WEB форумы на jedi
[Форум] [Помощь] [Поиск] [Выйти]
Добро пожаловать, [info]User

WEB форумы на jedi [ПОИСК] [Архив до 03.2006]

Тема Delphi,Api и EnableMenuItem? К предыдущему сообщению На следующее сообщение Программирование

Отправил Mighty в 22:10 14.08.2005[Ответить]
Есть чужая прога у которой один из пунктов меню недоступен. Надо его включить.

Делаю так:
procedure TForm1.Button1Click(Sender: TObject);
var
  wnd: HWND;
  hMen:HMenu;
  i:integer;
begin
  wnd:=FindWindow(nil,'Form1');
  hMen:=GetMenu(wnd);
  for i:=0 to 10 do begin
   EnableMenuItem(hMen,GetMenuItemID(hMen,i),MF_BYCOMMAND or MFS_ENABLED);
   SendMessage(wnd,wm_Command,i,0);
  end;
end;
Пункт меню включается, но не срабатывает событие(команда) на этом пункте. Кто сталкивался с подобным, ткните пальцем в функцию? плз..
Мож кто копался в исходниках TMainMenu? Я там совсем заплутал - где точка в которой под NT можно активизировать пункт меню??

ЗЫ: Если дизаблить пункт в рантайме(EnableMenuItem(hMen,GetMenuItemID(hMen,i),MF_GRAY);
), то потом EnableMenuItem(hMen,GetMenuItemID(hMen,i),MF_BYCOMMAND or MFS_ENABLED);
функция проходит на ура и событие срабатывает, если же в дизайнтайме, то только подсветка включается :-(


Отправил elite в 09:22 15.08.2005[Ответить]
не подскажешь, есть ли в дельфи аналог паскалевского KEYPRESSED?


Отправил Mighty в 10:13 15.08.2005[Ответить]
Не понял связи :-(
FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState)
if Key = ... then


Отправил elite в 08:17 16.08.2005[Ответить]
ну извини, совсем не в тему влез. но твое сообщение свежее и ты ответишь на него :)

FormKeyDown не пройдет, т.к. нужен выход из цикла.
цикл вывода на принтер, грузит комп.
нужно по капе выйти...


Отправил XZ в 14:37 16.08.2005[Ответить]
Загоняешь свой цикл в поток (TThread) и вставляешь в него проверку на флаг Terminated потока.. А в обработчике OnKeyDown формы пишешь че-нить типа:
MyThread.Terminate;


Отправил Mighty в 19:39 16.08.2005[Ответить]
>FormKeyDown не пройдет, т.к. нужен выход из цикла.
ДрАтити :-) Какой поток, какие циклы? А Application.ProcessMessages на что?
Делаешь Form1.KeyPreview:=true
Потом твой цикл. Внутри цикла после незнаю какой процедуры у тебя там вывода на печать строки делаешь
Application.ProcessMessages; (это чтобы очередь сообщений прогнать, а там как раз твое сообщение KeyPressed сидит)
и в
Form1.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState)
if Key = ... then

Нет проблем..

Людиии, а мне то помогите? Или может я так переформулирую вопрос. На CBuildere или VisualStudio эти функции API работают так как мне надо?? Попробуйте плз...


Отправил elite в 14:26 18.08.2005[Ответить]
спасибо за ответ, именно так я и сделал.
правда сам догодался (почитал некоторую литературу) :)))
именно с процесс мессагами всё и делаеца.
причем и комп совершенно не виснет!