Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Property Readonly setzen - gespeicherte Werte (https://www.delphipraxis.net/192252-property-readonly-setzen-gespeicherte-werte.html)

matashen 3. Apr 2017 13:04

Delphi-Version: XE2

Property Readonly setzen - gespeicherte Werte
 
Hallo zusammen,

hab grad zu nem Problem keine Idee und kein Glück beim googlen.

Ich lege Einstellungen zu verschiedenen Componenten in einer Datei ab. Je nach Benutezrfreigabe sollen verschiedene Bereiche der Anwendung frei gegeben sein.
Dabei soll ich die Werte Enabled, visible und Readonly setzen.
Genau bei letzterem hab ich das Problem das ich dieses nicht so einfach setzen kann.
Bei zum Beispiel Visible mach ich folgendes

Delphi-Quellcode:
TControl(application.FindComponent(myform).FindComponent(myobject)).visible:=visiblestatus;

Das gleiche geht auch mit enabled, nur bei Readonly hab ich keine Idee wie ich das machen kann.
setprobvalue kennt ja leider auch kein boolean, sonst häts ich mal so versucht

Delphi-Quellcode:
setpropvalue(application.FindComponent(myform).FindComponent(myobject)),'Readonly',Readonlystatus);

Wär cool wenns da nen einfachen einzeiler gäbe ...

himitsu 3. Apr 2017 13:25

AW: Property Readonly setzen - gespeicherte Werte
 
entweder
Delphi-Quellcode:
if MyComponent is TCustomEdit then
  TEdit(MyComponent).ReadOnly := ReadOnlyStatus
else if MyComponent is ... then
  ...
Denn z.B. bei DevExpress hast du sonst richtig Spaß, wenn sich das atattdessen in Edit.Properties.ReadOnly versteckt.

SetPropValue:
XE2 kennt schon die erweiterte RTTI (RTTI.pas), dann verwende besser die darin enthaltenen neueren APIs, anstatt dieser uralten API.

Aber ich bin mir sicher, dass SetPropValue auch Boolean kann.
Eventuell aber nur, wenn man den Wert vorher in einen Ordinalen Typ umwandelt
Delphi-Quellcode:
Ord(ReadOnlyStatus)
,
denn Delphi nutzt Boolean (1 Byte groß mit 0 und +1), welches als VarType als ein Integer mit Min=0 und Max=1 definiert ist, und Variant kennt nur WordBool (2 Byte groß mit 0 und -1)

nahpets 3. Apr 2017 13:55

AW: Property Readonly setzen - gespeicherte Werte
 
Eventuell hilft sowas:
Delphi-Quellcode:
Function HasProperty(AClass : TObject; APropertyName : String) : Boolean;
Begin
  Result := Assigned(GetPropInfo(AClass.ClassInfo, APropertyName));
End;

...

if HasProperty(application.FindComponent(myform).FindComponent(myobject),'ReadOnly') then begin
  SetPropValue(application.FindComponent(myform).FindComponent(myobject),'ReadOnly',Readonlystatus);
end;
Oder so (ungetestet, nur hingedaddelt):
Delphi-Quellcode:
uses
  TypInfo;

function SetValue(AClass : TObject; AProperty : String; AValue : Variant) : Boolean;
begin
  Result := Assigned(GetPropInfo(AClass.ClassInfo, AProperty));
  if Result then SetPropValue(AClass, AProperty, AValue);
end;
Benutzung:
Delphi-Quellcode:
var
     AClass : TObject;
begin
  AClass := application.FindComponent(myform).FindComponent(myobject);
  SetValue(AClass,'Visible',True);
  SetValue(AClass,'Enabled',False);
  SetValue(AClass,'ReadOnly',True);
...

matashen 3. Apr 2017 14:16

AW: Property Readonly setzen - gespeicherte Werte
 
Hallo,

danke Jungs
hatte einen Fehler an einer anderen Stelle im Code, SetPropValue funktioniert.

Der hinweis von Himitsu hat mich an einen anderen Fehler gebracht. Vartype gefüttert mit Wordbool dann geht's...

Zitat:

Aber ich bin mir sicher, dass SetPropValue auch Boolean kann.
Eventuell aber nur, wenn man den Wert vorher in einen Ordinalen Typ umwandelt Ord(ReadOnlyStatus) ,
denn Delphi nutzt Boolean (1 Byte groß mit 0 und +1), welches als VarType als ein Integer mit Min=0 und Max=1 definiert ist, und Variant kennt nur WordBool (2 Byte groß mit 0 und -1)
Nochmal dickes Dankeschön

Gruß Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz