@shark
Genau, ich nutze Delphi 6 Enterprise.
Die aktuelle Delphi-Version wird bei uns erst in den nächsten Monaten integriert.
@Lemmy
Die Aufgabe habe ich so gestellt bekommen. Weitere vorgaben sind zum Beispiel, dass der Bestand an Sprachtexten vom Endanwender pflegbar sein soll und es auch eine Historie geben soll. Da eignet sich meiner Meinung nach eine datenbank-basierte Lösung am Besten.
Die
Unit TypInfo verwende ich schon, z.B. um die Liste mit Komponenten zu erstellen, die eine bestimmte Eigenschaft haben.
Dumm von mir, dass ich dadurch nicht auf die Funktion SetPropValue gekommen bin, die genau das macht, was ich suche. Ich konnte mein Konzept anhand meines Demoprojekts jetzt vervollständigen.
@stahli
Auf deinen ersten Link konnte ich leider auf Arbeit nicht zugreifen, da tatsächlich der Teilstring 'xxx' in URLs blockiert wird. /fazialpalmier
Was den zweiten Link betrifft, dass habe ich schon in meiner Anwendung realisiert, danke.
@Bummi
Hui, dass macht auf mich einen ziemlich mächtigen Eindruck. Ehrlich gesagt schaffe ich es gerade nicht mit meiner Konzentration mich da durch zu arbeiten. Vor allem, da ich schon den Großteil erstellt habe. Ich werde mir das aber mal merken und später - bei erweitertem Horizont - noch einmal zu Gemüte führen. Danke.
@Iwo Asnet
Alternative Programme sind in meiner Situation leider keine Lösung, da ich die Aufgabe mit oben genannten Vorgaben bekommen habe und dementsprechend ausführen muss. Außerdem lerne ich dabei am meisten.
Noch einmal an alle:
Danke für die Hilfe, letzlich hatte ich die Lösung schon als
Unit eingebunden und habe sie aber nicht erkannt. Jetzt funktioniert im Demoprojekt alles laut Vorgabe.
Hier einmal die Prozedur, die ich verwende, um die Komponenten zu übersetzen:
- an den Parameter 'lang' wird die Bezeichnung der Sprache übergeben, die auch als Spaltenbezeichnung in der Tabelle für die Sprachtexte verwendet wird (z.B. 'GERMAN')
- ListComponents listet alle Komponenten des Formulars, die Text-Eigenschaften erhalten können
- die Select-Abfrage liefert als Ergebnis alle Informationen, die zum Übersetzen benötigt werden
- für alle Einträge, die die Abfrage als Ergebnis liefert werden die Einträge der StringList (durch ListComponents generiert) abgeglichen
Delphi-Quellcode:
procedure TFRM_Main.SetTranslation(
const lang:
String);
var
SL: TStringList;
Text, Prop:
String;
Comp: TComponent;
time: Cardinal;
begin
time := GetTickCount;
SL := ListComponents;
with QRY_Container
do
begin
Close;
SQL.Clear;
SQL.Add('
SELECT T.'+lang+'
, C.COMP_LABEL, P.PROP_NAME FROM '+texts+'
T');
SQL.Add('
INNER JOIN '+master+'
M ON T.TEXT_ID = M.TEXT_ID');
SQL.Add('
INNER JOIN '+props+'
P ON P.PROP_ID = M.PROP_ID');
SQL.Add('
INNER JOIN '+comps+'
C ON C.COMP_ID = M.COMP_ID;');
Open;
end;
while not QRY_Container.Eof
do
begin
Text := QRY_Container.Fields.Fields[0].AsString;
Comp := FindComponent(QRY_Container.Fields.Fields[1].AsString);
Prop := QRY_Container.Fields.Fields[2].AsString;
if SL.IndexOf(QRY_Container.Fields.Fields[1].AsString) <> -1
then
begin
if Comp
is TMenuItem
then
SetPropValue(Comp,Prop,Text)
else if Comp
is TListBox
then
QRY_Container.Next
else if (Comp
is TComboBox)
and (Prop = '
Items')
then
QRY_Container.Next
else if (Comp
is TMainMenu)
then
QRY_Container.Next
else if Comp
is TControl
then
SetPropValue(Comp,Prop,Text);
end;
QRY_Container.Next;
end;
SL.Free;
time := GetTickCount - time;
ShowMessage('
Fertig nach '+IntToStr(time)+'
ms.');
end;