-
Здравствуйте. У меня возникла проблема с заданием значения свойства. Если задать его начальное значение в конструкторе например 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 17:22)
Если у Вас не было желания или времени:
- отформатировать код так, чтобы он был читабельным; - выделить из кода только то, что действительно относится к проблеме
то почему Вы думаете, что такое желание и время найдутся у других?
-
Если бы я знал, что именно относится к проблеме я бы вопрос не задавал!
-
> [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]. Я приведенный тобой код даже и не смотрел, да и мало кто будет разбираться в такой каше...
> Если бы я знал, что именно относится к проблеме я бы вопрос не задавал!
> Код абсолютно левый:
Ну в таком случае покажи не "левый"...
-
1. Для свойств типа Double директива default неприменима. Если есть необходимость в дефолном значении такого свойства, то надо использовать директиву stored <функция>. Подробности см. в справке.
2. Вот это непонятно: "при попытке установить 0 оно почему-то устанавливается в 10". Такого быть не должно. Показывайте код. Только реальный, а не левый.
-
Суть такая: Имеется свойство объявленное следующим образом: 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. Суть такова.
-
Т.е. в инспеккторе оно меняется нормально, но после запуска заново выставляется в 10
-
Он именно почему-то 0 выставлять не хочет. Любые другие значения- запросто!
-
-
Да, похоже это именно то, что мне нужно.Спасибо всем огромное!
|