Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigenschaft überschreiben (https://www.delphipraxis.net/43802-eigenschaft-ueberschreiben.html)

F.W. 8. Apr 2005 22:46


Eigenschaft überschreiben
 
N'abend!

Ich sitzt jetzt schon seit 4 Stunden an einem Problem:

Ich leite eine Komponente von TTimer ab. Dafür muss ich die Eigenschaft "Interval" überschreiben, weil ich deren Schreibmethode erweitern möchte.
In der OH steht folgendes:
Delphi-Quellcode:
Die folgenden Deklarationen zeigen, wie Eigenschaften überschrieben werden können:

type
  TAncestor = class
   ...
  protected
    property Size: Integer read FSize;
    property Text: string read GetText write SetText;
    property Color: TColor read FColor write SetColor stored False;
    ...
  end;
type
  TDerived = class(TAncestor)
   ...
  protected
    property Size write SetSize;

  published
    property Text;
    property Color stored True default clBlue;
    ...
  end;

Beim Überschreiben von Size wird die Angabe write hinzugefügt, damit der Wert der Eigenschaft geändert werden kann. Die Sichtbarkeit der Eigenschaften Text und Color wird von protected in published geändert. Für die Eigenschaft Color wird außerdem festgelegt, dass sie in der Formulardatei gespeichert wird, wenn sie einen anderen Wert als clBlue hat.
Hier ist allerdings nicht die Implementation gezeigt. Momentan sieht das ganze bei mir so aus:
Delphi-Quellcode:
type
  TZeitgeber = class(TTimer)
  private
    procedure SetInterval(const Value: Cardinal);
  published
    property Interval write SetInterval;

{ ... }

procedure TZeitgeber.SetInterval(const Value: Cardinal);
begin
 Interval := Value;
end;
Das sind die relevanten Teile. Wenn man sich das ansieht, kommt man schnell darauf, dass hier ein Stacküberlauf produziert wird!

Wie kann ich dieses Problem lösen? Wenn ich die Zeile "Interval := Value;" weglasse kann ich der Eigenschaft keine Werte mehr zuuweisen!

[EDIT]Hatte die OH als Zitat, wodurch die Formatierung (Leerzeichen) nicht beachtet wurden! >> Delphi-Code draus gemacht![/EDIT]

Pr0g 8. Apr 2005 23:16

Re: Eigenschaft überschreiben
 
Du könntest doch:
Delphi-Quellcode:
procedure TZeitgeber.SetInterval(const Value: Cardinal);
begin
  inherited Interval := Value;
end;
schreiben, oder was genau willst du machen?

MfG Pr0g

Hansa 9. Apr 2005 00:12

Re: Eigenschaft überschreiben
 
Zitat:

Zitat von F.W.
N'abend!

Ich sitzt jetzt schon seit 4 Stunden an einem Problem:
...
Wenn man sich das ansieht, kommt man schnell darauf, dass hier ein Stacküberlauf produziert wird!
...

4 St. ist für Komponentenenwicklung eindeutig zu wenig ! Zum konkreten Problem : wieso ist klar, daß ein Stacküberlauf zwangsläufig auftaucht ? :shock:

Du hast zwar eine Set-Methode, aber kein Feld in der class, die das betrifft. Insofern greift die Methode ins leere. Ob da jetzt AV kommt oder sonstwas tut nichts zur Sache. 8)

Muetze1 9. Apr 2005 01:59

Re: Eigenschaft überschreiben
 
Moin!

Zitat:

Zitat von Hansa
Du hast zwar eine Set-Methode, aber kein Feld in der class, die das betrifft. Insofern greift die Methode ins leere. Ob da jetzt AV kommt oder sonstwas tut nichts zur Sache. 8)

Und ob. Wie du richtig festgestellt hast, hat er keine Klassenvariable - er will den Inhalt der überschriebenen Property nutzen. Und es kommt zwangsläufig zu einem Stacküberlauf, da er als Wert für die Property den Wert der Property, der sich aus dem Wert der Property welcher sich aus dem Wert der Property..... etc etc etc... ergibt. Klarer?

Pr0g's Lösung ist der Schlüssel...

MfG
Muetze1

F.W. 9. Apr 2005 10:47

Re: Eigenschaft überschreiben
 
@ Pr0g: Jepp, dass isses!! Danke!!!

Zitat:

Zitat von Hansa
4 St. ist für Komponentenenwicklung eindeutig zu wenig !

Nee, für die kleine abgeleitete Kompo isses zu viel. Außerdem sitzt ich vier Stunden an DEM EINEN PROPERTY! Welches mir das Leben schwer gemacht hat!!

Danke!

[EDIT]Jetzt hab ich doch nochmal eine Frage: Ich überschreibe die Procedure Timer. Aber die procedure Timer meiner Klasse wird nur dann aufgerufen, wenn ich eine Procedure mit dem Ereignis OnTimer verknüpfe. Warum das?

Delphi-Quellcode:
procedure Timer; dynamic; // beim TTimer
procedure Timer; override; //in meiner klasse
//Beide als protected deklariert

{ ... }

procedure TZeitgeber.Timer;
begin
 inherited;

 IncTime; { die gesamte Procedure "Timer" wird NICHT ausgeführt solange AUCH NICHTS im OnTimer steht (was ich im OI eigentlich nicht mehr anzeigen lassen wollte, aber da man die Sichtbarkeit leider nicht verringern kann...) }
end;

[/EDIT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 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