Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
while Schleife mit zwei booleschen Anweisungen | Probleme beim Wechsel von Delphi
xpate
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

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

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von xpate am .
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 5.940
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo xpate

Ich kenne Delphi zwar überhaupt nicht, aber ich versuchs mal.
Zitat
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))
Zitat
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

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
Trivalik
myCSharp.de - Member



Dabei seit:
Beiträge: 125

beantworten | zitieren | melden

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
}
private Nachricht | Beiträge des Benutzers
xpate
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von xpate am .
private Nachricht | Beiträge des Benutzers
xpate
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Borg
myCSharp.de - Member



Dabei seit:
Beiträge: 1.529
Herkunft: Berlin, Germany

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
DarKlajid
myCSharp.de - Member



Dabei seit:
Beiträge: 386
Herkunft: Köln

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
xpate
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3.331
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
xpate
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

Dann muss ich aber doch long als Typ angeben und nicht int oder? Weil .Length vom Typ long ist.
private Nachricht | Beiträge des Benutzers
DarKlajid
myCSharp.de - Member



Dabei seit:
Beiträge: 386
Herkunft: Köln

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3.331
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
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!
Zitat
Original von DarKlajid
Nur, dass herbivore es bereits erwaehnt hat vor ~ einer Stunde
Entschuldigung, herbivore!

Jürgen
private Nachricht | Beiträge des Benutzers