![]() |
Schriftfarbe einer Zeile in der Listbox ändern?
Hallo DPler.
Ich habe ein kleines Programm geschrieben, das andere PC's anpingt und dann in einer Listbox auflistet, welche "online" sind. Was muss ich den tun, damit die Rechern die "online" sind grün aufgelistet werden und die anderen rot? Denn wenn ich einfach Listbox1.font.color verändere, wirkt sich das auf die gesamte Listbox auf. Ausserdem habe ich noch das Problem, dass die Listbox nicht weiter nach unten scrollt, wenn es mehrere Einträge werden, als sichtbar in die Liste passen. Gruß Christian |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Moin Chris,
dazu muss die Eigenschaft Style der ListBox auf lbOwnerDrawFixed gesetzt werden. So könnte man dann die Einträge immer im Wechsel rot und grün schreiben.
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); begin if (Index mod 2 = 0) then begin ListBox1.Canvas.Font.Color := clred; end else begin ListBox1.Canvas.Font.Color := clGreen; end; ListBox1.Canvas.TextOut(Rect.Left,Rect.Top,ListBox1.Items[Index]); end; |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Danke,
das funktioniert, aber was schreibe ich denn in die Bedingung, damit es nur grün wird, wenn eine Variable "status" vom Typ String = "online" ist? Gruß Christian |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Moin Chris,
Delphi-Quellcode:
if status = 'online' then begin
ListBox1.Canvas.Font.Color := clGreen; end else begin ListBox1.Canvas.Font.Color := clRed; end; |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Hi Christian.
Das habe ich auch gedacht. Aber wenn ich das so mache, ändert sích die Schriftfarbe aller Items. Ich versteh das nicht :roll: Gruß Christian |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Hi,
setzt du "online" für jedes zeichnen (zeichen <> hinzufügen) neu? Chris |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Zitat:
Ich prüfe, wieviel Bytes ich zurückbekomme. Wenn die Bytes=0 sind, setze ich Status auf "offline" oder sonst eben auf "online". Dann trage ich das so in die Listbox ein :
Delphi-Quellcode:
Mir ist auch aufgefallen, dass das ändern der Farbe funktioniert, aber nur, wenn man nicht scrollt. Hat jemand eine Ahnung wodran das liegt? :?:
listbox1.items.add('...'+status);
Gruß Christian |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Hi,
ich sehe das Problem. Du machst das derzeit so:
Delphi-Quellcode:
Das machst du in deiner Routine, in der du auch pingst.
if (iReturnedBytes > 0) then
online := true; ListBox1.Items.Add('192.168.0.1'); // oder irgendeine andere IP Das Problem ist aber nun, dass das Zeichnen nicht automatisch mit dem Hinzufügen passiert. Du musst also folgendermaßen arbeiten: Füge alle Rechner in die ListBox und mache das dann folgendermaßen im OnDrawItem:
Delphi-Quellcode:
Chris
iReturnedBytes := PingeDenRechnerAnMitIP(ListBox1.Items[Index]);
if (iReturnedBytes > 0) then online := true; if online then begin ListBox1.Canvas.Font.Color := clGreen; end else begin ListBox1.Canvas.Font.Color := clRed; end; |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Ich versteh das nicht ganz :oops:
Zitat:
Gruß Christian |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Hi,
kannst oder solltest. Das kannst du dir jetzt aussuchen. ;) Chris |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Ich weiß, das ich nerve, aber eins muss ich noch wissen. :lol:
Wie mach ich das denn? :oops: Also, lade ich erst alle IP's in die Listbox & arbeite sie dann ab, oder mache ich das so:
Delphi-Quellcode:
lstbErgebnis.items.add ('Es ist eigentlich egal was hier steht')
Delphi-Quellcode:
Kann man das so machen?
var
iReturnedBytes :integer; status :string; implementation procedure TLanPing.lstbErgebnisDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin pingIP //diese Prozedur wird aufgerufen, um die IP zu pingen //die Bytes werden in der Prozedur auf die Globale Variable iReturnedBytes gesetzt if iReturnedBytes<>0 then begin lstbErgebnis.Canvas.Font.Color := clgreen; status := 'online'; end else begin lstbErgebnis.Canvas.Font.Color := clred; status := 'offline'; end; lstbErgebnis.Canvas.TextOut(Rect.Left,Rect.Top,lstbErgebnis.'Die IP ist '+status) end; Gruß Christian |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Zitat:
Zitat:
Zitat:
Zitat:
Chris |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Hm, es gibt das nächste Problem.
Das mit dem Ping habe ich über die Indy-Komponenten realisiert. Ich kann also eine Prozedur schreiben, die einen Host pingt. Die Sache ist nur, dass ich die Antwort durch das Ereignis OnReply von der Indy-Komponente bekomme, und dann erst die Daten in die Listbox schreibe. Ich will damit nur sagen, dass es nichts bringt, wenn ich eine Prozedur im OnDrawItem aufrufe, oder sehe ich das falsch? Gruß Christian |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
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:
Jetzt schreibst Du Dir eine Klasse, die die og. Klasse verwaltet.
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; Z.B. so:
Delphi-Quellcode:
In deinem Hauptprogramm deklarierst Du Dir im private Abschnitt des Forms eine Instanz vom Type FComputerStates : TComputerStates.
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; Vor dieser Instanz kannst Du dann im OnCreate-Event mit
Delphi-Quellcode:
und im OnDestroy-Event des Forms kannst das Objekt dann wieder zerstören
FComputerStates : TComputerStates.Create;
Delphi-Quellcode:
Du kannst dann mit
FComputerStates.Free
Delphi-Quellcode:
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
FComputerStates.Add
Delphi-Quellcode:
Was passiert hier: Über FComputerStates.Add(IPAdress) wird eine
ListBox1.Items.AddObject(IPAdress,FComputerStates.Add(IPAdress))
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:
2. Du bist unabhängig von der Oberfläche z.B. von der Komponente die die Information anzeigt !!!!!!!!
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; 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:
auf.
FComputerStates.Ping;
ListBox.Refresh |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Hi Jens.
Auf jeden Fall schonmal DANKE :lol: Das klingt jetzt richtig kompliziert :shock: , aber ich versuchs mal. Kannst du dein Programm vielleicht online stellen? Gruß Christian |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Hallo Chris,
ich habe kein Programm. Den Text habe ich "on the fly" geschrieben |
Re: Schriftfarbe einer Zeile in der Listbox ändern?
Ui, auch das noch. Respekt :bounce2: Nochmal Danke
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz