Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.026 c
1-1084745029
killer
2004-05-17 02:03
2004.05.30
XPManifest и Panel


14-1084437435
Романов Р.В.
2004-05-13 12:37
2004.05.30
Никто не обратил внимания?


3-1083217697
lightix
2004-04-29 09:48
2004.05.30
Проблемы с ADO + Oracle


1-1084808502
DillerXX
2004-05-17 19:41
2004.05.30
Чё у меня за фигня с DateToTime ом??


9-1075136639
DewersiA
2004-01-26 20:03
2004.05.30
Помогите обработать множество изображений