Button in Listbox einfügen

Rund um die LCL und andere Komponenten
Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Button in Listbox einfügen

Beitrag von Hitman »

Targion hat geschrieben: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)
Sicher, dass du den decoder nicht einfach nur falsch aufrufst? Hab diese Implementierung selbst im Einsatz (zum En- und Decoden) und das klappt einwandfrei.

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 »

So, fertig! Funktioniert hervorragend - aber nur mit dem Qt4-Widgetset. Unter GTK2 werden die (nativen) Buttons immer hinter der ListBox angezeigt. Wie kann ich den Button dazu bringen, unter GTK2 vor der Listbox zu stehen? (damit man ihn auch sieht)

@Hitman: Ich habe zum LZMA-SDK mal einen extra-Thread eröffnet.

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 »

Vielleicht ein Button.Parent ? oder ein Button.Show ? bzw. bringtofront ? sind nur Vermutungen....
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 »

Habe ich alles schon probiert => nichts. Aber mit Qt funktioniert es.

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

Re: Button in Listbox einfügen

Beitrag von theo »

Targion hat geschrieben:Habe ich alles schon probiert => nichts. Aber mit Qt funktioniert es.
Hab dir doch gesagt, nimm ein Icon und mach da selber einen Psuedo-Button draus. Aber du willst ja nicht hören.... ;-)

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:
Targion hat geschrieben:Habe ich alles schon probiert => nichts. Aber mit Qt funktioniert es.
Hab dir doch gesagt, nimm ein Icon und mach da selber einen Psuedo-Button draus. Aber du willst ja nicht hören.... ;-)
Das wäre natürlich die einfachste Lösung, ich hätte aber gerne den "nativen" Look des Systems... Vielleicht finde ich ja noch was in der GTK2-Doku :mrgreen:

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 »

Vielleicht liegt es an den Left und Top. Wie sehen diese Werte für den Button aus ? Kannst du etwas code Zeigen ?
(Leider ist die Direkt Verbindung zu deinem Rechner abgerissen *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 »

pluto hat geschrieben:(Leider ist die Direkt Verbindung zu deinem Rechner abgerissen *G*)
Brauchst du nicht, der Code ist OpenSource (bzw. wird es bald mit dem nächsten git push)
Der Button wird ganz einfach so erzeugt:

Code: Alles auswählen

btn:=TBitBtn.Create(self);
 btn.Parent:=self;
 btn.Width:=40;
 btn.Height:=40;
self ist hierbei die TListBox, da das ganze im Konstruktor passiert.
Wenn ihr übrigens in einem GTK2-Lazarus eine Listbox erstellt und dann versucht, einen Button drüberzulegen funktioniert das auch nicht...

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 »

und wo weißt du left und top zu ?
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 »

Im Draw-Ereignis:

Code: Alles auswählen

if odSelected in State then
      begin
        Canvas.Font.Color:=clHotLight;
        btn.Visible:=true;
        btn.Top:=Rect.Top+6;
        btn.Left:=Width-btn.Width-28;
        btn.Tag:=Index;
      end else
        Canvas.Font.Color:=clWindowText;
Ich habe den relativ schnell zusammengehackten Code jetzt mal veröffentlicht. Führt zwar dazu, dass der Listaller inkompilierbar wird, dafür könnt ihr jetzt aber die Listenklasse anschauen. Ich denke, das ist ein GTK+-Spezifisches Problem, allerdings habe ich dazu noch nichts gefunden.

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 »

Passiert das unter DrawItem ? Und versuch mal nicht Rect Komisch, bei mir heißt das ARect.... Rect.Top sondern 0. Damit habe ich immer wieder Probleme, mal ist es 0 mal ist es aRect.Top bzw. lass dir mal Rect.Top ausgeben. Ich nehme an die ListBox ist Breit genug ?
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 »

Ja, die Werte stimmen auch alle. Wie gesagt: Widgetset auf Qt stellen und der Button ist da, wo er hin soll.

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 »

Ja, die Werte stimmen auch alle. Wie gesagt: Widgetset auf Qt stellen und der Button ist da, wo er hin soll.
Das mit Rect meinte ich ernst. Ich habe beobachtet das es mal Rect.top mal 0 richtig ist also Relativ ist mal es ist Abzulut.
Es währe zu befürchten das die ListBox in GTk2 denn Button einfach überzeichnet. Kannst du es in einem Test-Projekt wieder spiegeln ? Ich meine außerhalb deines eigentlichen Projektes ?

Ich habe schon so ein Verhalten erlebt, ich war überzeugt das alles Richtig ist und es an der LCL liegen muss. Ein Test Projekt brachte dann das Gegenteil ans Tageslicht.

Letzte Möglichkeit die, dir bleibt: Eine eigene ListBox zu erstellen oder eine andere Komponente verwenden, z.b. die ListView. Wobei es gibt noch eine Möglichkeit:
Ich habe selbst vor einiger Zeit, eine eigene ListView angefangen, sie ist zwar noch Pre-Alpha, aber der ListBox Anordnungs- Modus Funktioniert schon. Wenn du möchtest, lade ich die Aktuelle Version hoch, sie hätte noch ein "Paar" andere nette Eigenschaften. Mir ging es darum, die Struktur Dynamisch austauschen zu können, außerdem sollten die Anordnungs Style Funktionieren, was unter der Standard ListView nicht der Fall.
Es gibt sogar schon die Möglichkeit, einen Header zu nutzen, es gibt jedoch auch hier noch einige Fehler, aber vielleicht kannst du das als Vorlage nehmen um eine eigene ListBox nach deinem Prinzip zu erstellen.
Wenn alles andere nicht geht. Sonst hätte ich keine Ideen mehr bzw. du könntest auch von der Standard ListBox ableiten und das Zeichnen selbst übernehmen, so hättest du gewisse Möglichkeiten, den Hintergrund z.b. nicht neu zeichnen zu lassen oder die Methode Paint aufzurufen und der gleichen.
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 »

Ich habe jetzt glaube ich die Ursache des problems gefunden! (Ist ein Standard von GTK2 und eventuell ein bug in der LCL)
Wie komme ich an das GtkWidget meiner Listbox, um diese zu bearbeiten?

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 »

Schau dir mal die Methode "GetIndexAtXY" an. Du findest sie in "TCustomListBox". Dort ist es gezeigt. Ich glaube aber, dass geht nur wenn du von der ListBox ableitest.
MFG
Michael Springwald

Antworten