Einzelnen Beitrag anzeigen

Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#9
  Alt 15. Mai 2003, 00:44
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat