boolean property mit Vorgabewert

Rund um die LCL und andere Komponenten
arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

boolean property mit Vorgabewert

Beitrag von arturx »

Wie kann man bei boolean properties einen Vorgabewert , der nur beim 1.Bearbeiten im Objektinspektor vorliegen soll, sicher zuweisen ?

Der übliche Weg : zuweisen in create und überschreiben lassen beim Loaden funktioniert nicht,
weil Lazarus offenbar annimt, dass der Wert standardmäßig false ist und nur überschreibt, wenn true gestreamt ist.

Beispiel:

Code: Alles auswählen

type tmycomponent = class(tcomponent);
        private
             fblah : boolean;
       published
             property  blah : boolean  read fblah write fblah;
      end;
//.....................
constructor tmycomponent.create(aowner : tcomponent);
        begin inherited create(aowner);
                 blah := true; //Vorgabewert
        end;

Wenn man nun im Objektinspektor blah auf false setzt, wird man trotzdem nach dem nächsten streamen (= loadform) wieder blah=true finden.
Der Wert wird beim Loaden nicht überschrieben. (Auch die Stored Direktive hilft natürlich nicht).
Ideen:
1.Wie kann man feststellen, ob die Komponente schon einmal gestreamt wurde (das könnte man in create nutzen) ?
2.Ein Versuch mit defineproperties misslang auch, weil dann die Eigenschaft doppelt gestreamt wurde
-- Kann man für eine Eigenschaft das Original Streaming unterdrücken ?
Zuletzt geändert von arturx am So 7. Feb 2010, 10:45, insgesamt 2-mal geändert.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: boolean property mit Vorgabewert

Beitrag von _X_ »

Setz die Eigenschaft in Create einfach mal auf True, im OI auf False, und lass dir dann ausgeben, welchem Wert die Eigenschaft dann in Loaded(); von TComponent entspricht.
Loaded(); einfach überschreiben.

Das wird aufgerufen, sobal die Komponente fertig aus der lfm datei geladen wurde, meines Wissen wird Create aber logischerweise vorher ausgeführt.

mfg _X_

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: boolean property mit Vorgabewert

Beitrag von arturx »

genau das habe ich zuerst versucht, siehe Zitat :
" Der übliche Weg : zuweisen in create und überschreiben lassen beim Loaden funktioniert nicht"

Klick einfach mal mal so eine Minikomponente zusammen und probiers aus. Die Wirkung ist überraschend.

Auf alle Fälle aber danke für die schnelle Antwort.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: boolean property mit Vorgabewert

Beitrag von mse »

Code: Alles auswählen

type tmycomponent = class(tcomponent);
        private
             fblah : boolean;
       published
             property  blah : boolean  read fblah write fblah default true; <<<<--------
      end;
//.....................
constructor tmycomponent.create(aowner : tcomponent);
        begin inherited create(aowner);
                 blah := true; //Vorgabewert
        end;

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: boolean property mit Vorgabewert

Beitrag von arturx »

Code: Alles auswählen

property  blah : boolean  read fblah write fblah default true; <<<<--------
Die Idee funktioniert so leider nicht, das Problem kehrt sich nur um : nun hätte ich das Problem bei Blah := false;
(Default sagt der IDE m.E. nur, welcher Wert nicht extra gespeichert werden muss, wenn dieser den Normalfall darstellt)

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: boolean property mit Vorgabewert

Beitrag von mse »

arturx hat geschrieben: Die Idee funktioniert so leider nicht, das Problem kehrt sich nur um : nun hätte ich das Problem bei Blah := false;
(Default sagt der IDE m.E. nur, welcher Wert nicht extra gespeichert werden muss, wenn dieser den Normalfall darstellt)
Default sagt auch TWriter welcher Wert nicht gestreamt sondern in create gesetzt wird. Bei früheren FPC Versionen gab es ein implizites default = false. Ich kann mir kaum vorstellen, dass so eine grundlegende Funktion wie boolean streaming nicht funktionieren soll?

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: boolean property mit Vorgabewert

Beitrag von arturx »

mse hat geschrieben: Ich kann mir kaum vorstellen, dass so eine grundlegende Funktion wie boolean streaming nicht funktionieren soll?
Kann ich mir auch nicht vorstellen, sonst hätte ich es in den Bugtracker geschrieben.
Vielleicht muss ich ja nur irgendeinen Compilerschalter (welchen ?) setzen oder Ähnliches...
schreib doch einfach mal den folgenden code, compilier ihn in ein package und probiers aus :

Code: Alles auswählen

type tmycomp = class(tcomponent)
         private
               fblah : boolean;
         public
              constructor create(aowner : tcomponent); override;
         published
              property blah : boolean read fblah write flah;
          end;
 
constructor tmycomp.create(aowner : tcomponent);
begin fblah := true;
end;
Dann setze im OI blah auf false, schließe Lazarus und schau es Dir wieder an... Mit default kannst Du das Ganze umkehren

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: boolean property mit Vorgabewert

Beitrag von mse »

arturx hat geschrieben: Dann setze im OI blah auf false, schließe Lazarus und schau es Dir wieder an... Mit default kannst Du das Ganze umkehren
Funktioniert bei mir (MSEide+MSEgui).

Code: Alles auswählen

unit test;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
interface
uses
 classes;
type
 ttestcomp = class(tcomponent)
  private
   fbo: boolean;
  public
   constructor create(aowner: tcomponent); override;
  published 
   property bo: boolean read fbo write fbo default true;
 end;
 
implementation
 
{ ttestcomp }
 
constructor ttestcomp.create(aowner: tcomponent);
begin
 fbo:= true;
 inherited;
end;
 
end.
"default true" ist notwendig, falls FPC Version < 2.4 IIRC, sollte aber aus Effizienzgründen immer angegeben werden.
Was steht denn in der lfm-Datei?

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: boolean property mit Vorgabewert

Beitrag von arturx »

funktioniert bei mir auch
Ich melde mich, wenn ich den Unterschied zu meiner ursprünglichen Version gefunden habe und poste ihn.....

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: boolean property mit Vorgabewert

Beitrag von arturx »

Hallo mse ! Vielen Dank !!!
Dein Tip mit default=true funktioniert wirklich anstandslos.
Ich weiß garnicht, warum ich ihn am Anfang nicht nachvollziehen konnte.
Hast Du evt auch eine Idee für die folgende Property (durch die ich ursprünglich auf meine 1. Frage kam) :

Code: Alles auswählen

type tXX  = (nr1,nr2);
type txxSet = set of txx;
// .....
type
 ttestcomp = class(tcomponent)
  private
   fbo: boolean;
   fxxset : txxSet;
  public
   constructor create(aowner: tcomponent); override;
  published
   property bo: boolean read fbo write fbo default true;// das funktioniert jetzt dank "default=true"
   property xx: txxset  read fxxset write fxxset;
 end;
// .......
constructor ttestcomp.create(aowner: tcomponent);
begin
 fbo:= true;
 fxxset:= [Nr1,nr2];
 inherited;
end;
Auch wenn man property xx im OI leert, füllt es sich nach Lazarusstart immerr wieder von allein.
Gibt es auch eine Anweisung, die das verhindert ?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: boolean property mit Vorgabewert

Beitrag von mse »

arturx hat geschrieben: Auch wenn man property xx im OI leert, füllt es sich nach Lazarusstart immerr wieder von allein.
Gibt es auch eine Anweisung, die das verhindert ?
Derselbe Effekt, FPC < 2.4 (IIRC) hat für alle ordinal gespeicherte properties einen impliziten Defaultwert von 0.

Code: Alles auswählen

property xx: txxset  read fxxset write fxxset default [Nr1,nr2];
sollte es richten. Tipp: für [Nr1,nr2] eine Konstante definieren und bei default und create verwenden vereinfacht spätere Änderungen.

Martin

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: boolean property mit Vorgabewert

Beitrag von theo »

arturx hat geschrieben: Dein Tip mit default=true funktioniert wirklich anstandslos.
Jetzt nochmal zum mitschreiben: Ich dachte immer, dass default bei Properties nur eine Optimierung ist (nicht stored), aber dass es ohne default nicht funktioniert ist mir neu.
Weiss das jemand genau?

Über Delphi:
If the default directive is omitted, all values are stored in the *.dfm file. When present, if the property's value matches the default, it is not stored.
EDIT: @mse: Ach so, das war früher immer gesetzt? Das wäre dann aber eine Inkompatibilität mit Delphi gewesen, oder?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: boolean property mit Vorgabewert

Beitrag von mse »

theo hat geschrieben: Jetzt nochmal zum mitschreiben: Ich dachte immer, dass default bei Properties nur eine Optimierung ist (nicht stored), aber dass es ohne default nicht funktioniert ist mir neu.
Weiss das jemand genau?
FPC < 2.4 (IIRC) hat folgende implizite default Werte:
boolean: false
byte,word,integer,longword...: 0
set: []

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: boolean property mit Vorgabewert

Beitrag von mse »

theo hat geschrieben: Das wäre dann aber eine Inkompatibilität mit Delphi gewesen, oder?
Ja. Wobei auch Delphi einen impliziten Defaultwert '' für strings und widestrings hat.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: boolean property mit Vorgabewert

Beitrag von theo »

mse hat geschrieben: Ja. Wobei auch Delphi einen impliziten Defaultwert '' für strings und widestrings hat.
DaaaaanKE! :P

Antworten