Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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;

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

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

Кому интересно...

http://www.delphikingdom.com/asp/ans...IDAnswer=77586
Ответить с цитированием
  #3  
Старый 12.07.2010, 19:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Через одно место делаешь....
Обычно я делаю так.
Есть базовый фрейм с объявленным интерфейсом (TBaseFrame).
Есть его потомки с перекрытими методами.
Есть фабрика фреймов, которая по некоторому ключу создает фрейм нужного класса, но возвращет его как TBaseFrame.
В месте, где используются фреймы, заводится переменная типа TBaseFrame. В нее заносится указатель на созданный фрейм и работа идет с ней (все методы доступны, бо как все-таки она, пременная, типизированная). Когда нужно, вызываешь деструктор для этой переменной и, соответсвенно, создаешь новый фрейм в нее же. Это если у тебя одновременно 1 фрейм на форме. Если несколько - то под каждую надо заводить свою переменную.
Ответить с цитированием
  #4  
Старый 13.07.2010, 23:39
tebeen tebeen вне форума
Прохожий
 
Регистрация: 10.07.2010
Сообщения: 5
Репутация: 10
По умолчанию

Вот мне написали это, похоже на Ваше описание, всё равно для меня это трудно: классы, объекты, типы, указатели, наследование, полиморфизм....

Код:
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  
Старый 13.07.2010, 23:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, батенька... Наследование, полиморфизм, инкапсуляция - это основы прогшраммирования в Дельфи. Идите и разберитесь с ними сначала. Не так уж это и сложно...
Ответить с цитированием
  #6  
Старый 14.07.2010, 16:11
tebeen tebeen вне форума
Прохожий
 
Регистрация: 10.07.2010
Сообщения: 5
Репутация: 10
По умолчанию

Мне проще олимпиаду по программированию выиграть. Чтобы мне в этом разобраться нужно понять как Файлы, проецируются в память. За 15 лет к таким вещам раз 5 прибегал, наверно, поэтому до сих пор нет понимания.

Последний раз редактировалось tebeen, 14.07.2010 в 16:22.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:45.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025