Hallo Chris,
ich habe das Gefühl, dass Du ein Design-Problem hast.
Ich weiss nicht was Andere empfehlen. Ich empfehle folgendes.
Schreibe Dir eine Klasse, die den Status der PC's repräsentiert.
Z.B.
Delphi-Quellcode:
Type
TComputerState = class(TObject)
private
FIPAddress : String;
FOnline : Boolean;
public
property IPAddress : String read FIPAddress write FIPAddress;
property Online : Boolean read FOnlien write FOnline;
end;
Jetzt schreibst Du Dir eine Klasse, die die og. Klasse verwaltet.
Z.B. so:
Delphi-Quellcode:
TComputerStates =
class(TObject)
private
FList : TList;
public
constructor Create;
destructor Destroy;
override;
function Add(aIPAddress :
String) : TComputerState;
procedure Clear;
function Count : Integer;
procedure Ping;
property Items[X : Integer] : TComputerState
read GetItems;
default;
end;
...
constructor TComputerStates.Create;
begin
inherited Create;
FList:=TList.Create;
end;
destructor Destroy;
begin
Clear;
FList.Free;
inherited Destroy;
end;
function TComputerStates.Add(aIPAddress :
String) : TComputerState;
begin
Result:=TComputerState.Create;
FList.Add(Result);
end;
procedure TComputerStates.Clear;
var
iCnt : Integer;
begin
For iCnt:=0
to Count-1
do
TObject(FList[iCnt]).Free;
FList.Clear;
end;
function TComputerStates.Count;
begin
Result:=Flist.Count;
end;
function TComputerStates.GetItems;
begin
Result:=TComputerState(FList[X]);
end;
procedure TComputerStates.Ping;
{In dieser procedure durchläufst Du alle Items holst Dir die IP-Adresse
und pingst die Adresse an. Wenn der Rechner antwortet setzt Online auf True.
Wenn der Rechner nicht antwortet eben auf False}
var
iCnt : Integer;
For iCnt:=0
to Count-1
do
Items[iCnt].Online:=DeinePingFunktion(Items[iCnt].IPAddress);
end;
In deinem Hauptprogramm deklarierst Du Dir im private Abschnitt des Forms eine Instanz vom Type FComputerStates : TComputerStates.
Vor dieser Instanz kannst Du dann im OnCreate-Event mit
FComputerStates : TComputerStates.Create;
und im OnDestroy-Event des Forms kannst das Objekt dann wieder zerstören
FComputerStates.Free
Du kannst dann mit
FComputerStates.Add
ein paar
IP-Adressen hinzufügen. Da Du eine TListBox hast muss jetzt die TListBox etwas über Deine TComputerState Objekte wissen. Das könntest Du wie folgt machen
ListBox1.Items.AddObject(IPAdress,FComputerStates.Add(IPAdress))
Was passiert hier: Über FComputerStates.Add(IPAdress) wird eine
FComputerState Ojektreferenz zurückgegeben. Diese Referenz wir in der Objeckts Eigenschaft der Items-Eigenschaft von TListBox gespeichert. In der ListBox wird als der Inhalt von IPAdress angezeigt.
Was bringt das ganze ?
Dieses Verfahren mag auf den ersten Blick ziemlich umständlich wirken. Hat aber zwei riesen Vorteile:
1. Du kannst jederzeit mit FComputerState(ListBox1.Items.Objects[Index]) zugreifen. In dem DrawItem-Event der TListBox könnte es dann so aussehen
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
If TComputerState(TListBox(Control).Items.Objects[Index]).Online then
begin
// mach hier irgendwas
end;
end;
2. Du bist unabhängig von der Oberfläche z.B. von der Komponente die die Information anzeigt !!!!!!!!
Dadurch könntest Du locker die TListBox durch eine TListView erstzen.
Wenn Du eine TListBox verwendest um die Daten zu halten (oben ist es die Aufgabe von TComputerStates) hättest Du große Probleme eine andere Komponente zu Visualisierung zu verwenden.
Jetzt rufst Du evt. in einem Timer-Event lediglich
Delphi-Quellcode:
FComputerStates.Ping;
ListBox.Refresh
auf.