Newsgroup: it.comp.lang.delphi
Titolo: override della ShowModal

Immaginate un Main e una form secondaria creata sul click del
FormMain.Button1.
Sul click del FormMain.button2 invece viene effettuata la ShowModal.
Se io invece volessi che quando viene chiamata la ShowModal non venga
effettivamente lanciata la ShowModal della Form ma vorrei che venga
lanciata una mia procedura (es. Form2.Setup) che a sua volta, dopo una
breve inizializzazione, lancerà la ShowModal. Come posso fare?
Se effettuo l'override della ShowModal poi quando la chiamo dalla
Setup, questa richiama sempre se stessa.
---- FORMMAIN ----
var
  MioOggetto : TForm2;  // <-- PUBBLICO
procedure TFormMain.Button1Click(Sender: TObject);
begin
  MioOggetto := TForm2.Create(nil);
end;
procedure TFormMain.Button1Click(Sender: TObject);
begin
  MioOggetto.ShowModal;
end;
--- FORM2 ----
function ShowModal: Integer; override;
...
procedure TForm2.Setup;
begin
  // Faccio quel che mi pare..
  ....
  ShowModal;      // <-- io vorrei chiamare la ShowModal originale ma
se ho fatto l'override... !?!?!?
end;
function TForm2.ShowModal: Integer;
begin
  Setup();   // chiamo la setup che dopo una serie di conti, dovrebbe
mostrarmi la form ma...
end;
--------------------------------------------
Io dalla Setup vorrei chiamare la ShowModal originale ma se ho fatto
l'override... !?!?!?
Al tempo stesso non vorrei, per nessuna ragione, far vedere al Main la
ShowModal "originale".
quindi l'ipotesi di utilizzare l'overload della ShowModal al posto
della Override non mi piace affatto.
Quindi ..?  :-\
Qualsiasi aiuto è ben accetto!
Grazie in anticipo,
Davide

 FormMain.Button1. [...]
Non penso di aver compreso bene tutto quanto, ma non puoi semplicemente 
introdurre un nuovo metodo nel tuo Form secondario che, una volta 
impostato il Form come desideri, invochi il metodo /ShowModal/ 
ereditato, senza ridefinirlo?
Qual è il problema con una soluzione di questo tipo?
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 [...]
Inizialmente era così. Cioè c'era la Setup e basta, che inizializzava
tutto il suo popo di roba e poi chiamava la ShowModal ereditata.
Però immaginati di lavorare in un grosso progetto. Succede che se
tizio, che non sa cosa fa la Form2, che sta scrivendo il progetto
principale vuole visualizzare la Form2 ovviamente gli viene spontaneo
richiamare la ShowModal o la Show senza quindi passare per la Setup, a
me questo non va bene. Quindi ho pensato di "nascondere" la ShowModal e
la Show ereditate ma poi mi trovo bloccato perchè non posso più
chiamarle nemmeno io.
Altrimenti nel mio oggetto (Form2) come posso "nascondere" al main dei
metodi ereditati ?
Mi sono spiegato meglio?
...è un pò contorta la cosa?

 metodi ereditati ?
Non puoi e non devi.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

[...]
Perfetto, l'eccezzione sulla OnShow mi piace.
Non ci avevo pensato.
Grazie mille a tutti !
Ciao
Davide

 Perfetto, l'eccezzione sulla OnShow mi piace.
Occhio che se non usi il mio stesso metodo di lavoro, ovvero creare e
distruggere le form quando serve, devi mettere un:
FShowOK := False;
sull'OnClose della form, altrimenti dopo la prima invocazione di Setup(),
la ShowModal() sarebbe chiamabile.


 ...č un pň contorta la cosa?
Puoi sempre modificare la visibilita' dei metodi nelle classi derivate,
(ie mettere ShowModal nella sezione protected o private d TForm2) ma in 
generale non e' una cosa buona, tra l'altro non garantisce nemmeno
la non visibilita':
// untested
var
   MyForm : TForm;
   MyForm2 : TForm2;
begin
   ...
   MyForm2.ShowModal(); // Errore di compilazione
   ...
   MyForm := MyForm2;
   MyForm.ShowModal(); // Nessun Errore
   ...
end;
ciao
Giacomo

end;
Questo sistema non va bene perché annulla il comportamento
polimorfico:
var
  F: TForm;
...
  F := TForm2.Create;
  F.ShowModal; 
  ^^--- la ShowModal chiamata non è quella di TForm2 ma quella di
TFrom (giustamente).


E ci credo che non funziona! :)
Hai mescolato le mie riesposte a due domande come se fossero una sola!
La prima era la risposta a "come faccio a chiamare ShowModal della
classe base dal metodo ShowModal della classe derivata?" mentre la 
seconda a "come faccio a nascondere un metodo della classe base nelle 
classi derivate?"
Il secondo esempio era per dimostrare che ha poco senso nascondere
i metodi nelle classi derivate, forse sono stato poco chiaro.
ciao
Giacomo

 classe base dal metodo ShowModal della classe derivata?"
La prima richiesta era finalizzata a rendere obbligatorio il passaggio da
Setup(), evitando di bypassare la chiamata mediante l'accesso diretto a
ShowModal().  La tecnica che hai consigliato, benché illustri come
chiamare la  chiamata al metodo della classe madre, non risolve il
problema.
Io non ho "mescolato" nulla.


 problema.
oops hai ragione!
La domanda a cui rispondevo era nel messaggio che ha originato il 3d e 
non in quello a cui ho effettivamente risposto!
ciao
Giacomo