Текущий архив: 2004.05.30;
Скачать: CL | DM;
ВнизКодинг прям в проекте (*.dpr) Найти похожие ветки
← →
DoAll (2004-05-17 20:40) [0]Решил писать win32 (не консоль) приложение но без GUI...
И тут столкнулся с двумя вопросами:
1. Как лучше всего организовать цикл, который бы не давал приложению сразу закрываться, а ждал-бы WM_DESTROY?
2. Как без форм, без юнитов и т.д. работать с событиями?
Заранее спасибо!
← →
DoAll (2004-05-17 20:56) [1]Ну неужели никто незнает? :)
← →
DrPass © (2004-05-17 21:31) [2]1. Создать окно
2. Создать окно
Может пригодиться AllocateHwnd (если ты не решил полностью отказаться от VCL)
← →
GuAV © (2004-05-17 22:02) [3]
> работать с событиями?
Событие - это свойтво типа метод.
Такая штука возможна и
> без форм, без юнитов и т.д.
если сам напишешь такие объекты.
← →
DrPass © (2004-05-17 23:30) [4]
> Событие - это свойтво типа метод.
> Такая штука возможна и
> > без форм, без юнитов и т.д.
>
> если сам напишешь такие объекты.
Как говорит моя 81-летняя бабушка: "Ты эту чушь в своем Интернете вычитал?" :)
← →
jack128 © (2004-05-17 23:47) [5]
> 1. Как лучше всего организовать цикл, который бы не давал
> приложению сразу закрываться, а ждал-бы WM_DESTROY?
?? это сообщение посылается когда нужно уничтожить окно, то это далеконе означает, что приложение должно завершиться. приложение должно завершиться по получении WM_QUIT. Нужно просто написать стандартный цикл выборки/обработки сообщений, пример в FAQ"e
> 2. Как без форм, без юнитов и т.д. работать с событиями?
TEventHandlers = class
procedure NotifyEventHandler(Sender: TObject);
end;
...
Button1.OnClick := TEventHandlers.NotifyEventHandler;
← →
DoAll (2004-05-18 04:07) [6]Проверяем:
program test;
uses
JvAppHotKey,
Menus,
Dialogs;
type
TTest = class
JvApplicationHotKey1: TJvApplicationHotKey;
end;
TEventHandlers = class
procedure NotifyEventHandler(Sender: TObject);
end;
var
myTest: TTest;
procedure TEventHandlers.NotifyEventHandler(Sender: TObject);
begin
ShowMessage("Insert íàæàò!");
end;
begin
myTest.JvApplicationHotKey1.HotKey:=TextToShortCut("Ins");
myTest.JvApplicationHotKey1.OnHotKey:=TEventHandlers.NotifyEventHandler;
myTest.JvApplicationHotKey1.Active:=TRUE;
while TRUE do
end.
Выдаёт ошибку: [Error] test.dpr(25): Incompatible types: "TNotifyEvent" and "Procedure"
Что ни так?
← →
DoAll (2004-05-18 06:41) [7]Кароче я нашол оптимальный вариант...
Вобщем пишем так как если бы это была GUI-прога, НО код проекта немного изменяем:
...
uses
...
Windows, // это чтобы Sleep работал :)
...
begin
Application.Initialize;
ShowWindow(Application.Handle,SW_HIDE); // типа невидимое окно :)
Form1:=TForm1.Create(nil);
Application.Run;
while (true) do // бесконечный цикл :)
begin
Application.ProcessMessages; // получаем управление
Sleep(1); // это чтоб не тормозило :)
end;
end.
← →
DoAll (2004-05-18 06:43) [8]хотя там от Windows ещё ShowWindow зависит :)
← →
Романов Р.В. © (2004-05-18 08:04) [9]DoAll (18.05.04 06:41) [7]
Смешная шутка :)))
← →
Digitman © (2004-05-18 08:53) [10]
> DoAll (18.05.04 06:41) [7]
> Кароче я нашол оптимальный вариант
"оптимальный" ты наш)
> ShowWindow(Application.Handle,SW_HIDE); // типа невидимое
> окно :)
какое окно-то ? главное окно приложения ? оно и так невидимое .. окно главной формы ? она еще даже и не создана ...
> Application.Run;
> while (true) do // бесконечный цикл :)
> begin
> Application.ProcessMessages; // получаем управление
> Sleep(1); // это чтоб не тормозило :)
> end;
строчку Application.Run, по твоему, от балды Борланд вписывает в каждый GUI-проект ? нет, не от балды, это и есть по сути цикл выборки/обработки оконных сообщений ... и одно из главных условий выхода из этого цикла - разрушение главной формы приложения ... так на кой же шут ты еще один бестолковый цикл впендюрил ниже ?
← →
[lamer]Barmaglot © (2004-05-18 09:14) [11]Держи код минимального приложения на WinAPI...
function PlainWinProc (hWnd: THandle; nMsg: UINT;
wParam, lParam: Cardinal): Cardinal; export; stdcall;
var
Rect: TRect;
begin
Result := 0;
case nMsg of
wm_Create:
begin
end;
wm_Size:
begin
end;
wm_Destroy:
PostQuitMessage (0);
else
Result := DefWindowProc (hWnd, nMsg, wParam, lParam);
end;
end;
procedure WinMain;
var
hWnd: THandle;
Msg: TMsg;
WndClassEx: TWndClassEx;
lpStartUpInfo: TStartUpInfo;
begin
WndClassEx.cbSize := sizeOf (TWndClassEx);
WndClassEx.lpszClassName := "PlainWindow";
WndClassEx.style := cs_VRedraw or cs_HRedraw;
WndClassEx.hInstance := HInstance;
WndClassEx.lpfnWndProc := @PlainWinProc;
WndClassEx.cbClsExtra := 0;
WndClassEx.cbWndExtra := 0;
WndClassEx.hIcon := LoadIcon (hInstance,MakeIntResource ("MaINICON"));
WndClassEx.hIconSm := LoadIcon (hInstance,MakeIntResource ("MAINICON"));
WndClassEx.hCursor := LoadCursor (0, idc_Arrow);;
WndClassEx.hbrBackground := COLOR_WINDOW;
WndClassEx.lpszMenuName := nil;
if RegisterClassEx (WndClassEx) = 0 then
MessageBox (0, "Invalid class registration","Plain API", MB_OK)
else
begin
hWnd := CreateWindowEx (WS_EX_OVERLAPPEDWINDOW and WS_THICKFRAME{WINDOWEDGE},
WndClassEx.lpszClassName,
"Plain API Demo",
WS_OVERLAPPEDWINDOW,
cw_UseDefault, 0,
cw_UseDefault, 0,
0,0,HInstance,nil);
if hWnd = 0 then
MessageBox (0, "Window not created",
"Plain API", MB_OK)
else
begin
GetStartUpInfo(lpStartUpInfo);
ShowWindow (hWnd, lpStartUpInfo.wShowWindow);
while GetMessage (Msg, 0, 0, 0) do
begin
TranslateMessage (Msg);
DispatchMessage (Msg);
end;
end;
end;
end;
begin
// Insert user code here
WinMain;
end.
← →
DoAll (2004-05-18 20:41) [12]2Digitman:
Ну если Application.Run; - это цикл выборки/обработки оконных сообщений, то какова Х выполняется не он, а последний цикл? :)
2[lamer]Barmaglot:
Тебе не кажется что приложение с окном - трудно назвать минимальным? :)
2All:
Благодоря товарищю Digitman-у, до меня дошло выкинуть из проекта немного лишнего :)
Теперь проект выглядит так:
program Project1;
uses
Forms,
Windows, // теперь точно только для Sleep :)
Unit1 in "Unit1.pas" {Form1};
{$R *.RES}
begin
Form1:=TForm1.Create(nil);
while (true) do // бесконечный цикл :)
begin
Application.ProcessMessages; // получаем управление
Sleep(1); // это чтоб не тормозило :)
end;
end.
Будем оптимизировать дальше? :)
← →
vertal (2004-05-18 21:25) [13]Когда я делал что-то подобное , то несмотря на
Sleep(x); // это чтоб не тормозило :)
загрузка процессора была 99-100%.Все-таки надо использовать GetMessage , тогда действительно не тормозит.
← →
nikkie © (2004-05-18 21:28) [14]>Будем оптимизировать дальше? :)
будем, конечно. да уже немного осталось. :)
вот немножко еще дооптимизировал:program Project1;
uses
Forms,
Unit1 in "Unit1.pas" {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
← →
DrPass © (2004-05-18 22:40) [15]
> Ну если Application.Run; - это цикл выборки/обработки оконных
> сообщений, то какова Х выполняется не он, а последний цикл?
> :)
Логично, т.к. ты главную форму создал через TForm1.Create, а не через Application.CreateForm. А тот же самый код, что и у тебя, но сделанный не через ж... выглядит как
> nikkie © (18.05.04 21:28) [14]
Если тебе нужно просто спрятать программу - то Form1.Hide, ShowWindow(Application.Handle,SW_HIDE);
← →
jack128 © (2004-05-18 23:23) [16]
> [6] DoAll (18.05.04 04:07)
сорри, ошибся
> TEventHandlers = class
> class procedure NotifyEventHandler(Sender: TObject);
> end
← →
Digitman © (2004-05-19 08:22) [17]
> DoAll (18.05.04 20:41) [12]
> Ну если Application.Run; - это цикл выборки/обработки оконных
> сообщений, то какова Х выполняется не он, а последний цикл?
> :)
выполняется он !
но поскольку объекту Application ты не сопоставил главную форму, то как раз и наступает то самое условие завершения цикла, о котором я тебе уже сказал
program Project1;
uses
Forms,
Unit1 in "Unit1.pas" {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.ShowMainForm := False; //если не выполнить эту строчку, то вне зависимости от св-ва TForm1.Visible форма будет показана
Application.CreateForm(TForm1, Form1); //создаем невидимую форму
Application.Run; //стартуем цикл ожидания/выборки/дисп-ции сообщений, условие выхода - разрушение формы Form1 или вызов где-то в коде обработчиков событий формы метода Application.Terminate
end.
Страницы: 1 вся ветка
Текущий архив: 2004.05.30;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.04 c