TMultiButton, ein Button mit einem integrierten Button

Zur Vorstellung von Komponenten und Units für Lazarus
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Nimral »

So, ich in wieder da. Termin gestern gut überstanden :-) Der Multibutton hat sich im produktiven Einsatz nicht schlecht geschlagen. Hier mal zwei etwas größere Probleme:

- Die Default-Caption wird während Runtime angezeigt, obwohl Caption (im Forms Designer) leer gesetzt wird. Die Anzeige im Forms Designer ist richtig. Workaround: ein Leerzeichen in der Caption eingeben.

Leere Caption wird Runtime angezeigt.png
Leere Caption wird Runtime angezeigt.png (58 KiB) 3896 mal betrachtet
Leere Caption wird falsch angezeigt.png
Leere Caption wird falsch angezeigt.png (49.67 KiB) 3896 mal betrachtet
Armin,

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von siro »

Ja, muss ich wohl bestätigen, das geht nicht richtig.
Ich vermute mal es liegt daran, dass CaptionChange nicht in dem Stream(in der .dfm) Datei gespeichert wird.

scheint so zu funktionieren.

Code: Alles auswählen

procedure TMultiButton.Paint;
....
 if csDesigning in ComponentState then    // wenn in der Designphase
   if not CaptionChange                   // Caption noch nicht geändert wurde
     then FCaption := self.Name;          // dann geben wir Caption den Komponentennamen
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wennerer
Beiträge: 518
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wennerer »

Hallo Siro, Hallo Nimral und alle Interessierten,
Nimral schrieb:
Die Default-Caption wird während Runtime angezeigt, obwohl Caption (im Forms Designer) leer gesetzt wird. Die Anzeige im Forms Designer ist richtig. Workaround: ein Leerzeichen in der Caption eingeben.
Siro schrieb:
Ich vermute mal es liegt daran, dass CaptionChange nicht in dem Stream(in der .dfm) Datei gespeichert wird.
Ich habe jedenfalls die Steilvorlage von Siro 1:1 so übernommen. Schien perfekt zu gehen. Leider musste ich feststellen das wenn man das Programm schließt und wieder öffnet es genau anders herum ist. Der Hinweis von Siro mit der lfm Datei und der von Nimral mit dem Leerzeichen hat mich dann auf die Idee gebracht im Setter "if aValue = '' then aValue:=' ';" einzutragen. Offensichtlich braucht die lfm Datei oder der Stream irgendwas was er speichern kann. Kann es mir nicht besser erklären. Bin mal gespannt ob es bei euch auch geht.

Siro schrieb:
Mich hatte der Code der GruppenTasten auch interessiert und der sieht recht ähnlich aus wie meiner,
wobei Du eine recht elegante Methode der Schleife benutzt hast, die ich so noch garnicht kannte.
for comp in self.Parent do
Ja ist genial. Hab ich von M.Fuchs abgeschaut :D viewtopic.php?f=55&t=13300

Die Taste mit Festhaltefunktion (ist dann wohl ein Schalter) hab ich in meiner Version gestern etwas halbherzig angefasst. Ist jetzt in der Komponente integriert. Einfach AllowsUp auf true stellen.

Nimral schrieb:
Hier mal zwei etwas größere Probleme
Was war denn das zweite Problem?

Siro schrieb:
Ich bin immer wieder erstaunt wie man über 2000 Zeilen Code schreiben kann für eine Taste.
Ja ist wahnsinn, und trotzdem hat man immer noch neue Ideen.

Ich hänge mal eine Version zum Testen an. Vielen Dank für euer Interesse!
Viele Grüße
Bernd
Dateianhänge
Testversion7.2.zip
(23.15 KiB) 114-mal heruntergeladen

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von aro »

Hallo,

prinzipiell arbeite ich genau so, das ich einfach ein Objekt von TCustomControl ableite, das eine Grafik anzeigt. Das ist nicht neu und man bekommt ganz einfach die Klickereignisse durchgereicht.
Ich bin immer wieder erstaunt wie man über 2000 Zeilen Code schreiben kann für eine Taste.
Wenn ich sehe welchen Aufwand Du dafür treibst verstehe ich die Welt nicht mehr. Das geht doch so viel einfacher . Wenn du dir meinen Beitrag

"sehr schnelle, einfache und ressourcensparende Grafik" mal anschaust, wirst Du verstehen was ich meine

wennerer
Beiträge: 518
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wennerer »

Hallo aro,
habe es mir schon runter geladen und mit großem Interesse angeschaut. Brauche da aber bestimmt noch einiges an Zeit und Probiererei um etwas dazu zu lernen.
PS: Ich bin nur Amateur, aber sehr Neugierig :D

Viele Grüße
Bernd

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Nimral »

Das zweite Problem ... da bin ich mir inzwischen nicht mehr sicher, ob der Button da Täter oder Opfer ist. Ich habe auf eine andere Anlage gewechselt, und dort tritt das Problem nicht auf.

Die Glyphen auf dem Button werden nach rechts unten verschoben. Nach wp's Hinweisen vom letzten Mal hab ich diesmal genauer hingeschaut, das schaut wieder nach dem Faktor 1,2 aus, der wiederum mit HighDPI und der 125% Einstellung von Windows 10 zusammen hängt. Die Zusammenhänge mit der Imagelist sind mir nach wie vor nur annähernd klar, da muss ich wohl nochmal Zeit beerdigen.

Ich denke, dass ich mit hoher Wahrsdcheinlichkeit irgendwo in der Ecke fündig werde, und dass der MultiButton nix dafür kann.

HG, Armin.

wennerer
Beiträge: 518
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wennerer »

Hallo Armin,
hast du diesen Beitrag schon mal gelesen?
https://www.lazarusforum.de/viewtopic.php?f=18&t=13170
Viele Grüße
Bernd

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Nimral »

Mehrmals gelesen, es ist mir nach wie vor aber mehr unklar als klar. Hier steht auch noch ein wenig zu dem Thema High-DPI:

https://forum.lazarus.freepascal.org/in ... ic=44071.0

.... wobei dort ein "Windows-Manifest" vom Himmel fällt, wo ich mich also auch noch irgendwie reinfuchsen muss.

Ich muss da am WE nochmal gründlicher drüber.

Armin.

in der Zwischenzeit, damit Dir nicht langweilig wird, mal die leise Anfrage, ob Du die Drag'n'Drop FUnktionen der normalen Buttons einbauen möchtest?

Und wo gibt es die neuesten Sourcen? Ich verliere langsam die Übersicht, welche neuesten Änderungen in welchem zip zu finden sind. Ich vermute, die 7.2 ist die Aktuellste?

Armin.

wennerer
Beiträge: 518
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wennerer »

Hallo Armin,
ja die 7.2 ist die letzte Version. Ist erstmal nur zum Testen gedacht. Mal sehen ob noch Jemand was enddeckt!
in der Zwischenzeit, damit Dir nicht langweilig wird, mal die leise Anfrage, ob Du die Drag'n'Drop FUnktionen der normalen Buttons einbauen möchtest?
Ich hab den DragMode bei den Buttons noch nie benutzt. Wenn ich das richtig sehe stellt man den DragMode auf dmAutomatic damit man zur Laufzeit was machen kann.
Stellt man DragKind auf dkDock kann man den Button mit der Maus verschieben und die Größe ändern. Wie beendet man die Aktion eigentlich? Was man mit dkDrag machen kann konnte ich noch nicht ergründen. Vielleicht könntest du mir zuerst mal erklären wie man den DragMode bei einem TButton nutzt?
Und welches Verhalten würdest du denn eigentlich benötigen bzw. was wäre das Ziel?
Viele Grüße
Bernd

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Nimral »

Die Anwendung ist eher ein netter Gag: ich habe einen Papierkorb Button, der alle markierten Objekte aus einer Liste (hier: VirtualTreeView) löscht. Für Mausfreaks ist es ein netter Gag wenn sie alternativ die markierten Objekte auf den Button ziehen können. Ein echter Datentransfer findet natürlich nicht statt, alleine der Drop Event auf den Button löst - wenn "Source is Liste" - das selbe aus wie onClick. Ich fand es eher kindisch, aber mit VTV und SpeedButton gehts mit 4 Zeilen Aufwand, ich habs eher beiläufig eingeschaltet, und zu meinem nicht ganz geringen Staunen kam das bei den künftigen Anwendern gut an. Vor allem die Surface Benutzer sind ganz wild auf Touch-Drag Bedienung von allem.

Was den Mechanismus dahinter betrifft kann ich nur über den im VirtualTreeView und den im Speedbutton ein wenig reden. DmAutomatic bewirkt m.W. nur, dass auf einem Control, das auf dmAutomatic steht, sofort losgedraggt werden kann. Setzt man dmManual muss man das Ziehen erst per Code einschalten. Sobald der Mauscursor im DnD Mode das Rectangle eines Controls betritt, bestimme ein "DragAllow" event ob der Drag'n'Drop Mauscursor angezeigt wird, und wenn ja und wenn der User das Element droppt feutert ein Event "OnDragDrop" beim Zielobjekt, dem das Control, wo losgedraggt wurde, übergeben wird. Ab da ist es dann kein Problem mehr, per Code festzustellen, was im Source Control geraade markiert war, und damit kann man dann machen was man will. Funktioniert hat nur die "kleine" Variante, also Drag'n'Drop per LCL, die geht nur innerhalb einer Applikation, die "Große" die mit OLE arbeitet und mit der man Drag'n'Drop zwischen verschiedenen Programmen machen kann hat nicht funktioniert, habe ich hier aber auch nicht gebraucht.

dkDock ist m.E. eher was für Container wie Fenster, Panels, Menüs und alldas, weniger für Formularelemente wie Buttons oder Listen.

Nicht kriegsentscheidend. Für mich halt ein Thema, weil ich ein Projekt, das auf Speedbuttons aufgebaut war (deren Hintergrund sich aber nicht färben lässt), auf Multibuttons umgezogen habe, und jetzt halt ungern auf eine nette Funktion verzichte, die beim Kunden gut angekommen ist.

Armin.

wennerer
Beiträge: 518
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wennerer »

Hallo Armin,
Ist eine coole Sache mit dem DragAndDrop. Hatte ich bis jetzt gar nicht auf dem Schirm. In der Anlage ein TestProjekt. Bei mir gehts. Schau mal bei Gelegenheit ob es Probleme gibt.
DragDrop.png
DragDrop.png (14.89 KiB) 3801 mal betrachtet
Du hast auch schon mal geschrieben das du Align vermisst. Mir leuchtet da die Anwendung nicht ein. Wo liegt da der Vorteil bei Benutzung von Align Eigenschaften?

Viele Grüße
Bernd
Dateianhänge
Testversion7.3.zip
(87.22 KiB) 116-mal heruntergeladen

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Nimral »

Align ist praktisch beim Aufbau von Menüs mit unkonstanten Button-Breiten, z.B. weil die Buttonbreiten der Caption-Textlänge folgen sollen. Mach einfach mal so ein schmales Menüband horizontal wie in meinen Screenshots, setz ein paar Speedbuttons drauf und setzen bei denen Align=alLeft oder alRight, und schon reihen sich die Buttons schön nebeneinander links und rechts im Gänsemarsch auf. Ich bin mir allerdings unsicher, ob das eine Nettigkeit des Formulardesigners ist, oder ob das auch zur Laufzeit funktioniert, wenn man z.B. die Button-Texte aus einer Language-Datei lädt und daher die Buttonbreiten nicht gleich sein müssen wie zur Design-Time. Ich vermute, es wird auch zur Laufzeit funktionieren.,

Für das jetzige Projekt aber irrelevant, da es garantiert nie übersetzt werden wird, kann ich die Buttonbreiten fest setzen und die Positionen der Buttons einmal austüfteln.

--> Prio irgendwo ganz, ganz hinten.

Den D&D probiere ich gleich morgen Abend aus und gebe Bescheid wie es läuft!

HG, Armin.

wennerer
Beiträge: 518
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wennerer »

Also ich habe jetzt mal schnell das mit dem Align getestet. Das geht ja super. Ich habe bis dato immer nur einen Button mit alLeft, einen mit alRight und einen Dritten mit alClient angelegt. Auf den Gedanken mehrere auf alLeft zu setzen bin ich von selbst nicht gekommen. Jedenfalls habe ich den MultiButton nun auch das Align vererbt.
Beim Testen ist mir noch aufgefallen das " for comp in parent do" (wegen GroupIndex) nur mit einer Form als Parent funktioniert (hatte ich vergessen). Hab ich schnell noch so umgeschrieben das Rückwärts bis zur Form gesucht wird. Das sollte jetzt dann auch funktionieren.
Im Anhang ist für jeden der möchte wieder was zum Testen.

Viele Grüße
Bernd
Dateianhänge
Testversion7.4.zip
(96.61 KiB) 121-mal heruntergeladen

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Nimral »

Hi Bernd, magst Du mal hier reinschauen?

viewtopic.php?f=18&t=13690&p=122201#p122201

Da gibt es einen Nebenast zum Multibutton, aber ich denke, das Problem mit High-DPI ist universell und ungelöst (auch dank einer grottenschlechten Dokumentation) und weil das Thema auf vier Bereiche aufgeteilt ist: Windows Anzeige-Einstellungen, Lazarus Projekteinstellung, Formular-Einstellung und schließlich noch komponentenspezifische individuelle Probleme wie z.B. Wahl der richtigen Schriftgröße und Aufbau einer ImageList.

Ein einziger Verhau von Fußangeln, wenns und abers, und garniert mit einer praktisch nicht existierenden Dokumentation, bereits der erste Absatz (nach dem Inhaltsverzeichnis ..) ergibt keinen Sinn mehr (https://wiki.freepascal.org/High_DPI/de)
DPI (dots per inch = Punkte pro Zoll) ist das Verhältnis zwischen Größe in Pixeln und der tatsächlichen Anzeigegröße. Hier steht "Punkt" (dot) als Äquivalent für Pixel in der Druckterminologie. Anwendungen können entweder Pixelgrößen verwenden, oder die aktuelle Anzeigegröße berücksichtigen.
1.) Nein, 96 ist ganz sicher kein Verhältnis, man kann aber vielleicht eins ausrechnen.
2.) In der Druckertechnologie gibte s exakt die selben Verwirrungen --> hilft nicht
3.) Anwendungen arbeiten immer mit Pixeln, ich habe jedenfalls nie einen Dialog gesehen der mit "Punkten" statt "Pixeln" definiert wird, und wüsste auch nicht dass das Windows API mit "Dots" etwas anfangen kann. Da auch die "aktuelle Anzeigegröße" auf Pixel hinausläuft ist das eine sinnlose Aussage.

Was Sinn machen würde: wenn man alle Größen in Dots (96 PPI Äquivalent) statt Pixeln eingeben könnte, aber das kann man m.E. nicht.

Und so geht es weiter.
Zum Beispiel bedeutet 300 DPI, dass es 300 Pixel (oder dot) pro Inch gibt. Wenn aber dafür 72 Punkte pro Inch definiert sind, so bedeutet das:
Jetzt sind 300 PPI wieder 300 DPI (nein, genau das sind sie ja nicht, deswegen das ganze Galama), und dann fällt plötzlich die 72 aus dem Himmel, die ist "definiert", schön für sie, aber in welchem Kontext?

Also wie genau funktioiniert das? Vielleicht bekommen wir eine Erkärung fürs Wiki zusammen die wirklich hilft, statt zusätzlich zu verwirren.

Armin

wennerer
Beiträge: 518
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wennerer »

Hallo,
ein erster Test mit Skalierung.
siehe viewtopic.php?f=18&t=13690

Viele Grüße
Bernd
Dateianhänge
Testversion7.5.zip
(116.95 KiB) 118-mal heruntergeladen

Antworten