Newsgroup: it.comp.lang.delphi
Titolo: Polimorfismo?

Ho un altro problema. Ho una serie di controlli a cui applicare una stessa 
operazione. Per passarli come parametro usando la stessa procedura devo 
risalire fino a TComponent o TControl che pero' non hanno la proprieta' che 
mi interessa. Devo quindi fare una serie di if...then...else nidificati del 
tipo: if (MyComp is TButton) then (MyComp is TButton).Propieta' ecc.
Vorrei sapere se esiste un modo per evitare tutti questi if.
Se ricorro al polimorfismo (so solo cos'e' e non l'ho mai usato).
Grazie
-- 
Ciao,
   Stefano

Stefano Costantini

interfacce ?

> interfacce ?
Non capisco.
-- 
Ciao,
   Stefano

 mi interessa. Devo quindi fare una serie di if...then...else nidificati
Che senso avrebbe una unica procedura che lavora su prop diverse in base al
componente ricevuto come parametro?
tanto vale averne una x tipo e buonanotte.
Ma tutto dipende da COSA fa la tua proc e quale prop usi.
Bye
A.

 ha scritto nel messaggio
news:ai5vg9$11mrq9$1...@ID-154342.news.dfncis.de...


 Ma tutto dipende da COSA fa la tua proc e quale prop usi.
No: la proprieta' e' la stessa.
Specifichiamo meglio: il tutto si riferisce al punto 2) del thread 
"Localizzazione". Devo tradurre le Caption. Ora TButton, TLabel, TMenuItem 
sono tutti TComponent ma TComponent non ha la proprieta' Caption.
-- 
Ciao,
   Stefano

 ha scritto nel messaggio
news:ai632o$112sab$1...@ID-154342.news.dfncis.de...


 da quanto ho capito dovrebbe andare un class reference.
Cioe' come parametro della funzione anziche' usare
MyComp: TComponent
definire
type MyClass: class of TComponent
e usare:
MyComp: MyClass?
Provo.
Grazie
-- 
Ciao,
   Stefano

 ha scritto nel messaggio
news:ai63c2$112sab$2...@ID-154342.news.dfncis.de...


> ..usa TControl.SetTextBuf..
Non va perche' devo usare TComponent (per i menu') e SetTextBuf non c'e'.
Grazie comunque.
-- 
Ciao,
   Stefano

> Come ho scritto sopra devo cambiare le Caption.
e il kit x la localizzazione non va bene?
Bye
A.

 Non capisco.
sono un modo per implementare l'ereditarieta' multipla,
possono risolvere elegantemente il tuo problema; il guaio
e' che devi modificare i componenti di libreria oppure
incapsularli in tuoi componenti che usano interfacce comuni
(tutto questo a meno che qualcuno in Borland non abbia
gia' fatto questo; di D6 non ho ancora guardato i sorgenti
di libreria...).
Nell'help cerca la parola chiave interface.
ciao

 e il kit x la localizzazione non va bene?
Su questo ho aperto un altro thread per chiedere i vostri pareri. Credo che 
il translation manager non sia cosi' valido perche' non mi sembra traduca 
tutto. Se metto un MessageDlg(...) il testo non appare nelle voci da 
tradurre, oltre al fatto che comunque se il messaggio e' un mtInformation 
la scritta resta Information e non diventa Informazione a meno di 
modificare la unit const.pas (mi pare).
-- 
Ciao,
   Stefano

 ..usa TControl.SetTextBuf..
Ho provato a scrivere:
  (MyComp as MyComp.ClassType).Caption:=str;
ClassType e' del tipo TClass.
Mi da errore perche' Caption non e' definito. Che non lo sia in TComponent 
lo so, ma nelle classi che gli passo c'e' eccome!
-- 
Ciao,
   Stefano

 modificare la unit const.pas (mi pare).
"consts.pas"
Quello che faccio io e' una copia di consts.pas distribuito di
default, nella cartella del mio progetto e faccio le modifiche del
caso.

 esattamente i nomi delle funzioni, semmai scrivimi per e-mail.
Gli ho dato un'occhiata ma non mi sembra che facciano al caso mio.
Io so che i componenti che passo hanno la proprieta' Caption ma siccome li 
passo come TComponent, che non invece non l'ha, quando scrivo:
  (MyForm.Components[i] as MyForm.Components[i].ClassType).Caption:
=MyString;
mi da errore mentre se scrivo (nel caso stia trattando una Label):
  if (MyForm.Components[i] is TLabel) then
    (MyForm.Components[i] as TLabel).Caption:=MyString;
Va tutto bene.
-- 
Ciao,
   Stefano

 mi da errore 
E' ovvio.  E' per questo che ti ho scritto che per assegnare un valore
alla proprieta' non devi usare l'assegnazione, ma una funzione
specifica (SetStrProp):
uses TypInfo;
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  C: TComponent;
begin
  for I := 0 to ComponentCount-1 do
  begin
    C := Components[I];
    if IsPublishedProp(C, 'Caption') then
      SetStrProp(C, 'Caption', IntToStr(Random(100)));
  end;
end;

 end;
La prorieta' Caption nei TComponent NON esiste, nei TControl e' Protected.
-- 
Ciao,
   Stefano

 La prorieta' Caption nei TComponent NON esiste, nei TControl e' Protected.
A quanto pare sei ostinato a non voler capire.
Il codice che ti ho scritto controlla tramite RTTI, innanzitutto, SE
il componente che stai esaminando POSSIEDA la proprieta' Caption e se
questa sia Published ed eventualmente le assegna un valore.
Perche' non provi il codice che ti viene postato prima di rispondere ?
Piazza dei componenti a caso sul tuo form e usa il codice che ti ho
mostrato.
La proprieta' Caption verra' impostata solo per quelli che la
possiedono.

 possiedono.
Chiedo umilmente perdono.
Giuro che avevo seguito la strada da te indicata ma senza fare copia-
incolla. Ho scritto il codice nella mia applicazione e non mi funzionava.
Devo aver passato male i parametri.
Ho appena copiaincollato la procedura che mi hai postato in una 
applicazione che non fa nulla e va.
Cospargendomi il capo di cenere sulla strada che porta a Canossa ringrazio 
sentitamente.
-- 
Ciao,
   Stefano