2012-01-02 2 views
1

Как проверить, полностью ли инициализирован элемент управления?
Рассмотрим следующий код (я знаю, что это очень плохая практика, чтобы сделать это, пожалуйста, это как пример)Как проверить, когда элемент управления полностью инициализирован?

type 
    TForm1 = class(TForm) 
    Memo1: TMemo; 
    private 
    procedure WndProc(var Message: TMessage); override; 
    public 
    { Public declarations } 
    end; 

procedure TForm1.WndProc(var Message: TMessage); 
begin 
{ 
    I'd like to log the messages to the memo as soon 
    as it's possible so I need to find out how to 
    check if the memo box is ready to use; the following 
    code stuck the application, so that the form is not 
    even displayed. How would you fix this code except 
    "avoid using of component access in window proc" ? 
} 

    if Assigned(Memo1) then 
    if Memo1.HandleAllocated then 
     Memo1.Lines.Add('Message: ' + IntToStr(Message.Msg)); 

    inherited WndProc(Message); 
end; 

P.S. Я знаю OutputDebugString :-)
Спасибо!

+1

Я смущен. Что вы хотите точно? 1) Записывать каждое сообщение «Message.Msg» в цикле сообщений в Memo1 или регистрировать завершение инициализации «Form1 и/или Memo1»? Можете ли вы это прояснить? – menjaraz

+0

@menjaraz Будьте осторожны, когда говорят «цикл сообщений». Это всего лишь сообщения в очереди. Сообщения без очереди также проходят через «WndProc». –

+1

@ Давид Хеффернан: Спасибо, что указали это. Это действительно отличное место для изучения. – menjaraz

ответ

4

Ваш вопрос довольно смутил меня. Когда вы сказали:

лог сообщений в памятке

Что вы имеете в виду, что вы хотите, чтобы регистрировать сообщения в форме, написав текст записки.

Этот подход чреват опасностью, поскольку, когда вы пишете в записке, форма получает отправленные сообщения, которые приводят к тому, что вы пишете записку, а переполнение стека является неизбежным последствием.

Мне удалось сделать вашу идею своей работой, включив защиту повторного входа. Я также представил переходный невизуальный список строк для захвата любых сообщений, которые доставляются до того, как элемент управления готов к их отображению. После того, как вы представите это, вам больше не нужно беспокоиться о том, чтобы найти точный ранний момент, когда его можно добавить в памятку.

unit LoggingHack; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TLoggingForm = class(TForm) 
    Memo1: TMemo; 
    private 
    FLog: TStringList; 
    FLogging: Boolean; 
    protected 
    procedure WndProc(var Message: TMessage); override; 
    public 
    destructor Destroy; override; 
    end; 

var 
    LoggingForm: TLoggingForm; 

implementation 

{$R *.dfm} 

{ TLoggingForm } 

destructor TLoggingForm.Destroy; 
begin 
    FreeAndNil(FLog); 
    inherited; 
end; 

procedure TLoggingForm.WndProc(var Message: TMessage); 
var 
    Msg: string; 
begin 
    if not FLogging then begin 
    FLogging := True; 
    Try 
     Msg := IntToStr(Message.Msg); 
     if Assigned(Memo1) and Memo1.HandleAllocated then begin 
     if Assigned(FLog) then begin 
      Memo1.Lines.Assign(FLog); 
      FreeAndNil(FLog); 
     end; 
     Memo1.Lines.Add(Msg); 
     end else if not (csDestroying in ComponentState) then begin 
     if not Assigned(FLog) then begin 
      FLog := TStringList.Create; 
     end; 
     FLog.Add(Msg); 
     end; 
    Finally 
     FLogging := False; 
    End; 
    end; 
    inherited; 
end; 

end. 

end; 

Мораль этой истории состоит в том, что вы должны использовать более подходящие рамки протоколирования, что не делает взаимодействовать с тем, что вы пытаетесь войти.

+0

Спасибо, Дэвид, я слышал о подклассе, но мой вопрос касался того, как получить доступ к этой заметке из окна окна proc. Я имею в виду, как проверить, когда памятка готова к использованию (форма и все ее элементы управления готовы к доступу). –

+0

@Martin ОК, я понимаю вопрос сейчас. Формулировка меня смутила. Сожалею. –

+0

Да, это хорошая идея. Спасибо. –