Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Hilfe bei Endlosschleife (https://www.delphipraxis.net/67270-hilfe-bei-endlosschleife.html)

anarkids 12. Apr 2006 07:38

Datenbank: Access • Version: 2003 • Zugriff über: ADO/JET

Hilfe bei Endlosschleife
 
guten morgen leute!

Ja wie der Zufall es so wollte, hat meine mangelnde Erfahrung mit Delphi und Konsorten mich mal wieder in die Enge getrieben. Dieses mal hab ich ein Problem mit einer Endlosschleife. Wäre nett von Euch, wenn ihr mal in meinen Quelltext reinschaun könntet!

Delphi-Quellcode:
procedure TForm1.load(Sender: TObject);
var f: integer;
begin
  //Fenster auf Bildschirmgröße setzen
  f:=(Width-CLientWidth) div 2;
  setbounds(-f,-f,Screen.Width+2*f,Screen.Height+2*f);

  //Stringgrid Überschriften setzen
  stringgrid1.cells[1,0]:='HTTP';
  stringgrid1.cells[2,0]:='SMTP';
  stringgrid1.Cells[3,0]:='FTP';
  stringgrid1.cells[4,0]:='POP3';
  stringgrid1.cells[5,0]:='HTTPS';
end;

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
  ado_q2.sql.CommaText := 'SELECT * from Serverdaten';
  ado_q2.open;
  ado_q2.First;
  sock := TTCPClient.Create(SELF);
  l := 0;
  i := 0;
  while not ado_q2.Eof do
  begin
     stringgrid1.Cells[0,ado_q2.recno]:= ado_q2.FieldByName('Servername').asstring;
     sock.RemoteHost := ado_q2.FieldByName('IPAdresse').AsString;
     repeat
        if ado_q2.FieldByName('HTTP').asstring = 'true' then
        begin
          Sock.RemotePort := '80';
          l := 1;
          ConnPub;
        end;
        if ado_q2.Fieldbyname('HTTPS').asstring = 'true' then
        begin
          Sock.RemotePort := '443';
          l := 2;
          ConnPub;
        end;
        if ado_q2.FieldByName('POP3').asstring = 'true' then
        begin
          sock.RemotePort := '110';
          l := 3;
          ConnPub;
        end;
        if ado_q2.fieldbyname('SMTP').asstring = 'true' then
        begin
          sock.RemotePort := '25';
          l := 4;
          connpub;
        end;
        if ado_q2.FieldByName('FTP').asstring = 'true' then
        begin
          sock.RemotePort := '21';
          l := 5;
          connpub;
        end;
        i := i + 1;
     until i=5;
     ado_q2.Next;
  end;
  ado_q2.Close;
  sock.free;
end;

procedure TForm1.ConnPub;
begin
  Sock.OnConnect := Connected;
  Sock.OnError := SocketError;
  Sock.Active := true;
  Application.ProcessMessages;
  Sock.Active := false;
end;

procedure TForm1.Connected(Sender: TObject);
begin
  stringgrid1.Font.Color := clGreen;
  stringgrid1.Cells[l,ado_q2.RecNo] := 'Online';
end;
mfg, anarkids

Hawkeye219 12. Apr 2006 07:48

Re: Hilfe bei Endlosschleife
 
Hallo anarkids,

sollte die Initialisierung der Variablen i (i := 0) nicht innerhalb der WHILE-Schleife vor dem REPEAT stehen? i wird ständig erhöht aber nie wieder zurückgesetzt. Deshalb funktioniert die Abbruchbedingung (i = 5) ab dem zweiten Durchlauf wahrscheinlich nicht.

Gruß Hawkeye

anarkids 12. Apr 2006 07:52

Re: Hilfe bei Endlosschleife
 
wiedermal nen typischer anfängerfehler!

großes dankeschön hawkeye!!!

recht freundliche grüße
anarkids

Mavarik 12. Apr 2006 07:55

Re: Hilfe bei Endlosschleife
 
Hallo!

Also...

Da Du lediglich einen Sock erzeugt, den Du immer wieder "vermatschst" gehe ich davon aus,
dass Du Ihn nicht mehr brauchst...

Übrigens i und l zu verwenden ist immer schlecht zu lesen...

Wofür soll aber die Repeat sein?
Warum machst Du das ganze 5 mal?
Warum setzt Du i außerhalb der While auf 0 und nicht innerhalb vor der Repeat?

Übrigens bin ich nicht sicher, ob der Connect innerhalb so kurzer Zeit (1x Application.Processmessages)
schon verbunden ist...

Aber eine Endlosschleife sehe ich nicht... Oder doch, klar...

Nach der 1. Repeat ist I = 5 wenn Du das nächste mal in die Repeat kommst, ist I immer noch 5 und
wird als erstes auf 6 gesetzt.. Somit wird i nie wieder 5...

Also immer >= abtesten...Aber wenn Du vor der Repeat i immer auf Null setzt geht es... Was uns zu meiner Frage zurückführt warum 5 Mal?

Frank :coder:

mquadrat 12. Apr 2006 09:22

Re: Hilfe bei Endlosschleife
 
Das Programm scheint zu prüfen, ob ein bestimmter Server ansprechbar ist. Die Wiederholung ist zur Sicherheit da, dass er nicht "aus Versehen" Alarm auslöst, wenn das Verbinden einmal aus Zufall / Paketverlust etc scheitert. Wenn der Server fünf Mal nicht verbindet, dann kann er davon ausgehen, dass er wirklich offline ist.

Zumindest interpretier ich den Code mal so :D

anarkids 12. Apr 2006 09:53

Re: Hilfe bei Endlosschleife
 
Zitat:

Zitat von Mavarik
Übrigens i und l zu verwenden ist immer schlecht zu lesen..

Weiß ich, is ne dumme Angewohnheit. Sagt mein Lehrer auch immer!

Zitat:

Zitat von Mavarik
Wofür soll aber die Repeat sein?
Warum machst Du das ganze 5 mal?
Warum setzt Du i außerhalb der While auf 0 und nicht innerhalb vor der Repeat?

5 Mal zur Sicherheit. Weiß ja nicht, wie du das siehst, aber bei ner 10Mbit Netzwerkleitung bekomme ich oft Paketverluste (Zumindest hier im Netz). Das mit dem i habe ich nach Hawkeye219's vorschlag geändert.

Der code funktioniert jetzt.

Bin halt neu in Delphi und ich weiß selbst, dass man an diesem code noch ne MENGE verändern/verbessern kann. Wollte bloß, dass die endlosschleife weg ist. Jetzt funktioniert es ja auch ganz gut. Trotzdem danke nochmal für die direkte Fragestellung!

Zitat:

Zitat von mquadrat
Das Programm scheint zu prüfen, ob ein bestimmter Server ansprechbar ist. Die Wiederholung ist zur Sicherheit da, dass er nicht "aus Versehen" Alarm auslöst, wenn das Verbinden einmal aus Zufall / Paketverlust etc scheitert. Wenn der Server fünf Mal nicht verbindet, dann kann er davon ausgehen, dass er wirklich offline ist.

Richtig interpretiert. Ich war mir kurzerhand unsicher, ob ich verluste über die 10Mbit Leitung erhalte. Vielleicht ist fünf mal übertrieben. Weiß ich nicht und für verbesserungen ist ja noch platz.

Trotzem danke euch beiden für die Antworten ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz