![]() |
Delphi-Version: 6
ist ein custom write möglich?
Hallo,
kann man bei einer property die write (funktion?) umdefinieren? Also ich möchte ungefähr sowas haben: property Name : String read fName write trim(fName); ...also dass ich noch auf die Werte noch irgendwelche Funktionen werfen kann. Danke! |
AW: ist ein custom write möglich?
Moin... :P
Sichwort: Setter :wink: auf die Schnelle: ![]() |
AW: ist ein custom write möglich?
Suche mal nach "Getter" und "Setter".
Getter sind lesende Funktionen, die statt einem Lesen eines Propertywertes ausgeführt werden. Setter sind entsprechend schreibende Prozeduren. Du Kannst damit z.B. so etwas lösen:
Delphi-Quellcode:
procedure TPerson.setFirstNamne(Value: string);
begin fFirstName := Trim(Value); end; |
AW: ist ein custom write möglich?
Ich denke er redet davon, in einem Typennachfahr die Read-/Write-Klauseln einer Eigenschaft neu zu definieren, ohne die Eigenschaft zu überschreiben. Und das geht nicht. Du kannst die Signaturen oder Les-/Schreibbarkeit einer Eigenschaft nicht überschreiben, sondern nur deren Sichtbarkeit.
|
AW: ist ein custom write möglich?
Wozu braucht man diese properties dann noch?
|
AW: ist ein custom write möglich?
Zitat:
Eigenschaften können:
Das wars. Mehr ist da nicht möglich. Sie sind also so gesehen nur "semantischer Zucker". |
AW: ist ein custom write möglich?
Zitat:
Delphi-Quellcode:
- oder
var
Delphi-Quellcode:
-Parameter übergeben.
out
Das sieht man z.B. auch daran dass Sprachen wie Java keine Entsprechung zu Delphi-Properties haben da man wohl gemerkt hat dass man mit einer einfachen Variable oder getXXX() und setXXX()-Methoden besser fährt. |
AW: ist ein custom write möglich?
Hallo,
Zitat:
property Active: Boolean Read GetActive write SetActive;
Delphi-Quellcode:
Hier wird nicht einfach nur FActive gesetzt, sondern es werden noch einige Randbedingungen geprüft.
procedure SetActive(Wert: Boolean);
begin if FActive=Wert then begin // keine Änderung notwendig Exit; end; if Wert=False then begin InternalCloseFile; FActive:= False; Exit; end; if FFileName='' then begin // ev. Log Exception.Create('FileName not set'); end; if not FileExists(FFileName) then begin // ev. Log Exception.Create('File does not exist'); end; InternalOpenFile; FActive:= True; end; |
AW: ist ein custom write möglich?
Hallo,
und ich benutze die Properties auch sehr gern, um in die Set-Methode Breakpoints zu setzen, um die Stelle schnell zu finden, wo eine Variable(hier Property) gesetzt wird. |
AW: ist ein custom write möglich?
Delphi-Quellcode:
...sowas gehört mit dem Klammerbeutel gepudert. :stupid:
if Wert=False then
|
AW: ist ein custom write möglich?
Zitat:
|
AW: ist ein custom write möglich?
Hallo,
naaa ;) Ich kann dann ja so schöne Sätze coden wie
Delphi-Quellcode:
anstatt zu schreiben
if not Table.Active then
begin Table.Active:= True; end;
Delphi-Quellcode:
Und die Published Properties kann ich im Object-Inspector setzen und in der DFM mit speichern.
if not Table.GetActive then
begin Table.SetActive(True); end; |
AW: ist ein custom write möglich?
Zitat:
a) damit zusammenkommt was zusammengehört und b) das mit dem MMX eh das schneller geht als ohne property |
AW: ist ein custom write möglich?
Zitat:
|
AW: ist ein custom write möglich?
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: ist ein custom write möglich?
Mit alt hat das nichts zu tun. Ich sehe nur echt keine Daseinsberechtigung in Delphi. Dass es in C++ Properties gibt wäre mir jetzt neu. C# hat auch Properties, hier sind sie aber wenigstens nicht so sinnlos wie in Delphi.
Beispielsweise sehe ich in der IDE ob ich eine Property setzen darf und nicht erst wenn der Compiler mir das um die Ohren wirft. Oder ich kann, wie man es mit getter- und setter-Methoden sowieso kann, eine Property
Delphi-Quellcode:
lesbar, aber z.B. nur
public
Delphi-Quellcode:
schreibbar machen.
protected
Außerdem gibt es beispielsweise ![]() Aber in C# kann man leider auch keine Properties als ref/out-Parameter übergeben, das ist schade. |
AW: ist ein custom write möglich?
Zitat:
|
AW: ist ein custom write möglich?
Hallo,
Zitat:
Zitat:
Delphi-Quellcode:
Der lesende Zugriff auf
type
TTest= class strict private fMyValue: Boolean; procedure SetMyValue(const aMyValue: Boolean); public property MyValue: Boolean read fMyValue write SetMyValue; end; var Test: TTest;
Delphi-Quellcode:
ist wesentlich performanter und ressourcenschonender als ein
Test.MyValue
Delphi-Quellcode:
, weil der Compiler durch das Feld im read aus dem
Test.GetMyValue
Delphi-Quellcode:
dabei ein schlankes
Test.MyValue
Delphi-Quellcode:
macht.
Test.fMyValue
Zitat:
Delphi-Quellcode:
property TmpTmp: Boolean read Schöne write Schlecht;
Denn wer bringt dem Compiler bei, dass deine GetXXX / SetXXX immer mit Get / Set anfangen müssen und XXX bei beiden gleich sein muss? Und vor allem wie? Auch und dann der Objektinspektor, den es ohne Properties bestimmt nicht geben würde. Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Wieso soll ich nochmal so viel Unnützes tippen? Da stelle ich doch lieber mal eine Frage zur Anregung. Wieso kann der Compiler aus dem gut lesbaren
var vTmp: Boolean;
begin vTmp:= Test.GetMyValue; DoTest(vTmp); Test.SetMyValue(vTmp);
Delphi-Quellcode:
nicht selbstständig ein schönes
DoTest(Test.MyValue)
Delphi-Quellcode:
machen?
var Dummy= Test.fMyValue;
DoTest(Dummy); Test.SetMyValue(Dummy); Und schöne wäre bei Parametern auch ein
Delphi-Quellcode:
,
property var
Delphi-Quellcode:
,
property const
Delphi-Quellcode:
und
property out
Delphi-Quellcode:
. Dann soll ebbend eine Referenz aufs Property rein gegeben werden und nicht nur der Wert rein/raus.
property in
Zitat:
|
AW: ist ein custom write möglich?
Zitat:
![]() Zitat:
Delphi-Quellcode:
markieren zu können. Aber geht nunmal nicht.
deprecated
Zitat:
Delphi-Quellcode:
-Parameter als Zeiger übergeben werden und ein Zeiger auf ein Methodenergebnis nunmal nicht weiterverwertbar ist. Es sind halt keine Variablen.
var
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz