Newsgroup: it.comp.lang.delphi
Titolo: nome procedure parametrico chiarimento

grazie a tutti, rimane pero' una questione:
il parametro sender che fine fa?
-- 
Using Opera's revolutionary e-mail client: 
http://www.opera.com/m2/

il parametro sender che fine fa?
Scusa riformula la domanda piu' tecnicamente...
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 il parametro sender che fine fa?
procedure TForm1.Button1Click(Sender: TObject);
type
  TExec = procedure(Sender: TObject) of object;
var
  i: integer;
  Routine: TMethod;
  Exec: TExec;
begin
  for i := 0 to Pred(ComponentCount) do
    if Components[i] is TPaintBox then
    begin
      Routine.Data := Pointer(Form1);
      Routine.Code := Form1.MethodAddress(Components[i].Name+'Paint');
      if Assigned(Routine.Code) then
      begin
        Exec := TExec(Routine);
        Exec(TPaintBox(Components[i]));
      end;
    end;
end;
-- 
Ciao, Anto', [37, 143, AQ] 
MB C SC 220 CDI Magma Rot
"Oggi c'è una grande battaglia di idee ma alla 
fine non ci saranno ne vinti, ne vincitori, ne idee!"
S. Benni da Elianto

riassumo il thread:
domanda originale:
  ho bisogno di una procedura che richiami gli eventi OnPaint di tutte le
  PaintBox di un Form; posso scrivere una roba del genere?
  for i=1 to controlCountcount-1
  if control[i] is PaintBox then
    control[i]Paint(sender)   <<<  come faccio  a unire control[i] e Paint ?
risposta 1:
procedure TForm1.Button1Click(Sender: TObject);
var
   i: integer;
   Routine: TMethod;
   Exec: TExec;
begin
   for i := 0 to Pred(ComponentCount) do
     if Components[i] is TPaintBox then
     begin
       Routine.Data=Pointer
       Routine.Code := Form1.MethodAddress(Components[i].Name+'Paint');
       if Assigned(Routine.Code) then
       begin
         Exec := TExec(Routine);
         Exec;
       end;
     end;
end;
risposta 2:
Paint è protetto, ma è chiamato in risposta ad un messaggio WM_PAINT.
Basta inviare il messaggio WM_PAINT al PaintBox:
for i := 0 to ControlCount - 1 do
   if Controls[i] is TPaintBox then
      Controls[i]).Perform(WM_PAINT, 0, 0);
Perform bypassa la coda dei messaggi di Windows e invia il messaggio
direttamente al controllo.
chiarimento:
in entrambe le soluzioni non vedo come passare il parametro sendere  
all'evento
Paint...
Tra l'altro mi piacerebbe sapere dove si possono imparare tutti queste  
finezze;
non ho mai trovato un testo chiaro ed esauriente (ho Programmare in D6 di  
Cantu',
D4 developer's guide di Pacheco e Teixeira ma nessuno secondo me tratta  
gli argomenti in maniera organica).
Ciao e grazie Luca

 end;
molto interessante! 
Non ho provato, ma ho un dubbio su quel
  Form1.MethodAddress(Components[i].Name+'Paint')
non è che per caso dovrebbe essere
  Form1.MethodAddress(Components[i].Name + '.Paint')
?
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

 Paint...
non ho compreso bene ciň che hai in mente di realizzare in pratica, ma una
  TPaintBox(qualcosa).Paint 
dovrebbe essere sufficiente.
Tu mi dirai che Paint č un protected method, allora ti rispondo che in casi 
come questo ti soccorre un piccolo workaround: dichiara un tipo
type
  TPaintBoxCracker = class(TPaintBox);
nella stessa unit (tipicamente, nella private section) dove vuoi usare il 
metodo protetto, che poi vai a chiamare semplicemente cosě:
  TPaintBoxCracker(qualcosa).Paint
Questa č una tecnica che vedi usata anche nella VCL e in vari 
sorgenti, per accedere ai metodi protetti; č descritta anche da Cantů in MD, 
ma comunque č sconsigliata perchč viola le regole dell'incapsulazione e puň 
portare a risultati non desiderati. 




e non facevi prima a provare? ;o)
Comunque no, MethodAddres restituisce un puntatore al codice di una
procedura dato il nome, ovviamente i presupposti affinche il tutto funzioni
sono due, il primo e che ogni TPaintBox abbia un suo metodo, il secondo e
che vengano lasciati i nomi di default generati dall'ide di delphi facendo
doppio click sull'evento OnPaint del TPaintBox, per esempio: se sulla form
(Form1) ci sono tre TPaintBox che chiameremo pbxUno, pbxDue, pbxTre,
facendo doppio click sull'evento OnPaint dei tre pbx avremo tre procedure
pbxUnoPaint(). pbxDuePaint(), pbxTrePaint(). In una situazione come quella
appena descrita il codice sopra fa quello di cui l'original posters "Cico"
ha bisogno, nel caso invece che venga generata solo la procedura per pbxUno
e poi venga usata anche per gli altri due il codice sopra non va bene.
Ovviamente questa precisazione è per Cico che credo non abbia capito, visto
che dopo ha chiesto aiuto anche sulla ml infomedia.


all'evento
Se invii un messaggio WM_PAINT al PaintBox ci pensa lui a chiamare
OnPaint(Self), passando quindi automaticamente il Sender.
Luigi D. Sandon - D&amp;D Support Team
--- posted by geoForum on 
http://www.delphiedintorni.it