1 (edited by k245 2017-10-27 10:46:02)

Topic: Работа с параметром обработчика событий (Sender: string)

Добрый день. Нигде не нашел описания, что именно находится в этом параметре. В обычном Delphi там передаётся объект, у которого возникло это событие; в скриптах MyVisualDatabase, видимо, тоже, но в виде строки, содержащей число.

Можно ли использовать это значение, например, для создания одного обработчика для нескольких элементов интерфейса?

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

procedure MenuItemClick (Sender: string);
var
  form:TForm;
begin
  form := TForm( TMenuItem(sender).tag );
  form.ShowModal;
end;

Но ничего не вышло, так как компилятор не захотел выполнять приведение типов:

var
   miItems: TMenuItem;

begin
  miItems := TMenuItem.Create (frmMain.MainMenu);
  miItems.Tag := Integer(frmItem);

Остались вопросы:

1. Как правильно использовать параметр sender для получения доступа к элементам интерфейса?

2. Как запихать в Tag ссылку на объект? 
(Пока вижу только одно решение: создаётся глобальный ObjectList:TList, в него добавляются объекты, а доступ к ним - по индексу, который хранится в Tag)

Визуальное программирование: блог и телеграм-канал.

Re: Работа с параметром обработчика событий (Sender: string)

Можно использовать и TObject если вы создаете событие с помощью скрипта, пример

procedure Form1_OnShow (Sender: string; Action: string); // event OnShow
var
   MyItem1: TMenuItem;
   MyItem2: TMenuItem;
   MySubItem3: TMenuItem;
begin

   MyItem1 := TMenuItem.Create (Form1.MainMenu);
   MyItem1.Caption := 'Item1';
   MyItem1.OnClick := @MenuClick;

   MyItem2 := TMenuItem.Create (Form1.MainMenu);
   MyItem2.Caption := 'Item2';



   MySubItem3 := TMenuItem.Create (Form1.MainMenu);
   MySubItem3.Caption := 'Submenu';
   MySubItem3.OnClick := @MenuClick;

   Form1.mniFile.Insert(0, MyItem1);
   Form1.MainMenu.Items.Insert(0, MyItem2);
   MyItem2.Add(MySubItem3);


                                               
end;


procedure MenuClick (Sender: TObject);
begin
     ShowMessage( TMenuItem(Sender).Caption );
end;


Скачайте пожалуйста последнюю  бета версию
https://www.dropbox.com/s/eef9rf7u08k63 … b.zip?dl=0


Добавил функцию ObjectToInt, пример использования

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
    sl: TStringList;
begin
    sl := TStringList.Create;
    sl.Text := 'Test';
    Form1.Button1.Tag := ObjectToInt(sl);
    ShowMessage( TStringList(Form1.Button1.Tag).Text );
    sl.Free;
end;
Dmitry.

Re: Работа с параметром обработчика событий (Sender: string)

Обновил программу, однако новая функция не поддерживается:  http://f5.s.qip.ru/SwgAVRyg.png

Визуальное программирование: блог и телеграм-канал.

Re: Работа с параметром обработчика событий (Sender: string)

http://f2.s.qip.ru/SwgAVRyh.png

Визуальное программирование: блог и телеграм-канал.

Re: Работа с параметром обработчика событий (Sender: string)

Проверил архив, работает, видимо у вас все же не последняя версия, CRC32 не могу проверить, нет такой вкладки.

Dmitry.