Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2009, 09:09   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию tList с указателями на методы

Всем привет!
Вот такой вопрос:
Хочу в tList-е хранить методы (указатели на них), и вызвать их из tList-а
Нечего не получается...

Код:
tProc = procedure;
  Tmain_form = class(TForm)
    Button9: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure e1;
    procedure e2;

end;
...
var
   list: tList;
...
procedure Tmain_form.FormCreate(Sender: TObject);
var
p: pointer;
begin
   list := tList.Create;
   p := MethodAddress('e1');
   list.Add(p); // p = nil почему-то...
   list.Add(@e2); // пишет [Pascal Error] main.pas(63): E2036 Variable required
end;
...
procedure Tmain_form.Button9Click(Sender: TObject);
var
c: integer;
tp: tProc;
begin
   for c := 0 to List.Count - 1 do
   begin
      @tp := list.Items[c];
      tp;
   end;
end;
Altera вне форума Ответить с цитированием
Старый 19.08.2009, 09:18   #2
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Получилось вот таким макаром:

Код:
type
  tProc = procedure of object;
  Tmain_form = class(TForm)
     button9: tButton;
    procedure FormCreate(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
    procedure e1;
    procedure e2;
  end;

var
  main_form: Tmain_form;
  list: tList;
  myProc: tProc;

implementation


{$R *.dfm}

procedure Tmain_form.Button9Click(Sender: TObject);
var
c: integer;
tp: tProc;
begin
   for c := 0 to List.Count - 1 do
   begin
      @tp := list.Items[c];
      tp;
   end;
end;

procedure Tmain_form.e1;
begin
   showMessage(':e1:');
end;

procedure Tmain_form.e2;
begin
   showMessage(':e2:');
end;

procedure Tmain_form.FormCreate(Sender: TObject);
var
p: tProc;
begin
   list := tList.Create;
   p := e1;
   list.Add(@p);
   p := e2;
   list.Add(@p);
end;

end.
А по проще способа нету? И вообще это надёжно?

Последний раз редактировалось Altera; 19.08.2009 в 09:20.
Altera вне форума Ответить с цитированием
Старый 19.08.2009, 10:09   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

И ещё прикол!
Короче бросил один метод в другой класс, чтобы проверить как он себя поведёт, если ещё убить.

В общем он всё равно вызывается и работает как надо, даже если я form3.free вызываю.

Пока писал, въехал, что в памяти остаётся процедура по нужному адресу, но её планировщик в любой момент может системе вернуть или под другие благие дела задействовать.

Код во вложении (там 2 формы)

------------------------
Ну в общем я сам спрашиваю, сам отвечаю. Сам с собой болтаю короче...
Вложения
Тип файла: rar EXE.rar (34.6 Кб, 6 просмотров)
Altera вне форума Ответить с цитированием
Старый 19.08.2009, 15:25   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
В общем он всё равно вызывается и работает как надо, даже если я form3.free вызываю.

Пока писал, въехал, что в памяти остаётся процедура по нужному адресу, но её планировщик в любой момент может системе вернуть или под другие благие дела задействовать.
Ой, это ещё не всё! Пардон!
Метод form3.e4 вызывается даже если я вообще не создавал форму.

Код:
begin
  Application.Initialize;
  Application.CreateForm(Tmain_form, main_form);
  //Application.CreateForm(TForm3, Form3);
  Application.Run;
end.
Код:
procedure Tmain_form.Button4Click(Sender: TObject);
begin
   form3.e4;
   showMessage(intToStr(integer(form3))); 
end;
Цитата:
:::e4:::
0
Объясните мне это! Значит, я так понимаю, я могу вызывать public и published методы из не существующих объектов?
Люди, не молчите! Я тут не для новичков изламываюсь...

//Новый пример во вложении
Вложения
Тип файла: rar EXE.rar (35.1 Кб, 8 просмотров)
Altera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись структуры TList в файл, проблема с длинными строками типа AnsiString Xardas Общие вопросы Delphi 2 24.05.2009 20:18
Сортировка TList prikolist Общие вопросы C/C++ 0 27.04.2009 21:48
Проблема с указателями 3D Hunter Общие вопросы Delphi 8 14.03.2009 06:55
Tlist - Сортировка MAcK Компоненты Delphi 1 03.09.2007 15:24
Блокирование при работе с TList. Riman Общие вопросы Delphi 7 31.05.2007 15:28