[gelöst] Toolbar - Position der Buttons zur Laufzeit definieren

Rund um die LCL und andere Komponenten
Benutzeravatar
KodeZwerg
Beiträge: 110
Registriert: Mo 6. Feb 2023, 11:04
OS, Lazarus, FPC: Win64, Lazarus 64 [trunk], FPC win64-win32 [stable]
CPU-Target: x86_64

Re: Toolbar - Position der Buttons zur Laufzeit definieren

Beitrag von KodeZwerg »

oleg hat geschrieben: Do 27. Apr 2023, 18:51
KodeZwerg hat geschrieben: Do 27. Apr 2023, 18:32
Im Anhang ist Dein Projekt abgeändert um mit meiner (ebenfalls verbesserten) methode freundschaftlich zu harmonieren.
Ich habe alle deine buttons umbenannt um bei den Tags den überblick nicht zu verlieren :D

Ps: Du musst selbst nochmal prüfen was welcher name nun ist, ich hab lediglich meine methode dafür optimiert.

Danke, das sieht jetzt ziemlich vielversprechend aus. Muss ich aber morgen noch mal ausführlich testen. Ich glaube die Lösung ist, das die Tags wie in der Reihenfolge der IDE gesetzt werden müssen, nicht stumpf mit einer for Schleife. Das ist zwar erst mal mühselig, aber was soll's :roll:
Nein, die Tags müssen nun aufsteigend sein wie Du es im Endprodukt haben möchtest, der Name oder wo es in der IDE erscheint ist egal.
Also von links nach rechts, Tag 0 bis "NumberOfElelemts" :mrgreen:
Ich hatte es lediglich umbenannt da Du alles durcheinander gewürfelt hattest (in der IDE)
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
KodeZwerg
Beiträge: 110
Registriert: Mo 6. Feb 2023, 11:04
OS, Lazarus, FPC: Win64, Lazarus 64 [trunk], FPC win64-win32 [stable]
CPU-Target: x86_64

Re: Toolbar - Position der Buttons zur Laufzeit definieren

Beitrag von KodeZwerg »

theo hat geschrieben: Do 27. Apr 2023, 17:27 Vielleicht sollte man mal nach dem Widgetset fragen.
Bei mir auf GTK2 gibt es beispielsweise eine Umsortierung nach Hide-Show mit den Separator Style Buttons.
Der Separator rutsch eins nach rechts (aber nur beim ersten Mal).
Ich halte das für einen Bug.

P.S. Bezieht sich auf einen eigenen Test von mir, nicht auf das Bsp. von wp_xyz
Wäre nett wenn Du Dir die Zeit nimmst meine Demo zu Testen, mir steht nur Windows mit Win64 Widget zur Verfügung.
Ps: nicht das update mit dem Index 1 vergessen einzuspielen :)
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

oleg
Beiträge: 31
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: Toolbar - Position der Buttons zur Laufzeit definieren

Beitrag von oleg »

vielen Dank erstmal. Ich hatte es bereits kurz getestet und es sah schon gut aus. Muss ich morgen in Ruhe mal ins Projekt bauen und ausgiebig testen.

Die Buttons im Testprojekt hab ich absichtlich gewürfelt. Im Projekt kommen schließlich auch immer mal neue Funktionen dazu, andere werden geändert oder die Berechtigung und Logik ändert sich.
Mittlerweile habe ich auch halbwegs die Logik deiner Sortierung mit den beiden Arrays kapiert.

Eine Frage trotzdem: wie hast du den Hintergrund auf dunkel gestellt. Ist es dieses Widgetset?

Benutzeravatar
KodeZwerg
Beiträge: 110
Registriert: Mo 6. Feb 2023, 11:04
OS, Lazarus, FPC: Win64, Lazarus 64 [trunk], FPC win64-win32 [stable]
CPU-Target: x86_64

Re: Toolbar - Position der Buttons zur Laufzeit definieren

Beitrag von KodeZwerg »

oleg hat geschrieben: Do 27. Apr 2023, 19:23 Eine Frage trotzdem: wie hast du den Hintergrund auf dunkel gestellt. Ist es dieses Widgetset?
https://github.com/zamtmn/metadarkstyle
man sollte dafür allerdings eine trunk version von lazarus installiert haben.
Lazarus 2.3.0 (rev main-2_3-3269-g9d0fc980e1) FPC 3.2.2 x86_64-win64-win32/win64
Dateianhänge
Bild_2023-04-27_221845726.png
Bild_2023-04-27_221845726.png (144.62 KiB) 992 mal betrachtet
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
KodeZwerg
Beiträge: 110
Registriert: Mo 6. Feb 2023, 11:04
OS, Lazarus, FPC: Win64, Lazarus 64 [trunk], FPC win64-win32 [stable]
CPU-Target: x86_64

Re: Toolbar - Position der Buttons zur Laufzeit definieren

Beitrag von KodeZwerg »

Moin moin, ich habe noch ein mini upgrade und Erklärungen hinzugefügt.

Code: Alles auswählen

// hilfs-funktion von KodeZwerg fürs LazarusForum.de
// diese methode sorgt dafür das TToolButtons in einer TToolBar ihre Reihenfolge einhalten
// entweder sortiert nach ihrem Tag wert (default)
// oder in der reihenfolge wie sie in der lfm datei erstellt werden
// letzteres hat nichts damit zu tun wo man einen button per designer platziert hat (!)
// sondern "wann" man sie erstellt hat
// im Tag modus (default) MUSS jeder button seine eigene nummer besitzen
// angefangen bei 0 (für ganz links) (!)
// sinn und zweck ist es, wo auch immer ihr im quelltext den visible status eines buttons ändert,
// ruft danach diese methode auf um die reihenfolge sicherzustellen
procedure ToolBarButtonOrder(const AToolBar: TToolBar; const ASortByTag: Boolean = True);
  type
    // dynamischer array type für die button verwaltung
    TToolButtons = array of TToolButton;
  // hilfs funktion zum ermitteln einer "links-position"
  function LeftPos(const AButtons: TToolButtons; const AIndex: Integer): Integer;
  var
    i: Integer;
  begin
    Result := 0;
    // wenn es nur ein button ist oder außerhalb des möglichen, abbruch
    if ((AIndex < Succ(Low(AButtons))) or (AIndex > High(AButtons))) then
      Exit;
    // addiere zu jedem sichtbaren button seine breite
    for i := Succ(Low(AButtons)) to AIndex do
      if AButtons[i].Visible then
        Result += AButtons[i].Width;
  end;
var
  i: Integer;
  LButtons: TToolButtons;
begin
  LButtons := nil;
  // bereite array zum aufnehmen aller buttons vor
  SetLength(LButtons, AToolBar.ButtonCount);
  // schreibe alle buttons ins array, sortiert nach tag oder nach der reihenfolge wie es in der lfm hinterlegt wurde
  for i := 0 to Pred(AToolBar.ButtonCount) do
    if ASortByTag then
      LButtons[AToolBar.Buttons[i].Tag] := AToolBar.Buttons[i]
      else
      LButtons[i] := AToolBar.Buttons[i];
  // setze manuell die position des buttons
  for i := Low(LButtons) to High(LButtons) do
    begin
      LButtons[i].Align := alNone;
      LButtons[i].Left  := LeftPos(LButtons, i);
    end;
end;
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

oleg
Beiträge: 31
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: Toolbar - Position der Buttons zur Laufzeit definieren

Beitrag von oleg »

@KodeZwerg: Fantastisch, dein Arbeit und jetzt auch noch mit Zeilengenauer Erklärung. Jetzt funktioniert es genau so, wie man es erwartet.

zum Detail: Wie du geschrieben hast gibt es wohl einen Unterschied wann die Buttons erstellt wurden, das ist das Listing (Reihenfolge) im ObjektInspektor. Manuell schiebt man sich die Buttons in der IDE mit der Maus zurecht - und schon hat man den Salat.

Ob man das als Bug werten sollte, kann ich nicht sagen, da bin ich kein Profi. Einfacher im Handling wäre sicher, wenn im OI direkt der Index der ToolButtons zum bearbeiten freigegeben wäre. Damit ließe sich dann wahrscheinlich auch gleich manuell die Sortierung setzen.
Ich glaube nicht, dass jemand auf die Reihenfolge des erstellen achtet oder wenn es später Änderungen gibt, müssten so alle folgenden Buttons wieder manuell in der richtigen Reihenfolge erstellt werden.

Nochmal abschließend: Die Sortierung funktioniert mit der Sortierroutine nach dem definiertem Tag einwandfrei.

Das Thema mit dem Dark-Modus ist sicherlich mal ein extra Tread wert. Ich hatte mich nur gewundert, dass mein Beispiel MiniProjekt plötzlich dunkel daher kommt, ohne dass man diesbezüglich am Quelltext oder in den Projekteinstellungen direkt irgendwas sieht.

Benutzeravatar
KodeZwerg
Beiträge: 110
Registriert: Mo 6. Feb 2023, 11:04
OS, Lazarus, FPC: Win64, Lazarus 64 [trunk], FPC win64-win32 [stable]
CPU-Target: x86_64

Re: Toolbar - Position der Buttons zur Laufzeit definieren

Beitrag von KodeZwerg »

Es freut mich das es Dir gefällt.
Man kann meine Methode auch noch mehr aufbrezeln und gleichzeitig runtime Balast loswerden indem man sie zu einen Teil der FormClass macht oder die TToolBar subclassed und es dort mit integriert.
Dann sollte bei Ausführung nur einmal eine Kopie des arrays erstellt werden wobei man per Sortierauswahl (als property) bestimmen könnte wonach es sich richten soll.
(IDE-Optik, Tags, CreationOrder) (mein jetziger ansatz kann nur mit den beiden letzteren klarkommen, da ich bei jedem Aufruf das array neu erstelle)
Dabei wird dann vom kleinsten button.Left wert bis zum größten das array beschrieben, also analog wie ich es mit den Tags gemacht habe.

Wenn ich mal absolut gelangweilt sein sollte, kann ich dazu eine Demo machen oder vielleicht überraschst Du uns ja damit, da Du ja nun über ein entsprechendes verfahren bescheid weißt :mrgreen: :lol:
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

oleg
Beiträge: 31
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: Toolbar - Position der Buttons zur Laufzeit definieren

Beitrag von oleg »

KodeZwerg hat geschrieben: Fr 28. Apr 2023, 11:13 Wenn ich mal absolut gelangweilt sein sollte, kann ich dazu eine Demo machen oder vielleicht überraschst Du uns ja damit, da Du ja nun über ein entsprechendes verfahren bescheid weißt :mrgreen: :lol:
Das ist gut. Glaube nicht, dass irgendwer hier an Langeweile leidet. Deshalb finde ich das Forum auch so Klasse. Hier findet man schnelle und freundliche Hilfe, trotz der vielen Arbeit die ja jeder hat.

Mir war die Logik der Standardsortierung klar, deshalb habe ich ja versucht die Tags zu nutzen um eine bessere individuelle Lösung zu finden.
Nachdem ich jetzt noch ein paar andere Fehler Kleinigkeiten in diesem Zusammenhang ändern musste, kann es sogar sein, dass meine erste Methode funktionieren würde. Mit deinem Lösungsansatz funktioniert es jetzt einwandfrei - müsste ich also zum testen nur noch mal umswitchen und beobachten. Das ist ein wenig Zeitintensiv, da ich in meinem Projekt immer wieder mit verschiedenen Konfigurationen arbeiten muss um einzelne Buttons aus- oder einzublenden.

Trotzdem ist es schon merkwürdig, dass die ToolButtons standardmäßig nach Erstellzeit sortiert werden. Das kenn ich von anderen Komponenten nicht.

Antworten