[gelöst]Font zur Laufzeit in allen Komponenten ändern
[gelöst]Font zur Laufzeit in allen Komponenten ändern
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.
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.
-
- 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
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);
Re: Font zur Laufzeit in allen Komponenten ändern
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;
-
- 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
Die meinte ich eigentlich auch. Ich war mir nur nicht sicher welche Funktion was gemacht hat. Vielen Dankwp_xyz hat geschrieben:Ich würde eher die Kombination Components[] / ComponentCount nehmen

Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
-
- 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
Code: Alles auswählen
f := Components[i].Font;
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
Mit Java und C/C++ sehe ich rot
-
- 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
Dann muss man doch TControl verwenden
Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Re: Font zur Laufzeit in allen Komponenten ändern
Nein. Schau dir halt meinen Code an.
-
- 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
Mit der Typen-Umwandlung geht die Kompilierung.Dann muss man doch TControl verwenden
Code: Alles auswählen
for i := 0 to ComponentCount - 1 do begin
WriteLn(Components[i].Name);
WriteLn(TControl(Components[i]).Font.Name);
end;
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
Mit Java und C/C++ sehe ich rot
Re: Font zur Laufzeit in allen Komponenten ändern
Nochmals: Schau dir meinen Code an, da ist alles drin.
-
- 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
Jetzt habe ich es gesehen
Das ist der springende Punkt.
Code: Alles auswählen
if (Components[i] is TControl) then
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- 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
Achso, das hatte ich falsch gelesen. Naja, Problem hoffentlich gelöst
Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Re: Font zur Laufzeit in allen Komponenten ändern
Recht herzlichen Dank für die Antowrten.
Werde das dann gleich mal aus probieren.
Werde das dann gleich mal aus probieren.
-
- 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
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 iterierenwp_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;
Re: Font zur Laufzeit in allen Komponenten ändern
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.
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.
Re: Font zur Laufzeit in allen Komponenten ändern
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;