Recent

Author Topic: Component attribute values  (Read 2129 times)

Birger52

  • Sr. Member
  • ****
  • Posts: 309
Component attribute values
« on: November 03, 2019, 04:05:15 pm »
Trying to create a new component from TPanel
Code: Pascal  [Select][+][-]
  1.   TThumbContainer = class(TPanel)
  2.   private
  3.     FSetColumns : integer;       //  Ønsket antal søjler
  4.     FSetRatio : real;            //  Forhold mellem længde/bredde af de viste thumbnails. Bemærk at dette gælder det panel der viser billedet - ikke billedet selv
  5.     FInnerMargin : integer;      //  Mindste margin fra container til billedpaneler
  6.     FVMargin : integer;          //  Beregnet vandret margin efter paldsen til rådighed
  7.     FHMargin : integer;          //  Beregnet lodret margin efter paldsen til rådighed
  8.     FDistance : integer;         //  Afstand mellem billeder - både lodret og vandret
  9.     FMinImgMargin : integer;     //  Mindste afstand fra billede til billedepanel - vandret eller lodret, afhængig af billedet dimensioner
  10.     FThumbWidth : integer;       //  Bredden på panel der indeholder bevel og billede
  11.     FThumbHeight : integer;      //  Højden på panel der indeholder bevel og billede
  12.     FBvSize : integer;           //  størrelsen på bevels
  13.     FScroller : TScrollBar;
  14.     procedure SetColumns(aColAnt : integer);
  15.     procedure SetRatio(aRatio : real); // højde ifht bredde
  16.     procedure RecalcThumbDim;
  17.     procedure ClearThumbs;
  18.     procedure DrawThumbs;
  19.   protected
  20.     procedure DoOnResize; override;
  21.   public
  22.     constructor Create(aOwner:TComponent); override;
  23.     procedure AfterConstruction; override;
  24.     destructor Destroy; override;
  25.   published
  26.     property Columns : integer read FSetColumns write SetColumns default 5;
  27.     property Ratio : real read FSetRatio write SetRatio;
  28.     property InnerMargin : integer read FInnerMargin write FInnerMargin default 5;
  29.     property ImgDist : integer read FDistance write FDistance default 3;
  30.     property ImgMargin : integer read FMinImgMargin write FMinImgMargin default 2;
  31.   end;
and it's working just fine - except it doesn't use the values set at designtime.
New Control is compiles with no errors, and is installed in Lazarus, placed from palette at designtime.

BevelInner is set to bvLowered (Outer is bvRaised by default).
Integers InnerMargin, ImgDist, ImgMargin show up in Object inspectors as 0'es ignoring the default values - I can change them to any value I want, but when the program is run, the 0'ers are used -ignoring defaults and ignoring settings in Object inspector...
Same thing with BevelInner - I set it to bvLowered, and that is what it is in designer and how it is actually drawn in designer - when program runs, it is bvNone when asked (calulating the width of the combined bevel) - but it is drawn lowered...
The real (can have no default calue?) Ratio => FSetRatio, has not been put to use nor tested..

What am I doing wrong?

Lazarus 2.0.8 FPC 3.0.4
Win7 64bit
Playing and learning - strictly for my own pleasure.

howardpc

  • Hero Member
  • *****
  • Posts: 4144
Re: Component attribute values
« Reply #1 on: November 03, 2019, 05:26:23 pm »
In

Code: Pascal  [Select][+][-]
  1. property InnerMargin : integer read FInnerMargin write FInnerMargin default 5;
and similar property declarations the "default" merely tells users of your component what they can expect the property's default value to be.
You as component writer have to set that value of FInnerMargin in your overridden constructor.

Did you remember to do that?

Birger52

  • Sr. Member
  • ****
  • Posts: 309
Re: Component attribute values
« Reply #2 on: November 03, 2019, 10:20:04 pm »
Nope - didn't know. Thx ;)

Still - values turns up as zeroes, so it should be in the lfm file, if not changed (as value is saved, if it is not default value - and 0 is not default) - and they aren't.
It doesn't explain why BevelInner is bvNone when asked, but is drawn bvLowered (as it is set to) when drawn.
Lazarus 2.0.8 FPC 3.0.4
Win7 64bit
Playing and learning - strictly for my own pleasure.

howardpc

  • Hero Member
  • *****
  • Posts: 4144
Re: Component attribute values
« Reply #3 on: November 04, 2019, 12:06:07 am »
You don't show your implementation. But something is amiss.
This simple component (with most of its guts missing)
Code: Pascal  [Select][+][-]
  1. unit ThumbContainer;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, Controls, StdCtrls, ExtCtrls;
  9.  
  10. type
  11.  
  12. TThumbContainer = class(TPanel)
  13. private
  14.   FSetColumns : integer;       //  Ønsket antal søjler
  15.   FSetRatio : real;            //  Forhold mellem længde/bredde af de viste thumbnails. Bemærk at dette gælder det panel der viser billedet - ikke billedet selv
  16.   FInnerMargin : integer;      //  Mindste margin fra container til billedpaneler
  17.   FVMargin : integer;          //  Beregnet vandret margin efter paldsen til rådighed
  18.   FHMargin : integer;          //  Beregnet lodret margin efter paldsen til rådighed
  19.   FDistance : integer;         //  Afstand mellem billeder - både lodret og vandret
  20.   FMinImgMargin : integer;     //  Mindste afstand fra billede til billedepanel - vandret eller lodret, afhængig af billedet dimensioner
  21.   FThumbWidth : integer;       //  Bredden på panel der indeholder bevel og billede
  22.   FThumbHeight : integer;      //  Højden på panel der indeholder bevel og billede
  23.   FBvSize : integer;           //  størrelsen på bevels
  24.   FScroller : TScrollBar;
  25.   procedure SetColumns(aColAnt : integer);
  26.   procedure SetRatio(aRatio : real); // højde ifht bredde
  27.   procedure RecalcThumbDim;
  28.   procedure ClearThumbs;
  29.   procedure DrawThumbs;
  30. protected
  31.   procedure DoOnResize; override;
  32. public
  33.   constructor Create(aOwner:TComponent); override;
  34.   procedure AfterConstruction; override;
  35.   destructor Destroy; override;
  36. published
  37.   property Columns : integer read FSetColumns write SetColumns default 5;
  38.   property Ratio : real read FSetRatio write SetRatio;
  39.   property InnerMargin : integer read FInnerMargin write FInnerMargin default 5;
  40.   property ImgDist : integer read FDistance write FDistance default 3;
  41.   property ImgMargin : integer read FMinImgMargin write FMinImgMargin default 2;
  42. end;
  43.  
  44. procedure Register;
  45.  
  46. implementation
  47.  
  48. procedure Register;
  49. begin
  50.   RegisterComponents('Standard',[TThumbContainer]);
  51. end;
  52.  
  53. { TThumbContainer }
  54.  
  55. procedure TThumbContainer.SetColumns(aColAnt: integer);
  56. begin
  57.  
  58. end;
  59.  
  60. procedure TThumbContainer.SetRatio(aRatio: real);
  61. begin
  62.  
  63. end;
  64.  
  65. procedure TThumbContainer.RecalcThumbDim;
  66. begin
  67.  
  68. end;
  69.  
  70. procedure TThumbContainer.ClearThumbs;
  71. begin
  72.  
  73. end;
  74.  
  75. procedure TThumbContainer.DrawThumbs;
  76. begin
  77.  
  78. end;
  79.  
  80. procedure TThumbContainer.DoOnResize;
  81. begin
  82.   inherited DoOnResize;
  83. end;
  84.  
  85. constructor TThumbContainer.Create(aOwner: TComponent);
  86. begin
  87.   inherited Create(aOwner);
  88.   FSetColumns := 5;
  89.   FInnerMargin := 5;
  90.   FDistance := 3;
  91.   FMinImgMargin := 2;
  92.   BevelInner := bvLowered;
  93. end;
  94.  
  95. procedure TThumbContainer.AfterConstruction;
  96. begin
  97.   inherited AfterConstruction;
  98. end;
  99.  
  100. destructor TThumbContainer.Destroy;
  101. begin
  102.   inherited Destroy;
  103. end;
  104.  
  105. end.
when tested with this test application (dropping a TThumbContainer on the main form)
Code: Pascal  [Select][+][-]
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Forms, StdCtrls, ThumbContainer;
  9.  
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     Memo1: TMemo;
  16.     ThumbContainer1: TThumbContainer;
  17.     procedure FormCreate(Sender: TObject);
  18.   end;
  19.  
  20. var
  21.   Form1: TForm1;
  22.  
  23. implementation
  24.  
  25. {$R *.lfm}
  26.  
  27. { TForm1 }
  28.  
  29. procedure TForm1.FormCreate(Sender: TObject);
  30. var
  31.   bi: String;
  32. begin
  33.   WriteStr(bi, ThumbContainer1.BevelInner);
  34.   with Memo1, ThumbContainer1 do
  35.     Lines.Add('%s'#10'Columns: %d'#10'InnerMargin: %d'#10'ImgDist: %d'#10'ImgMargin: %d'#10'%s',
  36.              [Name, Columns, InnerMargin, ImgDist, ImgMargin, bi]);
  37. end;
  38.  
  39. end.
gives a main form shown in the attached image, which clearly shows the default values are assigned correctly and saved in the .lfm


Birger52

  • Sr. Member
  • ****
  • Posts: 309
Re: Component attribute values
« Reply #4 on: November 04, 2019, 04:24:17 pm »
For one, I was missing the initialization of default values.

Next, I was using values of fields and vars in AfterConstruction procedure, which I figured was called after construction.
But it is apparently called before values are set to fields and variables.
Moved some calculation - eg. the total size of bevels - to Loaded - which makes a whole lot of difference.

Lazarus 2.0.8 FPC 3.0.4
Win7 64bit
Playing and learning - strictly for my own pleasure.

howardpc

  • Hero Member
  • *****
  • Posts: 4144
Re: Component attribute values
« Reply #5 on: November 04, 2019, 05:00:26 pm »
BTW, it would be better to use Single for float fields (or Double or Extended if you need extreme precision) rather than Real, which is a legacy format, and might be deprecated in the future.

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: Component attribute values
« Reply #6 on: November 04, 2019, 05:26:43 pm »
BTW, it would be better to use Single for float fields (or Double or Extended if you need extreme precision) rather than Real, which is a legacy format, and might be deprecated in the future.

According to the Reference Guide Real is mapped to either Single or Double (depending on the platform).

Quote from: Free Pascal Reference Guide (Section 3.1.2)
Free Pascal uses the math coprocessor (or emulation) for all its floating-point calculations. The Real native type is processor dependent, but it is either Single or Double. Only the IEEE floating point types are supported, and these depend on the target processor and emulation options.

IIRC the legacy, TP-compatible type is called Real48.
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

marcov

  • Administrator
  • Hero Member
  • *
  • Posts: 11383
  • FPC developer.
Re: Component attribute values
« Reply #7 on: November 04, 2019, 06:14:23 pm »
BTW, it would be better to use Single for float fields (or Double or Extended if you need extreme precision) rather than Real, which is a legacy format, and might be deprecated in the future.

According to the Reference Guide Real is mapped to either Single or Double (depending on the platform).

Yes, so basically "Real" is like "integer", an alias for the typical floating point type. C uses "float" for it.

Quote
IIRC the legacy, TP-compatible type is called Real48.

Yes and no, afaik TP just called it  "real", it is Delphi (TPW?) that called it real48 to set it apart from copro "real" and to make import programs for it.

FPC came only later and defaulted to copro from the start (well, at least as long as I can remember, which is late 1996). In that time, even most major TP codebases were in the $N state, since nearly everybody had CPUs that could do that.

winni

  • Hero Member
  • *****
  • Posts: 3197
Re: Component attribute values
« Reply #8 on: November 04, 2019, 07:29:38 pm »
Hi!

The Intel  80386 was the last Intel proc without floating point unit. But a lot of people plugged a FPU-CoPro into their mainboards.

In 1989 the 80486 was delivered and was the first one with a FPU on the proc and dominated for the next 5 years the market.

Winni
 

marcov

  • Administrator
  • Hero Member
  • *
  • Posts: 11383
  • FPC developer.
Re: Component attribute values
« Reply #9 on: November 04, 2019, 08:52:56 pm »
Hi!

The Intel  80386 was the last Intel proc without floating point unit. But a lot of people plugged a FPU-CoPro into their mainboards.

In 1989 the 80486 was delivered and was the first one with a FPU on the proc and dominated for the next 5 years the market.

https://en.wikipedia.org/wiki/Intel_80486SX

winni

  • Hero Member
  • *****
  • Posts: 3197
Re: Component attribute values
« Reply #10 on: November 04, 2019, 09:04:41 pm »
No one wanted the SX. The computer magazines were full of news that it was a fraud.Forget it.

 

TinyPortal © 2005-2018