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

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

Ламерский вопрос про создание своих компонентов


GGWIN ©   (2002-10-21 18:53:00) 

Имеется следующее как пример.
unit CoolPanel;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, ExtCtrls;

type
TCoolPanel = class(TPanel)
private
FBGImage: TBitmap;
procedure SetBGImage(Value: TBitmap);
{ Private declarations }
protected
procedure WMPaint(var m: TWMPaint); message WM_PAINT;
procedure WMEraseBkgnd(var m: TWMEraseBkgnd); message WM_ERASEBKGND;
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
property BGImage: TBitmap read FBGImage write SetBGImage;
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents("Samples", [TCoolPanel]);
end;

constructor TCoolPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FBGImage := TBitmap.Create;
end;

destructor TCoolPanel.Destroy;
begin
FBGImage.Free;
inherited Destroy;
end;

procedure TCoolPanel.SetBGImage(Value: TBitmap);
begin
if FBGImage <> Value then FBGImage.Assign(Value);
end;

procedure TCoolPanel.WMEraseBkgnd(var m : TWMEraseBkgnd);
begin
m.Result := LRESULT(False);
end;

procedure TCoolPanel.WMPaint(var m: TWMPaint);
var
x, y: Integer;
begin
inherited WMPaint;
y := 0;
while y < Height do
begin
x := 0;
while x < Width do
begin
Canvas.Draw(x, y, BGImage);
x := x + BGImage.Width;
end;
y := y + BGImage.Height;
end;
end;

end.

Вопрос почему при перетаскивании данного компонента на форму все наглухо виснет?


GGWIN   (2002-10-22 20:23:00) [1]

Упссс ...
Вообщем спасибо всем


TTCustomDelphiMaster   (2002-10-22 19:13:00) [2]

спасибо Набережных С.


GGWIN   (2002-10-22 19:00:00) [3]

Это все ботва!!!
Но спасибо вам TTCustomDelphiMasterваш ответ навел меня на правильную мысль.
Итак. Все кому интересно смотрите:
При перетаскивании данной панели на форму - она (панель) сразу-же пытается нарисоваться. А метод прорисовки пытается нарисовать еще не существующее изображение: BGImage.isEmpty (создано, но не заполнено).
И уже из этой причины получается следствие про бесконечный цикл.
Вот.
Всем спасибо!
Коллективный разум победил!


TTCustomDelphiMaster   (2002-10-21 21:32:00) [4]

y := 0;
while y < Height do
begin
x := 0;
while x < Width do
begin
Canvas.Draw(x, y, BGImage);
x := x + 0;
end;
y := y + 0;


GGWIN   (2002-10-21 21:12:00) [5]

В смысле...


Набережных С.   (2002-10-21 20:40:00) [6]

Печально... У тебя цикл бесконечный.


GGWIN   (2002-10-21 20:17:00) [7]

Дык блин!
Перетаскиваешь ты на форму TImage - картинки еще нет.
Затем нажимаешь кнопочку рядом со свойством Picture и ставишь картинку - теперь картинка есть.
Мне нуно то-же самое но для своего компонета!
В чем блин проблема в выше приведенном коде!!!???


TTCustomDelphiMaster   (2002-10-21 20:04:00) [8]

А если картинки нет, то зачем ее рисовать?


GGWIN   (2002-10-21 19:57:00) [9]

А размеры по-моему в данном случае не роляют.
Я же еще картинку не вбахал, а просто создал объект.


GGWIN   (2002-10-21 19:47:00) [10]

В run-time - все пучком. А мне нуно и при разработке!


Набережных С.   (2002-10-21 19:43:00) [11]

У BGImage width = 0, равно как и Height;


TTCustomDelphiMaster   (2002-10-21 19:28:00) [12]

А при создании run-time не виснет?


VaS   (2002-10-21 19:24:00) [13]

вместо inherited WMPaint напиши просто inherited. Больше ошибок не видно вроде...


GGWIN   (2002-10-21 19:15:00) [14]

Bitblt пробовал - та-же фигня.


Ricks   (2002-10-21 18:59:00) [15]

Может из-за Сanvas.Draw? Может оно перерисовывает окно??? Может проще использовать BitBlt (и быстрей)???


Наверх

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