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

Вниз

Узнать позицию (индекс) текущей строчки меню TMainMenu.TMenuItem   Найти похожие ветки 

 
sniknik ©   (2009-10-21 17:02) [0]

Сабж. Если это возможно конечно.
Смысл, нужно удалять некоторые, ненужные уже, позиции меню создаваемые динамически, и первым, что пришло в голову это делать это по кнопке (акции) при открытом меню, т.е. открыл, ведешь мышкой по выпавшему списку, увидел не нужное, навел мышкой, нажал дел и оно удалилось...

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


 
CrytoGen   (2009-10-21 18:20) [1]

в таких случаях, как мне кажется, делают под меню в котором есть пункт "удалить"


 
CrytoGen   (2009-10-21 18:31) [2]

или же можете поступить нестандартно и воспользоваться примерно таким способом
procedure TForm1.N11AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
 ARect: TRect; State: TOwnerDrawState);
begin
ACanvas.TextOut(ARect.Left,ARect.Top,(Sender as TMenuItem).Caption);
if (odHotLight in State) or (odFocused in State) or (odSelected in State) then
 LastItem:=Sender as TMenuItem
else
 LastItem:=NIL;
end;

правда возможны проблемы


 
Игорь Шевченко ©   (2009-10-21 19:24) [3]

Сильно сомневаюсь, что без дополнительных ухищрений удастся обработать нажатие клавиш (в том числе и Del), выбор меню - модальный цикл


 
sniknik ©   (2009-10-21 19:25) [4]

> в таких случаях, как мне кажется, делают под меню в котором есть пункт "удалить"
Некрасиво, будет меню с "гроздью" подменю, так как там все "удаляемые" (с возможностью).
Можно конечно сделать на всех один дополнительный пункт сверху "очистить", но тогда потеряется удобство, удалять всегда в основном нужно по одному пункту.  

> или же можете поступить нестандартно
Думал... минут пять, и отказался от этой мысли, т.к. ->
>  правда возможны проблемы
Только по моим мыслям, они не возможны, они гарантированны.


 
sniknik ©   (2009-10-21 19:28) [5]

> Сильно сомневаюсь, что без дополнительных ухищрений удастся обработать нажатие клавиш
Не проблема, у меня список акций (в том числе и дел), и это точно работает при открытом меню, собственно удаление хотел сделать так именно потому, что это было бы просто небольшой добавкой к уже работающему.


 
Игорь Шевченко ©   (2009-10-21 21:14) [6]

sniknik ©   (21.10.09 19:28) [5]


> Не проблема, у меня список акций (в том числе и дел), и
> это точно работает при открытом меню, собственно удаление
> хотел сделать так именно потому, что это было бы просто
> небольшой добавкой к уже работающему.


Акция - это хорошо. Но меню к моменту выполнения акции уже должно быть закрыто. Хотя через обработку WM_MENUSELECT можно узнать последний выделенный элемент меню.


 
sniknik ©   (2009-10-21 21:21) [7]

Игорь Шевченко ©   (21.10.09 21:14) [6]
Да, чего то не получается, видать придется форму-список из этих пунктов делать и там удалять.

> Хотя через обработку WM_MENUSELECT можно узнать последний выделенный элемент меню.
Хм. а может и текущий можно? Если из потока попробовать? Счас проверю.


 
Игорь Шевченко ©   (2009-10-21 21:24) [8]

unit main;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   MainMenu1: TMainMenu;
   Foo1: TMenuItem;
   Bar11: TMenuItem;
   Bar21: TMenuItem;
   Bar31: TMenuItem;
   Bar1: TMenuItem;
   Foo11: TMenuItem;
   Foo21: TMenuItem;
   Foo31: TMenuItem;
 private
   procedure WmMenuSelect (var Message: TMessage); message WM_MENUSELECT;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.WmMenuSelect(var Message: TMessage);
var
 Item: TMenuItem;
 I: Integer;
begin
 Memo1.Lines.Add(Format("selected %.8x (%.8x)", [Message.LParam, Message.WParam]));
 Item := MainMenu1.FindItem(Message.LParam, fkHandle);
 if Assigned(Item) then
   for I := 0 to Item.Count - 1 do
     if Item.Items[I].Command = Message.WParamLo then
       Memo1.Lines.Add("it is "+Item.Items[I].Caption); //Записываешь последний выбранный Item

end;

end.

Где-то так - записываешь последний выбранный MenuItem, в момент срабатывания акции Del смотришь, кого записал, если есть кого удалять - удаляешь


 
sniknik ©   (2009-10-21 21:24) [9]

Блин, тоже не получится, это событие отправляется если пункт меню выбран, а не просто "подсвечен"... не пойдет в общем.


 
sniknik ©   (2009-10-21 21:28) [10]

Хотя нет, все нормально, по [8], выдаются "подсветки". Спасибо, попробую что нибудь сообразить. Уже понятно что так просто не получится, нужно "химичить" :).


 
Игорь Шевченко ©   (2009-10-21 21:34) [11]

sniknik ©   (21.10.09 21:28) [10]

Это не химия, когда "было программирование чиста на API", по этому сообщению правильные пацаны хинт в статус-баре показывали для выбранного элемента меню.


 
sniknik ©   (2009-10-21 21:43) [12]

> Это не химия
Да пофиг как называть... :)

Кстати нашел более менее подходящее, можно по WM_MENUCHAR удалять, жаль оно только для "символьных кнопок", вместо Del придется например "D" жать, но и так неплохо, лучше чем с отдельной формой.


 
sniknik ©   (2009-10-21 22:02) [13]

Все получилось. Вполне удовлетворительно.
По WM_MENUSELECT организуем "селектедитем", по WM_MENUCHAR (Ctrl+D - Message.WParamLo = 4)  удаляем. Проблем быть не должно, событие вызывается и при "сходе" с меню, и "селектедитем" обниляется.
Спасибо!


 
Германн ©   (2009-10-22 01:49) [14]


> sniknik ©   (21.10.09 17:02)
>
> Сабж. Если это возможно конечно.
> Смысл, нужно удалять некоторые, ненужные уже, позиции меню
> создаваемые динамически, и первым, что пришло в голову это
> делать это по кнопке (акции) при открытом меню, т.е. открыл,
>  ведешь мышкой по выпавшему списку, увидел не нужное, навел
> мышкой, нажал дел и оно удалилось...
>
> Если нельзя то придется на другое меню переделывать, или
> что-то типа формы настроечной делать, со списком этих пунктов,
>  хотя отдельная форма не очень удобно как кажется...
>

Днём не было времени вдумываться в вопрос (тем более, что моя квалификация гораздо более низкая). А сейчас когда на компе стенда выполняется дефрагментация (похоже зря я её вообще запустил), а на основном скачивается пресовутый PPM для разбивки винта стендового компьютера, подумал, что данный вопрос очень напоминает работу с закладками в FF. В ран-тайме динамически в меню "Закдадки" добавляются некие пункты. Через некоторое время эти пункты становятся не нужными. (Или выходит так, что они вообще были ненужными). В FF для таких случаев предусмотрена именно отдельная форма (окно) - "Управление закладками".
Это так, к слову.


 
sniknik ©   (2009-10-22 02:31) [15]

Закладки в мозиле по сравнению с моими позициями в меню это что-то такое монументальное и незыблемое, "на века".... :о).

У меня ссылок 2-3-4 ну пять, и выполняются по 2-3-4... ну по десять раз. (это выгрузка в определенный файл по определенному пути, путь один, параметры отбора разные, определяются текущим состоянием программы. т.е. работаем работаем, о, нужно сохранить, работаем дальше, о, получилось лучше, нужно еще сохранить (/отправить). после, с одним закончили, типа не меняется, давай в другой путь сохраним, а старый пока пусть "повисит", может чего возникнет, что потребуется изменить. ну и т.д. а больше 5 одновременных задач человек не делает, задачи не такие уж длительные чтобы их хотя бы неделю хранить, за неделю они скорее всего раза три все поменяются).
Т.е. первый раз, по основному пункту, есть выбор куда, после, т.к. скорее всего туда же будут еще сохранения я этот выбор запоминаю и делаю дополнительный пункт меню, всего количеством 5 (больше вряд ли понадобится (хотя теперь можно и добавить, сделать например 7, или даже 8...)), устаревшие пункты само собой удаляются и так (те которые используют "всплывают" вверх, старые вниз и "уходят" когда выйдут за 5). Вот, вроде все нормально, но, чаще всего используется пара путей, и список даже из 3-х, не говоря о 5 ти "замыливает" глаз, лишние "напрягают", вот и возникла идея их удалять... (просто ограничить список 2-мя нельзя, т.к. путей может быть и больше) ну, а так как изменения довольно динамичны, лезть куда то в меню, открывать форму настроек очень неудобно. (хотя если бы не получилось так и сделал бы)
По кнопке в самый раз, одно нажатие и нет лишнего пункта, ничего не мешает. А ошибся, удалил нужное, тоже не страшно, просто повтори выбор из главного пункта (т.е. у меня нет "серьезности" закладок, или чего-то ради чего стоило бы делать серьезную настройку пунктов, оберегать от случайного удаления... наоборот все должно быть как можно проще, и удобнее).


 
Германн ©   (2009-10-22 02:41) [16]


> sniknik ©   (22.10.09 02:31) [15]

Не ты меня не понял. Это понятно.
Я свой пост к тому, что "управление закладками" позволяет мне максимально возможно вспомнить что из себя представляет тот или иной пункт меню. А ведь в меню, обычно, только "краткое название".
Ну а поскольку добавляет пункты в меню человек и человек же их в последствии удаляет, то имхо , этому человеку не мешало бы дать максимальную информацию о том, что он удаляет.



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

Форум: "Основная";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.003 c
2-1298584745
Артём
2011-02-25 00:59
2011.06.05
Деление строки


6-1237972450
антон1243232
2009-03-25 12:14
2011.06.05
Проблема со склейкой пакетов


2-1298571014
nord
2011-02-24 21:10
2011.06.05
ожидание выполнения процедуры


2-1298526442
AltCtrlDel
2011-02-24 08:47
2011.06.05
Многоязыковое приложение. ITE не нравится


15-1297866402
bss
2011-02-16 17:26
2011.06.05
Word.Application - загрузка из потока





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский