![]() |
Frame-Name in Variable
Hallo Zusammen,
ich versuche gerade ein Programm zu schreiben und möchte es für mehrere Sprachen verfügbar machen. Das heißt, dass beim Start die Sprache, die bei dem User hinterlegt ist, abgefragt werden soll, und dann die Caption in der jeweiligen Sprache gesetzt werden. Ich habe mir dafür eine Procedure geschrieben, die auch wunderbar funktioniert. Allerdings möchte ich diese effektiver gestalten. Jetzt zu meinem Problem: Das Programm arbeit mit einer ganzen Reihe von Frames, die von dem Prozeduraufruf auf dem Hauptformular aus "übersetzt" werden. Um auf die jeweiligen Komponenten auf den jeweiligen Frames zugreifen zu können, muss ich diese angeben (TLabel(Main.Workshop1.WorkshopDetail1.Components[I]).Caption). Ich würde dafür gerne eine Variable für den Teil "Main.Workshop1.WorkshopDetail1" verwenden, damit ich den Prozedure-Inhalt nicht für jedes Frame wieder holen muss. Kann mir jemand einen Tip geben, wie ich das anstellen müsste? Vielen Dank Ykcim |
AW: Frame-Name in Variable
Das klingt aber sehr ähnlich dem hier:
![]() |
AW: Frame-Name in Variable
Ohne Quelltext schwierig aber sowas in der Art?
Delphi-Quellcode:
Nicht getestet!
procedure Translate(aComp: TComponent; compNbr: integer; Text: String);
var subComp: Tcomponent; begin subComp := aComp.Components[compNbr]; if subComp is TLabel then TLabel(subComp).caption := text; end; Translate(Main.Workshop1.WorkshopDetail1, I, 'DeinText'); |
AW: Frame-Name in Variable
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht kannst Du mit folgendem Code etwas anfangen ...
Delphi-Quellcode:
Translate s.u., GetTheProps4Trans im Anhang
procedure TTemplate.FormCreate(Sender: TObject);
begin {$IFDEF gentranstab} GetTheProps4Trans(Self,Self.Classname,''); {$ELSE} Translate; {$ENDIF} end;
Delphi-Quellcode:
// Lokalisierung von Properties aus Translate_xx.XML
Procedure SetTranslation(Lang:TDataset;TheForm:TForm); var TheComp:TComponent; CN,CNP:String; PropInfo: PPropInfo; V:PPTypeInfo; cap,Prop:String; begin Lang.Filter := 'FormClassName=' + QuotedStr(TheForm.ClassName) + ' AND not hidden'; Lang.Filtered := true; While not Lang.Eof do begin try TheComp:=TheForm; CN:=Lang.FieldByName('ComponentName').asString; if Length(CN)>0 then begin While (Pos('.',CN)>0) and Assigned(TheComp) do begin CNP:=Copy(CN,1,pos('.',CN)-1); CN:=Copy(CN,pos('.',CN)+1,Length(CN)); if Pos('*',CNP)>0 then TheComp:=TheComp.Components[StrToInt(Copy(CNP,2,Length(CNP)))] else TheComp:=TheComp.FindComponent(CNP); end; if Assigned(TheComp) then begin if Pos('*',CN)>0 then TheComp:=TheComp.Components[StrToInt(Copy(CN,2,Length(CN)))] else TheComp:=TheComp.FindComponent(CN); end; end; IF Assigned(TheComp) then begin if Lang.FieldByName('IsClassType').asBoolean then begin PropInfo := GetPropInfo(TheComp,Lang.FieldbyName('Property').Value); if Assigned(PropInfo) then begin try if (not (TheComp is TMainMenu)) and (not (TheComp is TPopupMenu)) and (not (TheComp is TPageControl)) then //and ((not ((TheComp is TDBRadioGroup) or (TheComp is TRadioGroup)))) then TStrings(GetOrdProp(TheComp,PropInfo)).Text:=Lang.FieldbyName('Content').Value; except ON E:Exception do MessageDLG( E.Message+#13#10+TheComp.Name + ' - ' + Lang.FieldbyName('Property').Value,mtError,[mbok],0); end; end; end else begin cap:= Lang.FieldbyName('Content').Value; Prop:=Lang.FieldbyName('Property').Value; SetPropValue(TheComp,prop,cap); end; end; except ON E:Exception do MessageDLG( E.Message+#13#10+TheComp.Name + ' - ' + Lang.FieldbyName('Property').Value,mtError,[mbok],0); end; Lang.Next; end; end; |
AW: Frame-Name in Variable
Hallo Zusammen,
vielen Dank für die Antworten! Ich glaube aber, dass ich Euch mein Problem nicht richtig beschrieben habe, daher versuche ich es nocheinmal: Ich habe auf meinem MySQL Server eine Tabelle, in welcher der Framename, der Label- oder Buttonname, die Sprache und das Caption für diese Sprache steht. In der Prozedur wird der Framename mitgeliefert. Diese holt dann alle Label- oder Buttonnamen und das dazugehörige Caption für die gewählte Sprache aus der MySQL-Tabelle. Dann werden alle Komponenten auf dem mitgelieferten Frame durchsucht und überprüft, ob für die Komponente eine Übersetzung in der MySQL Tabelle war und diese dann gesetzt. Hier die Prozedur:
Delphi-Quellcode:
Diese Prozedur kann ich theoretisch für alle Frames ungeändert ausführen. Aber damit das Frame von meinem Hauptformular erreichbar ist, muss ich ihm ja den Weg zeigen (Sorry, ich weiß es nicht ander zu erklären), indem ich das schreibe
Procedure Beschriftung (Maske: string);
var query1, query2: string; Cols1, Cols2: TCols; Rows1, Rows2: TRows; i, j: integer; Language: string; begin Language:='deutsch'; //Das ist noch statisch, wird aber später dynamisch query1:='select Sprachen_ID from sprachen where Sprache='+#39+Language+#39; Connect; ExecQuery(DB, query1, Cols1, Rows1); DisConnect; //Hier werden die Daten für die Komponenten des mitgelieferte Frames (var Maske) aus dem MySQL-Server geholt query2:='select Feld_Name, Feld_Bezeichnung from sprache_bezeichnung '+ 'where Sprache='+Rows1[0,0]+' and Maske='+#39+Maske+#39+ ' and Variante=1'; Connect; ExecQuery(DB, query2, Cols2, Rows2); DisConnect; //Ab hier werden die Komponenten des mitgliefertes Frames durchsucht und das Caption geändert for I := 0 to Main.Workshop1.WorkshopDetail1.ComponentCount-1 do begin if (Main.Workshop1.WorkshopDetail1.Components[I] is TLabel) or (Main.Workshop1.WorkshopDetail1.Components[I] is TButton) then begin if (Main.Workshop1.WorkshopDetail1.Components[I] is TLabel) then begin for J:=0 to Length(Rows2[0])-1 do begin if Rows2[0,J]=TLabel(Main.Workshop1.WorkshopDetail1.Components[I]).Name then begin TLabel(Main.Workshop1.WorkshopDetail1.Components[I]).Caption:=Rows2[1,J]; end; end; end; if (Main.Workshop1.WorkshopDetail1.Components[I] is TButton) then begin for J:=0 to Length(Rows2[0])-1 do begin if Rows2[0,J]=TButton(Main.Workshop1.WorkshopDetail1.Components[I]).Name then begin TButton(Main.Workshop1.WorkshopDetail1.Components[I]).Caption:=Rows2[1,J]; end; end; end; end; end; end;
Delphi-Quellcode:
Dabei ist Main das Hauptformular, Workshop1 ist ein Frame auf dem Hauptformular, und WorkshopDetail1 ist das mitgelieferte Frame, welches sich auf dem Frame Workshop1 befindet und was hier übersetzt werden soll.
Main.Workshop1.WorkshopDetail1.Components[I]).Caption
Ich möchte diese "Pfadangabe"
Delphi-Quellcode:
gerne als Variable haben, damit ich die Prozedure nicht für jedes Frame mit eigener Pfadangabe erstellen muss.
Main.Workshop1.WorkshopDetail1.
Irgendwie bezweifel ich, dass mir das jetzt verständlicher gelungen ist :? Hat jemand eine Idee? Vielen Dank Ykcim |
AW: Frame-Name in Variable
Du kannst doch in Deinen Templates oder auch im Mainform ein Routine aufrufen der das Template oder Mainform als Parameter(TComponent) mitgegeben wird, welche erst alles für TComponent übersetzt und dann rekursiv die gleiche Routine für alle Komponenten (über ComponentCount) aufruft.
Mein letztes Posting macht eben dieses (per RTTI um nicht jeden Komponententyp gesondert behandeln zu müssen). |
AW: Frame-Name in Variable
Siehe auch Sir Rufos bzw. mein Beitrag im verlinkten Thread.
|
AW: Frame-Name in Variable
Delphi-Quellcode:
// sucht eine Komponente anhand des Pfads (z.B. 'Main.Workshop1.WorkshopDetail1')
function FindComponentByPath(owner:TComponent; name:string):TComponent; var s : string; p : Integer; begin if not Assigned(owner) then begin Result := nil; Exit; end; p := Pos('.', name); if p = 0 then begin Result := owner.FindComponent(name); Exit; end; s := Copy(name, 1, p-1); name := Copy(name, p+1, 999); Result := owner.FindComponent(s); if Assigned(Result) then Result := FindComponentByPath(Result, name); end; |
AW: Frame-Name in Variable
Toll! So klappt es, Bummi!!!
Delphi-Quellcode:
Ich habe eine TComponent verwendet, um sowohl Frames als auch Forms damit übersetzen zu können.
Procedure Beschriftung (Maske: string; TheComp:TComponent);//Damit ist es egal, ob es ein Form oder ein Frame ist
var query1, query2: string; Cols1, Cols2: TCols; Rows1, Rows2: TRows; i, j: integer; Language: string; begin Language:='deutsch'; query1:='select Sprachen_ID from sprachen where Sprache='+#39+Language+#39; Connect; ExecQuery(DB, query1, Cols1, Rows1); DisConnect; query2:='select Feld_Name, Feld_Bezeichnung from sprache_bezeichnung '+ 'where Sprache='+Rows1[0,0]+' and Maske='+#39+Maske+#39+ ' and Variante=1'; Connect; ExecQuery(DB, query2, Cols2, Rows2); DisConnect; for I := 0 to TheComp.ComponentCount-1 do begin if (TheComp.Components[I] is TLabel) or (TheComp.Components[I] is TButton) then begin if (TheComp.Components[I] is TLabel) then begin for J:=0 to Length(Rows2[0])-1 do begin if Rows2[0,J]=TLabel(TheComp.Components[I]).Name then begin TLabel(TheComp.Components[I]).Caption:=Rows2[1,J]; end; end; end; if (TheComp.Components[I] is TButton) then begin for J:=0 to Length(Rows2[0])-1 do begin if Rows2[0,J]=TButton(TheComp.Components[I]).Name then begin TButton(TheComp.Components[I]).Caption:=Rows2[1,J]; end; end; end; end; end; end; Das ist der Aufruf
Delphi-Quellcode:
Vielen Dank an alle für Eure Hilfe!!!
procedure TMain.ButtonTestClick(Sender: TObject);
begin Beschriftung ('WorkshopDetail', Main.Workshop1.WorkshopDetail1); //Das ist ein Frame Beschriftung ('Main', Main); //Das ist ein Form end; Gruß Ykcim |
AW: Frame-Name in Variable
Du darfst dann aber keine Komponenten dynamisch erzeugen, denen Du keinen Owner zuweist, denn die werden damit nicht erwischt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz