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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2012, 04:29   #1
vova65
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 48
По умолчанию Canvas в новом компоненте

Здравствуйте!
при создании нового компонента возникла проблема в:
Код:
constructor TDiv_H.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TCanvas.Create;
  FCanvas.Brush.Color := clFuchsia;
  FCanvas.Rectangle(0,0,10,10);
  Width := 50;
  Height := 50;
  FMEStatus:=false;
end;
на строке:
Код:
FCanvas.Rectangle(0,0,10,10);
выскакивает ошибка "canvas does not allow drawing".
подскажите пожалуйста где я напартачил?
vova65 вне форума Ответить с цитированием
Старый 02.06.2012, 16:00   #2
vova65
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 48
По умолчанию

вот весь код:
Код:
unit Div_H;

interface

uses
  SysUtils, Classes, Controls, Graphics, StdCtrls, Messages;

type TNotifyEvent = procedure (Sender: TObject) of object;
type
  TDiv_H = class(TGraphicControl)
  private
    { Private declarations }
    FOnMouseOver: TNotifyEvent;
    FOnMouseOut: TNotifyEvent;
    FOnMouseLDown: TNotifyEvent;
    FOnMouseRDown: TNotifyEvent;
    FOnMouseLUp: TNotifyEvent;
    FOnMouseRUp: TNotifyEvent;
    FCanvas: TCanvas;
    FMEStatus: Boolean;
    procedure CMMouseLeave(var msg:TMessage); message cm_mouseleave;
    procedure CMMouseEnter(var msg:TMessage); message cm_mouseenter;
    procedure WMLD(var msg:TMessage); message  WM_LBUTTONDOWN;
    procedure WMRD(var msg:TMessage); message  WM_RBUTTONDOWN;
    procedure WMLU(var msg:TMessage); message  WM_LBUTTONUP;
    procedure WMRU(var msg:TMessage); message  WM_RBUTTONUP;
  protected
    { Protected declarations }
  public
    { Public declarations }
  property Canvas: TControlCanvas read FCanvas write FCanvas;
  published
    { Published declarations }
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
  property OnMouseOut: TNotifyEvent read FOnMouseOut write FOnMouseOut;
  property OnMouseOver: TNotifyEvent read FOnMouseOver write FOnMouseOver;
  property OnMouseLDown: TNotifyEvent read FOnMouseLDown write FOnMouseLDown;
  property OnMouseRDown: TNotifyEvent read FOnMouseRDown write FOnMouseRDown;
  property OnMouseLUp: TNotifyEvent read FOnMouseLUp write FOnMouseLUp;
  property OnMouseRUp: TNotifyEvent read FOnMouseRUp write FOnMouseRUp;
end;



procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TDiv_H]);
end;

procedure TDiv_H.CMMouseEnter(var msg: TMessage);
begin
 if not FMEStatus then
 begin
 FMEStatus:=true;
 if Assigned(FOnMouseOver) then FOnMouseOver(Self);
 end;
end;

procedure TDiv_H.CMMouseLeave(var msg: TMessage);
begin
 if FMEStatus then
 begin
 FMEStatus:=false;
 if Assigned(FOnMouseOut) then FOnMouseOut(Self);
 end;
end;




constructor TDiv_H.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas:= TCanvas.Create;
  FCanvas.TextExtent('11');
  Width := 50;
  Height := 50;
  FMEStatus:=false;
end;


destructor TDiv_H.Destroy;
begin

  inherited Destroy;
end;

procedure TDiv_H.WMLD(var msg: TMessage);
begin
if Assigned(FOnMouseLDown) then FOnMouseLDown(Self);
end;

procedure TDiv_H.WMLU(var msg: TMessage);
begin
if Assigned(FOnMouseLUp) then FOnMouseLUp(Self);
end;

procedure TDiv_H.WMRD(var msg: TMessage);
begin
if Assigned(FOnMouseRDown) then FOnMouseRDown(Self);
end;

procedure TDiv_H.WMRU(var msg: TMessage);
begin
if Assigned(FOnMouseRUp) then FOnMouseRUp(Self);
end;

end.
vova65 вне форума Ответить с цитированием
Старый 05.06.2012, 14:40   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
выскакивает ошибка "canvas does not allow drawing".
подскажите пожалуйста где я напартачил?
FCanvas := TCanvas.Create;

на самом деле рисует не ваш компонент, а WindowsAPI. А TCanvas только передает ему данные.

неужели сложно пройти по двум ссылкам в коде
canvas.Rectange -->
Код:
procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
  NeededState: TCanvasState;
begin
  NeededState := ReqState - State;
  if NeededState <> [] then
  begin
    if csHandleValid in NeededState then
    begin
      CreateHandle;
      if FHandle = 0 then
        raise EInvalidOperation.CreateRes(@SNoCanvasHandle);
    end;
    if csFontValid in NeededState then CreateFont;
    if csPenValid in NeededState then CreatePen;
    if csBrushValid in NeededState then CreateBrush;
    State := State + NeededState;
  end;
end;
TDiv_H = class(TGraphicControl)
private
{ Private declarations }
FOnMouseOver: TNotifyEvent;
FOnMouseOut: TNotifyEvent;
FOnMouseLDown: TNotifyEvent;
FOnMouseRDown: TNotifyEvent;
FOnMouseLUp: TNotifyEvent;
FOnMouseRUp: TNotifyEvent;
FCanvas: TCanvas;

TGraficControl уже имеет свой объект (и свойство) Canvas правильно инициализированное им и надо пользоваться! А не создавать свои без веских на то причин!
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.06.2012 в 14:43.
evg_m вне форума Ответить с цитированием
Старый 08.06.2012, 19:21   #4
vova65
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 48
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
FCanvas := TCanvas.Create;

на самом деле рисует не ваш компонент, а WindowsAPI. А TCanvas только передает ему данные.

неужели сложно пройти по двум ссылкам в коде
canvas.Rectange -->
Код:
procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
  NeededState: TCanvasState;
begin
  NeededState := ReqState - State;
  if NeededState <> [] then
  begin
    if csHandleValid in NeededState then
    begin
      CreateHandle;
      if FHandle = 0 then
        raise EInvalidOperation.CreateRes(@SNoCanvasHandle);
    end;
    if csFontValid in NeededState then CreateFont;
    if csPenValid in NeededState then CreatePen;
    if csBrushValid in NeededState then CreateBrush;
    State := State + NeededState;
  end;
end;
TDiv_H = class(TGraphicControl)
private
{ Private declarations }
FOnMouseOver: TNotifyEvent;
FOnMouseOut: TNotifyEvent;
FOnMouseLDown: TNotifyEvent;
FOnMouseRDown: TNotifyEvent;
FOnMouseLUp: TNotifyEvent;
FOnMouseRUp: TNotifyEvent;
FCanvas: TCanvas;

TGraficControl уже имеет свой объект (и свойство) Canvas правильно инициализированное им и надо пользоваться! А не создавать свои без веских на то причин!
Спасибо! Просто у меня небольшой опыт программирования в delphi...

У меня походу возник новый вопрос.. Где можно найти исходники класса TBitmap?
vova65 вне форума Ответить с цитированием
Старый 08.06.2012, 19:32   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Где можно найти исходники класса TBitmap?
Там же где и все остальные исходники Delphi.
Programs Files/Delphi/Source....
или так
1. пишем var x: TBitmap;
2. наводим мышку на Tbitmap;
3. нажимаем Ctrl + Left Mouse
и вот они исходники!
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 08.06.2012, 19:52   #6
vova65
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 48
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Там же где и все остальные исходники Delphi.
Programs Files/Delphi/Source....
или так
1. пишем var x: TBitmap;
2. наводим мышку на Tbitmap;
3. нажимаем Ctrl + Left Mouse
и вот они исходники!
Спасибо!!!
vova65 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ячейка в новом окне mitiay БД в Delphi 7 16.01.2011 17:51
Открытие в новом окне Kapitann JavaScript, Ajax 2 07.08.2010 13:43
Потребность в новом свойстве Djem1991 Общие вопросы Delphi 7 27.06.2009 18:39
в новом окне jone Общие вопросы Delphi 1 05.10.2008 12:25
Canvas в компоненте ListBox Миша Общие вопросы Delphi 3 24.09.2007 20:38