![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Приложение работает с фреймами.
Делал так. Код:
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;Теперь до процедуры добрался, только до главного фрейма, а потомки не отрабатываются.... Последний раз редактировалось tebeen, 10.07.2010 в 17:30. |
|
#2
|
|||
|
|||
|
|
|
#3
|
|||
|
|||
|
Через одно место делаешь....
Обычно я делаю так. Есть базовый фрейм с объявленным интерфейсом (TBaseFrame). Есть его потомки с перекрытими методами. Есть фабрика фреймов, которая по некоторому ключу создает фрейм нужного класса, но возвращет его как TBaseFrame. В месте, где используются фреймы, заводится переменная типа TBaseFrame. В нее заносится указатель на созданный фрейм и работа идет с ней (все методы доступны, бо как все-таки она, пременная, типизированная). Когда нужно, вызываешь деструктор для этой переменной и, соответсвенно, создаешь новый фрейм в нее же. Это если у тебя одновременно 1 фрейм на форме. Если несколько - то под каждую надо заводить свою переменную. |
|
#4
|
|||
|
|||
|
Вот мне написали это, похоже на Ваше описание, всё равно для меня это трудно: классы, объекты, типы, указатели, наследование, полиморфизм....
Код:
type
TFrameParentClass=class of TframeParent;
var
MyClass : TFrameParentClass;
MyComp: TframeParent = nil;
procedure TfMain.Work;
begin
if MyComp<>nil then FreeAndNil(MyComp);
MyClass:= TFrameParentClass(GetClass('TFrameOne'));
MyComp := MyClass.Create(self);
MyComp .Parent := ScrollBox1;
MyComp .EnterToFrame; // Теперь можно войти в эту процедуру.
end; |
|
#5
|
|||
|
|||
|
Ну, батенька... Наследование, полиморфизм, инкапсуляция - это основы прогшраммирования в Дельфи. Идите и разберитесь с ними сначала. Не так уж это и сложно...
|
|
#6
|
|||
|
|||
|
Мне проще олимпиаду по программированию выиграть.
Чтобы мне в этом разобраться нужно понять как Файлы, проецируются в память. За 15 лет к таким вещам раз 5 прибегал, наверно, поэтому до сих пор нет понимания.Последний раз редактировалось tebeen, 14.07.2010 в 16:22. |