[gelöst]Font zur Laufzeit in allen Komponenten ändern

Rund um die LCL und andere Komponenten
hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

[gelöst]Font zur Laufzeit in allen Komponenten ändern

Beitrag von hubblec4 »

Hallo Alle

Wie kann man recht fix und unkompliziert den Font von allen Komponenten zur Laufzeit ändern.
Wichtig ist das die Komponenten NICHT auf "Parent.Font = true" eingestellt sind.

Es werden auch Komponenten zur Laufzeit erzeugt, manchmal mehr manchmal weniger, je nach dem was der Benutzer so alles anklickt.
Zuletzt geändert von hubblec4 am Fr 6. Jan 2017, 23:31, insgesamt 1-mal geändert.

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von compmgmt »

So z.B.

Code: Alles auswählen

var
  f: TFont;
  i: Integer;
  ...
begin
  ...
  for i := 0 to ComponentCount - 1 do begin // von 0 zur Anzahl der Elemente (-1) folgendes ausführen:
    f := Components[i].Font; // Die Schrift des aktuellen Elements "f" zuordnen
    f.Name := 'MS Sans Serif'; // Hier halt alles mögliche mir der Font tun
    f.Size := 8;
    ...
  end;
  ...
end;
Zuletzt geändert von compmgmt am So 1. Jan 2017, 16:14, insgesamt 1-mal geändert.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

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

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von wp_xyz »

Ich würde eher die Kombination Components[] / ComponentCount nehmen, damit werden alle Komponenten gefunden, egal in welchen Containern sie im Formular eingebunden sind (Controls[]/ControlCount findet nur diejenigen TControls die direkt auf dem Formular sitzen)

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i:=0 to ComponentCount-1 do
    if (Components[i] is TControl) then
      TControl(Components[i]).Font.Size := 12;
end; 

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von compmgmt »

wp_xyz hat geschrieben:Ich würde eher die Kombination Components[] / ComponentCount nehmen
Die meinte ich eigentlich auch. Ich war mir nur nicht sicher welche Funktion was gemacht hat. Vielen Dank :D. Ich verbessere es noch im obigen Beitrag.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Mathias
Beiträge: 7030
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von Mathias »

Code: Alles auswählen

f := Components[i].Font;
So was lässt sich bei mir nicht kompilieren.

Components. kennt bei mir Font nicht.
Irgendwie auch logisch, zB. kennt TTimer keinen Font.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von compmgmt »

Dann muss man doch TControl verwenden

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

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

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von wp_xyz »

Nein. Schau dir halt meinen Code an.

Mathias
Beiträge: 7030
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von Mathias »

Dann muss man doch TControl verwenden
Mit der Typen-Umwandlung geht die Kompilierung.

Code: Alles auswählen

  for i := 0 to ComponentCount - 1 do begin
    WriteLn(Components[i].Name);
    WriteLn(TControl(Components[i]).Font.Name);
end; 
Aber bei diesem Code knallt es, wen i = 1 ist.
Komponente 0 ist ein Button.
Komponente 1 ist ein Timer, und dort gibt es den Knall.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von wp_xyz »

Nochmals: Schau dir meinen Code an, da ist alles drin.

Mathias
Beiträge: 7030
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von Mathias »

Jetzt habe ich es gesehen

Code: Alles auswählen

if (Components[i] is TControl) then
Das ist der springende Punkt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von compmgmt »

Achso, das hatte ich falsch gelesen. Naja, Problem hoffentlich gelöst

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von hubblec4 »

Recht herzlichen Dank für die Antowrten.
Werde das dann gleich mal aus probieren.

Warf
Beiträge: 2195
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von Warf »

wp_xyz hat geschrieben:Ich würde eher die Kombination Components[] / ComponentCount nehmen, damit werden alle Komponenten gefunden, egal in welchen Containern sie im Formular eingebunden sind (Controls[]/ControlCount findet nur diejenigen TControls die direkt auf dem Formular sitzen)

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i:=0 to ComponentCount-1 do
    if (Components[i] is TControl) then
      TControl(Components[i]).Font.Size := 12;
end; 
Ich würde dieses Problem durch rekursion angehen, da man Komponenten ohne owner erstellen kann, aber jedes angezeigte Control muss einen parent haben, daher würde ich rekursiv durch die controls nicht durch die components iterieren

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von hubblec4 »

Ich habe eben den Code von wp_xyz getestet.
Zum testen soll die Schrifftart geändert werden.

Es werden NICHT alle "Dinge" geändert.
So zum beispiel habe ich ein LabelEdit(LaE) bei der das Caption vom Label nicht geändert wird(Komischerweise geht es bei einigen).
Das gleiche ist in VirtualStringTree's, dort werden die Captions in den Headers nicht berücksichtigt.
Ein VST was zur Laufzeit erzeugt wurde scheint offenbar gar nicht berücksichtigt zu werden.

Ich teste heute nach nochmal bissl.

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

Re: Font zur Laufzeit in allen Komponenten ändern

Beitrag von wp_xyz »

Das sind komplere Komponenten, bei denen du mit einer einfachen Typumwandlung zu TControl nicht an den gewünschten Font rankommst. Bei TLabeledEdit, z.B., ist der Font des Labels in der Untereigenschaft EditLabel versteckt. In diesem Fall fragst du in der Schleife ab, ob die Componente ein TLabeledEdit ist ("if Components is TLabeledEdit"), und änderst dann den Font des EditLabel:

Code: Alles auswählen

 
  for i:=0 to ComponentCount-1 do
  begin
    // zunächst den Standard-Font ändern
    if Components[i] is TControl then
      TControl(Components[i]).Font.Name := 'Arial';
    // nun die Spezialfälle, die mehr als einen Font haben
    if Components[i] is TLabeledEdit then
      TLabeledEdit(Components[i]).EditLabel.Font.Name := 'Arial'
    else
    if Components[i] is TVirtualStringTree then
      TVirtualStringTree(Components[i]).Header.Font.Name := 'Arial';
    else
      // hier weitere Typen genauso abfragen...
      ;
  end;

Antworten