Button Stylen

Forum für alles rund um die MSEide und MSEgui
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Button Stylen

Beitrag von fliegermichl »

Hallo,

ich hätte gerne, daß bei den Buttons / Menüs usw. der Buchstabe, dem das & vorangestellt ist, nicht einfach nur unterstrichen ist, sondern in einer anderen Farbe und Hintergrundfarbe dargestellt wird.
Wie stelle ich das am besten an?

Viele Grüße
Michael

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Button Stylen

Beitrag von Socke »

fliegermichl hat geschrieben:ich hätte gerne, daß bei den Buttons / Menüs usw. der Buchstabe, dem das & vorangestellt ist, nicht einfach nur unterstrichen ist, sondern in einer anderen Farbe und Hintergrundfarbe dargestellt wird.
Wie stelle ich das am besten an?

Unter Windows gar nicht, weil es nicht unterstützt wird.
Bei Qt und GTK müsstest du die Widgetset-Funktionen verwenden um den Button auseinanderzunehmen und den Text darin selbst zeichnen zu können.
Für OS X gilt vermutlich das gleiche wie unter Windows.

Edit: Sorry, ich hatte gar nicht gesehen, dass der Beitrag im MSEide/MSEgui Forum ist ... Das oben Geschriebene gilt für Lazarus/LCL
Zuletzt geändert von Socke am Mi 28. Jun 2017, 16:43, insgesamt 1-mal geändert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Button Stylen

Beitrag von mse »

Da müsste die Prozedur captiontorichstring() in der unit "mserichstring" angepasst werden.

Code: Alles auswählen

 
procedure captiontorichstring(const caption: captionty; var dest: richstringty);
var
 int1: integer;
 ch1: msechar;
 po1: pmsechar;
begin
 with dest do begin
  setlength(text,length(caption)); //max
  format:= nil;
  po1:= pointer(text);
  int1:= 1;
  while int1 <= length(caption) do begin
   ch1:= caption[int1];
   if (ch1 = '&') {and (format = nil)} then begin
    if caption[int1+1] = '&' then begin
     po1^:= ch1;
     inc(int1);
     if caption[int1+1] = '&' then begin    //there is a trailing #0
      updatefontstyle1(format,po1-pmsechar(pointer(text)),1,fs_underline,true);
      inc(int1);
     end;
     inc(po1);
    end
    else begin
     updatefontstyle1(format,po1-pmsechar(pointer(text)),1,fs_underline,true);
    end;
   end
   else begin
    po1^:= ch1;
    inc(po1);
   end;
   inc(int1);
  end;
  setlength(text,po1-pmsechar(pointer(text)));
 end;
end;
 

Ich werde mal schauen, ob sich die Sache auf elegante Weise parametrierbar machen lässt.
Zuletzt geändert von mse am Mi 28. Jun 2017, 20:19, insgesamt 1-mal geändert.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Button Stylen

Beitrag von mse »

git master f772f8afb4e2338c834226310276398ebe1c3f4b
https://gitlab.com/mseide-msegui/mseide-msegui
hat die Variablen

Code: Alles auswählen

 
initialization
  hotkeyfontstylesadd:= [fs_underline];
  hotkeyfontstylesremove:= [];
  hotkeycolor:= cl_none;
  hotkeycolorbackground:= cl_none;
 

in mserichstring.pas. Die Werte lassen sich auch in tskincontroller einstellen:
hotkey1.png

Das sieht dann so aus:
hotkey.png
hotkey.png (16.08 KiB) 2989 mal betrachtet

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

Re: Button Stylen

Beitrag von fliegermichl »

Das ist ja krass,

ich hab das ausgecheckt, die ide neu compiliert und in einem Datenmodul einfach einen skincontroller eingefügt, die Eigenschaften Hotkey Color und Backgroundcolor gesetzt und es hat auf Anhieb bei allen Menüs und Buttons funktioniert.
mseGUI find ich jeden Tag besser.

Ist natürlich mangels Dokumentation sehr mühsam, sich da reinzufinden.

Wie ist die empfohlene Vorgehensweise mit git?
ich habe jetzt einfach "git checkout f772f8afb4e2338c834226310276398ebe1c3f4b" und bin ja nun im "detached HEAD" state.

sollte ich mir einen neuen lokalen branch anlegen und Änderungen im master branch da reinmergen?


Danke und viele Grüße
Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Button Stylen

Beitrag von mse »

fliegermichl hat geschrieben:Wie ist die empfohlene Vorgehensweise mit git?
ich habe jetzt einfach "git checkout f772f8afb4e2338c834226310276398ebe1c3f4b" und bin ja nun im "detached HEAD" state.

Bitte mache jeweils ein

Code: Alles auswählen

 
git pull
 

Mit checkout erhältst du nicht die aktuelle Version, es gibt bereits Verbesserungen der Hotkey-Funktion.

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

Re: Button Stylen

Beitrag von fliegermichl »

Irgendwie klappt das nicht,

ich hab dann "git checkout master" gemacht um wieder zum master branch zu wechseln. Wenn ich dann "git pull" mach, bekomme ich "already up to date" und die Hotkeyfunktion funktioniert nicht.

Na egal, ich hab ja eine funktionierende Lösung.
Ich hab dann spasseshalber mal das Linux Binary von mseide heruntergeladen und damit mein Projekt geöffnet. Es compiliert auf Anhieb und sieht exakt gleich wie unter Windows aus

Echt Klasse!

Viele Grüße
Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Button Stylen

Beitrag von mse »

fliegermichl hat geschrieben:Irgendwie klappt das nicht,

ich hab dann "git checkout master" gemacht um wieder zum master branch zu wechseln. Wenn ich dann "git pull" mach, bekomme ich "already up to date" und die Hotkeyfunktion funktioniert nicht.

Die Version f772f8afb4e2338c834226310276398ebe1c3f4b verwendete die Einstellungen von tskincontroller.hotkey_* auch für MSEide, was natürlich nicht geplant war. ;-)
Der Fehler wurde inzwischen behoben, meinst du das? In deinem Projekt sollte die Einstellung wirken, bitte melde dich, falls nicht.
Ich hab dann spasseshalber mal das Linux Binary von mseide heruntergeladen und damit mein Projekt geöffnet. Es compiliert auf Anhieb und sieht exakt gleich wie unter Windows aus

Echt Klasse!

Danke! :-)

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

Re: Button Stylen

Beitrag von fliegermichl »

Nein, wenn ich "git checkout master" und dann "git pull" mache, bekomme ich "already up to date" und die Hotkeyfarben funktionieren nicht mehr.
Habe ich vielleicht den falschen branch?

"git remote -v" liefert.
origin https://gitlab.com/mseide-msegui/mseide-msegui (fetch)
origin https://gitlab.com/mseide-msegui/mseide-msegui (push)


Für Menüs klappt das so schon gut. Bei den Buttons noch nicht ganz.

Oder besser gesagt, es klappt wie geplant aber ich hätte es gern anders.
Da ich zusätzlich vor und nach dem Hotkey noch ein Leerzeichen wollte, habe ich "& &T& ext" geschrieben. Dann schaut das zwar optisch so aus, wie ich es haben wollte aber der Hotkey funktioniert natürlich nicht mehr.

Genauso ist es, wenn ich z.B. "F2" als Hotkey haben will.
Wie kann ich die Caption in einem TRichButton "rich" machen?

Dann könnte ich den Text formatieren wie ich will und die Hotkey Funktionalität so lassen, wie sie ist.

Kann ich bei dem Button sagen, dass die Beschriftung an Pixel x los gehen soll?
Wenn man mehrere Buttons untereinander hat, dann schaut das komisch aus, wenn der Text zentriert wird.

Viele Grüße
Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Button Stylen

Beitrag von mse »

fliegermichl hat geschrieben:Nein, wenn ich "git checkout master" und dann "git pull" mache, bekomme ich "already up to date" und die Hotkeyfarben funktionieren nicht mehr.
Habe ich vielleicht den falschen branch?

"git remote -v" liefert.
origin https://gitlab.com/mseide-msegui/mseide-msegui (fetch)
origin https://gitlab.com/mseide-msegui/mseide-msegui (push)

Das ist richtig die aktuelle Version ist 9af87c446819a0b4831c72982bc8e0827fda6b92. Bitte schicke ein einfaches Testprojekt, welches das nicht-Funktionieren demonstriert.
Für Menüs klappt das so schon gut. Bei den Buttons noch nicht ganz.

Oder besser gesagt, es klappt wie geplant aber ich hätte es gern anders.
Da ich zusätzlich vor und nach dem Hotkey noch ein Leerzeichen wollte, habe ich "& &T& ext" geschrieben. Dann schaut das zwar optisch so aus, wie ich es haben wollte aber der Hotkey funktioniert natürlich nicht mehr.

Ich muss mir überlegen, was da zu tun ist.
Genauso ist es, wenn ich z.B. "F2" als Hotkey haben will.

Shortcuts werden in T*Button.Shortcut definiert.
Wie kann ich die Caption in einem TRichButton "rich" machen?

Dann könnte ich den Text formatieren wie ich will und die Hotkey Funktionalität so lassen, wie sie ist.

Das "Rich" in TRichbutton bezieht sich auf zusätzliche Bitmaps und nicht auf die Caption.
Kann ich bei dem Button sagen, dass die Beschriftung an Pixel x los gehen soll?
Wenn man mehrere Buttons untereinander hat, dann schaut das komisch aus, wenn der Text zentriert wird.

Entferne T*Button.TextFlags tf_xcentered. Einen zusätzlichen Rand sollte man mit T*Button.CaptionDist einstellen können. Die Funktion scheint zerbrochen zu sein, ich werde mich darum kümmern.

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

Re: Button Stylen

Beitrag von fliegermichl »

Hat sich erledigt, wenn man den scincontroller auf active=true stellt, funktioniert es.

Vielleicht kann man ja den TRichStringDisp wie einen Button ausschauen lassen. Aber auch bei dem bekomme ich es nicht hin den "rich" zu machen.

Mit der nur Kleinschreibweise komme ich null zurecht :-)
Dateianhänge
hotkeytest.zip
(5.4 KiB) 79-mal heruntergeladen

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Button Stylen

Beitrag von mse »

mse hat geschrieben:
Da ich zusätzlich vor und nach dem Hotkey noch ein Leerzeichen wollte, habe ich "& &T& ext" geschrieben. Dann schaut das zwar optisch so aus, wie ich es haben wollte aber der Hotkey funktioniert natürlich nicht mehr.

Ich muss mir überlegen, was da zu tun ist.

Die git master Version überspringt hotkey-Leerzeichen.
Kann ich bei dem Button sagen, dass die Beschriftung an Pixel x los gehen soll?
Wenn man mehrere Buttons untereinander hat, dann schaut das komisch aus, wenn der Text zentriert wird.

Entferne T*Button.TextFlags tf_xcentered. Einen zusätzlichen Rand sollte man mit T*Button.CaptionDist einstellen können. Die Funktion scheint zerbrochen zu sein, ich werde mich darum kümmern.

T*Button.CaptionDist bezieht sich auf T*Button.ImagePos. Die git master Version ignoriert ImagePos wenn keine ImageList eingehängt ist.
fliegermichl hat geschrieben:Hat sich erledigt, wenn man den scincontroller auf active=true stellt, funktioniert es.

Genau!
Vielleicht kann man ja den TRichStringDisp wie einen Button ausschauen lassen. Aber auch bei dem bekomme ich es nicht hin den "rich" zu machen.

"richstringty" ist in lib/common/kernel/mserichstring.pas definiert, es ist ein Record der zusätzlich zum Text ein dynamisches Array mit Formatinformationen enthält:

Code: Alles auswählen

 
type
 charstylety = record
  fontcolor,colorbackground: colorty; //bits inversed, 0 -> not set
  fontstyle: fontstylesty;
 end;
 pcharstylety = ^charstylety;
 
 charstylearty = array of charstylety;
 
 formatinfoty = record
  index: integer;            //0-> from first char
  newinfos: newinfosty;
  style: charstylety;
 end;
 
 pformatinfoty = ^formatinfoty;
 formatinfoarty = array of formatinfoty;
 pformatinfoarty = ^formatinfoarty;
 
 richflagty = (rf_noparagraph);
 richflagsty = set of richflagty;
 
 richstringty = record
  text: msestring;
  format: formatinfoarty;
  flags: richflagsty;
 end;
 
 

Die Formatinformation wird mit folgenden Funktionen gesetzt:

Code: Alles auswählen

 
function setfontcolor1(var formats: formatinfoarty; aindex: integer;
                       len: halfinteger; color: colorty): boolean;
                                 //true if changed
function setfontcolor(const formats: formatinfoarty; aindex: integer;
                       len: halfinteger; color: colorty): formatinfoarty;
function setcolorbackground1(var formats: formatinfoarty; aindex: integer;
                              len: halfinteger;
                              color: colorty): boolean;
                                 //true if changed
function setcolorbackground(const formats: formatinfoarty; aindex: integer;
                              len: halfinteger;
                              color: colorty): formatinfoarty;
 
function updatefontstyle1(var formats: formatinfoarty; aindex: integer;
                              len: halfinteger;
                              astyle: fontstylety; aset: boolean): boolean;
                                 //true if changed
function updatefontstyle(const formats: formatinfoarty; aindex: integer;
                len: halfinteger;
                astyle: fontstylety; aset: boolean): formatinfoarty;
function updatefontstyle1(var formats: formatinfoarty; aindex: integer;
                              len: halfinteger;
                              astyles: fontstylesty; aset: boolean): boolean;
                                 //true if changed
function updatefontstyle(const formats: formatinfoarty; aindex: integer;
                len: halfinteger;
                astyles: fontstylesty; aset: boolean): formatinfoarty;
 
function setcharstyle1(var formats: formatinfoarty; aindex,len: halfinteger;
                            const style: charstylety): boolean;
                                  //true if changed
function setcharstyle(const formats: formatinfoarty; aindex,len: halfinteger;
                            const style: charstylety): formatinfoarty;
function getcharstyle(const formats: formatinfoarty;
           const aindex: integer): charstylety; //zero based
function getfontstyle(const formats: formatinfoarty;
           const aindex: integer): fontstylesty; //zero based
 

Mit der nur Kleinschreibweise komme ich null zurecht

Da gewöhnt man sich schnell daran. Ich lese lowercase Code deutlich schneller als CamelCase.
Dateianhänge
button.png
button.png (4.16 KiB) 2939 mal betrachtet

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

Re: Button Stylen

Beitrag von fliegermichl »

mse hat geschrieben:"richstringty" ist in lib/common/kernel/mserichstring.pas definiert, es ist ein Record der zusätzlich zum Text ein dynamisches Array mit Formatinformationen enthält:

Code: Alles auswählen

 
type
 charstylety = record
  fontcolor,colorbackground: colorty; //bits inversed, 0 -> not set
  fontstyle: fontstylesty;
 end;
 pcharstylety = ^charstylety;
 
 ...
 

Die Formatinformation wird mit folgenden Funktionen gesetzt:

Code: Alles auswählen

 
function setfontcolor1(var formats: formatinfoarty; aindex: integer;
                       len: halfinteger; color: colorty): boolean;
                                 //true if changed
function setfontcolor(const formats: formatinfoarty; aindex: integer;
                       len: halfinteger; color: colorty): formatinfoarty;
function setcolorbackground1(var formats: formatinfoarty; aindex: integer;
                              len: halfinteger;
                              color: colorty): boolean;
                                 //true if changed
function setcolorbackground(const formats: formatinfoarty; aindex: integer;
                              len: halfinteger;
                              color: colorty): formatinfoarty;
 
 ...
 



Das klappt nicht. Ich habe ich meinem Formular einen TRichStringDisp namens richirich mit richvalue "Ich bin ein reicher Text!!"
Dann einen Button "Set me"
im SetMeExecute schreibe ich

Code: Alles auswählen

 
begin
  SetColorBackGround(richirich.richvalue.format, 1, 3, cl_Red);
end;
 


Keine Reaktion!?!
Kann man in der mseIDE auch eigene Property Editoren erstellen? Dann würde ich nämlich bei richvalue einen machen, wo man Text selektieren kann und dann bkColor / color / Fontstyle etc. per GUI einstellen kann.

Wie kann ich einem TTextEdit einen Text zuweisen? Der hat keinerlei Property Caption / Text / Lines oder irgendetwas in der Art.

Wenn man Text eingibt, dann steht der in der Mitte. Finde ich ja ganz gut, daß so etwas geht aber als default?


mse hat geschrieben:
fliegermichl hat geschrieben:Mit der nur Kleinschreibweise komme ich null zurecht

Da gewöhnt man sich schnell daran. Ich lese lowercase Code deutlich schneller als CamelCase.


Ja aber nur wenn man die Wörter kennt die man liest. Wenn man sie nicht kennt, muss man sie drei mal lesen.

Viele Grüße
Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Button Stylen

Beitrag von mse »

fliegermichl hat geschrieben:Das klappt nicht. Ich habe ich meinem Formular einen TRichStringDisp namens richirich mit richvalue "Ich bin ein reicher Text!!"
Dann einen Button "Set me"
im SetMeExecute schreibe ich

Code: Alles auswählen

 
begin
  SetColorBackGround(richirich.richvalue.format, 1, 3, cl_Red);
end;
 


Keine Reaktion!?!

SetColorBackGround() ist eine Funktion, dein Resultat landet im Nirvana.

Code: Alles auswählen

 
function setcolorbackground(const formats: formatinfoarty; aindex: integer;
                              len: halfinteger;
                              color: colorty): formatinfoarty;
 

So geht es:

Code: Alles auswählen

 
procedure tmainfo.setmeev(const sender: TObject);
var
 rstr1: richstringty;
begin
 rstr1:= richirich.richvalue;
 SetColorBackGround1(rstr1.format, 1, 3, cl_Red);
 richirich.richvalue:= rstr1;
end;
 

Code: Alles auswählen

 
function setcolorbackground1(var formats: formatinfoarty; aindex: integer;
                              len: halfinteger;
                              color: colorty): boolean;
                                 //true if changed
 

richstring.png
richstring.png (5.11 KiB) 2925 mal betrachtet

Kann man in der mseIDE auch eigene Property Editoren erstellen?

Ja, sie müssen mit "registerpropertyeditor()" registriert werden. Beispiele sind in "lib/common/regcomponents/regwidgets.pas".
Wie kann ich einem TTextEdit einen Text zuweisen? Der hat keinerlei Property Caption / Text / Lines oder irgendetwas in der Art.

"ttextedit" und Nachkommen funktionieren nur als Spalte in "twidgetgrid". Plaziere ein "twidgetgrid" aus der Komponentpalette 'Edit' auf dem Formular, plaziere ein "ttextedit" im widgetgrid. Der Text ist in "ttextedit.datlist". Alle Editwidgets haben eine Eigenschaft "griddata" oder "datalist", welche die Daten einer grid-Spalte repräsentiert.
Zur Entwurfszeit können die Spaltenwerte im Objektinspektor in <widgetgrid>.datacols.col[n].datalist eingegeben werden.
Wenn man Text eingibt, dann steht der in der Mitte.

Bei mir nicht. Bitte schicke ein Testprojekt, welches das Problem demonstriert.

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

Re: Button Stylen

Beitrag von fliegermichl »

Ah jetzt ja! Danke,

in der aktuellen Version funktioniert ja jetzt auch captiondist.

Ich wollte eine von TRichstringDisp abgeleitete Klasse machen, bei der man richvalue direkt in dem Propertyeditor bearbeiten kann.
Problem ist natürlich, daß man die richstringty records nicht als published deklarieren kann.

Da muss man dann wohl den Umweg über eine spezielle Klasse mit entsprechendem Propertyeditor gehen.

Viele Grüße
Michael

Antworten