Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2008, 22:32   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Вопрос Аналог Application.ProcessMessages()

Есть своя DLL с циклом внутри(иногда долгий, иногда нет).
Нужно не используя Forms, т.к ненужно чтобы размер DLL был под 400Кб. Может кто-то делал такое?
Важно!: не использовать Uses Forms;

Это я Плагинами решил заняться, вот и надо на будущее. Там где будет предусматриваться использовать Формы в DLL, буду пользовать Application.ProcessMessages().
Alter вне форума Ответить с цитированием
Старый 09.02.2008, 22:40   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А что именно нужно? Application.ProcessMessages - это простой модальный цикл.
B_N вне форума Ответить с цитированием
Старый 09.02.2008, 22:58   #3
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Сообщение

Нужно создать аналогичную Application.ProcessMessages(), по функциональному назначению. Чтобы неувеличивать размер DLL, из-за подключения Forms. Надеюсь понятно излагаю.
Alter вне форума Ответить с цитированием
Старый 09.02.2008, 23:02   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну прогоните все что вызывает ProcessMessages; там немного... жмете в среде Ctrl + шелчок мыши на процедуру и смотрите дальше... и пишите все что видите в отдельном модуле ( или где вам там надо ). Вот и все
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 23:16   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Alter, я же Вам говорю, Application.ProcessMessages, это простая проверка сообщений, вкратце такая:
Код:
if PeekMessage(msg, hWnd, 0, 0, PM_REMOVE) then begin
	TranslateMessage(msg); 
	DispatchMessage(msg); 
end;
Если вдруг не будет работать (Борланд туда насовал каких-то своих штучек), BOBAH13 уже дал Вам универсальный совет - пройтись по ней отладчиком, делов-то.
-----
Ну да... или исходник посмотреть.... :-D

Последний раз редактировалось B_N; 09.02.2008 в 23:19.
B_N вне форума Ответить с цитированием
Старый 09.02.2008, 23:58   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Сообщение Проанализировал Forms

Вот именно что смотрел я до того как задать вопрос, с помощью Ctrl+LbMousClick. Там стоко перекрёстных ссылок из Функции ProcessMessages. Вот проанализировал исходник у Forms и извлёк сюда всё на что ссылается функция ProcessMessage(var Msg: TMsg): Boolean, чтобы выкинуть ненужное и как можно записать что останеться.

Код:
  // Protected
function TApplication.IsDlgMsg(var Msg: TMsg): Boolean;
begin
  Result := False;
  if FDialogHandle <> 0 then
    Result := IsDialogMessage(FDialogHandle, Msg);
end;

function TApplication.IsKeyMsg(var Msg: TMsg): Boolean;
var
  Wnd: HWND;
begin
  Result := False;
  with Msg do
    if (Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST) then
    begin
      Wnd := GetCapture;
      if Wnd = 0 then
      begin
        Wnd := HWnd;
        if (MainForm <> nil) and (Wnd = MainForm.ClientHandle) then
          Wnd := MainForm.Handle
        else
        begin
          // Find the nearest VCL component.  Non-VCL windows wont know what
          // to do with CN_BASE offset messages anyway.
          // TOleControl.WndProc needs this for TranslateAccelerator
          while (FindControl(Wnd) = nil) and (Wnd <> 0) do
            Wnd := GetParent(Wnd);
          if Wnd = 0 then Wnd := HWnd;
        end;
        if SendMessage(Wnd, CN_BASE + Message, WParam, LParam) <> 0 then
          Result := True;
      end
      else if (LongWord(GetWindowLong(Wnd, GWL_HINSTANCE)) = HInstance) then
      begin
        if SendMessage(Wnd, CN_BASE + Message, WParam, LParam) <> 0 then
          Result := True;
      end;
    end;
end;

function TApplication.IsMDIMsg(var Msg: TMsg): Boolean;
begin
  Result := False;
  if (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm) and
     (Screen.ActiveForm <> nil) and (Screen.ActiveForm.FormStyle = fsMDIChild) then
    Result := TranslateMDISysAccel(MainForm.ClientHandle, Msg);
end;

function TApplication.IsHintMsg(var Msg: TMsg): Boolean;
begin
  Result := False;
  if (FHintWindow <> nil) and FHintWindow.IsHintMsg(Msg) then
    CancelHint;
end;


  // Private
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
  begin
    Result := True;
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
      if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;

  // Publik
procedure TApplication.ProcessMessages;
var
  Msg: TMsg;
begin
  while ProcessMessage(Msg) do {loop};
end;

Последний раз редактировалось Alter; 10.02.2008 в 00:02.
Alter вне форума Ответить с цитированием
Старый 10.02.2008, 00:35   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Боже мой
Код:
procedure ProcessMessages;
var
  Msg: TMsg;
  lResult: Boolean;
begin
  lResult := true;  
  while lResult do
  begin
    lResult := False;
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
    begin
      lResult := True;
      if Msg.Message <> WM_QUIT then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end;
  end;
end;
BOBAH13 вне форума Ответить с цитированием
Старый 10.02.2008, 00:44   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Сообщение

Вот исправлено, работает. Только почему когда у дельфи таскаю форму, вся работа программы останавливается. Как в других программах это неслучается ??

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
   function ProcessMessagee(var Msg :TMsg):Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var I :LongInt;
    Msg: TMsg;
begin

 For I:=0 To 1000000 Do
 begin
   ProcessMessagee(Msg);
  label1.Caption := Format('Текст - %3.2f', [ I/10000 ]);
 end;

end;

function TForm1.ProcessMessagee(var Msg :TMsg):Boolean;
Begin
 if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
 begin
    TranslateMessage(msg);
    DispatchMessage(msg);
 end;
End;

end.
Alter вне форума Ответить с цитированием
Старый 10.02.2008, 00:46   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Что это Вы сделали ? Вообще не понимаю смысла. Ооо даже можно оптимизировать
Код:
procedure ProcessMessages;   
var   
  Msg: TMsg;   
begin   
  while true do   
  begin   
    if not PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then Break;  
    if Msg.Message <> WM_QUIT then   
    begin   
      TranslateMessage(Msg);   
      DispatchMessage(Msg);   
    end;   
  end;   
end;
вроде так

Последний раз редактировалось BOBAH13; 10.02.2008 в 00:49.
BOBAH13 вне форума Ответить с цитированием
Старый 10.02.2008, 00:54   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Сообщение

Это тест функции на подвисание, проверял как работает с большими циклами(всего-то). Самое главное что работает. Спасибо конечно за модернизацию .

Код:
function ProcessMessagee(var Msg :TMsg):Boolean;   
Begin   
 if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then  
 begin  
    TranslateMessage(msg);   
    DispatchMessage(msg);   
 end;   
End;
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
application run *Devil* Общие вопросы Delphi 5 12.12.2012 21:30
application.ProcessMessages; UROKSAN Общие вопросы Delphi 2 10.04.2008 13:32
Application.ProcessMessages =LeonZone= Общие вопросы Delphi 11 27.01.2008 21:31
Application.ProcessMessages KAMASUTR Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 11.08.2007 23:38
Как остановить цикл без Application.ProcessMessages Alar Общие вопросы Delphi 0 29.10.2006 20:18