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/)
-   -   Prism Problem mit Zugriff auf Property (https://www.delphipraxis.net/77878-problem-mit-zugriff-auf-property.html)

gfjs 26. Sep 2006 08:12


Problem mit Zugriff auf Property
 
Guten Morgen.

Ich habe in einer Komponente (Erweiterung von TextBox) folgende Property:
Delphi-Quellcode:
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;
Nachdem get_FDefText als public deklariert ist, bin ich davon ausgegangen, dass ich von außerhalb mit
Delphi-Quellcode:
str := StringEdit.get_FDefText;
darauf zugreifen kann, bekomme aber die Fehlermeldung:
Zitat:

[Pascal Fehler] uStringEdit.pas(201): E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt
Wie muss der Aufruf nun sein, dass ich den Wert auslesen kann?

Vielen Dank im Voraus.

Gruß Jürgen.

bernau 26. Sep 2006 08:47

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:
var
  aStringedit:TStringEdit;
begin
  aStringedit:=TStringEdit.create;
Und dann auf die Instanz zugreifen.

Delphi-Quellcode:
str := aStringEdit.get_FDefText;
Vieleicht muss man das bei .Net nich, aber bei Win32 muss man das schon.

Gerd

Elvis 26. Sep 2006 08:53

Re: Problem mit Zugriff auf Property
 
Zitat:

Zitat von bernau
Zuerst eine Anmerkung. Klassen würde ich immer mit einem T beginnen. Also "TStringEdit = class(..." und nicht "StringEdit = class(..."

Nenenenene! Wir reden hier von .Net
Auch wenn es mit D.Net nicht möglich ist den Design guidelines zu entsprechen[1], wenigstens das T sollte man sich verkneifen.
Zitat:

Ich habe noch kein .Net-Programm geschrieben, aber muss du nicht auch hier die Klasse instanzieren?
Bingo!

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

Jürgen Thomas 26. Sep 2006 09:01

Re: Problem mit Zugriff auf Property
 
Hallo Jürgen,
Zitat:

Zitat von bernau
Zuerst eine Anmerkung. Klassen würde ich immer mit einem T beginnen. Also "TStringEdit = class(..." und nicht "StringEdit = class(..."

Unter NET ist das (leider) nicht so.

Zitat:

Zitat von bernau
Ich habe noch kein .Net-Programm geschrieben, aber muss du nicht auch hier die Klasse instanzieren?
Delphi-Quellcode:
var
  aStringedit:TStringEdit;
begin
  aStringedit:=TStringEdit.create;
Und dann auf die Instanz zugreifen.
Delphi-Quellcode:
str := aStringEdit.get_FDefText;

So ist es. Aber ich nehme an, dass Du (Jürgen) schon beim Kompilieren hängen geblieben bist und nicht erst zur Laufzeit abstürzst.

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:
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!
Viel Erfolg! Jürgen

gfjs 26. Sep 2006 09:30

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:
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;
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:
Delphi-Quellcode:
type
  aTextBox = StringEdit;
var
  MyTextBox : aTextBox;
....
constructor MyForm.Create;
begin
  MyTextBox := aTextBox.Create;
  ....
end;
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.

Wie Ihr seht, bin ich ziemlich ratlos. Vielleicht lichtet sich mit Eurer Hilfe der Schleier ein wenig?!

Gruß Jürgen.

Jürgen Thomas 26. Sep 2006 10:33

Re: Problem mit Zugriff auf Property
 
Hallo Jürgen,

Zitat:

Zitat von gfjs
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

Wie kommst Du für eine eigene Komponente dazu, dass der Designer Dir etwas abnimmt? Oder erzeugst Du ein UserControl? So verstehe ich Deine Situation (und Deine Probleme) nicht mehr.

Zitat:

Zitat von gfjs
2. Das mit dem Instanziieren ist mir an dieser Stelle nicht so ganz klar...
Delphi-Quellcode:
type
  aTextBox = StringEdit;
var
  MyTextBox : aTextBox;
....
constructor MyForm.Create;
begin
  MyTextBox := aTextBox.Create;
  ....
end;
Muss ich denn hier noch einmal eine Instanz erzeugen?

Dazu: eigentlich gibt es keinen Grund, den Typ StringEdit durch den Typ aTextBox zu verdoppeln. Eine Bezeichnung genügt doch, oder?

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

gfjs 26. Sep 2006 11:08

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:
type
  TUserControl = class(System.Windows.Forms.UserControl) // wird zu class(System.Windows.Forms.TextBox)
    ...
  end;
Daher kommt wohl auch der vom Designer erzeugte Code.

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 15:08 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