Конференция "Компоненты" » Проблема с установкой нулевого значени свойства типа double [D7, WinXP]
 
  • Женька (20.06.07 17:22) [0]
    Здравствуйте.
    У меня возникла проблема с заданием значения свойства. Если задать его начальное значение в конструкторе например 10, то при  попытке установить 0 оно почему-то устанавливается в 10.Привожу пример демо-кода с аналогичной фигней. Код абсолютно левый:
    unit Fignya;

    interface

    uses
     SysUtils, Classes, Controls,graphics,windows,messages,dialogs;

    type
     TFignya = class(TCustomControl)
     private
     r:Integer;
     col:TCOLOR;
     x:double;

       { Private declarations }
     protected
     procedure SetR(v:integer);
     procedure SetX(v:double);
      procedure WMLButtonDown(var Message:TWMMouse);Message WM_LBUTTONDOWN;
     // procedure WMMouseButtonDown(var Message:TWMMButtonDown);message WM_LBUTTONDOWN;

       { Protected declarations }
     public
       { Public declarations }
       procedure Paint;override;
       constructor Create(AOwner:TComponent);override;
       procedure AFterConstruction;override;
     property Canvas;
     procedure CreateParams(var Params:TCreateParams);override;
     published
     property Radius:integer read r write SetR default 100;
     property XX:double read X write SetX;
       { Published declarations }
     end;

    procedure Register;

    implementation
    procedure TFignya.CreateParams(var Params:TCreateParams);
    begin
    inherited;
    //params.Style:=WS_CHILD+WS_CLIPCHILDREN+WS_CLIPSIBLINGS;
    Params.ExStyle:=Params.ExStyle;
    end;
    procedure Register;
    begin
     RegisterComponents('Fignya', [TFignya]);
    end;
    procedure TFignya.SetR(v:integer);
    begin
    if v<>R then begin
    r:=v;
    Paint;
    end;
    end;
    procedure TFignya.SetX(v:double);
    begin
    if X<>v then begin
    X:=v;
    ShowMessage(floattostr(x));
    //if v=0 then x:=1E-10;
    end;
    end;
    constructor TFignya.Create(AOwner:TComponent);
    begin
     inherited;
    //ControlStyle:=ControlStyle;
    Width:=200;
    Height:=200;
    r:=100;
    COL:=0;
    //X:=10;
    Visible:=true;

    end;
    Procedure TFignya.AFterConstruction;
    begin
    inherited;
    Invalidate;
    end;
    procedure TFignya.Paint;
    var
    rr:HRGN;
    I:INTEGER;
    rrr:trect;
    rrr1:trect;
    begin
    //inherited;
    //rr:=CreateEllipticRgn(0,0,width,height);
    ///SetWindowRgn(handle,rr,true);
    //Canvas.Brush.Color:=clBTnFace;

    rrr:=rect(0,0,width,height);
    rrr1:=rect(10,10,width-10,height-40);
    Canvas.Brush.Style:=bsSolid;
    Canvas.FillRect(Rect(0,0,Width,Height));
    Canvas.Brush.Color:=COL;
    //Canvas.Ellipse(r,r,width-r,height-r);
    Canvas.Brush.Color:=clGreen;
    canvas.Brush.Color:=clRed;
    DrawEdge(Canvas.Handle,rrr,BDR_RAISEDINNER +BDR_RAISEDOUTER,BF_RECT);
    DrawEdge(Canvas.Handle,rrr1,BDR_SUNKENINNER+BDR_SUNKENOUTER,BF_RECT or BF_MIDDLE or BF_ADJUST);

    {FOR I:=0 TO ControlCount-1 DO cONTROLS[I].Invalidate;}
    end;
    procedure TFignya.WMLButtonDown;
    begin
    //bEEP(100,100);
    //inherited;
    ShowMessage(floattostr(X));
    COL:=COL+10;
    Invalidate;
    end;

    end. Если кто-нить сталкивался с такой проблемой подскажите плиз! Заранее благодарю.
  • Юрий Зотов © (20.06.07 20:44) [1]
    > Женька   (20.06.07 17:22)

    Если у Вас не было желания или времени:

    - отформатировать код так, чтобы он был читабельным;
    - выделить из кода только то, что действительно относится к проблеме

    то почему Вы думаете, что такое желание и время найдутся у других?
  • Женька (20.06.07 21:32) [2]
    Если бы я знал, что именно относится к проблеме я бы вопрос не задавал!
  • {RASkov} © (20.06.07 22:06) [3]
    > [2] Женька   (20.06.07 21:32)

    TMyClass = class
     FDoub: Double;
    public
     constructor Create;
    published
     property Doub: Double read FDoub set FDoub default = 0;
    end;

    construktor TMyClass.Create;
    begin
     ....
     FDoub:=0;
    end;
    Только так смысла нет делать по умолчанию и так ноль будет..
    Деректива default не устанавыливает свойство в значение которое указано за этой дерективой... оно лишь указывает ОИ , что в кострукторе стоит явное присвоение переменной свойству значения, которое стоит за дерективой default - и это на совести программиста. Т.е. если он указал дерективу default, то он и должен сделать это же присвоение и в конструкторе.
    А вообще перечитай еще раз внимательно [1]. Я приведенный тобой код даже и не смотрел, да и мало кто будет разбираться в такой каше...

    > Если бы я знал, что именно относится к проблеме я бы вопрос не задавал!

    > Код абсолютно левый:

    Ну в таком случае покажи не "левый"...
  • Юрий Зотов © (20.06.07 22:34) [4]
    1. Для свойств типа Double директива default неприменима. Если есть необходимость в дефолном значении такого свойства, то надо использовать директиву stored <функция>. Подробности см. в справке.

    2. Вот это непонятно: "при  попытке установить 0 оно почему-то устанавливается в 10". Такого быть не должно. Показывайте код. Только реальный, а не левый.
  • Женька (20.06.07 22:43) [5]
    Суть такая:
    Имеется свойство объявленное следующим образом:
    property SignalSettings:TSignalSettings read FSignalSettings write SetSignalSettings;, где TSignalSettings  :
    TSignalSettings = class(TPersistent)
    private
     fValueFrom: double;
     FValueTo:double;
     FDigitFrom:integer;
     FDigitTo:integer;
     FFormatString:string;
     FValueFromChanged:TNotifyEvent;
     FValueToChanged:TNotifyEvent;
     FDigitFromChanged:TNotifyEvent;
     FDigitToChanged:TNotifyEvent;
     FFormatStringChanged:TNotifyEvent;
    protected
     procedure ValueFromChanged;dynamic;
     procedure ValueToChanged;dynamic;
     procedure DigitFromChanged;dynamic;
     procedure DigitToChanged;dynamic;
     procedure FormatStringChanged;dynamic;
     procedure SetValueFrom(v:double);
     procedure SetValueTo(v:double);
     procedure SetDigitFrom(v:integer);
     procedure SetDigitTo(v:integer);
     procedure SetFormatString(s:string);
    public
     constructor Create;
    published
      property DigitFrom: integer read FDigitFrom write SetDigitFrom default 0;
      property DigitTo: integer read FDigitTo write SetDigitTo default 10;
      property ValueFrom: double read fValueFrom write SetValueFrom;
      property ValueTo: double read fValueTo write SetValueTo;
      property ValueFormat:string read FFormatString write SetFormatString;
      property OnValueFromChanged:TNotifyEvent read FValueFromChanged write FValueFromChanged;
      property OnValueToChanged:TNotifyEvent read FValueToChanged write FValueToChanged;
      property OnDigitFromChanged:TNotifyEvent read FDigitFromChanged write FDigitFromChanged;
      property OnDigitToChanged:TNotifyEvent read FDigitToChanged write FDigitToChanged;
      property OnFormatStringChanged:TNotifyEvent read FFormatStringChanged write FFormatStringChanged;
    end;
    Все свойства имееют стандартные методы Set типа:
    procedure TSignalSettings.SetValueTo(v:double);
    begin
    if (v<>fValueTo) then begin
    fValueTo:=v;
    ValueToChanged;
    end;
    end;
    В конструкторе TSignalSettings задаются начальные значения полей:
    constructor TSignalSettings.Create;
    begin
    FDigitFrom:=0;
    FDigitTo:=10;
    fValueFrom:=0;
    FValueTo:=10;
    FFormatString:='0.00';
    end;
    Далее имеется конструктор основного класса, где создается FSignalSettings
    FSignalSettings:=TSignalSettings.Create;
    Проблема в том, что если изменить в испекторе свойство ValueTo на 0, то оно почему-то останется равным 10. Суть такова.
  • Женька (20.06.07 22:43) [6]
    Т.е. в инспеккторе оно меняется нормально, но после запуска заново выставляется в 10
  • Женька (20.06.07 22:49) [7]
    Он именно почему-то 0 выставлять не хочет. Любые другие значения- запросто!
  • {RASkov} © (20.06.07 23:01) [8]
  • Женька (20.06.07 23:08) [9]
    Да, похоже это именно то, что мне нужно.Спасибо всем огромное!
 
Конференция "Компоненты" » Проблема с установкой нулевого значени свойства типа double [D7, WinXP]
Есть новые Нет новых   [134427   +38][b:0][p:0]