Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не хочет работать Repaint вложенной формы 
V
    Опции темы
ilya_z
Дата 7.3.2007, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.1.2007
Где: Екатеринбург

Репутация: нет
Всего: нет



При создании главной формы создаю объект для рисования:
Код

  Drawing:=TDraw.Create(Self);
  Drawing.DrawForm.ControlStyle:=ControlStyle+[csOpaque];

Который содержит канву на основе объекта TForm:
Код

constructor TDraw.Create(aOwner:TComponent);
begin
  inherited Create(aOwner);
  DrawForm:=TForm.Create(form1);
  DrawForm.Color:=clWhite;
  DrawForm.BorderIcons:=[];
  DrawForm.BorderStyle:=bsNone;
  Canvas:=DrawForm.Canvas;
  Canvas.Brush.Style:=bsClear;
  DrawForm.OnMouseDown:=DoMouseDown;
  DrawForm.OnMouseMove:=DoMouseMove;
  DrawForm.OnMouseUp:=DoMouseUp;
  DrawForm.OnPaint:=DoPaint;
  DrawForm.Left:=5;
  DrawForm.Top:=90;
  DrawForm.Height:=575;
  DrawForm.Width:=760;
  DrawForm.Parent:=Form1;
  DrawForm.Visible:=true;
end;

Теперь для обновления вложенного окошка, по-идее, должна работать процедура:
Код

  Drawing.DrawForm.Repaint;

Однако обновления не происходит. Не могу понять в чём дело. То ли я дурак, то ли лыжи не едут.
Извращался по-всякому: пробовал и Invalidate+Update, и через сообщения (Drawing.DrawForm.Perform(WM_PAINT,0,0);  Drawing.DrawForm.Perform(WM_ERASEBKGND,0,0);), и через API (UpdateWindow(Drawing.DrawForm.Handle);), и во всех мыслимых и немыслимых комбинациях; и обработчики событий подменял (Paint, OnPaint). Ни фига. Такое чувство, что процедура Invalidate работает не так, как надо. Если делать Hide, а потом Show, то всё обновляется, только происходит зацикливание и наблюдается весёленькое такое мерцание.

Что такое это может быть? Чё ей надо, блин?

На счёт мерцания при перерисовке. В моём любимом Delphi 3 свойство DoubleBuffered в объекте TForm присутствует, и при создании формы по-умолчанию устанавливается в False, а вот поменять его он не даёт (пишет, что идентификатор не описан, т.е. в классе TForm его нет). Странно как-то. Видимо, в более поздних дельфях такой проблемы нет, но ставить другую версию из-за такой мелочи я не буду. Есть такое чувство, что всё дело в библиотечке forms.dcu, и что что-то можно намутить с этим, и тогда, может быть, всё заработает. Мне бы хоть одним глазком глянуть, какой от этого будет эффект, и на сколько вырастет загрузка процессора. Думается, что раза в два. Если будет круто тормозить, то уж лучше пусть иногда мерцает, чем будет тормозить. Вот, например, в AutoCAD-е ничего не мерцает и при этом не тормозит, и сделано явно не через двойной буфер. Так что есть и другие способы, которые можно попробовать.
PM MAIL   Вверх
ilya_z
Дата 8.3.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.1.2007
Где: Екатеринбург

Репутация: нет
Всего: нет



Ничего понять не могу. Ситуация прямо обхохочешься.
Создал уже простейший пример. Всё точно также, как и делалось до этого:
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

  TDr = class(TComponent)
    Form2:TForm;
  private
  public
    constructor Create(aOwner:TComponent); override;
  published
        procedure DoMM(Sender:TObject;Shift:TShiftState;X,Y:Integer);
  end;

var
  Form1:TForm1;
  DR:TDr;

implementation

{$R *.DFM}

procedure TDr.DoMM(Sender:TObject;Shift:TShiftState;X,Y:Integer);
begin
    DR.form2.Repaint;
    DR.form2.Canvas.Ellipse(X-10,Y-10,X+10,Y+10);
end;

procedure TForm1.FormCreate(Sender:TObject);
begin
    DR:=TDr.Create(self);
end;

constructor TDr.Create(aOwner:TComponent);
begin
  inherited Create(aOwner);
    form2:=TForm.Create(self);
  form2.Width:=300;
  form2.Height:=300;
  form2.Color:=clRed;
  form2.OnMouseMove:=DoMM;
  form2.Parent:=form1;
  form2.Visible:=true;
end;

end.


А самое смешное то, что всё в этом примере работает как надо, и никаких проблем нет. С ума можно сойти. Уже не знаю что и думать.
PM MAIL   Вверх
ilya_z
Дата 8.3.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.1.2007
Где: Екатеринбург

Репутация: нет
Всего: нет



УРА!!!

Нашёл, где собака порылась.
Убираю строчку:
Код

  Drawing.DrawForm.ControlStyle:=ControlStyle+[csOpaque];

- и усё работает.

Долбанная прозрачность. Целых два дня мне мозги компостировала.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.