Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли при помощи TApplication организовать главный цикл [D5, Win95/98, WinME, Win2k, WinXP]


NeyroSpace ©   (2004-07-02 11:51:00) 

выборки сообщений? Извращение, но все же... Вот код:
program Project1;
{$R *.DFM}
uses
 windows,
 messages,
 Forms;

type
 TApplication1 = class(TApplication)
 private
   procedure OnApplicationMessage(var Msg: TMsg; var Handled: Boolean);
   procedure OnFormClose(Sender: TObject; var Action: TCloseAction);
   { Private declarations }
 public
   { Public declarations }
 end;

var
 n : integer;
 Application1: TApplication1;
 Form1 :TForm;

procedure TApplication1.OnFormClose(Sender: TObject; var Action: TCloseAction);
begin
SendMessage(Application1.Handle, wm_close, 0 ,0);
end;

procedure TApplication1.OnApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = wm_close then
 begin
 n := 1;
//  Application1.Terminate;//????
 end;
end;

begin
 Application1 := TApplication1.Create(nil);
 Application1.Initialize;
 Application1.OnMessage := Application1.OnApplicationMessage;
 Application1.Run;
 Form1 := TForm.Create(Application1);
 Form1.Visible := true;
 Form1.OnClose := Application1.OnFormClose;

n := 0;
while n = 0 do
 begin
 Application1.ProcessMessages;
 sleep(10);
 end;

Application1.Terminate;//или не надо?
end.

Форму я создал просто так, чтобы было откуда WM_CLOSE послать.
Возникли следующие вопросы:
1.Можно ли вообще так делать?
2.Почему WM_CLOSE не обрабатывается?
3.Если не создать наследника TApplication1 = class(TApplication), то соответственно не переопределить событие
Application1.OnMessage := Application1.OnApplicationMessage;
врезультате приходиться подключать модуль Forms, можно ли как-нибудь это обойти и воспользоваться создаваемым средой Application?
4.Хотелось бы услышать ваши комментарии.


Тимохов   (2004-07-02 12:36:00) [1]

Про очереди сообщений
Рихтер, издание 4, глава 26. Посмотри в сети - она есть.
многое полезное узнаешь.


Digitman   (2004-07-02 12:28:00) [2]


> NeyroSpace ©   (02.07.04 12:17) [9]



> Вопрос что создается (из объектов)?


в этом случае никакие объекты не создаются


> что генерирует среда в таком случае?


среда генерирует вполне работоспособный exe-файл, который ничего полезного не делает

при старте такого "пустого" приложения система точно так же передает управление на точку входа, в результате чего происходит вызов секции иниц-ции модуля system ... поскольку в теле проекта нет никаких операторов, то тут же управление передается на секцию финализ-ции модуля system и после этого процесс завершается


> Как получить указатель процедуру выборки сообщений?


а кто ее создал, процедуру-то ? проект-то - пустой ! dummy он)


> как ее переопределить?


прежде чем что-то переопределять, нужно чтобы это "что-то" существовало в коде


Romkin   (2004-07-02 12:27:00) [3]

Ничего там не создается :) У тебя только System подключен.
Вот тебе цикл выборки сообщений, минимальный

repeat
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
   if Msg.Message <> WM_QUIT then
   begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
   end
   else
     Terminated := True;
until Terminated;

А процедура обработки сообщений у твоего окна должна быть


NeyroSpace   (2004-07-02 12:17:00) [4]

Имеем:

program Project1;
begin
end.

Запускаем, получаем ехе. Вопрос что создается (из объектов)? Можно ли к этому получить доступ?


NeyroSpace   (2004-07-02 12:15:00) [5]

>не подключай, никто не заставляет
>но тогда и про TApplication забудь
А что генерирует среда в таком случае?
Как получить указатель процедуру выборки сообщений?
И как ее переопределить?

Вопрос конечно чисто теоретический, для повышения уровня образованности :-).


NeyroSpace   (2004-07-02 12:09:00) [6]

Если не сделать цикла, то Application само завершается, доходя до end.


Тимохов   (2004-07-02 12:09:00) [7]

Ты бы сам свой код попытался запустить - много вопрособ вы снялось.


Семен Сорокин   (2004-07-02 12:08:00) [8]


> NeyroSpace ©   (02.07.04 12:06) [2]
> Это проще чем на ВинАпи. Если не подключать Forms, то размер
> получается 16Кб.

Извините а как вы собираетесь не подключать Forms, если TApplication там объявлен?


Digitman   (2004-07-02 12:08:00) [9]


> Если не подключать Forms, то размер получается 16Кб


не подключай, никто не заставляет
но тогда и про TApplication забудь


NeyroSpace   (2004-07-02 12:06:00) [10]

Это проще чем на ВинАпи. Если не подключать Forms, то размер получается 16Кб.


Romkin   (2004-07-02 12:06:00) [11]

Простите, а вы код TApplication.Run посмотрели? Внимательно?

repeat
 HandleMessage
until Terminated;


Тимохов   (2004-07-02 12:02:00) [12]

у меня не комментарий, а вопрос

какая стоит цель?


Наверх

Титульная страница Поиск, карта сайта Написать письмо