vierer Button integrieren
-
Andy Nightingale
- Beiträge: 430
- Registriert: Mo 13. Jan 2025, 12:11
vierer Button integrieren
Hallo Leute,
ich habe ein Programm das erzeugt mir als PNG Datei einen fertigen Button mit allen "Zuständen". Also: Standard, Clicked, Hovered, Disabled. Wie kann ich so etwas in mein Programm in einen Button integrieren? So sind die Zustände: und so sieht das fertige PNG dann aus:.-Grüße
ich habe ein Programm das erzeugt mir als PNG Datei einen fertigen Button mit allen "Zuständen". Also: Standard, Clicked, Hovered, Disabled. Wie kann ich so etwas in mein Programm in einen Button integrieren? So sind die Zustände: und so sieht das fertige PNG dann aus:.-Grüße
-
Mathias
- Beiträge: 7354
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vierer Button integrieren
TBitBtn ist das Stichwort. Da kann man Glyphe einfügen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
Andy Nightingale
- Beiträge: 430
- Registriert: Mo 13. Jan 2025, 12:11
Re: vierer Button integrieren
Hallo Matthias,Mathias hat geschrieben: So 13. Sep 2026, 14:19 TBitBtn ist das Stichwort. Da kann man Glyphe einfügen.
ich habe unter Glyph (Eigenschaft) die PNG Datei geladen und unter GlyphShowMode always eingegeben...aber es funzt nicht....hast du dafür ein kleines Beispiel...Grüße
-
kirchfritz
- Beiträge: 280
- Registriert: Mo 3. Jan 2011, 13:34
- OS, Lazarus, FPC: Win11 (L 4.0 FPC 3.2.2)
- CPU-Target: 64Bit
- Wohnort: Nürnberg
Re: vierer Button integrieren
Lade doch mal Deine PNG hoch. Dann könnte man konkretere Hilfe anbieten...
Re: vierer Button integrieren
TBitBtn unterstützt drei Zustände: „normal“, „disabled“ und „clicked“. Außerdem müssen die Grafiken für die Zustände von links nach rechts und nicht von oben nach unten angeordnet sein. Anschließend gibst du eine entsprechende Datei an (Eigenschaft „Glyph“) und trägst in die Eigenschaft „NumGlyphs“ den Wert 3 ein.
Vier Zustände und ein Bild in dieser Form werden von der Komponente TBCImageButton aus dem Komponentenpaket „BGRA Controls“ problemlos verarbeitet.
Vier Zustände und ein Bild in dieser Form werden von der Komponente TBCImageButton aus dem Komponentenpaket „BGRA Controls“ problemlos verarbeitet.
Grüße / Pozdrawiam
paweld
paweld
Re: vierer Button integrieren
Ich dachte, Glyph würde es auch erlauben, die Icons vertikal anzuordnen, aber nein, im Quelltext sieht man, dass die Breite des Gesamtbitmaps durch die Höhe dividiert wird - daher müssen die Icons, wie paweld schon sagte, horizontal angeordnet sein. Seltsam, denn TImageList, kann beide Varianten, und letztendlich landen die Bilder sowieso in einer ImageList.
Im Quelltext sieht man auch, dass es insgesamt 5 mögliche Icon-Arten gibt, entsprechend den Werten der TButtonState-Aufzählung:
Um das zu testen, habe ich ein kleines Mini-Projekt beigefügt, für das ich in einer Bildbearbeitung fünf Zahlen-Icons aus den Lazarus-Images nebeneinander montiert habe: '0'..'4', entsprechend den 5 ButtonState-Zuständen. Wie man in dem Programm sieht, funktioniert das. Die Option bsExclusive wird beim TBitBtn nicht verwendet, weil man BitBtns nicht zu einer Radiobutton-ähnlichen Gruppe zusammenschalten kann (oder habe ich etwas übersehen?). Bei TSpeedButton (mit der Eigenschaft GroupIndex) ist das aber möglich, und hier wird Index 3 verwendet. Seltsam, dass man diese Option dann nicht ans Ende gesetzt hat, denn so muss jemand, der bei TBitBtn einen MouseOver-Effekt erzeugen will, ein nicht benötigtes Icon einfügen.
Wie dem auch seo, generell würde ich aber überhaupt nicht mit dem "altmodischen" Glyph-Property hantieren, sondern die ImageList verwenden, die seit längerer Zeit schon bei TBitBtn und TSpeedButton verfügbar bist. Das hat den Vorteil, dass bei der Verwendung mehrerer gleicher Buttons die Bilder nur einmal vorhanden sein müssen. Außerdem beherrscht die ImageList das LCLScaling, d.h. die Icon-Größe passt sich der Bildschirmauflösung an (wenn man die entsprechenden Regeln beachtet; bei Glyph kann man nur 1 Bildgröße eingeben, bei ImageList mehrere!). Für die verschiedenen Zustände gibt es jeweils eigene Image-Indices:
* ImageIndex --> normal
* DisabledImageIndex --> disabled
* HotImageIndex --> mouse-over
* PressedImageIndex --> geclickt
Im Quelltext sieht man auch, dass es insgesamt 5 mögliche Icon-Arten gibt, entsprechend den Werten der TButtonState-Aufzählung:
Code: Alles auswählen
type
TButtonState =
(
bsUp, // Button is up.
bsDisabled, // Button disabled (grayed).
bsDown, // Button is down.
bsExclusive,// Button is the only down in his group.
bsHot // Button is under mouse.
); Wie dem auch seo, generell würde ich aber überhaupt nicht mit dem "altmodischen" Glyph-Property hantieren, sondern die ImageList verwenden, die seit längerer Zeit schon bei TBitBtn und TSpeedButton verfügbar bist. Das hat den Vorteil, dass bei der Verwendung mehrerer gleicher Buttons die Bilder nur einmal vorhanden sein müssen. Außerdem beherrscht die ImageList das LCLScaling, d.h. die Icon-Größe passt sich der Bildschirmauflösung an (wenn man die entsprechenden Regeln beachtet; bei Glyph kann man nur 1 Bildgröße eingeben, bei ImageList mehrere!). Für die verschiedenen Zustände gibt es jeweils eigene Image-Indices:
* ImageIndex --> normal
* DisabledImageIndex --> disabled
* HotImageIndex --> mouse-over
* PressedImageIndex --> geclickt
- Dateianhänge
-
BitBtn_Glyph_ButtonStates.zip- (18.86 KiB) 12-mal heruntergeladen
-
wennerer
- Beiträge: 656
- 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: vierer Button integrieren
Hallo,
suchst du sowas:
Dann kannst du wenn du möchtest meinen MultiButton testen. Hier siehst du mehr: viewtopic.php?t=14033
PS: Falls du tolle Icons suchst dann schau mal da: viewtopic.php?t=14263
Viele Grüße
Bernd
suchst du sowas:
Dann kannst du wenn du möchtest meinen MultiButton testen. Hier siehst du mehr: viewtopic.php?t=14033
PS: Falls du tolle Icons suchst dann schau mal da: viewtopic.php?t=14263
Viele Grüße
Bernd
- Dateianhänge
-
project1.zip- (140.7 KiB) 10-mal heruntergeladen
Re: vierer Button integrieren
Mit ein paar kleinen Änderungen kann man die Buttons Unit so ergänzen, dass die Orientierung des Streifens erkannt wird, so dass auch die vertikale Anordnung der Glyphen funktioniert (von oben nach unten):wp_xyz hat geschrieben: So 13. Sep 2026, 20:19 [...] müssen die Icons [...] horizontal angeordnet sein.
- Datei lcl/imagelistcache.pas: In procedure TImageListCache.RegisterBitmap die Zeile "Item^.FImageList := GetImageListFor(ABitmap.Width div ABitmapCount, ABitmap.Height);" austauschen gegen
Code: Alles auswählen
if ABitmap.Width > ABitmap.Height then Item^.FImageList := GetImageListFor(ABitmap.Width div ABitmapCount, ABitmap.Height) else Item^.FImageList := GetImageListFor(ABitmap.Width, ABitmap.Height div ABitmapCount); - Ein paar Zeilen weiter unten, die Zeile "AStart := Item^.FImageList.AddSliced(ABitmap, ABitmapCount, 1);" austauschen gegen
Code: Alles auswählen
if ABitmap.Width > ABitmap.Height then // Horizontal strip AStart := Item^.FImageList.AddSliced(ABitmap, ABitmapCount, 1) else // Vertical strip AStart := Item^.FImageList.AddSliced(ABitmap, 1, ABitmapCount); - Datei lcl/include/buttonglyph.inc: In procedure TButtonGlyph.SetGlyph den Block "if Original.Height > 0 then" bis zum "end" ersetzen durch
Code: Alles auswählen
if (FOriginal.Height > 0) and (FOriginal.Width > FOriginal.Height) and (FOriginal.Width mod FOriginal.Height = 0) then begin GlyphCount := FOriginal.Width div FOriginal.Height; if GlyphCount > High(TNumGlyphs) then GlyphCount := Low(TNumGlyphs); FNumGlyphs := TNumGlyphs(GlyphCount); end else if (FOriginal.Width > 0) and (FOriginal.Height > FOriginal.Width) and (FOriginal.Height mod FOriginal.Width = 0) then begin GlyphCount := FOriginal.Height div FOriginal.Width; if GlyphCount > High(TNumGlyphs) then GlyphCount := Low(TNumGlyphs); FNumGlyphs := TNumGlyphs(GlyphCount); end; - IDE neu bauen.
Das beigefügte Projekt ist eine Modification des bereits geposteten, in dem die genannten Änderungen vorausgesetzt werden.
- Dateianhänge
-
BitBtn_Glyph_ButtonStates-v2.zip- (31.43 KiB) 10-mal heruntergeladen
-
Andy Nightingale
- Beiträge: 430
- Registriert: Mo 13. Jan 2025, 12:11
Re: vierer Button integrieren
Hi WP,wp_xyz hat geschrieben: Mo 14. Sep 2026, 12:09Mit ein paar kleinen Änderungen kann man die Buttons Unit so ergänzen, dass die Orientierung des Streifens erkannt wird, so dass auch die vertikale Anordnung der Glyphen funktioniert (von oben nach unten):wp_xyz hat geschrieben: So 13. Sep 2026, 20:19 [...] müssen die Icons [...] horizontal angeordnet sein.Ich habe die Änderungen inzwischen in Laz/main eingebaut (siehe auch: https://gitlab.com/freepascal.org/lazar ... ws/1002606). Motivation ist, dass TImageList einen vertikalen Streifen speichert, TBitBtn und TSpeedButton aber plötzlich einen horizontalen Streifen wollen. Und das ist inkonsistent.
- Datei lcl/imagelistcache.pas: In procedure TImageListCache.RegisterBitmap die Zeile "Item^.FImageList := GetImageListFor(ABitmap.Width div ABitmapCount, ABitmap.Height);" austauschen gegen
Code: Alles auswählen
if ABitmap.Width > ABitmap.Height then Item^.FImageList := GetImageListFor(ABitmap.Width div ABitmapCount, ABitmap.Height) else Item^.FImageList := GetImageListFor(ABitmap.Width, ABitmap.Height div ABitmapCount);- Ein paar Zeilen weiter unten, die Zeile "AStart := Item^.FImageList.AddSliced(ABitmap, ABitmapCount, 1);" austauschen gegen
Code: Alles auswählen
if ABitmap.Width > ABitmap.Height then // Horizontal strip AStart := Item^.FImageList.AddSliced(ABitmap, ABitmapCount, 1) else // Vertical strip AStart := Item^.FImageList.AddSliced(ABitmap, 1, ABitmapCount);- Datei lcl/include/buttonglyph.inc: In procedure TButtonGlyph.SetGlyph den Block "if Original.Height > 0 then" bis zum "end" ersetzen durch
Code: Alles auswählen
if (FOriginal.Height > 0) and (FOriginal.Width > FOriginal.Height) and (FOriginal.Width mod FOriginal.Height = 0) then begin GlyphCount := FOriginal.Width div FOriginal.Height; if GlyphCount > High(TNumGlyphs) then GlyphCount := Low(TNumGlyphs); FNumGlyphs := TNumGlyphs(GlyphCount); end else if (FOriginal.Width > 0) and (FOriginal.Height > FOriginal.Width) and (FOriginal.Height mod FOriginal.Width = 0) then begin GlyphCount := FOriginal.Height div FOriginal.Width; if GlyphCount > High(TNumGlyphs) then GlyphCount := Low(TNumGlyphs); FNumGlyphs := TNumGlyphs(GlyphCount); end;- IDE neu bauen.
Das beigefügte Projekt ist eine Modification des bereits geposteten, in dem die genannten Änderungen vorausgesetzt werden.
leider check ich das "noch"nicht ganz. Verstehe ich das richtig das du den Code von Lazarus mit dieser Komponente geändert hast? Soweit bin ich leider nicht.-aber das wäre wahrscheinlich genau das was ich bräuchte. Ich hab mich auch extra bei diesem Gitlab angemeldet um zu sehen was das ist...aber es kommt die Meldung "Ansicht nicht gefunden".-es muß auf geteilt stehen in der Sichtbarkeit.-geht leider nicht. Ich werd mal versuchen Step by Step deiner Abänderung zu folgen.-danke für deine Mühe. Grüße
Re: vierer Button integrieren
@wp_xyz: Ich bestätige, dass es nach der Umsetzung der Änderungen auch bei vertikal angeordneten Grafiken einwandfrei funktioniert. - Lazarus trunk, FPC 3.2-fixes
Grüße / Pozdrawiam
paweld
paweld