Newsgroup: it.comp.lang.delphi
Titolo: Why it don't work?

Perche questo programma non funziona? Cioč compila... ma poi va in
errore di puntatore non valido...
Non mi sembra una richiesta cosi strana se volgio un programma che
scriva
2 e 3....
  program Project4;
  {$APPTYPE CONSOLE}
  uses
    SysUtils,
    Classes,
    Messages;
  Type
    TWndProc    = Procedure (Var Message : TMessage);
    TWndProcObj = Procedure (Var Msg : TMessage) of Object;
    TGLComponet = Class
      Procedure WndProc(Var Msg : TMessage);
      End;
    TA = Class(TGLComponet)
      Procedure WndProc(Var Msg : TMessage);
      End;
    TB = Class(TGLComponet)
      Procedure WndProc(Var Msg : TMessage);
      End;
  Procedure TGLComponet.WndProc(Var Msg : TMessage);
  Begin
    Msg.Result:= 1;
  End;
  Procedure TA.WndProc(Var Msg : TMessage);
  Begin
    Msg.Msg:= 2;
  End;
  Procedure TB.WndProc(Var Msg : TMessage);
  Begin
    Msg.Msg:= 3;
  End;
  Var
    WndProcList : TList;
  Procedure AddWndProc(WndProc : TWndProcObj);
  Begin
    WndPRocList.Add(@WndProc);
  End;
  Var
    A : TA;
    B : TB;
    I : Byte;
    Msg : TMessage;
Begin
  A:= TA.Create;
  B:= TB.Create;
  WndProcList:= TList.Create;
  AddWndPRoc(A.WndProc);
  AddWndPRoc(B.WndProc);
  For I:= 1 To WndProcList.Count
    Do Begin
      TWndProc(WndProcList.Items[I-1])(Msg);
      WriteLn(Msg.Result);
      End;
  ReadLn;
End.
Il Razziatore,
The Only Good Windows in an uninstalled Windows
-----------------------------------------------
E-MAILs : IlRazziat...@NOSPAMnetscape.net
WEB     : 
http://www.razziatore.dns2go.com/
ICQ     : 67552596

Si dice 
Why it doesn't work :)
-- 
Lawrence "Rhymes" Oluyede (
rhy...@myself.com
)
"Per cambiare, per diventare un'altra
cosa dobbiamo prima sapere cosa siamo"
(Bruce Lee)

>Why it doesn't work :)
La tersa pesona mi ha sempre dato problemi... cmq qualcosa di +
costutivo? PERCHE NON FUNZIONA?


 End.
Ciao Razziatore
Non ho capito bene a cosa dovrebbe servirti questo codice ma
un errore mi sembra di averlo visto comunque...
TWndProc(WndProcList.Items[I-1])(Msg);
Quando chiami questa procedura... cosa c'e' dentro a Msg?
Se ha un valore indefinito... come è giusto che sia visto che
non lo hai inizializzato... non puoi fare (NonInizializzato).Qualocosa
perchè se non c'è nulla dentro a Msg non ci sarà nulla nemmeno dentro
a Msg.Msg
Ciao
Mirko



Il programma agiuge 2 Derivati da TGLComponet.
e li agiungo ad una lista con AddWndPRoc(A.WndProc);
poi con quel for eseguo ongi singola procedura.
in msg.msg ci dovrebbe essere qualcosa perche c'è VAR
 Procedure TB.WndProc(Var Msg : TMessage);
  Begin
    Msg.Msg:= 3;
  End;
cioè io modifico msg che do in ingresso è lo uso come paramentro in
output... percui non mi interessa inizializarlo


OK,ok ho scritto una cazzata...
Adesso che lo studiato meglio questo codice non mi è
sembrato molto ad oggetti... anche se vengono usati molti costrutti
di questo ambito!!!
Io non so darti una spiegazione scientifica ma da quello che mi
dice l'esperienza non puoi considerare i puntatori a funzione
come i puntatori a metodi di oggetti, memorizzarli da qualche
parte e richiamare il rispettivo codice quando vuoi!!!
Sarebbe troppo facile... i puntatori a metodi fanno riferimento
alla propria classe... non sono delle "variabili globali" come
i puntatori a funzione!!!
Detto questo... non puoi usare il polimorfismo nel tuo programma?
E' una soluzione elegante... sempre se puo' servirti!!!
Eccotene un esempio.
program NWProject5; {13/02/2002}
{$APPTYPE CONSOLE}
uses SysUtils,Classes,Messages;
type TWndProc=procedure(var Message:TMessage);
     TWndProcObj=procedure(var Msg:TMessage) of object;
type TGLComponet=class
     protected
      procedure WndProc(var Msg:TMessage);virtual; //1a modifica
     end;
type TA=class(TGLComponet)
     public
      procedure WndProc(var Msg:TMessage);override; //2a modifica
     end;
type TB=class(TGLComponet)
     public
      procedure WndProc(var Msg:TMessage);override; //3a modifica
     end;
procedure TGLComponet.WndProc(var Msg:TMessage);
begin
 Msg.Result:=1;
end;
procedure TA.WndProc(var Msg:TMessage);
begin
 Msg.Msg:=2;
 inherited; //4a modifica, solo se necessario
end;
procedure TB.WndProc(var Msg:TMessage);
begin
 Msg.Msg:=3;
 inherited; //5a modifica
end;
var Lista:TList;
procedure AddWndProc(GLComponet:TGLComponet); //6a modifica
begin
 Lista.Add(GLComponet); //7a modifica
end;
var A:TA;
    B:TB;
    I:Byte;
    Msg:TMessage;
begin
 A:=TA.Create;
 B:=TB.Create;
 Lista:=TList.Create;
 AddWndProc(A); //8a modifica
 AddWndProc(B); //9a modifica
  for I:=0 to Lista.Count-1 do
  begin
   TGLComponet(Lista.Items[I]).WndProc(Msg); //10a modifica
   WriteLn(Msg.Msg,Msg.Result);
  end;
 ReadLn;
end.


Grazie moltisimo... non l'ho provato ma di te mi fido... appena mi
rispondi a quella cosa tipo CreateForm mi metto suito al lavoro...
Grazie Moltisimo di nuovo...
