Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамический OnClick [D6]


Страницы:   1 2

msguns ©   (2005-11-02 18:28:00) 

В рантайме создается TPopUpMenu с соответствующими итемами. Как назначить событию OnClick этих итемов ругулярные процедуры ?
Все происходит в библиотечном юните, где нет type

Спасибо за помощь


Игорь Шевченко   (2005-11-03 12:33:00) [21]

jack128 ©   (03.11.05 12:27) [12]


> Его dll'ки скомпилированы с ран-тайм пакетами


Кстати, да :)


jack128   (2005-11-03 12:27:00) [22]

Leonid Troyanovsky ©   (03.11.05 12:19) [11]
> Я очень извиняюсь, а разве GExperts не подобным образом
> работает ? В смысле, с процедурами обработки меню в DLL.


Его dll'ки скомпилированы с ран-тайм пакетами, со всеми втекающими и вытекающими..


Leonid Troyanovsky   (2005-11-03 12:19:00) [23]


> Игорь Шевченко ©   (03.11.05 12:03) [10]

> > Как минимум, создать его следует в exe.

> Я очень извиняюсь, а разве GExperts не подобным образом
> работает ? В смысле, с процедурами обработки меню в DLL.
>


А чего ты извиняешься? :)
Это мне неудобно, что я не щупал GExperts.

Но, думаю, что дело не в месте размещения кода,
а в банальных дубликактах глобальных переменных,
в т.ч. и, скажем, для окна popup menues.

--
Regards, LVT.


Игорь Шевченко   (2005-11-03 12:03:00) [24]

Leonid Troyanovsky ©   (03.11.05 11:47) [9]


> Если procedure DBGridEx_ShowHideColumn объявлена в dll,
> то я сильно сомневаюсь в работоспособности тамошнего меню.
>
> Как минимум, создать его следует в exe.


Я очень извиняюсь, а разве GExperts не подобным образом работает ? В смысле, с процедурами обработки меню в DLL.


Leonid Troyanovsky   (2005-11-03 11:47:00) [25]


> msguns ©   (03.11.05 11:18) [7]

> Такой способ я успешно использовал в процедурах другого
> библ.юнита, который динамически создает формы-диалоги. Там,
>  ессно, есть объявление форм и все работает !


Ну, ты ходил-ходил и заслуженно наступил на грабли.
Если procedure DBGridEx_ShowHideColumn объявлена в dll,
то я сильно сомневаюсь в работоспособности тамошнего меню.
Как минимум, создать его следует в exe.
А как максимум - даже неохота язык мозолить.

--
Regards, LVT.


Игорь Шевченко   (2005-11-03 11:30:00) [26]

msguns ©   (03.11.05 11:18) [7]

В моем примере ButtonClick, как ты сам понимаешь, является создателем элемента меню, поэтому является он методом объекта, не является - какая нафиг разница ? Обработчик нажатия на меню не является методом класса, как ты, опять же, можешь видеть из моего кода, так что я не совсем понимаю, в чем разница между твоим и моим кодом.


msguns   (2005-11-03 11:18:00) [27]

Ну да !
В твоем примере Button1Clickявляется методом класса, мне же надо "засунуть" в событие регулярную процедуру. Ибо в юните, отрывок из которого я привел, нет формы (это одна из процедур библиотечного юнита универсального назначения).

Такой способ я успешно использовал в процедурах другого библ.юнита, который динамически создает формы-диалоги. Там, ессно, есть объявление форм и все работает !

А как быть в этом случае ? У Тексейры с Пачеко такого я не нашел, поиск в хэлпе и MSDN (TMethod) ничего не дал ;(


Игорь Шевченко   (2005-11-03 10:33:00) [28]

msguns ©   (03.11.05 10:12) [5]

Вот такой код, например, работает:

unit main;

interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Menus, StdCtrls;

type
 TForm1 = class(TForm)
   PopupMenu: TPopupMenu;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure MenuEventHandler (Self: TObject; Sender: TObject);
begin
 ShowMessage ('Event handler traps an event');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 mi: TMenuItem;
 method: TMethod;
begin
 mi := TMenuItem.Create (PopupMenu);
 mi.Caption := 'Catch me!';
 PopupMenu.Items.Add (mi);
 method.Code := @MenuEventHandler;
 method.Data := nil;
 mi.OnClick := TNotifyEvent(method);
end;

end.


msguns   (2005-11-03 10:12:00) [29]

Вот такой код:

procedure DBGridEx_MenuClick(Self: TObject; Sender: TObject);
begin
Досюда дело не доходит вообще 
 ShowMessage(TMenuItem(Sender).Caption);
end;

procedure DBGridEx_ShowHideColumn(Grid: TDBGrid; TitleColumn: TColumn);
// Позволяет добавить или убрать колонку грида
// Вызов этой процедуры следует выполнять по событию OnTitleClick грида
var
 pmn: TPopupMenu;
 pmi: TMenuItem;
 X,Y: integer;
 i: integer;
 e: TMethod;
begin
 // Определить текущую колонку грида
 pmn := TPopupMenu.Create(nil);    // Создать всплывающее меню
 e.Code := @DBGridEx_MenuClick;
 e.Data := nil;
 with pmn do
   begin
    pmi := TMenuItem.Create(pmn);
    pmi.Caption := 'Убрать колонку';
    pmi.OnClick := TNotifyEvent(e);
    Items.Add(pmi);
    pmi := TMenuItem.Create(pmn);
    pmi.Caption := 'Добавить колонку';
    pmi.OnClick := TNotifyEvent(e);
    Items.Add(pmi);
    TitleColumn.PopupMenu := pmn;
    // Открыть меню под (над) заголовком колонки
    with TDBGridCrack(Grid) do
      Y := Grid.ClientOrigin.Y+CellRect(Col,Row).Bottom-CellRect(Col,Row).Top;
    X := Grid.ClientOrigin.X;
    for i := 0 to TitleColumn.Index-1 do
      if Grid.Columns[i].Visible then
         X := X+Grid.Columns[i].Width+1;
    pmn.Popup(X,Y);
    Free;
   end;
end;


не работает.
Вернее, нет реакции на клик в меню.


Leonid Troyanovsky   (2005-11-03 09:22:00) [30]


> DiamondShark ©   (02.11.05 18:43) [3]

> Можно и не nil.
> Разницы-то...


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

--
Regards, LVT.


DiamondShark   (2005-11-02 18:43:00) [31]


> IMHO, все же,  не nil.

Можно и не nil.
Разницы-то...


Leonid Troyanovsky   (2005-11-02 18:40:00) [32]


> DiamondShark ©   (02.11.05 18:37) [1]

> z.Data := nil;


IMHO, все же,  не nil.

--
Regards, LVT.


DiamondShark   (2005-11-02 18:37:00) [33]

z: TMethod;

z.Code := @MyRegularProc;
z.Data := nil;
Item.OnClick := TNotifyEvent(z);

procedure MyRegularProc(Self: TObject; Sender: TObject)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо