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

Вниз

Динамически создаваемое меню....   Найти похожие ветки 

 
John0001   (2002-07-23 15:20) [0]

Создаю меню во время выполнения... (просто загружаю туда список нужных мне окон в системе и в поле Tag вставляю HWND окна) так вот вопрос как узнать на какой пункт я кликнул??


 
Song   (2002-07-23 15:23) [1]

Сделайте им [итемам] событие onClick и различайте по TMenuItem(Sender)


 
John0001   (2002-07-23 15:27) [2]

Хм а как сделать то?
Вот это то и не могу понять... что так сделать надо я и так понял... пальцом бы кто показал! :o)


 
Skier   (2002-07-23 15:29) [3]

>John0001
Эх, молодёжжжжжжжжжжж...:)


 
John0001   (2002-07-23 15:31) [4]

Дык не молодежь... просто начальником работаю и позабыл все напрочь... так от случая к случаю юзаю Дельфи :o/


 
Song   (2002-07-23 15:32) [5]

- Молодой человек, скажите где Гибралтар?
- Зюйд-зюйд, вест!
- Да ты не умничай, ты пальцем покажи!

(с) ГЭГ

:-))) Кто играл, вспомнит обязательно.


 
Song   (2002-07-23 15:32) [6]

- Молодой человек, скажите где тут Гибралтар?
- Зюйд-зюйд, вест!
- Да ты не умничай, ты пальцем покажи!

(с) ГЭГ

:-))) Кто играл, вспомнит обязательно.


 
Song   (2002-07-23 15:33) [7]

Ok, а как делаете-то "Создаю меню во время выполнения" ? :-)


 
John0001   (2002-07-23 15:34) [8]

Угу так о том и речь не прикалывались бы а "пальцом бы показали"!


 
Skier   (2002-07-23 15:34) [9]

>John0001

Просто анкеты нет, вот я и подумал... :))


procedure TForm1.miNClick(Sender: TObject);
begin
with Sender as TMenuItem do begin
if Tag <> 0 then begin
//здесь используешь Handle окна...
end; //if
end; //with
end;


 
John0001   (2002-07-23 15:37) [10]

Вот кусок что генерит меню...

Wnd := GetWindow(Handle, gw_HWndFirst);
while Wnd <> 0 do
begin
if (Wnd <> Application.Handle) and
IsWindowVisible(Wnd) and
(GetWindow(Wnd, gw_Owner) = 0) and
((GetWindowText(Wnd, buff, sizeof(buff)) <> 0) and
(IsWild(StrPas(buff), "Ultima Online*", true)) )
then
begin
GetWindowText(Wnd, buff, sizeof(buff));
NewItem:=TMenuItem.Create(miChgUOwin);
NewItem.Caption := StrPas(buff);
NewItem.Tag := Wnd;
if ProcHWND = Wnd then NewItem.Checked:=true;
RxppmMain.Items[0].Add(NewItem);
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;


 
Song   (2002-07-23 15:39) [11]

Если показывать пальцем всё с самого начала то это много писать, поэтому Вы покажите как Вы создавали динамически Ваше меню, а мы Вам покажем как сделать остальное.

2Skier © (23.07.02 15:34)
Походу дела у него не назначено это событие вообще.


 
John0001   (2002-07-23 15:42) [12]

To: Skier
Я просто акк свой посеял на форуме а искать лень :-)
А задача проста... прога моя получает в глобальной переменной HWND окна и что-то делает... в меню несколько процессов HWND которых содержатся в поле Tag соответствующего пункта меню... задача при выборепункта меню записать в глобальную переменную содержимое поля Tag у выбранного пункта... вот..... и никак не допру как сделать :-(


 
Song   (2002-07-23 15:42) [13]


...
GetWindowText(Wnd, buff, sizeof(buff));
NewItem:=TMenuItem.Create(miChgUOwin);
NewItem.Caption := StrPas(buff);
NewItem.Tag := Wnd;
NewItem.onClick:=MyItemsClick;
if ProcHWND = Wnd then NewItem.Checked:=true;
RxppmMain.Items[0].Add(NewItem);
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;
...

Procedure TForm1.MyItemsClick(Sender:TObject);
Begin
ShowMessage("Мы нажали итем "+TMenuItem(Sender).Caption); // Вот здесь мы и различаем итемы.
End;


 
Song   (2002-07-23 15:44) [14]

Кстати для Вашего случая я бы советовал не ходить по дескрипторам через GetWindow(), а использовать EnumWindows(), EnumChildWindows() - легче, компактней, менее трудоёмко.


 
John0001   (2002-07-23 15:54) [15]

Урааа то что надо!!! Я знал что должно быть просто и красиво ;-)
А как с EnumWindows?
Моя задача найти просто окна с началом в заголовке "Ultima Online" и вывести их в меню... кстати я при выборе одного из пунктов перечитываю список окон и чищу меню таким образом:

procedure TfrmMain.miRefreshListClick(Sender: TObject);
var
i: Integer;
begin
i := RxppmMain.Items[0].Count - 1;
while i >= 1 do
begin
RxppmMain.Items[0].Delete(i);
i:=i-1;
end;
GetProcList(); // как раз кусок кода приведенный раньше
end;

Может это коряво?


 
John0001   (2002-07-23 16:05) [16]

Ну вот видимо сильно много спросил :o/


 
Song   (2002-07-23 16:24) [17]

Главное чтобы работало.
Если честно писать лень, поищите по слову EnumWindows найдёте кучу примеров.


 
John0001   (2002-07-23 17:01) [18]

Угу сделал поиск нашел 2 топика в которых говорится типа EnumWindows круче... и все :-)


 
Song   (2002-07-23 17:08) [19]


Function EnumProc(Handle:HWND; Param:LongInt):Boolean; stdcall;
Begin
GetWindowText(...);
PopupMenu1.Items.Add(...);
Result:=True;
End;

Procedure TForm1.Button1Click(Sender:TObject);
Begin
EnumWindows(@EnumProc,0);
End;

В EnumProc придётся вставить ещё дополнительные проверки, потому что по умолчанию она Вам много чего в меню напехает.



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

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

Наверх




Память: 0.48 MB
Время: 0.006 c
3-13574
whiteman
2002-07-16 10:29
2002.08.05
IB (ссылочная целостность)


3-13550
studentik
2002-07-09 20:18
2002.08.05
Как перенести прогу, работающую с БД InterBase на


1-13714
madcap
2002-07-23 23:01
2002.08.05
Обработчик события


4-13852
roadstar
2002-05-29 14:24
2002.08.05
Как програмно открыть папку


1-13695
Maxuz
2002-07-24 00:29
2002.08.05
Преобразование Фурье и его реализация на D6





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