AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Zugriff auf Property

Ein Thema von gfjs · begonnen am 26. Sep 2006 · letzter Beitrag vom 26. Sep 2006
Antwort Antwort
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#1

Problem mit Zugriff auf Property

  Alt 26. Sep 2006, 08:12
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
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.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit Zugriff auf Property

  Alt 26. Sep 2006, 08:47
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.

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

Gerd
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Problem mit Zugriff auf Property

  Alt 26. Sep 2006, 08:53
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
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#4

Re: Problem mit Zugriff auf Property

  Alt 26. Sep 2006, 09:01
Hallo Jürgen,
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 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.
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Problem mit Zugriff auf Property

  Alt 26. Sep 2006, 09:30
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.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#6

Re: Problem mit Zugriff auf Property

  Alt 26. Sep 2006, 10:33
Hallo Jürgen,

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 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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Problem mit Zugriff auf Property

  Alt 26. Sep 2006, 11:08
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.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 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