Alle Objekte eines Formulares durchgehen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
karkov
Beiträge: 69
Registriert: Di 27. Okt 2009, 17:52

Alle Objekte eines Formulares durchgehen

Beitrag von karkov »

Gibt es eine Möglichkeit mit hilfe einer Laufenden Zahl alle Objekte eines Formulares druchzugehen?
Ich will ein Programm schreiben, das in mehreren Sprachen vorhanden ist. Dazu will ich mit Hilfe einer Schleife auf alle Objekte eines Formulares zugreifen und diese je nach Sprache den Inhalt der Eigenschaft Caption anpassen (über eine DB).

df.id
Beiträge: 20
Registriert: Fr 23. Mai 2008, 00:29
OS, Lazarus, FPC: Windows|Linux (L 3.8.0 FPC 3.2.2)
CPU-Target: Intel
Wohnort: Münster
Kontaktdaten:

Re: Alle Objekte eines Formulares durchgehen

Beitrag von df.id »

Jedes Formular hat die Eigenschaften Controls[] und ControlCount. Enthält das Formular WinControls, wie tPanel, muß man nur rekursiv arbeiten, um alle Objekte zu besuchen. Das könnte so aussehen:

Code: Alles auswählen

procedure TForm1.UpdateOne(Control: TControl);
begin
 // hier das Sprachupdate auf Control.Caption durchführen
end;
 
procedure TForm1.UpdateAll(Control: TControl);
var
 i: Integer;
begin
 if Control is TWinControl then
  with Control as TWinControl do
   for i:=0 to ControlCount-1 do
    UpdateAll(Controls[i]);
 UpdateOne(Control);
end;
 
procedure TForm1.ExecuteUpdateAll(Sender: TObject);
begin
 UpdateAll(Self);
end;
Für Internationalisierung existieren aber auch Standardmuster, die wahrscheinlich den besseren Weg darstellen.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Alle Objekte eines Formulares durchgehen

Beitrag von pluto »

Es gibt noch eine zweite Eigenschaft: ComponentCount und Components. Werden genauso genutzt wie im Beispiel gezeigt.
MFG
Michael Springwald

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Alle Objekte eines Formulares durchgehen

Beitrag von carli »

karkov hat geschrieben:Gibt es eine Möglichkeit mit hilfe einer Laufenden Zahl alle Objekte eines Formulares druchzugehen?
Ich will ein Programm schreiben, das in mehreren Sprachen vorhanden ist. Dazu will ich mit Hilfe einer Schleife auf alle Objekte eines Formulares zugreifen und diese je nach Sprache den Inhalt der Eigenschaft Caption anpassen (über eine DB).
Warum machst du's nicht über die offiziellen i18n-Methoden?
http://wiki.lazarus.freepascal.org/Tran ... r_programs" onclick="window.open(this.href);return false;

karkov
Beiträge: 69
Registriert: Di 27. Okt 2009, 17:52

Re: Alle Objekte eines Formulares durchgehen

Beitrag von karkov »

Danke für die Antworten. Das ist genau das, was ich gebraucht habe! :-)

@ carli: auf die gefahr hin, mich zu blamieren, wi und wie definiere ich denn Ressourcenstrings? Das ist mir bei der Lektüre nicht ganz klar geworden.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Alle Objekte eines Formulares durchgehen

Beitrag von carli »

karkov hat geschrieben:Danke für die Antworten. Das ist genau das, was ich gebraucht habe! :-)

@ carli: auf die gefahr hin, mich zu blamieren, wi und wie definiere ich denn Ressourcenstrings? Das ist mir bei der Lektüre nicht ganz klar geworden.

Code: Alles auswählen

resourcestring
    rsSomeText = 'Some text';
Blamieren tust du dich nicht, weil du fragst, sondern weil ein simples Google "Lazarus ressourcenstrings" dasselbe Ergebnis liefert.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Alle Objekte eines Formulares durchgehen

Beitrag von Scotty »

Falls du die Standard i18n nicht magst, dann kannst du dir meine Variante auf LazForge ansehen. Alle dynamischen Strings werden in der jeweiligen Unit als r* verwendet, ulanguage eingebunden und r* dort definiert. SetLanguage() ist die Hauptroutine. Der Vorteil meiner Version ist eine IMHO übersichtlichere lang-Datei und die Umschaltung der Sprache zur Laufzeit, Nachteil, dass es eben kein Standard ist. Es gibt aber sicher noch viele weitere Nachteile 8)

Antworten