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


Автор: FShadow 11.4.2008, 20:10
Народ помогите. Вопрос простой. но тем не менее.  Есть к примеру такой компонент.
Код

type
  TMyComp = class (TGraphicControl)
  protected
    FBorderWidth: integer;
    procedure SetBorderWidth(const Value: integer);
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property BorderWidth: integer
        read FBorderWidth
        write SetBorderWidth default 1;
  end;

implementation

{ TMyComp }

constructor TMyComp .Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csOpaque];
  FBorderWidth := 1;
  Width := 100;
  Height := 100;
end;

procedure TMyComp .Paint;
var
  DrawRct: TRect;
begin
  DrawRct := ClientRect;
  Canvas.Pen.Width := FBorderWidth;
  Canvas.Rectangle(Left, Top, Width, Height);
end;

procedure TMyComp .SetBorderWidth(const Value: integer);
begin
  if Value <> FBorderWidth then
    FBorderWidth := Value;
  Invalidate;
end;
end.

При вызове его в осн программе и изменении его свойства BorderWidth по нажатию кнопки должна меняться толщина границы но ничего не происходит. В чем дело?
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  fValue: integer;
begin
  inc(fValue);
  Chart.BorderWidth := fValue;
end;



Автор: MetalFan 11.4.2008, 20:35
неинициализированные локальные переменные - зло!

Автор: FShadow 11.4.2008, 20:51
Цитата

неинициализированные локальные переменные - зло! 

можно по конкретнее??
Может я не корректно здесь fValue описал будем считать что я объявил ее глобально.
Все равно если я даже напишу по нажатию кнопки ничего не меняется
Код

  Chart.BorderWidth := 20;

Автор: Kaboom 11.4.2008, 22:56
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  fValue: integer;
begin
  inc(fValue);
  Chart.BorderWidth := fValue;
end;


Как ты думаешь, чему равно fValue? А если до этого прибавить единицу, что выйдет?

Автор: ivan219 12.4.2008, 00:11
Создавал динамически? а про парент забыл smile My.Parent := Self;
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TMyComp = class (TGraphicControl)
  protected
    FBorderWidth: integer;
    procedure SetBorderWidth(const Value: integer);
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property BorderWidth: integer read FBorderWidth write SetBorderWidth default 1;
  end;

var
  Form1: TForm1;
  My: TMyComp;
  A: Integer;

implementation

{$R *.dfm}
{ TMyComp }

constructor TMyComp .Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FBorderWidth := 1;
  Width := 100;
  Height := 100;
end;

procedure TMyComp .Paint;
var
  DrawRct: TRect;
begin
  DrawRct := ClientRect;
  Canvas.Pen.Color := clBlack;
  Canvas.Pen.Width := FBorderWidth;
  Canvas.Brush.Color := clWhite;
  Canvas.Rectangle(Left, Top, Width, Height);
end;

procedure TMyComp .SetBorderWidth(const Value: integer);
begin
  if Value <> FBorderWidth then
    FBorderWidth := Value;
  Invalidate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Inc(A);
 My.BorderWidth := A;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 My := TMyComp.Create(Self);
 My.Parent := Self;
 My.Left := 0;
 My.Top := 0;
 My.Width := 100;
 My.Height := 100;
end;

end.

 smile 

Автор: Poseidon 14.4.2008, 09:12
Цитата(Kaboom @  11.4.2008,  22:56 Найти цитируемый пост)
Как ты думаешь, чему равно fValue?
По дефолту целочисленные переменные равны нулю. Так что все там нормально, хоть и не рекомендуется так делать smile

Автор: MetalFan 14.4.2008, 10:54
Цитата(Poseidon @  14.4.2008,  09:12 Найти цитируемый пост)
По дефолту целочисленные переменные равны нулю. Так что все там нормально, хоть и не рекомендуется так делать smile

Локальные переменные не инициализируются нулями. они могут иметь совершенное непредсказуемое значение.
не путай с полями класса.

Автор: Kaboom 14.4.2008, 14:08
Код

По дефолту целочисленные переменные равны нулю.


Я тоже так думал, пока не пришлось искать ошибку smile 

Автор: Alexeis 15.4.2008, 10:00
  Стековые переменные не инициализируются, компилятор вставляет код, который сдвигает указатель стека на нужный размер и эта память становиться памятью переменных. Правда сейчас для новых рекордов еще должен вызываться конструктор.

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