Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Kann man veröffentlichte Eigenschaften unsichtbar machen?


belzebubi - Do 27.03.03 18:46
Titel: Kann man veröffentlichte Eigenschaften unsichtbar machen?
Wie kann ich eine Eigenschaft die ich bei published veröffentlicht habe bei nicht mehr gebrauch ausschalten, so das sie nicht mehr angezeigt wird. Oder wenigstens das sie einen Schreibschutz besitzt damit man nicht mehr auf sie zugreifen kann.


Tino - Fr 28.03.03 10:18

Hi,

ich weiß nicht ob es reicht die Eigenschaft einfach in der neuen Klasse in der Privat-Sektion zu definieren? Also so:

Quelltext
1:
2:
3:
4:
5:
Type
  tMyEdit = Class (tEdit)
      Private
        Property Text;
    End;

Ich gehe aber davon aus das das nicht funktioniert. Mußte halt mal ausprobieren. Aber in den meisten Fällen gibt es (gerade bei Komponenten) eine Ableitung welche noch keine Properties veröffentlicht. Diese beginnen meistens mit tCustom.... Wenn Du Deine Komponente von so einer Klasse ableitest kannst Du selbst bestimmen welche Eigenschaften angezeigt werden und welche nicht.

Gruß
Tino


belzebubi - Fr 28.03.03 16:32

ne , das war schon klar.
Mein Problem ist das ich ein Button mit Customcontrol erstellen will, der rund oder eckig sein soll. Wenn ich nun rund im Objektinspektor einstelle, wäre es mir lieb wenn height einen Schreibschutz erhält oder einfach verschwindet, weil dann nur width als radius fungiert.
Aber ich glaube das macht die Antwort auch nicht einfach :oops:


Delphi-Experte - Sa 29.03.03 06:36
Titel: Eigenschaften nachträglich "schreibschützen"
Man kann eine Eigenschaft nachträglich wie folgt "schreibschützen":


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
type
  TMyClass = class(TParentClass)
  private
    procedure SetMyProperty(Value : Integer);
    function IsMyPropertyStored : Boolean;
  published
    property MyProperty write SetMyProperty stored IsMyPropertyStored;
  end;

procedure TMyClass.SetMyProperty(Value : Integer);
begin
  if not MyPropertyReadOnly then
    inherited MyProperty := Value;
end;

function TMyClass.IsMyPropertyStored : Boolean;
begin
  Result := not MyPropertyReadOnly;
end;


Der Ausdruck "MyPropertyReadOnly" entspricht dabei der Bedingung, wann die Eigenschaft nicht geändert werden darf. Die Funktion "IsMyPropertyStored" sorgt dafür, daß die Eigenschaft dann auch nicht in der Formulardatei gespeichert wird.

Wenn Du die Eigenschaft "Height" schreibschützen möchtest, dann solltest Du aber besser den folgenden Quelltext verwenden (beim Ändern von "Height" wird intern die Funktion "SetBounds" aufgerufen):


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
type
  TMyClass = class(TParentClass)
  private
    function IsHeightStored : Boolean;
  public
    procedure SetBounds(ALeft, ATop, AWidth, AHeight : Integer); override;
  published
    property Height stored IsHeightStored;
  end;

procedure TMyClass.SetBounds(ALeft, ATop, AWidth, AHeight : Integer);
begin
  if HeightReadOnly then
    AHeight := Height;
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;

function TMyClass.IsHeightStored : Boolean;
begin
  Result := not HeightReadOnly;
end;


AndyB - Sa 29.03.03 09:17

Dann kann man auch gleich CanResize() überschreiben, da dieses nicht nur von SetBounds() aufgerufen wird und hat somit alle Größenveränderungen abgefangen.