AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frame-Name in Variable

Ein Thema von Ykcim · begonnen am 24. Aug 2012 · letzter Beitrag vom 24. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#1

Frame-Name in Variable

  Alt 24. Aug 2012, 00:28
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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 07:03
Das klingt aber sehr ähnlich dem hier: http://www.delphipraxis.net/169927-f...verwenden.html
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
CarlAshnikov

Registriert seit: 18. Feb 2011
Ort: Erfurt
108 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 07:12
Ohne Quelltext schwierig aber sowas in der Art?

Delphi-Quellcode:
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');
Nicht getestet!
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 08:29
Vielleicht kannst Du mit folgendem Code etwas anfangen ...
Delphi-Quellcode:
procedure TTemplate.FormCreate(Sender: TObject);
begin

{$IFDEF gentranstab}
    GetTheProps4Trans(Self,Self.Classname,'');
{$ELSE}
  Translate;
{$ENDIF}
end;
Translate s.u., GetTheProps4Trans im Anhang

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;
Angehängte Dateien
Dateityp: pas GenTranslationTable.pas (6,1 KB, 1x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 10:13
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:
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;
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
Main.Workshop1.WorkshopDetail1.Components[I]).Caption 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.

Ich möchte diese "Pfadangabe" Main.Workshop1.WorkshopDetail1. gerne als Variable haben, damit ich die Prozedure nicht für jedes Frame mit eigener Pfadangabe erstellen muss.



Irgendwie bezweifel ich, dass mir das jetzt verständlicher gelungen ist

Hat jemand eine Idee?

Vielen Dank Ykcim
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 10:22
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).
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 10:44
Siehe auch Sir Rufos bzw. mein Beitrag im verlinkten Thread.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 10:51
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;
Andreas
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 10:56
Toll! So klappt es, Bummi!!!

Delphi-Quellcode:
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;
Ich habe eine TComponent verwendet, um sowohl Frames als auch Forms damit übersetzen zu können.

Das ist der Aufruf
Delphi-Quellcode:
procedure TMain.ButtonTestClick(Sender: TObject);
begin
  Beschriftung ('WorkshopDetail', Main.Workshop1.WorkshopDetail1); //Das ist ein Frame
  Beschriftung ('Main', Main); //Das ist ein Form
end;
Vielen Dank an alle für Eure Hilfe!!!

Gruß
Ykcim
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Frame-Name in Variable

  Alt 24. Aug 2012, 10:57
Du darfst dann aber keine Komponenten dynamisch erzeugen, denen Du keinen Owner zuweist, denn die werden damit nicht erwischt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz