Показать сообщение отдельно
  #1  
Старый 10.07.2010, 15:20
tebeen tebeen вне форума
Прохожий
 
Регистрация: 10.07.2010
Сообщения: 5
Репутация: 10
По умолчанию Работа с объектами и процедурами

Приложение работает с фреймами.

Делал так.


Код:
unit uParent;  //Главный фрейм (предок)

type
  TframeParent = class(TFrame)
      procedure EnterToFrame; virtual;

Код:
unit uOne;

type
  TframeOne = class(TframeParent) //Рабочий фрейм

  public
    procedure EnterToFrame; override;

Код:
unit uMain; // Приложение

var
  CurrentFrame: TframeParent = nil;

procedure TfMain.Work;
begin
  CurrentFrame:=TframeOne.Create(nil);
    CurrentFrame.Parent := ScrolBox1;
      CurrentFrame.EnterToFrame; // Так входил в процедуру
end;

CurrentFrame.EnterToFrame -таким способом обращался к процедуре.


Теперь перешёл на такой код, вызов фрейма по имени.

Код:
unit uParent;

type
  TframeParent = class(TFrame)
      procedure EnterToFrame; virtual;

Код:
unit uOne;

type
  TframeOne = class(TframeParent)

  public
    procedure EnterToFrame; override;


Код:
unit uMain;
  MyClass: TComponentClass;
    MyComp: TComponent = nil;

implementation

type
  TClassArray = array [1..1] of TPersistentClass;
const
  ClassArray: TClassArray = (TframeOne);

procedure TfMain.Work;
var
  generalPtr : Pointer;
begin
  if MyComp<>nil then FreeAndNil(MyComp);

  MyClass:= TComponentClass(GetClass('TFrameOne')); //Где-то здесь при вызове разных фреймов происходит расход памяти
    MyComp := MyClass.create(self);

    TControl (MyComp) .parent := ScrollBox1; 

   generalPtr:= MyComp1.MethodAddress('EnterToFrame'); // нашёл указатель на процедуру

    ...EnterToFrame; // А как теперь войти в эту процедуру не пойму.
end;


Не подскажите как справиться с утечкой памяти и добраться до своих процедур в фреймах (или вызвать процедуру по указателю)?
.....

Спустя некоторое время
....

добавил

Код:
type TProc = procedure of object;
в
Код:
 TfMain.Work;
var
....
  MethodVar: TMethod;
  proc: TProc;
begin
....


    MethodVar.Data := generalPtr;
    MethodVar.Code := generalPtr;
    Proc := TProc(MethodVar);
      Proc;

Теперь до процедуры добрался, только до главного фрейма, а потомки не отрабатываются....
Ответить с цитированием