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

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

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 спокойно показывается.


Наверх

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