![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как назначить PopupMenu динамически.
Kolan © (2007-11-21 08:51:00)Зоздаю менб таким образом:
function TCardDataView.CreateGroupPopupMenu(AOwner: TComponent): TPopupMenu;
var
MenuItem: TMenuItem;
begin
Result := TPopupMenu.Create(AOwner);
MenuItem := TMenuItem.Create(Result);
MenuItem.OnClick := MenuDelClick;
MenuItem.Caption := 'Oaaeeou';
Result.Items.Add(MenuItem);
end;
И назначаю его TreeView
function TCardDataView.CreateGroup(Owner: TWinControl;
Group: TGroup; AColor: TColor): TStructureTreeView;
var
I: Integer;
TempItem: TTreeNode;
begin
Result := nil;
if Assigned(Group) then
begin
Result := TStructureTreeView.Create(Owner);
Result.Parent := Owner;
Result.PopupMenu := FGroupTreeViewPopupMenu;
При правом клике на TreeView получаю AV, по адресу нашел что вGetClientOrigin. \
Может я не так его создал, или не все свойства задал?
Как правильно?
{RASkov} (2007-11-21 10:28:00) [1]> [13] Kolan © (21.11.07 10:21)
> Сделал свой для каждого. Рабоатает.
:(
:)
Kolan (2007-11-21 10:21:00) [2]Сделал свой для каждого. Рабоатает. Не сильно ресурсоёмко имхо Оставил так. Благодарю за обсуждение.
{RASkov} (2007-11-21 10:18:00) [3]> [11] Kolan © (21.11.07 10:12)
> Блин может каждому дереву по меню создать и не мучится?
Ну тут с ходу сложно посоветовать....
Может ты и по правильному пути идешь.... нужно лишь один байт в программе сделать not байт и делов :)
Если попап у всех одинаковый, то зачем всем создавать одинаковый попап? ресурсоемко получается....
Проверь весь код заного.... где-то у тебя ошибка:) 17 - строка? )
Kolan (2007-11-21 10:12:00) [4]> т.е. у каждого ТриВью свой FGroupTreeViewPopupMenu
> Или не так?
Нет один на всех.
Есть класс TCardDataView у него в конструкторе создается меню.
Он же создает много TreeView и всем им назначает одно и тоже меню FGroupTreeViewPopupMenu.
> Если не так, то зачем тогда его каждый раз создавать
Создается меню 1 раз
Наврал чуток 8 и 9
Так работает:
if Sender is TMaskEdit then
begin
(Sender as TMaskEdit).PopupMenu := CreateGroupPopupMenu(Sender as TMaskEdit);
(Sender as TMaskEdit).PopupMenu.Popup(100, 200);
end;
Так нет :
if Sender is TMaskEdit then
begin
(Sender as TMaskEdit).PopupMenu := FGroupTreeViewPopupMenu;
FGroupTreeViewPopupMenu.Popup(100, 200);
end;
Блин может каждому дереву по меню создать и не мучится?
{RASkov} (2007-11-21 09:57:00) [5]> [8, 9] Kolan
получается, что у тебя битая ссылка в FGroupTreeViewPopupMenu....
> Единственное что не сказал, это меню назначается множеству
> TreeView.
Это как? Я так понял, что FGroupTreeViewPopupMenu - это поле конкретного класса...
т.е. у каждого ТриВью свой FGroupTreeViewPopupMenu..... Или не так?
Если не так, то зачем тогда его каждый раз создавать
> constructor TCardDataView.Create(ScrollBox: TScrollBox);
> begin
> {…}
> FGroupTreeViewPopupMenu := CreateGroupPopupMenu(FScrollBox);
> end;
> function TCardDataView.CreateGroupPopupMenu(AOwner: TComponent)
> : TPopupMenu;
> var
> MenuItem: TMenuItem;
> begin
> Result := TPopupMenu.Create(AOwner);
???
Kolan (2007-11-21 09:50:00) [6]Так тоже самое.
procedure TCardDataView.DiagnosisKeyPress(Sender: TObject; var Key: Char);
begin
Key := AnsiUpperCase(Key)[1];
{ }
if Sender is TEdit then
(Sender as TEdit).PopupMenu := FGroupTreeViewPopupMenu;
FGroupTreeViewPopupMenu.Popup(100, 200);
end;
> , мало инфы или она не достоверная,
Единственное что не сказал, это меню назначается множеству TreeView.
Kolan (2007-11-21 09:48:00) [7]> Например что-нибудь так:
Совсем так не получилось, повесил на обработчик нажатия одного из Edit'ов.
procedure TCardDataView.DiagnosisKeyPress(Sender: TObject; var Key: Char);
begin
Key := AnsiUpperCase(Key)[1];
{ }
FGroupTreeViewPopupMenu.Popup(100, 200);
end;
То же АВ, по тому же адресу.
{RASkov} (2007-11-21 09:46:00) [8]Не на ту кнопу нажал)
В [6] я хотел сказать, что в сабже, т.е. по ветке, мало инфы или она не достоверная, т.е. сбивающая с толку....)
Сорри...
{RASkov} (2007-11-21 09:43:00) [9]> [4] Kolan © (21.11.07 09:31)
> проблемма и есть сабж ветки
:)
> Как назначить PopupMenu динамически
Ответ тогда простой:
var pm: TPopupMenu;....
begin
pm:=TPopupMenu.Create();
....
TreeView.PopupMenu:=pm;
{RASkov} (2007-11-21 09:34:00) [10]> [4] Kolan © (21.11.07 09:31)
> А как проверить?
Например что-нибудь так:
procedure TForm.ButtonClick();
begin
Button.PopupMenu:=FGroupTreeViewPopupMenu;
FGroupTreeViewPopupMenu.Popup(X, Y);
end;
Kolan (2007-11-21 09:31:00) [11]> GetClientOrigin твое? т.е. переопределил? Что там?
Не не моё.
> А может ошибка в этой «затеи»:
Нет, проект тот же, но место это другое с тем сабжем не связаное.
> А это FGroupTreeViewPopupMenu, точно «рабочее», т.е. «по
> другому» вызывается без проблем?
А как проверить? Вызывается с проблеммами проблемма и есть сабж ветки.
{RASkov} (2007-11-21 09:20:00) [12]А это - FGroupTreeViewPopupMenu, точно "рабочее", т.е. "по другому" вызывается без проблем?
Ошибка явно в другом месте, не здесь...
GetClientOrigin - твое? т.е. переопределил? Что там?
А может ошибка в этой "затеи":
http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&id=1195566507
Kolan (2007-11-21 09:11:00) [13]> А может он к этоиу моменту вообще не создан?
Создан, я его в конструкторе создаю.
constructor TCardDataView.Create(ScrollBox: TScrollBox);
begin
{ }
FGroupTreeViewPopupMenu := CreateGroupPopupMenu(FScrollBox);
end;
Указатель не нил к моменту присвоения(Result.PopupMenu := FGroupTreeViewPopupMenu;).
ЮЮ (2007-11-21 09:00:00) [14]> Может я не так его создал, или не все свойства задал?
А может он к этоиу моменту вообще не создан? Чему равен FGroupTreeViewPopupMenu, если поставить точку останова на выделенной строке?