Newsgroup: it.comp.lang.delphi
Titolo: Lettura variabile pubblica di due MDI child

Salve, ho il seguente problema.
Ho due MDI child (MDIChild1 e MDIChild2), ognuna con una variabile
pubblica (Variabile).
Nella form principale (MainForm) ho creato la seguente funzione, che
legge la variabile pubblica delle altre due child:
  begin
  for Cont:=0 to MDIChildCount-1 do
    begin
    if(MDIChildren[Cont].ClassName=NomeClasse) then
      begin
      if(MDIChildren[Cont].ClassName='TMDIChild1') then
        VarFunz:=TMDIChild1(MDIChildren[Cont]).Variabile;
      if(MDIChildren[Cont].ClassName='TMDIChild2') then
        VarFunz:=TMDIChild2(MDIChildren[Cont]).Variabile;
      [...]
      end;
    end;
  end;
Questo codice funziona, però vorrei evitare di fare due "if": sapete
darmi qualche consiglio?
Grazie in anticipo.
Alessandro

On 22 Jun 2004 11:01:45 -0700, Alessan...@Interfree.it
(Alessandro Vanni) wrote:

Qual'è il problema di due if? :-)
Quando si lavora con le stringhe, non potendo usare i case di if se ne
possono trovare a iosa.
al limite, se proprio vuoi ottimizzare usa un 
if then 
else if 
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 Alessandro
-- 
Ciao, Anto', [37, 143, AQ] 
MB C SC 220 CDI Magma Rot
"Di sempre cio' che senti e fai cio' che pensi."
    G.G. Màrquez

crei una from mdichild (frmBase) che espone un metodo nella sezione public:
function GetTuaVariabile: string; virtual; abstract;
Poi, le tue child le fai ereditare da tfrmbase e non da tform, avendo 
cura di dare un override di getTuaVariabile:
child1:
public
function GetTuaVariabile: string; override;
...
function tfrmchild.GetTuaVaribauile: string;
begin
   Result := 'child1'
end;
child2:
public
function GetTuaVariabile: string; override;
...
function tfrmchild.GetTuaVaribauile: string;
begin
   Result := 'child2'
end;
infine, nella mdi:
begin
   for Cont:=0 to MDIChildCount-1 do
     begin
       if MDIChildren[Cont] is TfrmBase then
         VarFunz:= tfrmBase(MDIChildren[Cont]).GetTuaRaviabile
...
Bye
A

Provato a sfruttare la class reference, tipo ClassType?
Saluti

 else if
In realtà ho semplificato il problema, infatti gli "if" sarebbero
alcune decine e in futuro potrebbero aumentare ancora con l'aggiunta
di nuove child.
Volendo potrei tranquillamente continuare a usare gli "if", tuttavia
speravo di trovare una soluzione migliore del "copia-incolla".

    end;
Purtroppo la proprietŕ Tag č giŕ stata utilizzata per altre cose.

...

Questa sembrerebbe la soluzione per risolvere il mio problema,
tuttavia non mi piace tanto avere le Child1 e Child2 ereditate dalla
MainForm, eventualmente potrei usare una form d'appoggio da cui
ereditare le Child1 e Child2; comunque ci penserò un po'...
Grazie.
Alessandro

 Provato a sfruttare la class reference, tipo ClassType?
In quale modo? Dall'help sembrerebbe che ClassType ritorni solo il
puntatore a TClass, come faccio ad accedere alla variabile delle child
partendo dal ClassType?

 ereditare le Child1 e Child2; comunque ci penserò un po'...
Parlvavo di una form "base", ma non ho *mai* detto di ereditare da mainform.
A

Forse ho capito male, cosa sono precisamente (anche il tipo) Variabile e
VarFunz?
Saluti

 Parlvavo di una form "base", ma non ho *mai* detto di ereditare da mainform.
Hai ragione, rileggendo il tuo messaggio ho visto che si parla di
ereditare da una form "base": non chiedermi come abbia potuto capire
di ereditare dalla MainForm, perché non lo so :)
Ciao.
Alessandro

 VarFunz?
"Variabile" č una proprietą read-only pubblica di tipo string delle
Child1 e Child2, mentre "VarFunz" č semplicemente una variabile locale
di una funzione nella MainForm.
Alessandro

uses TypInfo;
for Cont:=0 to MDIChildCount-1 do
  VarFunz:=GetPropValue(MDIChildren[Cont],'Variabile');
Hai provato cosě?
Saluti

 Hai provato così?
Funziona con le proprietà ereditate da TForm, ma non con la proprietà
"Variabile" definita nella mia MDIChild, infatti ritorna NULL.
Saluti.
Alessandro