![]() |
AW: Item in DrawItem ändern?
Hallo Popov,
genau wegen des dann eintretenden "Endlosaufrufs" von DrawItem meinte ich, dass das logischerweise nicht gehen kann. Der Hintergrund ist, dass die Listbox automatisch bei einer Änderung des Inhaltes den entsprechenden Item neu zeichnet. Also, sobald items[index]:='irgendwas' gemacht wird, schreibt sie die Änderung und das soll sie ja auch. Wie gesagt, etwas anderes als den Itemtext auszugeben ist kein Problem. Mache ich ja in meiner Listview ständig. Es wäre eben nur interessant, ob man das irgendwie hinbiegen kann. Gruß Mattze PS: Richtig, Sir Rufo! Aber fragen kann man ja mal... So wurden schon viele Sachen geklärt und oft weiß man selber gar nicht, was man eigentlich wirklich will. |
AW: Item in DrawItem ändern?
.onItemDraw() ist nun mal für das Zeichnen von Einträgen (Darstellung) zuständig. Hier sollte man nichts an den Daten ändern.
Wenn Dir das Radio/Fernseher zu laut/leise ist regelst Du ja auch die Lautstärke über den Regler oder der Fernsteuerung und rufst nicht beim Sender an und verlangst, dass Sie die daten ändern sollen (Film/Musik). 8-) |
AW: Item in DrawItem ändern?
Hallo,
tschja, so ist das eben. Vieles ist für vieles zuständig und manches sogar für mehr als man denkt und vermuten würde. Die Möglichkeiten muss man halt ausloten. Gruß Mattze |
AW: Item in DrawItem ändern?
Natürlich kann man auch mit einem Teelöffel eine Tunnel durch die Alpen graben. :stupid:
|
AW: Item in DrawItem ändern?
Eben!
Aber es gibt auch positive Beispiele. Hat sicherlich jeder schon mal erlebt. Man weiß nicht, wie man weiterkommt und macht und macht... Letztendlich war es dann nur eine klitzekleine einfache Sache, von der man nie für möglich gehalten hätte, dass sie funktioniert! Gruß Mattze |
AW: Item in DrawItem ändern?
Gehen, geht alles, nur wie sinnvoll ist das?
Delphi-Quellcode:
Also hier kann man den Inhalt ändern, ohne Endlosschleife, weil nicht der Item-String genutzt wird, sondern der String im Objekt abgelegt ist. Dadurch merkt die ListBox nicht sofort, wenn sich der Inhalt ändert.
type
TTest = class Text: String; end; procedure AddItem(LB: TStrings; Str: String); var Test: TTest; begin Test := TTest.Create; Test.Text := Str; LB.AddObject('', Test); end; procedure ModItem(LB: TStrings; AIndex: Integer; Str: String); begin if (AIndex >= 0) and (AIndex < LB.Count) then TTest(LB.Objects[AIndex]).Text := Str; end; function ItemStr(LB: TStrings; AIndex: Integer): String; begin Result := TTest(LB.Objects[AIndex]).Text; end; procedure DelItem(LB: TStrings; AIndex: Integer); begin if (AIndex >= 0) and (AIndex < LB.Count) then TTest(LB.Objects[AIndex]).Free; end; procedure GetFiles(Path: String; List: TStrings); var Search: TSearchRec; begin //Path := IncludeTrailingBackslash(Path); if FindFirst(Path + '*.*', faAnyFile, Search) = 0 then repeat AddItem(List, Path + Search.Name); until FindNext(Search) <> 0; FindClose(Search); end; procedure TForm1.FormCreate(Sender: TObject); const Path = 'c:\'; begin ListBox1.Style := lbOwnerDrawFixed; ListBox1.Sorted := True; GetFiles(Path, ListBox1.Items); end; procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); const PfadeVerstecken = True; //<<<< var FileName: String; begin with (Control as TListbox) do begin if PfadeVerstecken then FileName := ExtractFileName(ItemStr(Items, Index)) else FileName := ItemStr(Items, Index); Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top, FileName); ModItem(Items, Index, '[Mattze] ' + FileName); //<<<<<<<<<<<<< end; end; procedure TForm1.RefreshBtnClick(Sender: TObject); begin ListBox1.Refresh; end; Trotzdem, etwas sinnvolles wird nichts draus, da bei jeder Aktualisierungs die Änderung vorgenommen wird. |
AW: Item in DrawItem ändern?
Hallo Popov,
das wäre tatsächlich eine ernstzunehmende Idee. Statt über die Items, die die Listbox automatisch aktualisieren, geht man über die Objekte. Wenn man das Drawitem von CustomListbox sowieso in seiner Komponente überschreibt, kann man das auch gleich umdrehen. Sprich: Die normalen Listeinträge (soweit möglich) als Zusatzinfos verwenden und die Objecte als die "normalen" Einträge. Wenn die geändert werden, wird Drawitem nicht automatisch aufgerufen. Wobei... Na ja, jedenfalls erst mal ein schönes Wochenende allen! Gruß Mattze |
AW: Item in DrawItem ändern?
Und dann verwendet der Benutzer der Komponente ebenfalls die Objects-Eigenschadt, und alles geht den Bach runter.
|
AW: Item in DrawItem ändern?
Ist doch egal, Hauptsche man hat etwas geschafft, was eigentlich nicht gehen sollte, weil es keinen Sinn macht!
|
AW: Item in DrawItem ändern?
In TTest ist ja noch Platz für ein weiteres Objects-Feld ... darf der Endanwender nur nicht vergessen, daß er jetzt wo anders suchen muß.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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