TMultiButton, ein Button mit einem integrierten Button

Zur Vorstellung von Komponenten und Units für Lazarus
wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wp_xyz »

Ja, jetzt sehe ich es auch. Ratlos...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wp_xyz »

Die ImageIndexPropertyEditor scheint für deine Komponente die ImageListe nicht zu finden. Gespickt von einer der JVCL-Komponenten habe ich folgenden Code angepasst:

Code: Alles auswählen

uses
  PropEdits, GraphPropEdits;

type
  TTestImageImageIndexPropertyEditor = class(TImageIndexPropertyEditor)
  protected
    function GetImageList: TCustomImageList; override;
  end;

function TTestImageImageIndexPropertyEditor.GetImageList: TCustomImagelist;
begin
  Result := TTestImage(GetComponent(0)).Images;
end;
Damit funktioniert es. Im Anhang habe ich die Komponente damit ergänzt, sowie auch den von fliegermichl richtigerweise bemängelten nil-Check für FImageList eingefügt und das Notification- und Change-Handling für die ImageList aktiviert: Notification verhindert, dass die Komponente abstürzt, wenn die ImageListe vom Formular gelöscht wird, und das in SetImages eingebaute Change-Handling updatet die Komponente, wenn in die ImageListe (die ja selbständig ist und von der Komponente nichts weiß) Bilder eingefügt bzw. daraus gelöscht werden. Das geht über eine Zwischenklasse, FImageListChangeLink, die beide betroffenen Komponenten kennt.
Dateianhänge
ImageListTest-wp-2.zip
(7.7 KiB) 114-mal heruntergeladen
Zuletzt geändert von wp_xyz am Di 1. Jun 2021, 23:01, insgesamt 1-mal geändert.

wennerer
Beiträge: 507
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 wp_xyz,
ich habe es natürlich gleich probiert. Ja das geht!!! Mal wieder herzlichen Dank für deine Unterstützung. Da hätte ich noch sehr lange herumprobiert um irgendwas hin zu murksen was dann halt irgendwie geht..
Ich mach mich dann mal dran meinen MultiButton etwas umzubauen.
PS. dachte mir gleich das du nicht sehr lange ratlos bist :D

Viele Grüße
Bernd

Edit: Wer es testen möchte sollte in der Destroy noch "FImageListChangeLink.Free;" hinzufügen.

wennerer
Beiträge: 507
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 an Alle,
ich habe dank vieler Tipps und Anregungen meinen MultiButton nun ein weiteres Mal erneuert. Die Imagelist ist aus der Komponente herausgenommen und muss nun separat auf die Form gelegt werden. Im ersten Beitrag habe ich die Release 9 hochgeladen. Mit dabei sind vier Testprojekte. Getestet und entwickelt habe ich unter Linux Mint 64bit. Die Testprojekte habe ich native unter Win XP (32bit) und Win10 (64bit) kompiliert und kurz getestet. Linux 32bit und FreeBSD (64bit) habe ich crosskompiliert und in der VM ausgeführt. Es schien alles zu funktionieren. Wer möchte kann gerne mal testen und sowohl positive wie auch negative Rückmeldung geben, oder einfach auch nur seine Meinung zu der Komponente sagen.
Naja und so kann er aussehen (die Icons sind von hier https://commons.wikimedia.org/wiki/Tango_icons oder aus dem Lazarus Ordner):
Versionen.png
Versionen.png (143.12 KiB) 3169 mal betrachtet
Viele Grüße
Bernd
Dateianhänge
Menüband.png
Menüband.png (90.77 KiB) 3169 mal betrachtet

wennerer
Beiträge: 507
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 »

Noch ein kurzer Nachtrag:
Bin eben auf die Idee gekommen das Widgetset auf qt5 umzustellen und musste feststellen das hier offenbar rgb zu bgr im Vergleich zu gtk2 vertauscht ist. Ich habe es nun noch mit if def abgefragt. Deshalb jetzt die Version 9.1.

Viele Grüße
Bernd

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von fliegermichl »

Also spätestens jetzt sollte man getmem bitten, den Multibutton in den OPM aufzunehmen.
Top!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wp_xyz »

Ich hätte noch ein paar Anmerkungen:

- Es befinden sich im Quellcode noch einige deutsche Kommentare und deutsche Bezeichner (AlphaBlende). Vor einer breiten Veröffentlichung im OPM würde ich diese ins Englische übersetzen, um anderssprachliche User nicht auszuschließen.

- Generell: Der Button hat sehr viele Einstellmöglichkeiten. Wenn mir jetzt die Defaulteinstellung nicht gefällt, muss ich sehr viele Änderungen vornehmen, und wenn ich viele solche Buttons im Projekt habe, an vielen Stellen wiederholen - kein Wunder, wenn da etwas vergessen wird. Mir schwebt da sowas wie ein TMultiButtonStyleManager vor, eine eigene Komponente, in der man zentral alle Grundeinstellungen vornimmt (also alles außer z.B. Caption, ImageIndex, ...). TMultiButton bekommt ein Property StyleManager und holt sich seine Einstellungen von dem StyleManager. Wenn der StyleManager an den MultiButton angeschlossen ist, kopiert der Manager alle Properties in den MultiButton und aktualisiert auch den MultiButton, wenn sich eine der Einstellungen im StyleManger ändert. Die Properties im MultiButton sind in diesem Fall wirkungslos; sie werden nur benötigt, wenn kein StyleManager angeschlossen ist. Oder man könnte sich auch vorstellen, dass Einstellungen, die von denen des StyleManagers abweichen, auch weiterhin nicht mehr von diesem synchronisiert werden (wobei sich aber das Problem ergibt, wie man mit dem Fall umgeht, dass man zuerst die Einstellungen des MultiButton ändert, dann den StyleManager anschließt und sich wundert, warum die Einstellungen des StyleManagers nicht übernommen werden).

- Nochmals High-DPI: Die Paletten-Icons der Komponente sind nicht mitgeliefert, und ich bin nicht in die Details gegangen. Aber hast du daran gedacht, diese in drei Auflösungen anzulegen und in die Resource zu schreiben? Das 24x24 Grundbild trägt den Namen der Komponente und entspricht der 100%-Auflösung. Dann brauchst du noch ein Bild in 150% (36x36) - das trägt den Zusatz "_150" am Ende das Dateinamens, sowie ein Bild in 200% (48x48) mit Zusatz "_200". Die IDE sorgt dann dafür, dass je nach Bildschirmpixeldichte das Icon in der richtigen Größe in der Komponenten-Palette verwendet wird.

- Du fügst die Komponente in die Palette "Standard" ein. Du kannst das natürlich machen wie du willst, aber ich sehe die Paletten "Standard", "Additional" und "Common Controls" als die für die Delphi-Komponenten an, und würde da nicht nach einer Fremdkomponente suchen. Entweder du spendierst dem Button eine eigene Lasche (ok - für ein, zwei (mit StyleManager) ist eine eigene Lasche vielleicht übertrieben), oder du packst sie in "Misc".

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Michl »

Wenn ich den Verlauf hier sehe, Respekt, super Arbeit!

Nur als Anregung, wäre es nicht besser, da die Source ja verfügbar ist, diese Arbeit per Versionskontrolle offiziell zu pflegen (z.B. SourceForge, GitHub etc.)? Dann könnte man besser bei möglichen Problemen Ursachen finden. Auch Patches sind dann recht einfach erstellbar.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

siro
Beiträge: 730
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 »

Hallo Bernd,
ich muss leider ein Problemchen melden. Im Projekt "TestProjekt2_Menueband" bekomme ich einen Fehler in PointInEllipse
Jetzt muss ich gleich dazu sagen, es ist extrem problematisch diesen Fehler zu reproduzieren,
ich habe es aber schon 6 mal hinbekommen.
Bern_02.jpg
Bern_02.jpg (13.76 KiB) 3145 mal betrachtet
Bern_01.jpg
Bern_01.jpg (93.81 KiB) 3145 mal betrachtet
Nachdem der Fehler aufgetreten war, habe ich das Programm erneut gestartet und alles ist okay.
Irgendwann nach dem x ten Start tauchte der Fehler aber wieder auf und nun habe ich festgestellt,
das der Übergabeparameter aRect in PointInEllipse anscheinend komplett auf 0 steht.
Die x und y Werte sind jedoch initialisiert.

Übergabeparameter x = 50 y=28
Übergabeparameter x = 53 y=23

aRect ist komplett 0
Bern_06.jpg
Bern_06.jpg (46.39 KiB) 3145 mal betrachtet
Was habe ich genau gemacht :
Ich bin quasi alle Buttons durchgegangen:

Neu
unteren Neu Button
Öffnen
unteren Öffnen Button
Schließen
unteren Schließen Button
Speichern
Unteren Speichern Button
Speichern Unter
unteren Speichern Unter Button
Exportieren
unteren Exportieren Button
Drucken
unteren Drucken Button
Info
unteren Info Button

dann alle "Laufwerkstasten" ein mal klicken
dann die Fahnen nacheinander,
bei der 2ten oder 3 Fahne passierte dann der Fehler

Ob das mit der Reihenfolge so zusammenhängt kann ich nicht sagen, zumindest reproduzierbar, wenn auch nicht immer, war es bei mir in dieser Reihenfolge.

Nach erneutem Start des Programms habe ich es dann aber nicht mehr hinbekommen.
So habe ich Lazarus verlassen und das Projekt aus dem Explorer neu in Lazarus geladen und dann konnte ich den Fehler wieder reproduzieren.

Jetzt habe ich das nochmal ausprobiert außerhalb der IDE, also direkt die .exe aufgerufen
und hier trat der Fehler auch auf:
Bern_07_Exe.jpg
Bern_07_Exe.jpg (55.48 KiB) 3145 mal betrachtet
Ich denke mal es wird sicher schwierig das zu ergründen...

Ansonsten wieder Super Chick die Oberfläche.

Achja, ich habe Windows 10 64Bit und Lazarus 2.08 FPC 3.04
-----
ein erneuter Versuch: Nur die Buttons der Reihe nach durchgeklickt und es tritt wieder bei der 3 Fahne ein Fehler Fehler auf,
Nochmal probiert, Ja wieder.

Jetzt ist es direkt nach dem 2ten Fahnenklick aufgetreten., also nach dem Starten nur die ganz rechte Fahne, dann die daneben und bum...

Siro
Zuletzt geändert von siro am So 6. Jun 2021, 13:59, insgesamt 1-mal geändert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wennerer
Beiträge: 507
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 zusammen,
vielen Dank für die Rückmeldungen!
@Siro: Ich habe es jetzt unter Windows10 und Linux x mal probiert, bei mir kommt es leider nicht. Aber wenn es immer bei der Flagge kam dann hat es mich zuerst mal gewundert das da die PointInEllipse überhaupt aufgerufen wird. Ich habe da in der Case-Abfrage bei mbsCircle die Function für die Ellipse, statt der für deinen Kreis hinterlegt. Das habe ich jetzt angepasst. Das kann aber nicht der Grund für die Division durch Null sein, deshalb habe ich in der MouseMove noch eine Abfrage auf Hotspot.width<=0 eingebaut. Eventuell wird da ab und an der MessageButton nicht rechtzeitig berechnet? Ich hänge mal meinen Test (9.2)an. Wenn du möchtest kannst du es ja bei Gelegenheit mal testen.

Ansonsten Danke für die positiven Antworten.
@fliegermichl:
An so was wie den OPM habe ich als "Hobby-Akrobat" ehrlich gesagt noch nicht gedacht. Da spricht aus meiner Sicht zwar nichts dagegen, jedoch bin ich mir bei weitem nicht sicher ob nicht noch irgendwo, in irgendeiner Konstellation ein Wurm drin ist. Ich glaube auch nicht das ich mit meinem Wissen auf jedes Fehlverhalten immer eine Antwort haben werde.
@michl:
Ja sicherlich. Ich lese auch hier im Forum die Beiträge zu SourceForge und GitHub schon länger mit Interesse. Ich konnte mich aber noch nicht aufraffen. Ich nehme es mir mal für den nächsten Winter vor. Ich denke aber das ist mit Nullahnung schon ein Pfund.
@wp_xyz:
Kurzum du hast mit allem Recht. Die Paletten-Icons habe ich schlicht vergessen. Kann ich bei der nächsten Version aber hinzufügen. Die Idee mit dem TMultiButtonStyleManager fasziniert mich, auch wenn ich da bestimmt länger dran knobeln werde. Ich dachte bis jetzt an eine Funktion wie "alles auf Systemfarben setzen", habe aber gemerkt das das unter verschiedenen OS gar nicht so leicht geht. Jedenfalls habe ich wieder viel zum Nachdenken!

Viele Grüße
Bernd
Dateianhänge
multibutton.pas
(83.05 KiB) 123-mal heruntergeladen

siro
Beiträge: 730
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 »

Ich wunderte mich auch warum er PointInEllipse aufruft. Ich habe mal einen BreakPoint direkt drauf gesetzt.
Ja, er landet dort und dann tritt der Fehler auf.

Bei deiner neuen Version kommt er da anscheinend nicht mehr an.
Sieht gut aus.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Soner »

Sieht gut aus.

Edit: Lizenz hatte ich falsch verstanden, es ist okay.

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

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Nimral »

Hi Jungs,

bin wieder zurück aus dem - computerlosen - Urlaub :-) Ich sehe, da hat sich einiges getan am Button, Respekt! Werde mein Projekt gleich mal nachziehen auf die letzte Version.

Auf frohes Werkeln ... bis zu den nächsten Ferien :-)

HG, Armin.

P.S. ich schließe mich Siros Anregung, ein SVN oder GIT zu machen, gere an. Wenn Dir (Bernd) das zu mühsam ist, ich habe ein GIT am Start, und biete Dir gerne an, dort eine Heimat für den Button einzurichten. Aber ein Git ist in 10 Minuten gemacht ... gut, GIT gehört Microsoft, passt mir auch nicht, aber was solls. Nachdem sie sich schon meinen Rechner unter den Nagel gerissen haben - Windows 10 kommt einer Enteignung der Hardware ziemlich nahe - sollen sie halt den Rest auch noch haben. Wer bin ich kleiner Krabbler um gegen einen Milliardenkonzern anzustänkern.

Nur meinen Hund, den bekommen sie nicht!

Ich hätte auch noch ein SVN bei SourceForge, aber irgendwie haben ich den Eindruck, SVN geht zunehmend den Bach runter, jedenfalls muss ich meistens erklären, warum ich "noch" SVN habe und "immer noch" kein GIT.

HG, Armin.

wennerer
Beiträge: 507
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,
na da hoffe ich mal du hast dich gut erholt. Meine computerfreie Zeit (Urlaub) beginnt am Freitag. Vielen Dank für dein Angebot mit Git. Ich denke aber über kurz oder lang muss ich den Schritt wohl wagen und mich damit selber beschäftigen.
Über das von Siro geschilderte Problem habe ich noch etwas nachgedacht. Leider kann ich es auch nach längerem Testen bei mir nicht nachstellen. Wenn es bei den Fahnen kommt hängt es aber damit zusammen das der MessageButton noch nicht berechnet wurde und in der MouseMove bereits die PointIn.. aufgerufen wird, was dann eine Division durch Null (weil Hotspot noch leer ist) verursacht. In der Komponente befindet sich die Property CalculateAlthoughInvisible (berechnen obwohl unsichtbar). Die ist dafür gedacht das falls der MessageButton erst zur Laufzeit sichtbar wird, er bereits beim Start des Programmes die richtige Größe hat. Diese Eigenschaft wird nun beim Setzen von ShowMsgButtonInGroup automatisch gesetzt. Das bedeutet beim Starten des Programmes wird in dem Fall der Hotspot des MessageButtons definitiv berechnet und steht immer zur Verfügung. Nachteil: wenn man dann das Design des Buttons nochmal um schmeist und ShowMsgButtonInGroup wieder weg nimmt muss man halt die aktivierte Eigenschaft CalculateAlthoughInvisible falls gewünscht wieder deaktivieren.
Ich hoffe damit ist das Problem sicher behoben. In der Anlage für jeden der es Testen möchte die optimierte Version 9.3.
Sofern ich nichts übersehen habe sind nun alle deutschen Kommentare durch englische ersetzt. Auch habe ich drei Paletten-Icons in den passenden Größen eingefügt und die Komponente in die Palette "Misc" verschoben.
Viele Grüße und Danke für alle Rückmeldungen
Bernd
Dateianhänge
multibutton.pas.zip
(14.04 KiB) 115-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,

Houston ... ich hab da ein paar Probleme mit dem MultiButton. Im Zusammenhang mit High-DPI und WIndows 10.

Problem 1 (Mini-Problem zum Aufwärmen): der Speedbutton reagiert richtig auf das Verstellen der Anzeigeskalierung zur Laufzeit, das klappt sogar wenn ich (in einer Dual-Monitor Konfig) das laufende Programm zwischen einer 100% und einer 150% Anzeige hin und herschiebe. Der Multibutton reagiert nicht, er ändert sich erst wenn das Programm neu gestartet wird.
Nach Veränderung der Anzeigeskalierung von 100 auf 150%, ohne Neustart des Programms.
Nach Veränderung der Anzeigeskalierung von 100 auf 150%, ohne Neustart des Programms.
MultiButton_150_dynamisch.png (7.48 KiB) 2899 mal betrachtet
Problem 2 (Demo-Projekt hängt an): das Auswählen des geeignetsten Icons aus der ImageList arbeitet nicht, oder ich finde nicht heraus wie ich es richtig konfigurieren muss. Der Speedbutton machts richtig und geht bei Skalierung=150% vom 16 Pixel Icon auf das 24 Pixen Icon, der Multibutton rechnet das 16x16 Image groß. Beide verwenden die selbe ImageList, da sollten sich doch eigentlich beide gleich verhalten?
MultiButton_100.png
MultiButton_100.png (4.6 KiB) 2899 mal betrachtet
MultiButton_150.png
MultiButton_150.png (8.53 KiB) 2899 mal betrachtet
Zum Testen verwende ich einen 96Dpi Schirm und schalte unter WIndows bei den Anzeigeeinstellungen zwischen 100% und 150% um. Ich bekomme allerdings exakt das selbe Verhalten wenn ich das Programm rübernehme auf mein Laptop, das hat einen High-Dpi Schirm mit 140Dpi.

Verwendete Versionen:

Lazarus 2.0.12, Windows 10 21H1/Windows 7, MultiButton 1.1.9.3 aus dem Forenbeitrag oben.

Zum Problem von Siro: leider kann ich dazu keinen nützlichen Beitrag liefern, ich verwende den Button jetzt schon ca. 4 Wochen produktiv, und hatte keinen einzigen Absturz. Ich verwende allerdings nur den "äußeren" Button.
Dateianhänge
HighDPI.zip
(1.18 MiB) 107-mal heruntergeladen

Antworten