![]() |
Problem mit Zugriff auf Property
Guten Morgen.
Ich habe in einer Komponente (Erweiterung von TextBox) folgende Property:
Delphi-Quellcode:
Nachdem get_FDefText als public deklariert ist, bin ich davon ausgegangen, dass ich von außerhalb mit
type
StringEdit = class(System.Windows.Forms.TextBox) components: System.ComponentModel.IContainer; Timer1: System.Windows.Forms.Timer; procedure InitializeComponent; procedure StringEdit_MouseEnter(sender: System.Object; e: System.EventArgs); procedure StringEdit_Enter(sender: System.Object; e: System.EventArgs); strict protected procedure Dispose(Disposing: Boolean); override; private { Private-Deklarationen } FDefText : string; public constructor Create; function get_FDefText: System.string; procedure set_FDefText(Value: System.string); published [DefaultValue('DefText')] property DefText : string read get_FDefText write set_FDefText; end;
Delphi-Quellcode:
darauf zugreifen kann, bekomme aber die Fehlermeldung:
str := StringEdit.get_FDefText;
Zitat:
Vielen Dank im Voraus. Gruß Jürgen. |
Re: Problem mit Zugriff auf Property
Zuerst eine Anmerkung. Klassen würde ich immer mit einem T beginnen. Also "TStringEdit = class(..." und nicht "StringEdit = class(..."
Ich habe noch kein .Net-Programm geschrieben, aber muss du nicht auch hier die Klasse instanzieren?
Delphi-Quellcode:
Und dann auf die Instanz zugreifen.
var
aStringedit:TStringEdit; begin aStringedit:=TStringEdit.create;
Delphi-Quellcode:
Vieleicht muss man das bei .Net nich, aber bei Win32 muss man das schon.
str := aStringEdit.get_FDefText;
Gerd |
Re: Problem mit Zugriff auf Property
Zitat:
Auch wenn es mit D.Net nicht möglich ist den Design guidelines zu entsprechen[1], wenigstens das T sollte man sich verkneifen. Zitat:
Außerdem sind deine Acessors denkbar ungünstig benannt. Du nennst dein Feld fBlabla weil es das Feld der Property Blabla ist. Die getter und setter heißen in .Net get_Blabla und set_Blabla. Delphi.Net erlaubt es aber nicht diese direkt zu benutzen, du musst es also GetBlabla und SetBlabla nennen. Accessors sind normalerweise private, nicht public. ;) [1]durch den Krempel mit dem dir der Compiler die Klassen zumüllt |
Re: Problem mit Zugriff auf Property
Hallo Jürgen,
Zitat:
Zitat:
Denn der eigentliche Fehler liegt im Modifizierer von Get/Set. Diese sind immer private; und der Zugriff auf den Inhalt erfolgt durch die Eigenschaft (ich habe Deinen Quelltext kopiert und nur die Änderungen registriert::
Delphi-Quellcode:
Viel Erfolg! Jürgen
type
StringEdit = class(System.Windows.Forms.TextBox) // usw. private { Private-Deklarationen } FDefText : string; function get_FDefText: System.string; // verschoben procedure set_FDefText(Value: System.string); // verschoben public constructor Create; published [DefaultValue('DefText')] property DefText : string read get_FDefText write set_FDefText; end; // der Zugriff erfolgt dann direkt: se := StringEdit.Create; str := se.DefText; // dafür sind die Eigenschaften schließlich da! |
Re: Problem mit Zugriff auf Property
Erstmal vielen Dank für Eure Beteiligung. Leider ist mir folgendes noch nicht klar:
1. Der Designer hat mir bei einer anderen Eigenschaft den Getter und Setter (für FDiologTextSize) in den Public-Bereich geschrieben, deshalb habe ich es - entgegen meiner Überzeugung - auch so gemacht. So sieht meine komplette Typ-Deklaration aus:
Delphi-Quellcode:
2. Das mit dem Instanziieren ist mir an dieser Stelle nicht so ganz klar. Es handelt sich hier um die Unit uStringEdit, in der die (künftige) selbstentwickelte Komponente StringEdit enthalten ist. In dem Programm, in dem ich die Komponente verwende sieht es dann so aus:
type
StringEdit = class(System.Windows.Forms.TextBox) {$REGION 'Vom Designer verwalteter Code'} strict private /// <summary> /// Erforderliche Designervariable. /// </summary> components: System.ComponentModel.IContainer; Timer1: System.Windows.Forms.Timer; /// <summary> /// Erforderliche Methode zur Unterstützung des Designers - /// ändern Sie die Methode nicht mit dem Quelltext-Editor /// </summary> procedure InitializeComponent; procedure StringEdit_MouseEnter(sender: System.Object; e: System.EventArgs); procedure StringEdit_Enter(sender: System.Object; e: System.EventArgs); {$ENDREGION} strict protected /// <summary> /// Ressourcen nach der Verwendung bereinigen /// </summary> procedure Dispose(Disposing: Boolean); override; private { Private-Deklarationen } FHintDelay : integer; FDialogTextSize: System.Double; FDefText : string; FDialogVisible : boolean; function getFDefText: System.string; procedure setFDefText(Value: System.string); public constructor Create; function get_DialogTextSize: System.Double; procedure set_DialogTextSize(Value: System.Double); published property HintDelay : integer read FHintDelay write FHintDelay default 1000; property DialogTextSize: System.Double read get_DialogTextSize write set_DialogTextSize; [DefaultValue('DefText')] property DefText : string read getFDefText write setFDefText; property DialogVisible : boolean read FDialogVisible write FDialogVisible default true; end;
Delphi-Quellcode:
Muss ich denn hier noch einmal eine Instanz erzeugen? Ich kann ja z.B. in "StringEdit.StringEdit_Enter" auf die Eigenschalften von StringEdit zugreifen. Allerdings gelingt es nicht aus einer Methode, die zu einem zur Laufzeit erzeugten Dialog gehört.
type
aTextBox = StringEdit; var MyTextBox : aTextBox; .... constructor MyForm.Create; begin MyTextBox := aTextBox.Create; .... end; Wie Ihr seht, bin ich ziemlich ratlos. Vielleicht lichtet sich mit Eurer Hilfe der Schleier ein wenig?! Gruß Jürgen. |
Re: Problem mit Zugriff auf Property
Hallo Jürgen,
Zitat:
Zitat:
Deine Zeile MyTextBox := aTextBox.Create; enthält genau die Instanzenbildung, die wir gemeint haben. Vor allem: Wo genau bleibst Du bzw. der Compiler hängen? Beim Entwurf der Komponente, beim Design oder beim Kompilieren des Programms oder gar erst zur Laufzeit? Jürgen |
Re: Problem mit Zugriff auf Property
Hallo Jürgen.
Tut mir leid, dass ich Dich verwirrt habe. Hier zur Erläuterung, was ich "verbrochen" habe: 1. Es handelt sich um die Erweiterung einer bestehenden Komponente (TextBox), mittels eines "User Control für Windows Forms". Das ist in dem Buch von Elmar Warken (Delphi 2005. Delphi programmieren mit dem .NET Framework) so beschrieben. Dabei wird nur die Typ-Deklaration abgeändert:
Delphi-Quellcode:
Daher kommt wohl auch der vom Designer erzeugte Code.
type
TUserControl = class(System.Windows.Forms.UserControl) // wird zu class(System.Windows.Forms.TextBox) ... end; 2. Die Komponente soll in einer, von mir noch für eigene Zwecke zu erstellenden Anwendung eingesetzt werden. Diese Komponente soll einerseits helfen, die Augen zu schonen und andererseits die Eingabe in oft zu knapp bemessene Felder erleichtern. Das Ganze soll so funktionieren: Wenn meine Komponente (StringEdit) den Focus erhält, öffnet sich ein Dialog-Formular. In diesem Dialog ist eine weitere TextBox (daher die Verwirrung mit der scheinbaren Verdoppelung), in der die Eingabe mit einer größeren Schrift und mit (nahezu) unbeschränktem Platz erfolgt. Beim Schließen des Dialogs wird die Eingabe entweder in StringEdit übernommen oder verworfen. Vielleicht ist es ja nur eine Spinnerei, aber für meine Zwecke finde ich es recht praktisch und komfortabel. Ein Beispiel, das vielleicht den Nutzen, den ich mir verspreche, verdeutlichen kann, sind die normalerweise viel zu kleinen Felder für die email-Adressen. Bei einer Schriftgröße von 8 Punkt und einer Breite von vielleicht 25 Zeichen ist die Eingabe einer längeren email-Adresse nicht nur unkomfortabel, sondern auch ziemlich fehleranfällig. Mein Problem ist nun der Zugriff auf die Eigenschaften von StringEdit aus Methoden des Dialogs oder der im Dialogformular vorhanden Komponenten. Ich hoffe, ich konnte mich verständlich ausdrücken?! Vielen Dank und Grüße aus München. Jürgen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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-2025 by Thomas Breitkreuz