Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.23;
Скачать: CL | DM;

Вниз

Как в PopupMenu вставить компонент (например TPanel)?   Найти похожие ветки 

 
frost ©   (2004-01-12 20:03) [0]

Может PopupMenu1.InsertComponent(Component); - но что то у меня не получается.


 
Юрий Зотов ©   (2004-01-12 20:15) [1]

Скорее всего, все-таки получается, но не то, что хочется. А вот что хочется - непонятно. Уточните - что же имеется в виду?


 
frost ©   (2004-01-12 20:21) [2]

Необходимо вставить Panel в PopupMenu все это для того чтобы работасть с DropDown menu у SpeedButton, могу создавать окно и выставлять его как PopupMenu, координаты и т.д. но это немного не то. Единственное что могу это PopupMenu1.InsertComponent(Panel); но никакой панели не появляется?


 
Юрий Зотов ©   (2004-01-12 20:43) [3]

Так, теперь задача понятна, идем дальше.

1. Смотрим справку - что же конкретно делает InsertComponent?
2. Как Вы считаете, можно ли вообще вставить панель в меню?


 
frost ©   (2004-01-12 22:18) [4]

То есть мне надо самому рисовать пункт меню. Либо показывать панель в отдельном окне? Если я правильно понял.


 
Юрий Зотов ©   (2004-01-12 22:36) [5]

Так, движемся дальше. Возвращаемся к исходной задаче - что Вы хотите получить? Только, пожалуйста, простыми русскими словами, без всяких меню и панелей. Что и когда должно появиться на экране?


 
Palladin ©   (2004-01-12 22:46) [6]

Все конечно жутко смутно, но подменю делается простым добавлением в нужный Item других Item.


 
Ломброзо ©   (2004-01-12 22:57) [7]

ala Access?

Всё это конечно, ужасно, но добавлять на Popup menu контролы навроде Edit или Combobox - очень муторно. Можно создать плавающий Edit или Combobox, вычислять размеры MemuItem"а в OnMeasureItem и позиционировать плавающий контрол в рамки этого пункта меню в OnDrawItem, но меню будет исчезать при установке фокуса в этот контрол. Мне кажется, что проще будет имитировать само Popup меню какой-нибудь плавающей по экрану панелью и разместить контролы ввода прямо на ней.
ЗЫ сам не пробовал.


 
frost ©   (2004-01-12 22:59) [8]

Есть кнопка со свойством DropDownMenu мне надо чтобы по нажатию на эту кнопку появлялась панель которую я создаю сам, вот собственно и все. Я сейчас делаю на OnClick кнопки создаю окно без заголовка и отображаю его в соответствии с тем где находится кнопка (внешне похоже на PopupMenu и все хорошо но это дополнительное окно - изменение заголовка на неактивный у MainForm)


 
frost ©   (2004-01-12 23:02) [9]

Ломброзо > Что такое - плавающий контрол? Имеется в виду что кнопка это тоже окно? Может мне и Panel так сделать, и тогда моя проблема решена?


 
Ломброзо ©   (2004-01-12 23:21) [10]

Писал штуку одну давно... Идею, надеюсь, поймешь.
Плавающее окно имеет родителем десктоп.
try except finally Расставить по вкусу. Вместо наследника TListBox написать наследника Tpanel.

TXNList = class(TListBox)
private
protected
FOnClick: TNotifyEvent;
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
procedure MouseLeave(var Message: Tmessage); message CM_MOUSELEAVE;
procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER;
public
constructor Create(AOwner: TComponent); override;
published
property OnClick: TNotifyEvent read FOnClick write FOnClick;
end;

constructor TXNList.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;

procedure TXNList.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := Style or WS_BORDER;
ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
AddBiDiModeExStyle(ExStyle);
WindowClass.Style := CS_SAVEBITS;
end;
end;

procedure TXNList.CreateWnd;
begin
inherited CreateWnd;
Windows.SetParent(Handle, 0);
CallWindowProc(DefWndProc, Handle, wm_SetFocus, 0, 0);
end;

procedure TXNList.MouseEnter(var Message: TMessage);
begin
Self.Visible := true;
end;

procedure TXNList.MouseLeave(var Message: Tmessage);
var pStart: ULONG;
begin
pStart:=GetTickCount;
while (pStart + 2000 < GetTickCount) do
Application.ProcessMessages();
Self.Visible := false;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
var APoint: TPoint;
begin
APoint.x := ToolButton1.Left;
APoint.y := ToolButton1.Top + ToolButton1.Height;
Windows.ClientToScreen(Handle, APoint);
FList.Left := APoint.x;
FList.Top := APoint.y;
FList.Visible := true;
Windows.SetForegroundWindow(FList.Handle);

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TXNList.Create(nil);
FList.Parent := self;
FList.Left := 10000;
FList.Ctl3D := False;
FList.ParentCtl3D := false;
FList.Visible := false;
end;


 
Юрий Зотов ©   (2004-01-12 23:36) [11]

> frost © (12.01.04 22:59) [8]

При чем тут меню - непонятно. Еще непонятнее, зачем вставлять в меню панель и как это вообще можно сделать.

Плавающий контрол - это вариант, но довольно трудоемкий. Не подойдет ли вот такое простейшее решение:

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.Parent := Self;
Form2.Show
end;

Все сработает как нужно и заголовок Form1 не изменится. Но у такого решения есть недостаток - Form2 должна располагаться в пределах клиентской части родительской формы. Если это устраивает, то нет проблем.


 
Ломброзо ©   (2004-01-12 23:40) [12]

он имел в виду, что при использовании в качестве контейнера формы с главной формы уходит фокус и "сереет" заголовок. Некрасиво. Хотя в .NET, я смотрю, Microsoft с этим не заморачивается, и в своём Property Grid так и сделали - редактор свойства типа "дата время" вываливается на форме (т.е. OVERLAPPEDWINDOW) в виде DateTimeCOntrol, размещенного на ней.



Страницы: 1 вся ветка

Текущий архив: 2004.01.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
1-72724
man
2004-01-14 10:09
2004.01.23
ф-я для поиска файлов,с выдачей в опр. с выдачей в опр. сорт.


4-72982
DDS
2003-11-17 18:53
2004.01.23
Как перевести текст из кодировки DOS>WIN


1-72714
timer
2004-01-12 00:52
2004.01.23
перебор файлов


6-72862
Андрей
2003-11-21 11:24
2004.01.23
FTP


7-72951
Woolen
2003-10-27 17:45
2004.01.23
Не обнаруживается кэш второго уровня