Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
ВнизКак в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c