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

Re: Button in Listbox einfügen

Beitrag von Targion »

pluto hat geschrieben: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.
Das mache ich ja sowieso. Ein TTreeView tut's übrigens auch! Allerdings werden da dann die Bilder und schriften nicht gezeichnet. Die Methode GetIndexAtXY holt übrigens nicht das echte native GtkWidget (bzw. einen Pointer darauf) Ich muss da anders hin kommen.
Lese grade mal den entsprechenden Code des Software-Centers.

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 »

Allerdings werden da dann die Bilder und schriften nicht gezeichnet. Danke schonmal!
Ja, dass war einer der Gründe warum ich eine eigene ListView erstellt habe. Bitte. Ich werde an der ListView noch einige Fehler behoben, aber wenn du möchtest könnte ich sie dir schon mal senden, damit du sie dir anschauen kannst. Sie ist eine Alternative, viele Sachen gehen halt noch nicht, nur die Sachen gehen, die für mich Wichtig waren.... für das damalige Projekt. Zurzeit versuche ich weitere Funktionen einzubauen z.b. den Report Modus, im Prinzip klappt der auch ganz gut, ist gibt halt nur noch ein kleines Problem.... Aber für die Komponente mache ich ein neuen Thread auf, wenn es so weit ist.

Ich habe ein eigenen Versuch gemacht und konnte deine Angaben bestätigen. Da bei mir noch kein QT läuft unter Lazarus konnte ich das nicht bestätigen. Ich hatte sogar versucht, den Button einfach über die ListBox zu legen. Also das der Button jetzt nicht der ListBox gehört sondern z.b. den Form. Das ging auch nicht, da die ListBox das Fenster immer neu zeichnet.

Im Übrigen, ist mir noch ein Fehler aufgefallen: Im From Desiner, je mehr Komponenten ich platziere gibt es um so mehr Grafik Fehler, wenn ich z.b. eine ListBox verschiebe. Bei meiner Komponenten Sammlung kann man das beobachten, zuerst dachte ich es liegt an meinen Komponenten, aber das war nicht der Fall. Vielleicht hängt das zusammen ? Dieser Fehler und den Fehler den du gefunden hast ? Ich hoffe du weißt was 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 »

Ich würde deine Komponenten wirklich gerne benutzen. Der Listaller soll aber so nativ wie möglich aussehen und 1:1 mit den Themes der Desktopoberfläche harmonieren. Die Integration in den Linux-Desktop sollte möglichst nahtlos sein.
Deine Komponenten passen sich leider nicht dem Stil des Systems an und wirken ein wenig wie Fremdkörper. Zudem möchte ich die Codebasis des Projektes nicht unmöglich aufblähen, jetzt wo ich grade die Abbrevia-Komponenten (mit über 10.000 zeilen Code) entfernen konnte.
Ich werde deine Komponenten gerne in anderen Projekten verwenden, aber für dieses eine Projekt denke ich ist das eine eher ungünstige Wahl.

Da mich die Limitierungen der GUI-Gestaltbarkeit in Lazarus auch zunehmend nerven, werde ich vermutlich, sollte das Projekt erfolgreich werden, ein Frontend für die Listaller-Bibliothek mit Vala oder C/C++ schreiben. (Auch ein KCM für KDE wäre nett, da kenne ich mich aber nicht aus)
Vorerst muss aber die Lazarus-GUI reichen. Ich werde jetzt Labels auf das TTreeView setzen, das funktioniert recht gut. Und auch die anderen Probleme lassen sich lösen.
Das Ergebnis ist nicht wirklich eine Augenweide und es sieht auch nicht ganz nativ aus, aber es ist deutlich benutzerfreundlicher als die alte platzfressende Liste.

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 »

Ich würde deine Komponenten wirklich gerne benutzen. Der Listaller soll aber so nativ wie möglich aussehen und 1:1 mit den Themes der Desktopoberfläche harmoniere
Das währe der Fall. Ich nutzte z.b. den Standard HeaderControl und auch sonst währe es kein Problem, dass so aussieht als ob es Nativ währe.
Deine Komponenten passen sich leider nicht dem Stil des Systems an und wirken ein wenig wie Fremdkörper.
Ich meine meine eigene ListView, die kennst du noch gar nicht. Sie befindet sich noch in der Entwicklung. Wie schon oben erwähnt, könnte ich sie so aussehen lassen als ob es Nativ währe. Ich habe dafür entsprechende Funktionen und Möglichkeiten gesehen. Ich würde es dann genau so machen, wie es THeaderControl macht.
Da mich die Limitierungen der GUI-Gestaltbarkeit in Lazarus auch zunehmend nerven
Da bist du nicht der einzgiste. Ich habe schon mal angefangen auf Bases von TCustomControl eine reihe eigener Komponenten zu erstellen. Bisher habe ich eine CheckBox, RadioBox, Prossesbar, TrackBar. Ob ich hier weiter mache weiß ich nicht. Mein Ziel war es einfach, die Möglichkeiten und Alt nativen zu erhöhen. Das Problem von Lazarus ist: Es ist immer an die Verwendete Plattform gebunden und muss den kleinsten gemeinsamen Nenner finden, außerdem kommt noch die Delphi Kompatibilität hinzu.
MFG
Michael Springwald

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 »

Ich habe meine ListView angepasst. Sie unterstützt jetzt den Button. Das habe ich so gelöst:

Code: Alles auswählen

procedure TForm1.LVDrawItem(const CurrItem: TPL_IT; ItemRect: TRect; var Used: Boolean);
begin
  if CurrItem.Index = CurrItem.ITL.ItemIndex then begin
    CurrItem.ITL.Canvas.GradientFill(ItemRect,clRed, clBlue,gdHorizontal);
  end
  else
    CurrItem.ITL.Canvas.FillRect(ItemRect);
  CurrItem.ITL.Canvas.TextOut(ItemRect.Left, ItemRect.Top, CurrItem.Text);
 
  if CurrItem.Index = CurrItem.ITL.ItemIndex then begin
    if Assigned(myButton) then begin
      if not myButton.Visible then  myButton.Visible:=True;
      myButton.Left:=lv.Width-myButton.Width-10;
      myButton.Top:=ItemRect.Top;
    end;
  end;
  Used:=True;
end;
Ein Bild davon gibt es im Anhang. Dank diesem Event hast du die Kontrolle über das Zeichnen. Die Komponente ist jedoch noch nicht für den Produktiven Einsatz geeignet. Es gibt noch eine reihe von Dingen, die noch nicht unterstützt werden wie z.b.:
- Mehrfach Markierung,
- F2 Funktion,
- .....

Aber vieles geht schon, es gibt vier Anordnungs Möglichkeiten: (ag_Hori, ag_Verti, AG_OneLine, AG_Report, AG_None); weitere zwei sind geplant.

Es würde jedoch alles unterstützen, was du brauchst. Vielleicht lade ich ein ein Vorläufiges Demo davon hoch, jedoch in einem Extra Thread.
Dateianhänge
plListView.png
plListView.png (4.68 KiB) 1637 mal betrachtet
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 »

Deine Komponente ist später sicher eine Überlegung wert... Genial wäre natürlich, wenn man die Komponente so einstellen könnte, dass der Hintergrund einer Zeile so aussieht, wie es das GTK+-Theme oder der Qt-Style vorschreibt...
Ich löse das ganze jetzt so, dass es den Button nur in der Qt-Version geben wird. Die GTK+-Version des Programmes wird entweder einen Button selbst zeichnen, oder aber eine Buttonlose Lösung verwenden.

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 »

Genial wäre natürlich, wenn man die Komponente so einstellen könnte, dass der Hintergrund einer Zeile so aussieht, wie es das GTK+-Theme oder der Qt-Style vorschreibt...
Das wird es sicherlich geben.
Ich löse das ganze jetzt so, dass es den Button nur in der Qt-Version geben wird. Die GTK+-Version des Programmes wird entweder einen Button selbst zeichnen, oder aber eine Buttonlose Lösung verwenden.
Vielleicht könntest du auch ein Panel am Rechten Rand platzieren, also außerhalb der ListBox. Weißt du wie ich meine ?
Was soll der Button Eigentlich genau machen ?
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:
Vielleicht könntest du auch ein Panel am Rechten Rand platzieren, also außerhalb der ListBox. Weißt du wie ich meine ?
Was soll der Button Eigentlich genau machen ?
Panel an der Seite sieht aber so richtig hässlich aus :-P Der Button leitet die Deinstallation der gewählten Anwendung ein. (Klick drauf und die Anwendung wird entfernt.)

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

Re: Button in Listbox einfügen

Beitrag von theo »

@Targion: Vergiss doch den System Button endlich. Mach ein nettes Icon rein und gut is. Das stört niemanden.

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 das jetzt so gelöst, dass es nur unter Qt4 den Button geben wird. Unter GTK+ gibt's eine nette Fallback-Lösung.
Alternativ kann ich immernoch ein bild draufzeichnen :mrgreen:
Danke für die Hilfe! Ihr könnt die Lösung dann später bewundern (oder auch nicht :P )

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 »

@theo
Einige Leute wollen halt mehr, als andere, klar das die LCL nicht alles kann.... aber etwas mehr währe schon nicht schlecht..... da sie ja angeblich auch zu Delphi Kompatibel sein soll..... :mrgreen:
MFG
Michael Springwald

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

Re: Button in Listbox einfügen

Beitrag von theo »

pluto hat geschrieben:@theo
Einige Leute wollen halt mehr, als andere, klar das die LCL nicht alles kann.... aber etwas mehr währe schon nicht schlecht..... da sie ja angeblich auch zu Delphi Kompatibel sein soll..... :mrgreen:
Bin mir gar nicht so sicher, ob sich das Problem in der LCL befindet. Irgendwelche Komponenten auf komplexe System Controls draufzupappen war schon unter Delphi problematisch. Deshalb auch mein ursprünglicher Tipp.

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 »

Nun ja, unter Delphi verhält sich das Parent ganz anders. Z.B. war es ja möglich darüber eine MDI Anwendung "nachzubauen"..... In denn man einfach gesagt hat: From1.Parent:=Form2 *G*..... Es gibt jedoch viele kleinigkeiten, die auf die LCL-Zurückzuführen sind. Meine Liste wird ständig länger... Aber ich bin frohe das es Lazarus gibt, sonst müsste ich Java einsetzten oder was anders.... alles hat seine Nach und Vorteile... Zum Glück kann man sich ja relativ leicht seine eigene Komponente erstellen, die den Fehler dann nicht hat, aber dafür andere *G*....
MFG
Michael Springwald

Antworten