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

Вниз

Кодинг прям в проекте (*.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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.028 c
3-1083450579
Goida
2004-05-02 02:29
2004.05.30
Как убрать пробелы в полях БД?


1-1084821008
Yong
2004-05-17 23:10
2004.05.30
net send программно?


3-1084326164
Марат
2004-05-12 05:42
2004.05.30
Два поля


7-1082597883
Anonymous
2004-04-22 05:38
2004.05.30
создать файл сообщений (разработка службы)


1-1084633198
Ivolg
2004-05-15 18:59
2004.05.30
Memo





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