Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Динамическое создание меню: возникла необходимость создания меню   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.04 c
1-1082482168
просто Я
2004-04-20 21:29
2004.05.09
ComboBox1.Items.Delete(??????);


14-1082100591
Undert
2004-04-16 11:29
2004.05.09
Вопрос к администраторам


8-1076701704
Сережа
2004-02-13 22:48
2004.05.09
ImageList


7-1079698523
headerr
2004-03-19 15:15
2004.05.09
Отключение прокрутки колесом мыши


7-1079991197
neodiX
2004-03-23 00:33
2004.05.09
Detect WinLogon window in winXP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский