Avatar billede js_delphi Nybegynder
13. oktober 2011 - 19:41 Der er 7 kommentarer og
2 løsninger

Smart måde at sætte flere properties i en klasse med et enkelt kald?

Hej,

jeg har en klasse, som bl.a. består af mange labels, som jeg vil sætte Caption på i runtime (sprogomskiftningsfunktion).

Da alle sprogafhængige tekster kommer fra en separat form (frmLanguage), og jeg i OOP's hellige navn ikke vil tilgå denne form direkte fra min klasse, har jeg brug for at sætte de forskellige tekster via procedure i klassen (f.eks. SetLabel1Caption(AValue: string)).

Fra min frmMain ser det så sådan her ud:
klasse.SetLabel1Caption(frmLanguage.GetText(Label1Text)).

Nu er mit spørgsmål så, hvordan jeg kan sætte alle labels på en gang, uden at lave en procedure for hver label, så min frmMain ikke skal se sådan ud:
klasse.SetLabel1Caption(frmLanguage.GetText(Label1Text));
klasse.SetLabel2Caption(frmLanguage.GetText(Label2Text));
klasse.SetLabel3Caption(frmLanguage.GetText(Label3Text));
...

Jeg kunne selvfølgelig lave en procedure, hvor jeg overgiver alle teksterne på en gang:
klasse.SetLabelsCaption(frmLanguage.GetText(Label1Text), frmLanguage.GetText(Label2Text), ...);
Det er bare ikke særlig elegant med så mange parametre.

Eller med et loop:
for i := 1 to 20 do
  klasse.SetLabelsCaption(i, frmLanguage.GetText(i));

Synes bare det er svært at vedligeholde, når der arbejdes med relative indexer, da jeg i min klasse så skal holde styr på, at i=12 f.eks. er lblUserName osv.

Har nogen bedre forslag til en elegant løsning?
Venligst ikke foreslå færdige komponenter til sprogomskiftning osv., da jeg faktisk er ret godt tilfreds med min overordnede løsning :)

Takker på forhånd!
Avatar billede martinlind Nybegynder
13. oktober 2011 - 22:22 #1
Kunne det være en mulighed at "decentralisere" dit sprog skifte...
så din klasse selv kan skifte sprog, når den får besked på det, evt med noget nedarvning, så du ikke skal vedligeholde alle dine klasser
Avatar billede Delphi_Ekspert Nybegynder
14. oktober 2011 - 00:30 #2
Hej,

Jeg går udfra at klassen med labels er nedarvet fra TForm. Jeg kalder den TFormA.

type
  TFormA = class(TForm)
    ...
  private
  public
    procedure SetLabelCaption(Name, Caption: string);
  end;

implementation

procedure TFormA.SetLabelCaption(Name, Caption: string);
var
  Component: TComponent;
begin
  Component:=FindComponent(Name);
  if Component is TLabel then
    TLabel(Component).Caption:=Caption;
end;

Hvis en udgave af den anden form hedder frmLanguage så kan du nemt overføre alle label captions fra frmLanguage til en udgave a TFormA, FormA ved

procedure SkiftSprog;
var
  i: integer;
  Lab: TLabel;
begin
  for i:=0 to frmLanguage.ComponentCount-1 do
    if frmLanguage.Components[i] is TLabel then begin
      Lab:=TLabel(frmLanguage.Components[i]);
      FormA.SetLabelCaption(Lab.Name,Lab.Caption);
    end;
end;

Løsningen kræver at labels har samme navne i de 2 forms.

Venlig hilsen
Jan
www.it-konsulent.dk
Avatar billede js_delphi Nybegynder
14. oktober 2011 - 09:14 #3
>>martinlind
Det kunne man måske, men det ønsker jeg ikke, da alle tekster bliver hentet fra en enkel ini fil.
Jeg vil helst ikke have at flere forme læser fra denne fil, og jeg vil heller ikke have flere filer.

>>Delphi_Ekspert
1:
Teksterne ligger ikke som labels på frmLanguage, men bliver hentet fra en ini fil.

2:
Selv hvis de lå som labels, ville jeg jo ikke tilgå dem direkte (pga. OOP)!


Bonus info:
Teksterne fra ini filen har samme navn som de tilhørende komponenter (f.eks. lblTest fra ini filen hører til label lblTest osv.).
Avatar billede Delphi_Ekspert Nybegynder
14. oktober 2011 - 09:54 #4
Hej,

Så kan følgende måske bruges

procedure SkiftSprog;
var
  i: integer;
  Lab: TLabel;
begin
  for i:=0 to frmLanguage.LabelCount-1 do begin
    LabelName:=frmLanguage.GetLabelName(i);
    FormA.SetLabelCaption(LabelName,frmLanguage.GetLabelCaption(LabelName));
  end
end;

Ovennævnte kræver at der defineres en property LabelCount, samt GetLabelName og GetLabelCaption på TfrmLanguage.

Venlig hilsen
Jan
Delphi udvikler
Avatar billede arne_v Ekspert
15. oktober 2011 - 17:28 #5
Hvorfor bruge en anden form til at holde dem? Hvorfor ikke bare loade dem direkte?
Avatar billede martinlind Nybegynder
15. oktober 2011 - 20:12 #6
Ja altså... når du helst ikke vil ændre noget, tror jeg ikke du får det smartere end det er :-)
Avatar billede js_delphi Nybegynder
18. oktober 2011 - 09:09 #7
Jeg er ved at implementere en loesning, og vender foerst tilbage, naar jeg er sikker paa, at det er den rigtige!
Tak indtil videre.
Avatar billede arne_v Ekspert
27. november 2011 - 01:38 #8
Kommet videre??
Avatar billede js_delphi Nybegynder
22. august 2012 - 21:01 #9
Hej igen,

ja, jeg fik faktisk lavet en ordenlig løsning på sagen (delvist med hjælp fra Delphi_Ekspert), dog er det så længe siden, at jeg ikke kan huske detaljerne mere.
Da jeg ikke har Delphi installeret mere, er det heller ikke så let at grave frem.

Hvis noget ønsker detaljer, må de lige sige til, så forsøger jeg at finde det frem af gemmerne.

Undskyld det (meget) sene svar!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester