Форум: "Основная";
Текущий архив: 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