Текущий архив: 2004.04.11;
Скачать: CL | DM;
ВнизДинамическое создание меню: возникла необходимость создания меню Найти похожие ветки
← →
Alexander © (2004-04-26 10:01) [0]динамически, т.к. сначала есть только один пункт контекстного меню,
после того как пользователь новодит на него мышь - выпадает новое меню, которое должно создаваться именно в момент наведения на него мыши, а когда выделение пропадает, то элементы удаляются, т.к. в следующий раз могут быть другими (ближайшая аналогия - навигация по файловой системе). Надеюсь понятно объяснил. Вот как делаю:
procedure TForm1.mnMainDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
MI: TMenuItem;
I: Integer;
S: string;
begin
if Selected then
ACanvas.Brush.Color := clHighlight
else
ACanvas.Brush.Color := clMenu;
ACanvas.FillRect(ARect);
S := (Sender as TMenuItem).Caption;
Delete(S, Pos("&", S), 1);
ACanvas.TextOut(ARect.Left + 5, ARect.Top + 3, S);
if ((Sender as TMenuItem).Tag = 0) then
begin
(Sender as TMenuItem).Tag := 1;
MI := TMenuItem.Create(Self);
MI.Caption := "Start";
MI.OnDrawItem := mnMainDrawItem;
MI.OnMeasureItem := mnMainMeasureItem;
(Sender as TMenuItem).Add(MI);
end
else
if Selected then
begin
if ((Sender as TMenuItem).Tag = 1) then
begin
(Sender as TMenuItem).Tag := 2;
for I := 0 to 14 do
begin
MI := TMenuItem.Create(Self);
MI.Caption := IntToStr(I);
MI.OnDrawItem := mnMainDrawItem;
MI.OnMeasureItem := mnMainMeasureItem;
(Sender as TMenuItem).Add(MI);
end;
end;
end
else
if ((Sender as TMenuItem).Tag = 2) then
begin
(Sender as TMenuItem).Tag := 1;
while ((Sender as TMenuItem).Count > 1) do
(Sender as TMenuItem).Delete(1);
end;
{}
end;
В принципе работает именно так, как нужно, но...
Иногда моя XP падает в синий экран, если слишком быстро бегать по менюшкам, да и прорисовка идёт не красиво. Может что посоветуете?
← →
Alexander © (2004-04-26 10:01) [0]динамически, т.к. сначала есть только один пункт контекстного меню,
после того как пользователь новодит на него мышь - выпадает новое меню, которое должно создаваться именно в момент наведения на него мыши, а когда выделение пропадает, то элементы удаляются, т.к. в следующий раз могут быть другими (ближайшая аналогия - навигация по файловой системе). Надеюсь понятно объяснил. Вот как делаю:
procedure TForm1.mnMainDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
MI: TMenuItem;
I: Integer;
S: string;
begin
if Selected then
ACanvas.Brush.Color := clHighlight
else
ACanvas.Brush.Color := clMenu;
ACanvas.FillRect(ARect);
S := (Sender as TMenuItem).Caption;
Delete(S, Pos("&", S), 1);
ACanvas.TextOut(ARect.Left + 5, ARect.Top + 3, S);
if ((Sender as TMenuItem).Tag = 0) then
begin
(Sender as TMenuItem).Tag := 1;
MI := TMenuItem.Create(Self);
MI.Caption := "Start";
MI.OnDrawItem := mnMainDrawItem;
MI.OnMeasureItem := mnMainMeasureItem;
(Sender as TMenuItem).Add(MI);
end
else
if Selected then
begin
if ((Sender as TMenuItem).Tag = 1) then
begin
(Sender as TMenuItem).Tag := 2;
for I := 0 to 14 do
begin
MI := TMenuItem.Create(Self);
MI.Caption := IntToStr(I);
MI.OnDrawItem := mnMainDrawItem;
MI.OnMeasureItem := mnMainMeasureItem;
(Sender as TMenuItem).Add(MI);
end;
end;
end
else
if ((Sender as TMenuItem).Tag = 2) then
begin
(Sender as TMenuItem).Tag := 1;
while ((Sender as TMenuItem).Count > 1) do
(Sender as TMenuItem).Delete(1);
end;
{}
end;
В принципе работает именно так, как нужно, но...
Иногда моя XP падает в синий экран, если слишком быстро бегать по менюшкам, да и прорисовка идёт не красиво. Может что посоветуете?
← →
Alexander © (2004-04-26 10:22) [1]вот ещё одна процедура, но от неё ничего не зависит
procedure TForm1.mnMainMeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
begin
Width := Canvas.TextWidth((Sender as TMenuItem).Caption + "!");
end;
← →
Alexander © (2004-04-26 10:22) [1]вот ещё одна процедура, но от неё ничего не зависит
procedure TForm1.mnMainMeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
begin
Width := Canvas.TextWidth((Sender as TMenuItem).Caption + "!");
end;
← →
Alx2 © (2004-04-26 10:25) [2]Может из прорисовки выкинуть лишнее, что не нужно именно для прорисовки? Мне кажется, модификация меню во время отрисовки неуместна :)
← →
Alx2 © (2004-04-26 10:25) [2]Может из прорисовки выкинуть лишнее, что не нужно именно для прорисовки? Мне кажется, модификация меню во время отрисовки неуместна :)
← →
Alexander © (2004-04-26 10:52) [3]Так это понятно, что решение кривое, так не должно быть. А как тогда сделать?
← →
Alexander © (2004-04-26 10:52) [3]Так это понятно, что решение кривое, так не должно быть. А как тогда сделать?
← →
[lamer]Barmaglot © (2004-04-26 10:57) [4]CreateMenu, DestroyMenu?
← →
[lamer]Barmaglot © (2004-04-26 10:57) [4]CreateMenu, DestroyMenu?
← →
Alexander © (2004-04-26 11:00) [5]>[lamer]Barmaglot
Насколько я понял - предлагаешь всё то же самое, но на API?
← →
Alexander © (2004-04-26 11:00) [5]>[lamer]Barmaglot
Насколько я понял - предлагаешь всё то же самое, но на API?
← →
Alx2 © (2004-04-26 11:56) [6]в OnClick попробуй
← →
Alx2 © (2004-04-26 11:56) [6]в OnClick попробуй
← →
Alx2 © (2004-04-26 12:03) [7]Сорри. В OnPopup.
← →
Alx2 © (2004-04-26 12:03) [7]Сорри. В OnPopup.
← →
Alexander © (2004-04-26 13:48) [8]Да в том то и дело, что в OnPopup не подходит для моей задачи, там можно заполнить, только когда заранее известна структура меню, а вот когда неизвестна, то возникают проблемы. Я же аналогию привёл вначале - файловая система. Представь, если тебе на вопрос, как работать с файлами и папками (прямая аналогия с выпадающими пунктами и обычными) предложат при запуске проги рекурсивно проходить всю файловую систему. Как думаешь, как долго прога будет запускаться? Вот и тут тоже самое хотелось прикрутить, чтобы подгружать только те пункты, которые пользователь захотел посмотреть.
← →
Alexander © (2004-04-26 13:48) [8]Да в том то и дело, что в OnPopup не подходит для моей задачи, там можно заполнить, только когда заранее известна структура меню, а вот когда неизвестна, то возникают проблемы. Я же аналогию привёл вначале - файловая система. Представь, если тебе на вопрос, как работать с файлами и папками (прямая аналогия с выпадающими пунктами и обычными) предложат при запуске проги рекурсивно проходить всю файловую систему. Как думаешь, как долго прога будет запускаться? Вот и тут тоже самое хотелось прикрутить, чтобы подгружать только те пункты, которые пользователь захотел посмотреть.
Страницы: 1 вся ветка
Текущий архив: 2004.04.11;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.04 c