Button in Listbox einfügen

Rund um die LCL und andere Komponenten
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Button in Listbox einfügen

Beitrag von Targion »

Hi!
Ich hätte gerne eine Listendarstellung, wie die aus dem Anhang (das Ubuntu Software Center), also mit mehrzeiligem Titel, bild und button in der Listbox.
Also habe ich eine neue Klasse von TCustomListbox abgeleitet und dann ewig rumprobiert, den gewünschten Effekt zu erreichen.
Das Ergebnis ist - nichts. Es gibt nichtmal Fehlermeldungen, die Listbox tut einfach überhaupt nichts, was ich programmiere.
Also: Ist sowas plattformunabhängig mit der LCL möglich? Und wenn ja, wie? Ich kenne mich in der grafischen LCL nämlich nicht wirklich gut aus.
Dateianhänge
Listbox mit mehrzeiligen Einträgen, Bild und Button
Listbox mit mehrzeiligen Einträgen, Bild und Button

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Button in Listbox einfügen

Beitrag von theo »

Probier's mal mit einem TListView, da kannst du in den versch CustomDraw Events schon einiges machen auch ohne Ableitung.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Button in Listbox einfügen

Beitrag von Targion »

Gibt's da irgendwo eine Stelle, wo ich ansetzen kann? Ich würde am liebsten eine Komponente von TCustomListview ableiten. Um das Verhalten zu erreichen, müsste ich aber wahrscheinlich auch TListViewItem verändern.
Gibt es irgendwo Codebeispiele, wo ähnliches schonmal gemacht wurde? Oder wenigstens eine Dokumentation, wie man in den Zeichenprozess eingreifen kann? (Wenn ich's bei "OnItemDraw" versuche, passiert wieder nichts.)

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Button in Listbox einfügen

Beitrag von theo »

Targion hat geschrieben:Wenn ich's bei "OnItemDraw" versuche, passiert wieder nichts.
Hmm ich hab das auch noch nie gemacht, aber bei mir funzt es (GTK2);


Property Style auf lbOwnerDrawFixed setzen und dann z.B:

Code: Alles auswählen

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  ARect: TRect; State: TOwnerDrawState);
var Style:TTextStyle;
begin
 if odSelected in State then TListBox(Control).Canvas.Brush.Color:=clNavy else
 if odd(Index) then TListBox(Control).Canvas.Brush.Color:=clLtGray else TListBox(Control).Canvas.Brush.Color:=clwhite;
 TListBox(Control).Canvas.FillRect(ARect);
 Style.Alignment:=taLeftJustify;
 Style.Layout:=tlCenter;
 TListBox(Control).Canvas.TextRect(ARect,0,0,TListBox(Control).Items[Index], Style);
end;

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Button in Listbox einfügen

Beitrag von Targion »

Danke, damit bekomme ich zumindest die Symbole andersfarbig... Ich habe jetzt den Grund gefunden, warum der Button nicht angezeigt wird: Der Button befindet sich hinter dem ListBox control, und nicht vor einem ListItem.
Wie bringe ich den Button dazu, auf einem ListItem angezeigt zu werden? Und wie ändere ich die Höhe eines ListItems, um mehr Text darauf anzeigen zu lassen?

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Button in Listbox einfügen

Beitrag von theo »

Targion hat geschrieben:Und wie ändere ich die Höhe eines ListItems, um mehr Text darauf anzeigen zu lassen?
Keine Ahnung. Lass mal sehen... ListBox1.ItemHeight... klingt nicht schlecht....
Targion hat geschrieben:Wie bringe ich den Button dazu,..
Ich würde da keinen Systembutton nehmen, sondern nur ein Icon.
Mit
ListBox1.
OnMouseDown
ItemAtPos
ItemRect

Müsste man eig. alles anstellen können mit dem Pseudo Button.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Button in Listbox einfügen

Beitrag von pluto »

Keine Ahnung. Lass mal sehen... ListBox1.ItemHeight... klingt nicht schlecht....
Das Problem hier bei ist, die TListBox basiert auf eine TStringList. Es währe möglich / denkbar dort auch Buttons anzuzeigen. Gerade so eine Ansicht wie im Bild ist leicht hinzubekommen.
Du musst beim Klicken nur dafür sorgen, dass ein Button sichtbar ist / wird. Der Parent des Buttons sollte die ListBox sein.

In der ListView geht das auf jedenfall in der DP gab es dazu einige Einträge. ItemHeigt sollt auf jedenfall Groß genug sein, damit du zwei Zeilen hast. Z.B. 40 bis 60. Was auch noch denkbar währe: Denn Button neben der ListBox anzuzeigen. In einer extra Panel-Leiste. Weißt du wie ich meine ?
MFG
Michael Springwald

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Button in Listbox einfügen

Beitrag von Targion »

theo hat geschrieben:Keine Ahnung. Lass mal sehen... ListBox1.ItemHeight... klingt nicht schlecht....
Diese Eigenschaft hat ein ListView aber nicht :-P Und das bringt wenigstens die Möglichkeit, Icons einzufügen gleich mit.
Den Button könnte ich einfach über das ListView zeichnen, das sollte also kein großes Problem werden.

Problem ist jetzt nur noch die unterschiedliche Schriftgröße der Einträge. (erste Zeile größer, zweite kleiner)
Ich probiere mal weiter rum, irgendwas geht bestimmt.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Button in Listbox einfügen

Beitrag von theo »

Targion hat geschrieben:
theo hat geschrieben:Keine Ahnung. Lass mal sehen... ListBox1.ItemHeight... klingt nicht schlecht....
Diese Eigenschaft hat ein ListView aber nicht
Ich dachte wir reden von ListBox.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Button in Listbox einfügen

Beitrag von Targion »

Ergenzung zu ItemHeight: Mit einer Listbox hat das bei mir (GTK2) überhaupt keinen Effekt...

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Button in Listbox einfügen

Beitrag von pluto »

Das geht nur wenn du den Zeichen Modus auf Variable stellst: Style:=csOwnerDrawVariable; dann sollte ItemHeihgt auch gehen.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Button in Listbox einfügen

Beitrag von theo »

Targion hat geschrieben:Ergenzung zu ItemHeight: Mit einer Listbox hat das bei mir (GTK2) überhaupt keinen Effekt...
Wer bist du und was hast du mit Targion gemacht? ;-)
Pluto hat geschrieben: Das geht nur wenn du den Zeichen Modus auf Variable stellst: Style:=csOwnerDrawVariable;
Genau.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Button in Listbox einfügen

Beitrag von pluto »

Wer bist du und was hast du mit Targion gemacht?
Stimmt, die Frage ist berechtigt...Monta: Kannst du Prüfen, ob Targion noch Targion ist ? *G*
MFG
Michael Springwald

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Button in Listbox einfügen

Beitrag von Targion »

Keine Sorge, ich bin's :mrgreen: Nur im Moment anscheinend etwas verpeilt :oops:
Der nächste Beitrag von mir hier wird bestimmt die fertige Lösung. Aber bevor ich mit dem Listbox-Zeug angefangen habe, habe ich viel zu lange (fast 3 Stunden) versucht, den LZMA-Algorithmus des LZMA-Pascal-SDK zu fixen. (Decoding geht nicht) Leider erfolglos... (Versucht mal, den auch nur ansatzweise (ist nicht dokumentiert...) aus dem Quellcode zu verstehen)
Naja, ich habe jetzt schon einen Button angezeigt und den Text kriege ich auch noch drauf (manuell auf's Canvas zeichnen wahrscheinlich)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Button in Listbox einfügen

Beitrag von pluto »

Naja, ich habe jetzt schon einen Button angezeigt und den Text kriege ich auch noch drauf (manuell auf's Canvas zeichnen wahrscheinlich)
Meines Wissens ist das manuelle zeichnen hier nicht notwendig, wenn du das Event DrawItem nicht nutzt. Aber das ist doch auch schon mal was *G*
MFG
Michael Springwald

Antworten