Autor |
Beitrag |
Anarkids
      
Beiträge: 81
Win XP Pro, Freundin
Delphi 2006, C/C++, VisualBasic
|
Verfasst: Fr 17.03.06 12:04
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 17.03.06 12:08
Wäre natürlich hilfreich, wenn Du uns verrätst, wie der Fehler lautet
Aber ich denke, es wäre zumindest schonmal eine gute Idee, die Variable i in der repeat-until-Schleife auch zu verändern, sonst bleibt sie bei Null und die Schleife wird zur Endlos-Schleife.
//edit: Okay, vergiss das Erste 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Zuletzt bearbeitet von Christian S. am Fr 17.03.06 12:08, insgesamt 1-mal bearbeitet
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Fr 17.03.06 12:08
Erster Ansatz, Deine Schleife läuft von 0 bis 6
Ports hast Du aber nur von 1-5
Setz mal i := 1 und until i =5
und in der Schleife inc(i);
Dann sollte das Laufen;
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Fr 17.03.06 12:10
Zitat: | aber ich denke, es wäre zumindest schonmal eine gute Idee, die Variable i in der repeat-until-Schleife auch zu verändern, sonst bleibt sie bei Null und die Schleife wird zur Endlos-Schleife. |
oder sie gleich durch eine for-Schleife ersetzten. In diesem Fall weiß man ja wie oft sie wiederholt werden soll.
_________________ Markus Kinzler.
|
|
Anarkids 
      
Beiträge: 81
Win XP Pro, Freundin
Delphi 2006, C/C++, VisualBasic
|
Verfasst: Fr 17.03.06 12:15
mkinzler hat folgendes geschrieben: | Zitat: | aber ich denke, es wäre zumindest schonmal eine gute Idee, die Variable i in der repeat-until-Schleife auch zu verändern, sonst bleibt sie bei Null und die Schleife wird zur Endlos-Schleife. | oder sie gleich durch eine for-Schleife ersetzten. In diesem Fall weiß man ja wie oft sie wiederholt werden soll. |
*kopf auf den tisch hau*
das hatte ich glatt vergessen. ja guter rat mit der for schleife, aber das problem ist ja nich die schleife, sondern die Abfrage.
thx 
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: Fr 17.03.06 12:21
TTCPClient.OnConnect ist vom Typ TSocketNotifyEvent (= procedure (Sender: TObject) of object)!
Du musst dir eine Methode vom diesem Typ schreiben und sie .OnConnect zuweisen. Wenn die Verbindng zustande kommt, wird dann diese Methode aufgerufen.
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
mikhal
      
Beiträge: 109
Windows 10 Professional 64-Bit
VS 215 CE, Delphi 10.1 Berlin Professional
|
Verfasst: Fr 17.03.06 12:24
Ich kenne die TTCPClient-Klasse nicht, aber schau mal in Zeile 17 deines Quelltextes:
Delphi-Quelltext 1:
| if Sock.OnConnect = True then |
Handelt es sich hierbei um einen Methodenaufruf? Ein Methodenaufruf einer Ereignismethode wird dir kein Boole'sches Ergebnis liefern!
Laut Delphi 7 Hilfe solltest du mal die Eigenschaft Connected für deinen Test heranziehen.
Grüße
Mikhal
_________________ Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Fr 17.03.06 12:24
Oh ja, bei OnError ist das selbe Problem !
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Fr 17.03.06 12:25
onConnect/onError ist eine Prozedur-Properties, die kannst du so nicht aufrufen. Denen kannst du nur Ereignisroutienen zuweisen, welche dann beim connect bzw bei einem Fehler aufgerufen wird.
Du mußt also für diese beiden Ereignisse Methoden in der Klasse implementiern und dem Event zuweisen.
_________________ Markus Kinzler.
|
|
Anarkids 
      
Beiträge: 81
Win XP Pro, Freundin
Delphi 2006, C/C++, VisualBasic
|
Verfasst: Fr 17.03.06 12:25
also z.B. so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.Button1Click(Sender: TObject); var Sock: TTCPClient; var i; integer; begin i := 0; ports[1] := '80'; ports[2] := '443'; ports[3] := '110'; ports[4] := '119'; ports[5] := '21';
repeat Sock := TTCPClient.Create(self); Sock.RemoteHost := edit1.text; Sock.RemotePort := ports[i];
Sock.OnConnect := Connect; Sock.OnError := Error; Sock.Active := True; Application.ProcessMessages; Sock.Active := False; Sock.Free; until i = 6; end; |
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Fr 17.03.06 12:27
Hatte ich Dir in diesem Thread doch schon mal gezeigt !
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: Fr 17.03.06 12:34
Nein, so war es nicht gedacht!
Was willst du eigentlich bezwecken? Bei einem gegebenen Host (Edit1.Text) die fünf Ports "belauschen"? Warum Erstellst du dafür 5 Sockets nacheinander und gibst sie jeweils wieder frei? Würde es nicht reichen, einfach den Port zu ändern?
Naja, schreib erst mal, was du bezwecken willst, dann sehen wir weiter...
[edit]Ich denke, der Link von chrisw dürfte genau das sein, was du suchst![/edit]
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
Anarkids 
      
Beiträge: 81
Win XP Pro, Freundin
Delphi 2006, C/C++, VisualBasic
|
Verfasst: Fr 17.03.06 12:38
sicher, sorry!
War mir net klar, dass man das Zeug nich per IF-Abfrage klären kann. Du hattest mir ja auch diesen Teil mitgegeben:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.ActiveConnection (Sender: TObject); begin ShowMessage('Connected'); end; |
deinen Teil habe ich dann so ergänzt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.ActiveConnection (Sender: TObject); var Sock1: TTCPClient; begin var Sock1 := Dummy; memo1.lines.add(Sock1.RemoteHost +'blablablablablaaaaa'); end; |
das sollte in Verbindung mit der Schleife und dem Array wirken. Tut es aber nicht.
Bin echt ziemlich Hilflos, weil ich mir immer denke, dass ich kurz vor dem Ziel bin
thx schonmal für eure Geduld und Hilfe 
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Fr 17.03.06 12:39
Lass mal das var bei var Sock1 := Dummy; weg.
Aber eigentlich kannst du ja dann gleich mit dummy arbeiten und die lokale Variable ganz weglassen!
_________________ Markus Kinzler.
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: Fr 17.03.06 12:41
"Sender" ist der Socket, der das Ereignis auslöst! Einfach per type-cast umwandeln, dann kannst du dir "dummy" sparen.
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
Anarkids 
      
Beiträge: 81
Win XP Pro, Freundin
Delphi 2006, C/C++, VisualBasic
|
Verfasst: Fr 17.03.06 12:41
sorry mein fehler, das steht da gar net drin. is mehr nen tipfehler...
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Fr 17.03.06 12:56
Hier mal mein Beispiel aus dem vorherigen Thread für mehrere Ports
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Sockets;
type TForm1 = class(TForm) Button1: TButton; TcpClient1: TTcpClient; procedure Button1Click(Sender: TObject); private procedure ActiveConnection (Sender : TOBject); procedure SocketError (Sender : TObject; SocketErr: Integer); public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var Sock : TTCPClient; ports : array [1..5] of String; i : Integer; begin Ports[1] := '80'; Ports[2] := '119'; Ports[3] := '21'; Ports[4] := '110'; Ports[5] := '443'; Sock := TTCPClient.Create(self); Sock.RemoteHost := '127.0.0.1'; for i := 1 to 5 do begin Sock.RemotePort := Ports[i]; Sock.OnConnect := ActiveConnection; Sock.OnError := SocketError ; Sock.Active := True; Application.ProcessMessages; Sock.Active := False; end; Sock.Free; end;
procedure TForm1.ActiveConnection (Sender : TOBject); begin Showmessage('Connected'); end;
procedure TForm1.SocketError(Sender : TObject; SocketErr: Integer); begin Showmessage('Port ' + (Sender as TTCPClient).RemotePort + ' ist nicht auf'); end; end. |
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
Anarkids 
      
Beiträge: 81
Win XP Pro, Freundin
Delphi 2006, C/C++, VisualBasic
|
Verfasst: Fr 17.03.06 12:57
also ich hab jetzt einfach Sock global gemacht und die sowieso überflüssigen vars rausgenommen.
wie mach ich das denn, dass sich nur der port ändert. weil du hattest schon recht, mehr will ich auch nicht machen. ich hab nur keinen plan, wie's funktioniert
das ist so deprimierend
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: Fr 17.03.06 13:02
Ich würde noch
Delphi-Quelltext 1: 2:
| Sock.OnConnect := ActiveConnection; Sock.OnError := SocketError ; |
aus der Schleife raus nehmen und direkt unter
Delphi-Quelltext 1:
| Sock.RemoteHost := '127.0.0.1'; |
schreiben, da diese Zuweisungen ja nur einmal vorgenommen werden müssen!
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
Anarkids 
      
Beiträge: 81
Win XP Pro, Freundin
Delphi 2006, C/C++, VisualBasic
|
Verfasst: Fr 17.03.06 13:06
*g* danke leute. jetz hab ich immerhin schonma ne endlosschleife. das is toll
thx thx thx thx!!!
|
|