Yeeep i get it and ..... it seems it was not my fault.

Many thanks to everybody but the problem is elsewhere.
Your codes and mine are working perfectly if we do not use a
parent Procedure of Object.
If
Endproc is declared inside TThread, no probem, it works.
But if
Endproc is declared in parent of TThread it do not work :
TThread.execute;
begin
Synchronize(Parent.EndProc) ; <<<< Not working because Parent
end;
TThread.execute;
begin
Synchronize(EndProc) ; <<<< Working because Endoc declared in Thread.
end;
I gonna create a new topic do explain it better.
So for resume, here how to run a external procedure stored in variable into a procedure who is inside a thread :
type
TMyClass = class(TThread)
Public
...
EndProc : procedure of object; //<<< the Outside procedure is declared inside the Cass.
...
procedure Execute; override; //<<< the Inside procedure
end;
/////////////////////////////////////////////////////////
Procedure TMyClass.Execute; //<<< the Inside procedure
begin
....
EndProc ; //<<< the Outside procedure
end; and how to use it in a Form:
rocedure procclasstest ; //< the general procedure to test
var
testclass : TMyClass;
begin
testclass :=TMyClass.Create;
testclass.EndProc := @testendproc; //< the external procedure
testclass.MyClassProc ;
end;
Procedure testendproc; //< the external procedure
begin
form1.caption := 'It is the End' ;
end;Ouf, it was a Big fight, but we win.
