![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TPopupMenu +стандартное меню [D7, 2003]
Максим В. © (2007-12-28 09:29:00)У меня простой наследник TListBox, в котором я при двойном клике по пункту создаю TEdit, который позволяет редактировать пункт.
У самого TListBox'a задан внешний TPopupMenu, который успешно показывается. Но при такой ситуации: когда я делаю двойной клик по пункту - создается TEdit контролл, - у этого TEdit отсутствует собственое стандартное меню (копировать-вырезать...), а опять же возникает меню из TPopupMenu. Т.е. TPopupMenu переопределяет (?) стандартное меню TEdit'a.
Что мне в такой ситуации сделать?
Код создающий TEdit внутри TListBox'a:
procedure TCheckListBox.CreateWnd;
begin
inherited CreateWnd;
FEdit := TEdit.Create(Self);
FEdit.BorderStyle := bsNone;
FEdit.Parent := Self;
FEdit.Visible := False;
FEdit.OnKeyPress := OnEditKeyPress;
...
end;
{RASkov} (2007-12-28 14:12:00) [1]Тогда попробуй вот так:
procedure TForm1.ListBox1DblClick(Sender: TObject);
var Edit: TEdit;
begin
......
ListBox1.PopupMenu:=nil;
end;
........
procedure TForm1.ListBox1Click(Sender: TObject);
begin
if ListBox1.Tag<>0 then begin
try
TObject(ListBox1.Tag).Free;
finally
ListBox1.Tag:=0;
ListBox1.PopupMenu:=PopupMenu1;
end;
end;
end;
Т.е. мы просто на время редактирования отключаем всему листу его попапменю и после редактирования включаем его назад.....
clickmaker (2007-12-28 14:12:00) [2]
> [4] Максим В. (28.12.07 14:11)
а нельзя ли временно отнять попап-меню у листбокса, на время когда показываешь edit?
Максим В. (2007-12-28 14:11:00) [3]Да, именно для создаваемого Edit'a нужно стандартное-windows меню, а не меню из PopupMenu.
{RASkov} (2007-12-28 14:07:00) [4]Тьфу.... или тебе как раз стандартное для эдита и нужно меню?
{RASkov} (2007-12-28 14:02:00) [5]> [1] Максим В. (28.12.07 11:03)
Вот посмотри вариант:
type
TForm1 = class(TForm)
.....
private
procedure EditExit(Sender: TObject);
{ Private declarations }
.....
end;
................
procedure TForm1.ListBox1DblClick(Sender: TObject);
var Edit: TEdit;
begin
Edit:=Tedit.Create(ListBox1);
with Edit do begin
Parent:=ListBox1;
BorderStyle:=bsNone;
Text:=ListBox1.Items[ListBox1.ItemIndex];
BoundsRect:=ListBox1.ItemRect(ListBox1.ItemIndex);
OnExit:=EditExit;
Color:=clInfoBk;
SetFocus;
end;
ListBox1.Tag:=Integer(Edit);
end;
procedure TForm1.EditExit(Sender: TObject);
begin
ListBox1.Items[ListBox1.ItemIndex]:=TEdit(Sender).Text;
end;
procedure TForm1.ListBox1Click(Sender: TObject);
begin
if ListBox1.Tag<>0 then begin
try
TObject(ListBox1.Tag).Free;
finally
ListBox1.Tag:=0;
end;
end;
end;
Вместо идентификатора "ListBox1" - лучше везде используй сендер.... код будет гибче...)
Максим В. (2007-12-28 11:03:00) [6]Совсем нет идей, или я плохо описал ситуацию?
Добавлю: если не устанавливать PopupMenu для ListBox, тогда стандартное меню TEdit'a спокойно показывается.