![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический OnClick [D6]
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)