Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Form Namen Variable verwenden (https://www.delphipraxis.net/169927-form-namen-variable-verwenden.html)

Andidreas 21. Aug 2012 17:32

AW: Form Namen Variable verwenden
 
Zitat:

Zitat von Sir Rufo (Beitrag 1179111)
Zitat:

Zitat von Andidreas (Beitrag 1179110)
@Sir Rufo
Gibt es keine möglichkeit, das ich im OnShow ereignis einer Form die Komponenten durchsuche und die Captions etc. setze und das über eine Prozedur die ich im OnShow Ereignis aufrufe so wie von mir angedacht?

:?: Das passiert doch so wie ich das geschrieben habe - gut der Aufruf müsste dann im OnShow erfolgen

Und die Prozedur kann dann in einer anderen Unit liegen?
Sorry wenn ich so doof nachfrage, aber ich steh grad ein klein wenig aufm Schlauch... :oops:

Uwe Raabe 21. Aug 2012 17:36

AW: Form Namen Variable verwenden
 
Kurze Zwischenfrage: ist D2005 richtig oder arbeitest du schon mit was neuerem?

DeddyH 21. Aug 2012 17:41

AW: Form Namen Variable verwenden
 
Klappt das hiermit (komplett ungetestet, da im Editor getippt)?
Delphi-Quellcode:
uses
  TypInfo;
 
function HasProperty(AClass: TObject; const APropertyName: String): Boolean;
var
  MyPropInfo: PPropInfo;
begin
  MyPropInfo := GetPropInfo(AClass.ClassInfo, APropertyName);
  Result := Assigned(MyPropInfo);
end;

function CompSetPropValue(AClass: TObject; const PropName, Caption: string): Boolean;
var
  MyPropInfo: PPropInfo;
begin
  MyPropInfo := GetPropInfo(AClass.ClassInfo, PropName);
  Result := Assigned(MyPropInfo);
  if Result then
    SetPropValue(AClass, PropName, Caption);
end;

procedure prLoadModuleLanguage(AParent: TWinControl);
const PROPNAMES: array[0..1] of string = ('Caption', 'Text');
var
  i, j: integer;
  NewText: string;
  AControl: TControl;
begin
  Assert(Assigned(AParent));
  for i := 0 to AParent.ControlCount - 1 do
    begin
      AControl := AParent.Controls[i];
      NewText := fnGetComponentCountryText('Component', AParent.ClassName,
        AControl.ClassName, AControl.Name);
      for j := Low(PROPNAMES) to High(PROPNAMES) do
        if HasProperty(AControl, PROPNAMES[j]) then      
          begin
            CompSetPropValue(AControl, PROPNAMES[j], NewText);
            break;
          end;
      if AControl is TWinControl then
        prLoadModuleLanguage(TWinControl(AControl));
    end;
end;

Sir Rufo 21. Aug 2012 17:50

AW: Form Namen Variable verwenden
 
Zitat:

Zitat von Andidreas (Beitrag 1179113)
Zitat:

Zitat von Sir Rufo (Beitrag 1179111)
Zitat:

Zitat von Andidreas (Beitrag 1179110)
@Sir Rufo
Gibt es keine möglichkeit, das ich im OnShow ereignis einer Form die Komponenten durchsuche und die Captions etc. setze und das über eine Prozedur die ich im OnShow Ereignis aufrufe so wie von mir angedacht?

:?: Das passiert doch so wie ich das geschrieben habe - gut der Aufruf müsste dann im OnShow erfolgen

Und die Prozedur kann dann in einer anderen Unit liegen?
Sorry wenn ich so doof nachfrage, aber ich steh grad ein klein wenig aufm Schlauch... :oops:

Ja, das geht problemlos, allerdings musst du wohl noch die eine oder andere Unit in die uses der Unit mit aufnehmen (z.B. Classes, Controls).

Das ist aber auf jeden fall eine Reduzierung, weil bei deinem Ansatz musst du ja deine kompletten Komponenten-Units einbinden ;)

Andidreas 21. Aug 2012 18:08

AW: Form Namen Variable verwenden
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1179115)
Kurze Zwischenfrage: ist D2005 richtig oder arbeitest du schon mit was neuerem?

Ne stimmt nicht mehr, haben mittlerweile RAD Studio XE und XE2 liegt uninstalliert in der Schublade :-D

@deddyH und Sir Rufo
Werd Eure Ansätze morgen mal ausprobieren... Aufm iPad hab ich leider kein RAD Studio :lol:

himitsu 21. Aug 2012 18:39

AW: Form Namen Variable verwenden
 
XE2 hat selber in vielen Komponenten eine Übersetzungsfunktion integriert, wo sich die Komponenten selber übersetzen, also keiner sie suchen muß und wo du dich mit deiner Funktion einklinken könntest.

Andidreas 22. Aug 2012 07:59

AW: Form Namen Variable verwenden
 
Ich habs jetzt mal so gemacht:

Delphi-Quellcode:
procedure prLoadModuleLanguage(frmModule : TForm);

var
i : Integer;


begin

  For i := 0 To frmModule.ComponentCount -1 Do
  Begin

    //TAdvPage
    If (frmModule.Components[i] is TAdvPage) Then
    Begin
      (frmModule.Components[i] as TAdvPage).Caption := fnGetComponentCountryText('Component', frmModule.Name, 'TAdvPage', (frmModule.Components[i] as TAdvPage).Name);
    End;

    //TAdvToolBar
    If (frmModule.Components[i] is TAdvToolBar) Then
    Begin
      (frmModule.Components[i] as TAdvToolBar).Caption := fnGetComponentCountryText('Component', frmModule.Name, 'TAdvToolBar', (frmModule.Components[i] as TAdvToolBar).Name);
    End;

    //TAdvGlowButton
    If (frmModule.Components[i] is TAdvGlowButton) Then
    Begin
      (frmModule.Components[i] as TAdvGlowButton).Caption := fnGetComponentCountryText('Component', frmModule.Name, 'TAdvGlowButton', (frmModule.Components[i] as TAdvGlowButton).Name);
    End;

  End;

end;

Ist der Lösungsansatz schlechter als der von deddyH oder Sir Rufo?

DeddyH 22. Aug 2012 08:04

AW: Form Namen Variable verwenden
 
Zumindest ist er unflexibler :mrgreen:

Andidreas 22. Aug 2012 08:09

AW: Form Namen Variable verwenden
 
Zitat:

Zitat von DeddyH (Beitrag 1179236)
Zumindest ist er unflexibler :mrgreen:

Weil ich immer Abfragen muss was es für eine Komponente ist?

DeddyH 22. Aug 2012 08:11

AW: Form Namen Variable verwenden
 
Genau. Sobald ein neuer Komponententyp dazukommt, musst Du den Code wieder erweitern. Und ob Du wirklich auf Components statt Controls zugreifen willst, musst Du anhand der vorherigen Diskussion selbst entscheiden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr.
Seite 3 von 4     123 4      

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