Laden...

while Schleife mit zwei booleschen Anweisungen | Probleme beim Wechsel von Delphi

Erstellt von xpate vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.253 Views
X
xpate Themenstarter:in
5 Beiträge seit 2007
vor 17 Jahren
while Schleife mit zwei booleschen Anweisungen | Probleme beim Wechsel von Delphi

Hallo
Ich hoffe ich bin hier im richtigen Unterforum gelandet.

Ich schreibe zur Zeit mein Programm, mit dem ich Firmware auf eine Medienbox spiele, von Delphi in C# .Net um.

Dieser Code bereitet mir Probleme:

function TForm1.WarteAufQuittung:boolean;
begin
    FTimeout := false;
    Timer1.Enabled := false;
    Timer1.Interval := 3000;
    Timer1.Enabled := true;



    while (not FTimeout) and (not FRcvFlag) do
      Application.ProcessMessages;
    Timer1.Enabled := false;

    if FTimeOut = true then
    	result := false
    else
    begin
			if RcvBuffer[0] = char($0d) then
	    	result := true
      else
      	result := false;
    end;


end;

Ich habe ja im Anweisungsblock der while Schleife zwei Anweisungen.
Weiß jemand von euch wie ich das in C# realisieren kann?

Und hat jemand evtl. auch eine Ahnung, wie das "result" Gegenstück in C# heißt?

5.941 Beiträge seit 2005
vor 17 Jahren

Hallo xpate

Ich kenne Delphi zwar überhaupt nicht, aber ich versuchs mal.

Original von xpate
while (not FTimeout) and (not FRcvFlag) do
Application.ProcessMessages;

Ich habe ja im Anweisungsblock der while Schleife zwei Anweisungen.
Weiß jemand von euch wie ich das in C# realisieren kann?


while((!FTimeout) && (!FRcvFlag))

Original von xpate

Und hat jemand evtl. auch eine Ahnung, wie das "result" Gegenstück in C# heißt?

Hier nehme ich mal an, dass das Gegenstück zur "return <Value>" sein wird.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

T
125 Beiträge seit 2005
vor 17 Jahren

Ich weis zwar nicht ganz genau was du nun mit ner while schleife willst.

Jedenfalls wenn du auf etwas warten willst empfiehlt es sich events zu machen. Weis ja nun nicht ob du die Macht hast das Event auszulösen.


while(!FTimeout && !FRcvFlag)
{
 Application.DoEvent();  //arbeitet Messages ab
}
X
xpate Themenstarter:in
5 Beiträge seit 2007
vor 17 Jahren

Der Teil mit der while Schleife funktioniert.
Danke dafür schon einmal.

Den Rest werde ich nachher mal testen.

Edit: Ich sende der Medienbox eine Intel Hex Zeile, an der die MB erkennt, dass als nächstes eine Firmware kommt.
Die MB hat dann 3Sek zeit um zu antworten.

Das ist in etwa die grobe Funktion.

Ich weiß, dass das nicht optimal gelöst ist. Ist auch schon recht alt der Code.

X
xpate Themenstarter:in
5 Beiträge seit 2007
vor 17 Jahren

So der Teil mit dem Event funktioniert nun auch wunderbar.

Habe jetzt auch so ziemlich alles in C# realisiert, allerdings fehlt mir noch eine Funktion, die ich nicht so ganz auf die Reihe bekomme.

Hier seht ihr den alten, fertigen Delphi Code

function TForm1.GetFileSize(filename:string):integer;
var
  F: TextFile;
	s:string;
  count : integer;
begin
  AssignFile(F, filename);
  Reset(F);
  count := 0;
  if IOResult = 0 then
  begin
  	while not eof(F) do
    begin
    	Readln(F, s);
      count := count + length(s);
    end;
  end;
  result := count;
  CloseFile(F);
end;

Das hier ist mein C# Code. Noch nicht viel, ich weiß 😉

public int GetFileSize(string filename)
        {
            StreamReader sr = new StreamReader("GetFileSize");
            String line;
            string s;
            int count;


            if(IOException == 0)
            {
               while (((line = sr.ReadLine()) !=null) && (error = false))
                {
                    
                }
            }
        }

Habe nun folgende konkrete Probleme.
IOResult wird ja scheinbar in C# mit IO Exception gelöst. Funktioniert bei mir aber nicht, weil ich es wie eine Variable benutzte. Jemand dazu ein Lösung?

AssignFile bekomme ich auch nicht umgesetzt. Ebenfalls Reset. Wie ich die eingebettenen Ausdrücke in der while Schleife umsetze, ist mir leider auch noch ziemlich schleierhaft.

Hoffe ihr könnt mir dabei helfen.
Danke und Gruß Jan

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo xpate,

if(IOException == 0) kannst du einfach weglassen. Wenn new StreamReader fehl schlägt, bekommst du automatisch eine Exception und der Code danach wird nicht mehr ausgeführt.

Ich würde Tippen, dass AssignFile und Reset dem new Streamreader entsprechen.

In die While-Schleife gehört doch nur count += s.Length;

In C# gibt es aber FileInfo.Length, das die ganze Funktion ersetzt.

herbivore

B
1.529 Beiträge seit 2006
vor 17 Jahren
public int GetFileSize( string filename )
{
   string[] lines = File.ReadAllLines( filename );
   int charcount = 0;
   foreach( string line in lines )
      charcount += line.Length;
   retunr charcount;
}

Ich möchte dich allerdings noch darauf hinweisen, dass die Methode nicht die Dateigröße liefert, sondern die Anzahl der Zeichen exklusive dem Zeilenendezeichen. Das ist nicht das gleiche (war es auch in Delphi nicht). Um die Dateigröße zu ermitteln, nimmst du (new FileInfo( filename )).Length.

D
386 Beiträge seit 2007
vor 17 Jahren

AssignFile holt ein Handle auf eine Datei, Reset oeffnet sie erst (anhand einer globalen Variable..) im gewuenschten Dateimodus.

Auch Delphi (allerdings weiss ich nicht ab welcher Version) kennt aber die Funktion FileSize(var F) - also ist der urspruengliche Code entweder schon recht alt oder aber nicht gruendlich recherchiert..

Zusammengefasst: Der StreamReader ersetzt AssignFile und Reset, ja. Nein, man braucht aber erst gar nicht die Datei zu lesen um die Groesse zu bestimmen. Und fuer den IOResult Kram wuerde ich dir empfehlen in dem links verlinkten Buch ueber C# das Thema Exceptions durchzugehen.

Pound for pound, plutonium is about as toxic as caffeine when eaten.

X
xpate Themenstarter:in
5 Beiträge seit 2007
vor 17 Jahren

Danke schon einmal für eure Antworten.

Und der Code ist mit Delphi 7 geschrieben worden. Ende 2004 habe ich das Programm geschrieben.

Die Methode ist auch dafür geschrieben worden, die Zeichenlänge auszulesen. Sorry falls das falsch rüber gekommen sein sollte.

Ich werde mal eure Tipps befolgen und gebe Rückmeldung, ob es geklappt hat.

J
3.331 Beiträge seit 2006
vor 17 Jahren

Entschuldigung, aber warum möchte keiner die Dateigröße über **FileInfo **abfragen?

public int GetFileSize( string filename )
{
    FileInfo fi = new FileInfo(filename);
    return fi.Length;
}

Oder habe ich irgendein Zusatzproblem in diesem Zusammenhang übersehen? Jürgen

X
xpate Themenstarter:in
5 Beiträge seit 2007
vor 17 Jahren

Dann muss ich aber doch long als Typ angeben und nicht int oder? Weil .Length vom Typ long ist.

D
386 Beiträge seit 2007
vor 17 Jahren

Original von juetho
Entschuldigung, aber warum möchte keiner die Dateigröße über FileInfo abfragen?

Oder habe ich irgendein Zusatzproblem in diesem Zusammenhang übersehen?

Nur, dass herbivore es bereits erwaehnt hat vor ~ einer Stunde und (so wie auch ich es uebersehen hab) es (siehe Borg) ja ein Unterschied ist ob man die Newlines bei der Groessenbestimmung mitzaehlt oder nicht.

Pound for pound, plutonium is about as toxic as caffeine when eaten.

J
3.331 Beiträge seit 2006
vor 17 Jahren

Original von xpate
Dann muss ich aber doch long als Typ angeben und nicht int oder? Weil .Length vom Typ long ist.

Natürlich, sorry!

Original von DarKlajid
Nur, dass herbivore es bereits erwaehnt hat vor ~ einer Stunde

Entschuldigung, herbivore! 😁

Jürgen