Einzelnen Beitrag anzeigen

Partikelecho

Registriert seit: 2. Dez 2011
14 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: [Mehrsprachigkeit] String als Property/Eigenschaft verwenden

  Alt 24. Feb 2012, 07:42
@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;

Geändert von Partikelecho (24. Feb 2012 um 08:17 Uhr)
  Mit Zitat antworten Zitat