Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Узнать когда окончилась отрисовка?


Автор: Grol 13.1.2007, 06:55
Уважаемые модераторы, ответьте пожалуйста на вопрос: как узнать что DBGrid отрисовался? Т.е. на форме есть DBGrid, когда форма на экране отобразилась на ней отобразился DBGrid. И нужно выдать сообщение в момент окончания отрисовки DBGrid'a.... как это сделать я не знаю.... может знает кто другой.... За любую помощь буду очень благодарен!

Автор: aktuba 13.1.2007, 08:36
Не сталкивался, но первая мысль, пришедшая в голову - проверять отрисовалась ли последняя ячейка (нижняя правая)...
Еще, как вариант, проверять, что программа простаивает...

Автор: Alexeis 13.1.2007, 10:47
Grol, обработчик onPaint как раз и вызывается после окончания отрисовки.

Автор: Sunvas 13.1.2007, 12:28
Цитата(Grol @  13.1.2007,  06:55 Найти цитируемый пост)
И нужно выдать сообщение в момент окончания отрисовки DBGrid'a

Вот этого не совутую делать. Если ты будешь мессаги выдавать когда произошла отрисовка, то пользователь будет только то и делать что кликать "ОК".

Автор: Grol 13.1.2007, 20:24
Спасибо всем тем кто принимает обсуждение в вопросе smile Alexeis я конечно же воспользовался бы обработчиком onPaint, но в DBGrid'e нет такого события.... Что тогда делать?

Добавлено @ 20:25 
А может я просто слеп как крот  smile  подскажите тогда как и где его найти.....

Автор: Sunvas 13.1.2007, 20:31
Цитата(Grol @  13.1.2007,  20:24 Найти цитируемый пост)
но в DBGrid'e нет такого события.... Что тогда делать?

Самостоятельно ловить это сообщение и что-то делать.

Добавлено @ 20:31 
Ща. Набросаю.

Автор: Sunvas 13.1.2007, 20:46
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    s: TStringGrid;
    procedure FormCreate(Sender: TObject);
  private
  procedure Newwnd(var Msg:TMessage);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  Oldwnd : TWndMethod;
procedure TForm1.FormCreate(Sender: TObject);
begin
oldwnd:=s.WindowProc;
s.WindowProc:=newwnd;
end;

procedure TForm1.Newwnd(var Msg: TMessage);
begin
  case msg.Msg of
    wm_paint: //твое действие
   end;
   Oldwnd(Msg);
end;

end.

Автор: Grol 13.1.2007, 21:59
Ага спасибо сейчас попробую!

Автор: Sunvas 13.1.2007, 22:13
Отпишись, когда все сделаешь.

Автор: bems 14.1.2007, 00:58
Цитата(Sunvas @  13.1.2007,  12:28 Найти цитируемый пост)
будет только то и делать что кликать "ОК". 
Вроде да, ожидать этого было бы логично...

Автор: Grol 15.1.2007, 07:54
Sunvas все получилось что я хотел! Спасибо! А как в этом коде 
Код

procedure TForm1.Newwnd(var Msg: TMessage);
begin
  case msg.Msg of
    wm_paint: //твое действие
   end;
   Oldwnd(Msg);
end;

узнать от какого компонента поступило сообщение?

То есть на форме у меня несколько StringGridov. И мне нужно узнать какой компонент сейчас отрисовывается? Если бы у msg было такое свойство бы parent или owner, а то ничего же нет. Извините за мои глупые вопросы!

Автор: Alexeis 15.1.2007, 10:41
  Если действия разные, то логично делать разные обработчики для каждого из компонентов. Иначе прийдется искать нужный компонент в списке, а это лишнее процессорное время.

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

Автор: MetalFan 15.1.2007, 12:22
Цитата(Alexeis @  15.1.2007,  10:41 Найти цитируемый пост)
После замены функции обработки сообщений, нельзя будет уже производить определенных действий с самим StringGrid ом. Я имею ввиду те действия которые приводят к пересозданию его окна, потому что пересозданное окно будет иметь уже старый обработчик, а новый попросту не будет вызываться

судя по генетическому коду пересозадние окна в случае наследника от TControl никак не повлияет на вызов WindowProc.
ибо она вызывается в коде 
procedure TWinControl.MainWndProc(var Message: TMessage);

видимо путаешь с SetWindowLong?

Автор: Sunvas 15.1.2007, 13:24
Цитата(Grol @  15.1.2007,  07:54 Найти цитируемый пост)
узнать от какого компонента поступило сообщение?

А что проверять-то? От какому компоненту присвоил - тому и пренадлежит.
Цитата(Sunvas @  13.1.2007,  20:46 Найти цитируемый пост)
s.WindowProc:=newwnd;

Если же хочется сделать универсальную процедуру для всех - то WindowProc не выход. Надо либо экспериментировать с SetWindowLong, или писать наследника.

Автор: Alexeis 15.1.2007, 13:41
Цитата(MetalFan @  15.1.2007,  12:22 Найти цитируемый пост)
судя по генетическому коду пересозадние окна в случае наследника от TControl никак не повлияет на вызов WindowProc.
ибо она вызывается в коде 


Гм... сам не лазил, но где-то читал, сейчас никак не могу найти где  smile . Разве при пересоздании окна метод обработки сообщений не назначается заново?

Автор: Grol 15.1.2007, 23:43
Спасибо всем кто помог мне....пока помощи больше не нужно  smile  если что опять обращусь к этому прикольному форуму  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)