Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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: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]

Может из прорисовки выкинуть лишнее, что не нужно именно для прорисовки? Мне кажется, модификация меню во время отрисовки неуместна :)


 
Alexander ©   (2004-04-26 10:52) [3]

Так это понятно, что решение кривое, так не должно быть. А как тогда сделать?


 
[lamer]Barmaglot ©   (2004-04-26 10:57) [4]

CreateMenu, DestroyMenu?


 
Alexander ©   (2004-04-26 11:00) [5]

>[lamer]Barmaglot
Насколько я понял - предлагаешь всё то же самое, но на API?


 
Alx2 ©   (2004-04-26 11:56) [6]

в OnClick попробуй


 
Alx2 ©   (2004-04-26 12:03) [7]

Сорри. В OnPopup.


 
Alexander ©   (2004-04-26 13:48) [8]

Да в том то и дело, что в OnPopup не подходит для моей задачи, там можно заполнить, только когда заранее известна структура меню, а вот когда неизвестна, то возникают проблемы. Я же аналогию привёл вначале - файловая система. Представь, если тебе на вопрос, как работать с файлами и папками (прямая аналогия с выпадающими пунктами и обычными) предложат при запуске проги рекурсивно проходить всю файловую систему. Как думаешь, как долго прога будет запускаться? Вот и тут тоже самое хотелось прикрутить, чтобы подгружать только те пункты, которые пользователь захотел посмотреть.



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

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

Наверх




Память: 0.49 MB
Время: 0.046 c
14-1081947771
*pavel
2004-04-14 17:02
2004.04.11
Реализация сети


3-1079290162
Zilog
2004-03-14 21:49
2004.04.11
Работа с данными из базы данных!


3-1079433263
ламер2
2004-03-16 13:34
2004.04.11
TIBQuery


3-1079510121
Cj_Nik
2004-03-17 10:55
2004.04.11
Отобразить первые n записей талицы


3-1079513845
stud
2004-03-17 11:57
2004.04.11
генерация сообщений