AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Hilfe bei Endlosschleife
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe bei Endlosschleife

Ein Thema von anarkids · begonnen am 12. Apr 2006 · letzter Beitrag vom 12. Apr 2006
Antwort Antwort
anarkids

Registriert seit: 7. Apr 2006
Ort: Braunschweig
22 Beiträge
 
Delphi 2006 Architect
 
#1

Hilfe bei Endlosschleife

  Alt 12. Apr 2006, 08:38
Datenbank: Access • Version: 2003 • Zugriff über: ADO/JET
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 = 'truethen
        begin
          Sock.RemotePort := '80';
          l := 1;
          ConnPub;
        end;
        if ado_q2.Fieldbyname('HTTPS').asstring = 'truethen
        begin
          Sock.RemotePort := '443';
          l := 2;
          ConnPub;
        end;
        if ado_q2.FieldByName('POP3').asstring = 'truethen
        begin
          sock.RemotePort := '110';
          l := 3;
          ConnPub;
        end;
        if ado_q2.fieldbyname('SMTP').asstring = 'truethen
        begin
          sock.RemotePort := '25';
          l := 4;
          connpub;
        end;
        if ado_q2.FieldByName('FTP').asstring = 'truethen
        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
Mr.D
Change begins with you - today!
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Hilfe bei Endlosschleife

  Alt 12. Apr 2006, 08:48
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
  Mit Zitat antworten Zitat
anarkids

Registriert seit: 7. Apr 2006
Ort: Braunschweig
22 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Hilfe bei Endlosschleife

  Alt 12. Apr 2006, 08:52
wiedermal nen typischer anfängerfehler!

großes dankeschön hawkeye!!!

recht freundliche grüße
anarkids
Mr.D
Change begins with you - today!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Hilfe bei Endlosschleife

  Alt 12. Apr 2006, 08:55
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
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Hilfe bei Endlosschleife

  Alt 12. Apr 2006, 10:22
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
  Mit Zitat antworten Zitat
anarkids

Registriert seit: 7. Apr 2006
Ort: Braunschweig
22 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Hilfe bei Endlosschleife

  Alt 12. Apr 2006, 10:53
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 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 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
Mr.D
Change begins with you - today!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:37 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