Ich habe jetzt mal was Ausprobiert.
Hier mein Code:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets, ExtCtrls, ScktComp, Buttons;
type
TForm1 =
class(TForm)
Button1: TButton;
ListBox1: TListBox;
ListBox2: TListBox;
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
ClientSocket1: TClientSocket;
BitBtn1: TBitBtn;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure BitBtn1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
i: Integer;
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ClientSocket1.Address:='
192.168.0.'+inttostr(i);
Try
ClientSocket1.Open;
if ClientSocket1.Active
then begin
ListBox1.Items.Add(ClientSocket1.Address);
ClientSocket1.Close;
end else
ListBox2.Items.Add(ClientSocket1.Address);
finally
ClientSocket1.Close;
i:=i+1;
if i=21
then timer1.Enabled:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
i:=1;
Timer1.Enabled:=true;
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
//ListBox2.Items.Add(ClientSocket1.Address);
ErrorCode:=0;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
//ListBox1.Items.Add(ClientSocket1.Address);
//ClientSocket1.Close;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i: Integer;
begin
ListBox1.Clear;
ListBox2.Clear;
For i:=1
to 20
do begin
ClientSocket1.Address:='
192.168.0.'+inttostr(i);
Try
ClientSocket1.Open;
Application.ProcessMessages;
if ClientSocket1.Socket.Connected
then
ListBox1.Items.Add(ClientSocket1.Address)
else
ListBox2.Items.Add(ClientSocket1.Address);
ClientSocket1.Close;
except
beep;
end;
end;
end;
end.
Wenn du den Button1 benutzen willst, dann muß du die Auskommentierung unter OnError und OnConnect wieder rausnehmen.
Aber mir ist dabei ein Phänomen aufgefallen:
die Timer-Lösung funktioniert richtig (Gefällt mir aber nicht)
die BitBtn-Lösung liefert erst ab dem 2. Klick die richtige
IP-Adresse.
Eigentlich müsste das schon beim 1. Klick so sein. Liegt warscheinlich daran, das beim Open nicht wirklich gewartet wird, bis die Verbindung aufgebaut ist. Und wenn das dann zu lange dauert, wird eine
IP ausgegeben, die nicht stimmt, da die Schleife schon weiter ist.
Also folgende Lösung sollte dann aber auch das Problem lösen.
Du setzt eine Globale Booleanvariable 'test' auf False.
Nach dem Open läßt du dann eine While-Schleife laufen, die auf ein test=True wartet.
Im OnConnect und OnError setzt du die dann auf True.
Dann geht das aufwärtzählen der
IP nur weiter, wenn die Open-Procedure abgeschlossen ist. So oder so.
Zur Sicherheit kannst du dann ja noch einen Timer mit einem Timeout von 30 Sek vor der While-Schleife starten, der auf jeden Fall Test auf True setzt.
Probier das doch mal.