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 »

Ist es beabsichtigt, dass der Speedbutton Imageindex 1 hat, der MultiButton aber ImageIndex 0, wobei man im ImageList-Editor sieht, dass beim Image 0 nur das Bild in der 16er-Auflösung geladen wurde?
Zuletzt geändert von wp_xyz am Di 22. Jun 2021, 22:04, 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 »

Hi,
da wo ich gerade bin habe ich nur ab und an Internetzugang. Sobald ich Zuhause bin schau ich es mir gerne mal an.
PS: Meine Finger und mein Handy passen nicht so richtig gut zusammen.
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 »

wp_xyz hat geschrieben:
Di 22. Jun 2021, 15:44
Ist es beabsichtigt, dass der Speedbutton Imageindex 1 hat, der MultiButton aber ImageIndex 0, wobei man im ImageList-Editor sieht, dass beim Image 0 nur das Bild in der 16er-Auflösung geladen wurde?
S****, der geht auf mich :-) Ist es natürlich nicht.

Korrigiert, und schon klappt es. Bleibt nur noch das kleinere Problem übrig, nämlich dass der Multibutton nicht auf das Wechseln der Größeneinstellung reagiert, wenn das Programm bereits läuft. Aber das ist nicht so furchtbar wichtig.

Eine gute Nacht noch, und entschuldigt wenn ich eure Zeit mit einem Eingenfehler verschwendet habe ...

Armin.

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

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wp_xyz »

@wennerer: Bin nicht sicher, ob das folgende richtig ist, aber dass du in DoAutoAdjustLayout auch Font.Height mit skalierst, kommt mir seltsam vor, das habe ich noch nie gesehen, denn eigentlich sollte die Skalierung des Font mit Namen "Font" schon in "inherited" behandelt sein. Nur wenn der Font anders heißt, gibt es nochmals die geerbte Methode ScaleFontPPI, die überschrieben werden muss, und ich meine, dass das hier für den Font des MessageButton zu tun ist weil dieser ja nur ein TPersistent ist und von der ganzen Skaliererei nur über den zugehörigen TMultiButton etwas mitkriegt:

Code: Alles auswählen

procedure TMultiButton.ScaleFontPPI(const AToPPI: Integer; const AProportion: Double);  // override nicht vergessen!
begin
  inherited;
  DoScaleFontPPI(FMessageButton.Font, AToPPI, AProportion);  
 end;
Das gibt noch Probleme zur Designzeit mit dem Default-Font. Um diese zu beheben, gibt es in Trunk noch die folgende Methode:

Code: Alles auswählen

uses
  LCLVersion;
{$IF LCL_FullVersion >= 2010000}  
procedure TMultiButton.FixDesignFontsPPI(const: ADesignTimePPI: Integer);  // wieder: override
begin
  inherited;
  DoFixDesignFontPPI(FMessageButton.Font, ADesignTimePPI);
end;
{$IFEND} 

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

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von Nimral »

Hi Bernd,

ich hoffe, Du hats noch ein paar Nerven übrig für letzte kleinere Fehlerkorrekturen? Das Problem mit den Klötzchen in den gerundeten Ecken ist immer noch oder wieder da (V1.1.9.3 - 7.6.2021). Sie erscheinen, sobald der Button ein mal fokussiert(gedrückt) wurde.
2021-06-30 08_35_51-(1) TMultiButton, ein Button mit einem integrierten Button - Seite 5 - Deutsches.png
2021-06-30 08_35_51-(1) TMultiButton, ein Button mit einem integrierten Button - Seite 5 - Deutsches.png (3.82 KiB) 3643 mal betrachtet
Das angehängte Demo-Projekt ist Teil von etwas Größerem, das Problem tritt auch auf, wenn der ganze Summs mit dem Timer und dem Zuweisen des Images zur Laufzeit draußen ist.

HG, Armin.
Dateianhänge
EncryptedFileTest.zip
(110.63 KiB) 112-mal heruntergeladen

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,
keine Angst ich habe ganz gute Nerven :D .
Ich habe dein Testprojekt eben mal probiert. Vielleicht habe ich da ein Verständnissproblem mit dem Fokus. Allerdings denke ich der MultiButton verhält sich so wie andere Controls auch.
Der Rahmen um den Button zeigt an das der Button den Eingabefokus besitzt. Wenn ich den MultiButton drücke hat er den Eingabefokus bis ein anderes Control (hier das Edit) den Fokus bekommt (z. Bsp. durch drücken oder die Tab-Taste). Sind die Ecken da (also Fokusiert) kann der Button mit der Entertaste ausgelöst werden. Das Edit hat bei mir wenn es den Fokus hat einen kleinen grünen Rand und ein TButton besitzt dann ein kleines Rechteck. Beide behalten den Fokus bis ein anderes Control den Fokus bekommt.
Editfeld.png
Editfeld.png (3.43 KiB) 3626 mal betrachtet
Button.png
Button.png (5.73 KiB) 3626 mal betrachtet
Wenn wie in deinem Fall die Ecken blöd aussehen kann man noch die Eigenschaft FocusedOn auf false stellen dann wird der Fokusrahmen nicht angezeigt. Der Button erhält dann aber trotzdem noch den Eingabefokus und man kann ihn mit der Entertaste auslösen. Leider sieht man dann aber halt nicht das er den Fokus hat.
Eventuell liege ich jetzt auch ganz falsch aber dann musst du mir noch etwas besser beschreiben wie es richtig gehen müsste.
PS: Ich habe gestern Abend mal mit ScaleFontsPPI herum gespielt. Wenn das drin ist wechseln die Bilder auch wenn man zur Laufzeit umstellt. Das mit dem FixDesignFontsPPI habe ich noch nicht begriffen. Da greife ich am Wochenende nochmal an.

Viele Grüße
Bernd

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 in der Zwischenzeit einiges probiert und möchte mich deshalb zum Thema MultiButton mal wieder melden.
wp_xyz schrieb:
Bin nicht sicher, ob das folgende richtig ist, aber dass du in DoAutoAdjustLayout auch Font.Height mit skalierst
Das ist natürlich nicht okay. Ich habe die Methode ScaleFontsPPI wie von dir beschrieben aufgenommen.

nimral schrieb wegen HighDPI:
Der Multibutton reagiert nicht (zur Laufzeit), er ändert sich erst wenn das Programm neu gestartet wird.
Mit der Aufnahme von ScaleFontsPPI ist das Verhalten identisch mit einem SpeedButton . Ich musste in den Projekteinstellungen noch bei DPI Anpassung Vista-8:an,8.1+:pro Monitor(True/PM) auswählen damit es zur Laufzeit funktioniert.

wp_xyz schrieb:
Das gibt noch Probleme zur Designzeit mit dem Default-Font. Um diese zu beheben, gibt es in Trunk noch die folgende Methode (FixDesignFontsPPI)
Ich denke ich habe es wie von dir beschrieben aufgenommen, bin mir aber nicht sicher ob das so passt. Ich habe mir in fpcupdeluxe die neueste Trunk geholt jedoch springe ich nicht in den Code nach {$IF LCL_FullVersion >= 2010000}. Es klappt auch nicht wenn ich mit der Versionsnummer runter gehe. Erst wenn ich 0 eingebe wird der Code schwarz.
Eventuell mache ich da was falsch!

wp_xyz schrieb:
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".
Darüber habe ich noch länger nachgedacht. Ich habe mich jetzt doch dazu entschieden eine eigene Lasche zunehmen (Multi). Ich denke man findet es dann einfach besser, und wer die Komponente in einer anderen Lasche haben möchte kann die ja problemlos selber verschieben.

wp_xyz schrieb:
- 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
Wie schon gesagt hat mich der Gedanke gleich fasziniert. Ich hänge hier im Beitrag mal meinen ersten Versuch an. Da fehlt bestimmt noch einiges. Vor allem weiß ich aber nicht ob ich in die richtige Richtung laufe und möchte deshalb erst mal hören wie die Kritik ausfällt.
StyleManager.png
StyleManager.png (90.87 KiB) 3560 mal betrachtet
Schön wären jetzt noch Hints für alle Controls und natürlich i18n. Was mir aber noch wirklich fehlt wäre "Einstellung speichern" und "Einstellung laden". Sollte ich mich beim Speichern an ein bestimmtes Format halten oder kann ich das machen wie ich möchte?

Im Anhang befinden sich neben dem Package auch wieder Testprogramme. Ich würde mich wie immer sehr über Kritik und Meinungen freuen!

Viele Grüße
Bernd
Dateianhänge
Multis0.0.1.zip
(835.41 KiB) 118-mal heruntergeladen
Zuletzt geändert von wennerer am Di 13. Jul 2021, 22:08, insgesamt 2-mal geändert.

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

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wp_xyz »

wennerer hat geschrieben:
So 11. Jul 2021, 07:29
wp_xyz schrieb:
Das gibt noch Probleme zur Designzeit mit dem Default-Font. Um diese zu beheben, gibt es in Trunk noch die folgende Methode (FixDesignFontsPPI)
Ich denke ich habe es wie von dir beschrieben aufgenommen, bin mir aber nicht sicher ob das so passt. Ich habe mir in fpcupdeluxe die neueste Trunk geholt jedoch springe ich nicht in den Code nach {$IF LCL_FullVersion >= 2010000}. Es klappt auch nicht wenn ich mit der Versionsnummer runter gehe. Erst wenn ich 0 eingebe wird der Code schwarz.
Du meinst, dass der Code im Editor ausgegraut ist, obwohl du Trunk verwendest? Das ist ein Bug der IDE.
wennerer hat geschrieben:
So 11. Jul 2021, 07:29
wp_xyz schrieb:
- 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
Wie schon gesagt hat mich der Gedanke gleich fasziniert. Ich hänge hier im Beitrag mal meinen ersten Versuch an. Da fehlt bestimmt noch einiges. Vor allem weiß ich aber nicht ob ich in die richtige Richtung laufe und möchte deshalb erst mal hören wie die Kritik ausfällt.
StyleManager.png

Schön wären jetzt noch Hints für alle Controls und natürlich i18n. Was mir aber noch wirklich fehlt wäre "Einstellung speichern" und "Einstellung laden". Sollte ich mich beim Speichern an ein bestimmtes Format halten oder kann ich das machen wie ich möchte?
Das Speichern würde ich dem User überlassen. Wichtig ist nur, dass die Werte des Stylemanager gestreamt werden, also in der lfm-Datei auftauchen - und das machst du ja auch, weil die entsprechenden Properties "published" sind. Somit kann der User zur Designzeit den Stylemanager einstellen, das wird in der lfm-Datei gespeichert und bei jedem Compiler-Run verwendet. Wenn der User darüber hinaus einen Einstell-Dialog hat und die Einstellungen zur Laufzeit ändert, dann muss er selbst für die Speicherung sorgen so wie bei jeder anderen Eigenschaft (z.B. mit dem TXMLPropStorage). Wenn du ihn hier z.B. zum Speichern in einer xml-Datei zwingst, er speichert sonst aber alles in einer ini-Datei, hat er plötzlich zwei Konfigurationsdateien zu verwalten - unschön.

Zu deinem Entwurf:
- Du musst noch dafür sorgen, dass die Änderung der Stylemanager-Eigenschaften im Objekt-Inspektor gleich im Formular angezeigt werden. Es muss möglich sein, die Eigenschaften ohne deinen Einstelldialog vornehmen zu können.
- Ich würde den StyleManager eher "MultiButtonStyleManager" nennen, denn "StyleManager" suggeriert viel mehr.
- Zustands- oder Logik-Variablen wie "Down" oder "AllowsUp" oder "GroupIndex" würde ich da nicht aufnehmen, sondern nur das, was das Aussehen beeinflusst.
- Die Buttons "Abort" und "Okay" des Einstelldialogs würde ich als normale Buttons ausführen, jetzt ist es verwirrend, weil ihr Zweck nicht gleich klar ist. (OK - wenn der Einstelldialog vom Benutzerprogramm aus aufgerufen wird, nicht von der IDE aus, ist das vielleicht anders...). Und warum nimmst du nicht die üblichen Bezeichnungen "Cancel" und "OK"? Evtl wäre auch ein Butten "Apply" sinnvoll, der die Einstellungen in die Anwendung überträgt, aber den Einstelldialog geöffnet lässt.

Noch ein Nachtrag zum MultiButton:
- Es gibt da kein AutoSize. Das wäre eine der wesentlichsten Eigenschaften, um eine plattform-übergreifende Anwendung zu schreiben. Du müsstest dafür die Methode CalculatePreferredSize überschreiben.

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,
vielen Dank für deine Antwort. Ich habe sie gestern gleich gelesen, musste aber erst mal denken und probieren.
Du musst noch dafür sorgen, dass die Änderung der Stylemanager-Eigenschaften im Objekt-Inspektor gleich im Formular angezeigt werden. Es muss möglich sein, die Eigenschaften ohne deinen Einstelldialog vornehmen zu können.
Das sollte jetzt gehen. In dem Zug habe ich den Code noch so geändert das man zur Laufzeit die Stylmanagereinstellungen überschreiben kann.
Ich würde den StyleManager eher "MultiButtonStyleManager" nennen, denn "StyleManager" suggeriert viel mehr.
Ich habe ihn nun MultiButton_StyleManager im OI genannt damit ich keine Namensgleichheit mit der Unit habe.
Zustands- oder Logik-Variablen wie "Down" oder "AllowsUp" oder "GroupIndex" würde ich da nicht aufnehmen, sondern nur das, was das Aussehen beeinflusst.
Ich habe den Reiter Various komplett entfernt. Falls ich es immer noch zu gut meine und es zu viele Eigenschaften sind kann ich ja noch was entfernen.
Die Buttons "Abort" und "Okay" des Einstelldialogs würde ich als normale Buttons ausführen, jetzt ist es verwirrend, weil ihr Zweck nicht gleich klar ist. (OK - wenn der Einstelldialog vom Benutzerprogramm aus aufgerufen wird, nicht von der IDE aus, ist das vielleicht anders...). Und warum nimmst du nicht die üblichen Bezeichnungen "Cancel" und "OK"? Evtl wäre auch ein Butten "Apply" sinnvoll, der die Einstellungen in die Anwendung überträgt, aber den Einstelldialog geöffnet lässt.
Die Buttons habe ich umbenannt und auch einen Applybutton habe ich eingefügt.
Das Speichern würde ich dem User überlassen. ....
Ich glaube da hast du mich mißverstanden. Stell dir vor du hast in einem Projekt ein tolles Design entworfen und möchtest es in einem andern Projekt genauso wieder verwenden.
Für den Fall möchte ich die Einstellungen irgendwo speichern und in einem anderen Projekt aufrufen können. Man hätte dann sofort ein bereits vorher schon mal verwendetes Design immer wieder parat. Ich habe zum Testen mal zwei Buttons für save und load eingefügt. Die Dialoge habe ich weggelassen und es wird nur ColorStart und ColorEnd gespeichert. Man kann hier mal im Editor am DesignButton ColorStart und-End einstellen dann speichern und mit cancel verlassen. Dann den Editor wieder öffnen und auf load klicken dann sollten die Einstellungen sichtbar sein (hoffe ich jedenfalls).
Noch ein Nachtrag zum MultiButton:
- Es gibt da kein AutoSize. Das wäre eine der wesentlichsten Eigenschaften, um eine plattform-übergreifende Anwendung zu schreiben. Du müsstest dafür die Methode CalculatePreferredSize überschreiben.
Ja, ein AutoSize wäre sehr schön. Ich habe die Property AutoSize vererbt und die Procedure CalculatePreferredSize eingefügt. So ganz habe ich aber noch nicht verstanden wann die Procedure aufgerufen wird. Bei meinen ersten Tests wurde die Procedure nur beim ersten Klick auf AutoSize im OI und immer beim Kompilieren des Projektes aufgerufen. Die Werte die ich an PreferredWidth und PreferredHeight zugewiesen habe werden an width und height zugewiesen. Wäre die richtige Vorgehensweise folgende: damit zur Designzeit die Procedure zum Beispiel bei einer Änderung der Caption aufgerufen wird muss ich diese selber im Setter der Caption aufrufen? In der Prozedure berechne ich dann die benötigte Breite und Höhe des Buttons und weise die Werte an PreferredWidth und PreferredHeight zu?

Über eine Antwort würde ich mich sehr freuen und hoffe das ich nicht zu sehr nerve!

Viele Grüße
Bernd
Dateianhänge
Multis0.0.2.zip
(632.7 KiB) 120-mal heruntergeladen

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

Re: TMultiButton, ein Button mit einem integrierten Button

Beitrag von wp_xyz »

Wegen AutoSize kannst du z.B. beim TButton spicken (oder genauer beim TCustomButton) - etwas anderes mache ich auch nicht. Da gibt es eine Methode "TextChanged" - die ist virtuell (override), wird also aufgerufen, wenn sich der "Text" (beim Button ist das "Caption") ändert:

Code: Alles auswählen

procedure TCustomButton.TextChanged;
begin
  InvalidatePreferredSize;
  if Assigned(Parent) and Parent.AutoSize then
    Parent.AdjustSize;
  AdjustSize;
  inherited TextChanged;
end;
"InvalidatePreferredSize" macht die aktuelle Größe für AutoSize ungültig, und AdjustSize ruft die automatische Größenanpassung auf; das Parent.AdjustSize vorher sorgt dafür, dass sich auch der Parent der neuen Größe anpasst (frag mich nicht, warum das vorher steht...).

Die unvollständige Aufrufkette von AdjustSize ist:

AdjustSize --> DoAllAutoSize ---> DoAutoSize ---> GetPreferredSize --->CalculatePreferredSize.

Das alles wird teilweise nicht sofort ausgeführt, sondern erst durch Flags zur Ausführung vorgemerkt. Insgesamt ist der Komplex Größen- und Positionsberechnung mit AutoSize, Anchoring, ChildSizing usw. in meinen Augen mit das komplizierteste, was die LCL zu bieten hat. Ich bewundere die Leute, die sich sowas ausdenken können!

CalculatePreferredSize für TCustomButton steht im Widgetset, für Windows in der Datei interfaces/win32/win32wsstdctrls:

Code: Alles auswählen

class procedure TWin32WSButtonControl.GetPreferredSize(const AWinControl: TWinControl;
  var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean);
begin
  if MeasureText(AWinControl, AWinControl.Caption, PreferredWidth, PreferredHeight) then
  begin
    Inc(PreferredWidth, 20);
    Inc(PreferredHeight, 4);
    if WithThemeSpace then
    begin
      Inc(PreferredWidth, 6);
      Inc(PreferredHeight, 6);
    end;
  end;
end; 
MeasureText ist eine Windows-Funktion, die du aber durch eine Canvas-Methode ersetzen können müsstest. Grob geschnitzt könnte das dann beim MultiButton so aussehen:

Code: Alles auswählen

procedure TMultiButton.CalculatePreferredSize(var PreferredWidth,
  PreferredHeight: integer; WithThemeSpace: Boolean);
begin
  PreferredWidth := Canvas.TextWidth(Caption) + 32;
  PreferredHeight := Canvas.TextHeight(Caption) + 16;
  // oder dein CalculateDimensions einbauen...
end; 
Im folgenden nur ein paar Gedanken, kein funktionsfähiger Code:

Das oben bereits erwähnte Textchanged funktioniert bei TMultiButton nicht, ich denke, das liegt daran, dass du dem Button ein eigenes FCaption gibst - die caption ist aber schon in TControl eingeführt und auf diese bezieht sich auch das TextChanged. Daher würde ich vorschlagen, du entfernst dein eigenes FCaption und ersetzt die Property-Deklaration durch ein einfaches "property Caption", so dass die geerbte Caption verwendet wird. Der SetCaption-Setter wird durch ein SetRealText (override) ersetzt. (macht bei meinen Schnell-Tests allerdings einen Stack-Überlauf, so dass da noch etwas faul ist, was ich aber jetzt nicht lösen will).

Du kannst aber auch bei der eigenen FCaption bleiben, musst dann aber dafür sorgen, dass sowas wie TextChanged bei der Änderung der Caption aufgerufen wird.

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,
ein großes Dankeschön für die vielen Informationen, damit habe ich auf jeden Fall viele Ansatzpunkte um ein Autosize hinzubekommen!!!

Viele Grüße
Bernd

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 möchte mal für Interessierte einen Zwischenbericht abgeben.

Zunächst hat mich das Anliegen von Nimral mit dem Fokusrahmen nochmal beschäftigt. Der MultiButton machte zwar das was er sollte, aber so richtig stimmig war es nicht. Jedenfalls habe ich als erstes die irreführende Bezeichnung FocusedOn in FocusFrameOn umbenannt. Es wird mit der Eigenschaft ja nur der Rahmen ein- und ausgeblendet. Der Fokus an sich bleibt ja unberührt. Um bei ausgeblendeten Rahmen trotzdem eine optische Fokusanzeige zu haben gibt es nun die Eigenschaft ForegroundFocusOn. Diese ist als default ausgeschaltet. Möchte man also ein Verhalten wie Nimral es gerne gehabt hätte (oder vielleicht auch noch benötigt?) dann kann man FocusFrameOn auf false, FocusFrameWidth auf 0 und ForegroundFocusOn auf true setzen. Die Farbe lässt sich mit FocusColor einstellen. Sieht dann so aus:
Foregroundfocus.png
Foregroundfocus.png (3.34 KiB) 3344 mal betrachtet
Ich hoffe dass das Thema Fokus nun stimmig ist. Nachteil: Wer ein altes Projekt mit dem neuen Package kompilieren möchte muss halt in der .lfm Datei alle Vorkommen von FocusedOn mit FocusFrameOn ersetzen!

Im MultiButtonStylManager habe ich die Load- und Savefunktion vervollständigt. Man kann nun eine aktuelle Einstellung abspeichern und mit Load in einem anderen Projekt wieder verwenden. Im Ordner Themes der beigefügten Beispiele habe ich zum Testen eine Datei (mit Systemfarben) hinterlegt. Ich hoffe es funktioniert nicht nur bei mir.
Dann habe ich den Controlls im Panel rechte obere Ecke im Editor Hints spendiert. Diese habe ich mit i18n versehen so das je nachdem ob Lazarus Englisch oder Deutsch gestartet wird diese in der jeweiligen Sprache sein sollten. Auch hier hoffe ich das es nicht nur bei mir geht. Folgendes für jemand der das auch mal machen will als Tipp: Ich hatte die resourcestring-unit nicht in die Anforderungen des Packages aufgenommen. Hat mich viel Zeit gekostet!

Nun zu AutoSize. Dank der Hilfe von wp_xyz habe ich ein AutoSize hinbekommen. Ob ich damit auf dem Holzweg bin oder nicht weiß ich noch nicht so recht. Die größte Schwierigkeit ist eigentlich zu entscheiden was passieren soll wenn AutoSize true ist.
Bei einem MultiButton mit Caption reagiert man auf Höhe und Länge der Caption. Hat der MultiButton zusätzlich ein Image stellt sich schon die Frage ist das Image links, rechts, über oder unter dem Text. Kommt nun noch der MessageButton ins Spiel gibt es unzählige Varianten. Ich bin mir sicher das ich nicht auf alle diese Varianten richtig reagiere bzw. das es auch noch Varianten gibt die ich noch gar nicht betrachtet habe (z. Beispiel vertikaler Text). Dennoch möchte ich mein Ergebnis mal vorstellen. Entwickelt habe ich unter Linux Mint, eventuell hat der Eine oder Andere etwas Zeit und Lust es zu probieren und seine Meinung dazu zu sagen.
Im Anhang befindet sich ein Projekt mit dem ich AutoSize getestet habe. Wer selber einen Button mit Image erzeugt, sollte noch wissen das sich je nachdem wo sich das Image vor dem Einschalten von AutoSize befindet es nach links , rechts, oben oder unten positioniert wird.

Viele Grüße
Bernd

AutoSize.png
AutoSize.png (106.35 KiB) 3344 mal betrachtet
Dateianhänge
Multis0.0.3.zip
(652.37 KiB) 111-mal heruntergeladen

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,
man kann sicherlich (wie immer) noch vieles verbessern , dennoch möchte ich diese Version als eine Art Release 1 bezeichnen. Getestet und Entwickelt habe ich unter Linux Mint 20 Cinnamon mit Lazarus 2.0.10 r64667M FPC 3.2.0 x86_64-linux-gtk2. Wer Fehler oder Unschönes entdeckt bitte melden. Ich versuche gerne es zu verbessern.
Jedenfalls befindet sich der MultiButton nun in einem extra Package mit dem Namen multis.lpk und erscheint nach dem Installieren zusammen mit dem MultiButtonStylmanager in einem separatem Reiter "Multi".
Reiter.png
Reiter.png (5.79 KiB) 3291 mal betrachtet
Der Stylmanager soll bei Verwendung von mehreren gleichen MultiButtons die Einstellarbeit erleichtern. Der Stylmanager wird wie jede andere Komponente zur Designzeit auf das Formular gezogen. Anschließend wählt man beim MultiButton den Stylmanager im OI einfach an.
anwählen.png
anwählen.png (51.24 KiB) 3291 mal betrachtet
Führt man einen Doppelklick auf dem Icon des Stylmanagers aus öffnet sich der StylmanagerEditor. Dort lassen sich diverse Einstellungen vornehmen welche dann bei allen verbundenen MultiButtons wirksam werden. Der Editor besitzt i18n und eine deutsche .po Datei ist dabei. Zur Info: bei den FarbButtons lässt sich mit einem Rechtsklick die Farbe kopieren und Einfügen.
editor1.png
editor1.png (67.43 KiB) 3291 mal betrachtet
Die neuste Version befindet sich im 1. Betrag zum Herunterladen!!

Viele Grüße
Bernd

Antworten