Newsgroup: it.comp.lang.delphi
Titolo: Eventi e form

 Come posso capire da quale form mi arriva l'evento activate della mia 
nuova form?
Grazie
&lt;b&gt;.....se non hai idee per risolvere il problema, fai parte del problema &lt;/b&gt;
--- posted by geoForum on 
http://www.delphiedintorni.it


Mars University: «Knowledge brings Fear»

 viene richiamato.
Mi "autoquoto" per fornire una precisazione: ciò che ti ho detto vale
per gli eventi dei form nella generalità dei casi, ma siccome un metodo
di gestione di un evento può appartenere ad una classe ed essere
utilizzato per gestire un evento che viene segnalato da un oggetto di
diversa classe, è meglio se utilizzi direttamente il parametro Sender
passato al metodo di gestione dell'evento.


Ho 50 bottoni generati dinamicamente da una classe tbutton.
Come faccio a capire quale bottone ha dato l'evento?
'azie!!!!
Ciao
"Marco Breveglieri" <ma...@NOSPAMabls.it> ha scritto nel messaggio
news:qb01c.2048$36.4...@news4.tin.it...


 Come faccio a capire quale bottone ha dato l'evento?
Per sapere il nome del bottone che ha generato l'evento puoi fare 
semplicemente così:
  (Sender as TButton).Name (e ci fai il controllo che devi)
oppure puoi definirti una variabile di tipo TButton per accederre più 
semplicemente a diverse proprietà:
  MyButton: TButton
  [...]
  MyButton := Sender as TButton;
  MyButton.Name (o quello che ti serve)
-- 
Una volta che avete conosciuto il volo, camminerete sulla Terra guardando 
il cielo, perché là siete stati e là desiderate tornare (Leonardo da Vinci)

 ha scritto nel messaggio
news:c27gv4$1q3of1$1...@ID-154342.news.uni-berlin.de...


 metodo che gestisce il click dei bottoni?
Due regolette pratiche:
1. si risponde sotto e non sopra a ciò che hanno scritto gli altri;
2. si toglie tutto quello che non serve.
Come esempio puoi guardare questo post.
Torniamo a Delphi.
Supponiamo che crei automaticamente 50 bottoni e, in un impeto di fantasia, 
li chiami AutoButton01..AutoButton50. Supponiamo che questi bottoni fanno 
qualcosa di simile per cui puoi creare un'unica procedura AutoButtonOnClick 
(a cui dovrai far puntare tutti i bottoni quando vengono premuti) con la 
parte comune più 50 parti dipendenti dal bottone premuto. Un modo comodo è 
sfruttare il parametro tag o (ma potrebbe non essere possibile) taborder. 
Se imposti AutoButton01.tag = 1..AutoButton50.tag = 50 puoi scriverti un 
case in questo modo:
  i := (Sender as TButton).tag;
  case i of
     1:
    [...]
    50:
  end;
Spero di essere stato chiaro. Ho cercato di essere il più generale 
possibile visto che non so quello che devi fare (a parte il fatto che vuoi 
sapere come riconoscere l'oggetto che scatena un certo evento).



Ti chiedo scusa, ma questa č la mia procedura.
Procedure TForm4.Start();
var Toto_Sequenze,I :integer;
    File_Dott:String;
      Variabile_Seq,Sequenza_Presa: String;
      Btn,Btn2:TButton;
      Lbl,Lblnum:TLabel;
begin
  if (Profilo.Profilo_Attuale <>'0') then
    begin  //Leggi tutte le sequenze e riportale sulla form
      Label11.Caption:='Elenco Sequenze Utente '+Profilo.Nome_Attuale;
      File_Dott:=
ExtractFilePath(Application.ExeName)+'configurazione\dottori\'+'dottore_'+Pr
ofilo.Profilo_Attuale+'.dat';
Toto_Sequenze:=StrToInt(Profilo.Leggi_Proprieta(File_Dott,'sequenze','totale
'));
      For I:=1 to  Toto_Sequenze do
      begin
          Variabile_Seq:='seq_'+IntToStr(I);
Sequenza_Presa:=Profilo.Leggi_proprieta(File_Dott,'sequenze',Variabile_Seq);
          Lbl:=TLabel.Create(Self);
          LblNum:= TLabel.Create(Self);
          Btn:= TButton.Create(Self);
          Btn2:= TButton.Create(Self);
          Btn.Top:= 50*I;
          Lbl.Top:=Btn.Top;
          LblNum.Top:=Btn.Top;
          Btn2.Top:=Btn.Top;
          LblNum.Left:=40;
          Lbl.Left:=LblNum.Left+LblNum.Width+100;
          Btn.Left:=Lbl.Left+200;;
          Btn2.Left:=Btn.Left+Btn.Width+10;
          LblNum.Parent:=Self;
          Lbl.Parent:=Self;
          Btn.Parent:=Self;
          Btn2.Parent:=Self;
          Lbl.Visible:=true;
          LblNum.Visible:=true;
          Btn.Visible:=true;
          Btn2.Visible:=true;
          BTn.Caption :='Modifica';
          Btn2.Caption :='Cancella';
          Lbl.Caption :=Sequenza_Presa;
          LblNum.Caption :='Sequenza '+IntToStr(I);;
     end;
   end
  else  MessageDlg('Attenzione, deve essere prima scelto un
profilo',mtError,[mbOk],0) ;
end;
Dalla procedura puoi vedere come i miei componenti vengano nominati in
questo modo
    Lbl.Name:=Sequenza_Presa+'_'+IntToStr(I);;
          LblNum.Name:='Lbl_num_'+IntToStr(I);
          Btn.Name:='Modifica'+IntToStr(I);;
          Btn2.Name:='Cancella'+IntToStr(I);;
Io vorrei ora che ci fossero 2 procedure che 'capiscano' automaticamente
quale fra i bottoni Btn ho cvliccato e quale fra i bottoni Btn2 ho cliccato.
Grazie e scusa la petulanza

 bottoni Btn2 ho cliccato. 
Devi assegnare gli eventi OnClick dei bottoni. Devi aggiungere i seguenti 
comandi:
  Btn.OnClick  := BtnModificaOnClick;
  Btn2.OnClick := BtnCancellaOnClick;
Poi scrivi le due procedure (scrivo solo quella per Modifica):
procedure TForm4.BtnModificaOnClick(Sender: TObject);
var
  str: string;
begin
  str := (Sender as TButton).Name;
  if (str = 'Modifica1') then
    <Codice da eseguire quando premi Modifica1>
  else if (str = 'Modifica2') then
    <Codice da eseguire quando premi Modifica2>
  else if (str = 'Modifica3') then
    <Codice da eseguire quando premi Modifica3>
  ...
  else if (str = 'ModificaN') then
    <Codice da eseguire quando premi ModificaN>
end;
Oppure della stringa str ti ricavi il numero in questo modo:
  // 'Modifica' conta 8 caratteri, se la stringa è lunga nove 
  // il numero è   compreso tra 1 e 9
  if lenght((str) = 9) then i := StrToInt(str(9)) 
  // se la stringa è lunga più di nove caratteri prendo gli
  // ultimi due (max 99 bottoni)
  else i := StrToInt(Copy(str,9,2));
e poi ci fai un case:
  case i of
  1:<Codice da eseguire quando premi Modifica1>
  2:<Codice da eseguire quando premi Modifica2>
  3:<Codice da eseguire quando premi Modifica3>
  ...
  N:<Codice da eseguire quando premi ModificaN>
  end;
Ultima cosa. Se devi lavorare sul bottone per cambiarne qualche proprietà 
puoi continuare ad usare la sintassi (Sender as TButton). Se lo devi 
scrivere un po' di volte e non puoi raggruppare questi comandi in un:
  with (Sender as TButton) do
    <Modifiche alle proprietà del bottone>
  end;
puoi farti una 'copia' più manegevole di Sender (eè un TObject, qualche 
proprietà potrebbe non averla e non puoi ridefinire la procedura per 
accettare un Sender di tipo TButton anche se sai benissimo che solo un 
TButton scatenerà un evento che la attiverà) definendo una variabile di 
tipo TButton, ad esempio:
  MyBtn: TButton;
per poi scrivere:
  MyBtn := (Sender as TButton);
e quindi farci tutto quello che ti pare.
Spero di essere stato esaustivo.
Ad ogni buon conto, sono esausto e me ne vado a casa.
Ciao.


 ha scritto nel messaggio
news:c27rg9$1p2rjb$1...@ID-154342.news.uni-berlin.de...

Grazie e scusa se  non ho afferrato subito.

 Grazie e scusa se  non ho afferrato subito.
Prego. Non ero esausto per colpa tua, lo ero perché ieri la mia giornata è 
stata pienotta e lunga (tipo 9-19).
Spero che ora il tutto funzioni.
Ciao.
PS: quota!
