Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: VCL (C++ Builder) ::  Read only Eigenschaften von Klassen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 15:50:46 26.08.2010   Titel:   Read only Eigenschaften von Klassen            Zitieren

Hi,

einige der VCL-Klassen haben Public Eigenschaften, die Read Only sind. Wie definiere ich eine Eigenschaft als Read Only?
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11271
Beitrag akari Moderator 16:15:28 26.08.2010   Titel:              Zitieren

Hallo

Indem du die Setter-Methode wegläßt.

bis bald
akari

_________________
In der nächsten Version wird alles besser!
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 19:01:06 26.08.2010   Titel:              Zitieren

C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
class TMyClass
{
  public:
    UnicodeString MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt";
C/C++ Code:
1
2
3
4
5
6
7
8
9
class TMyClass
{
public:
UnicodeString MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt";
C/C++ Code:
1
2
3
4
5
6
7
8
9
class TMyClass
{
  public:
    UnicodeString MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt";

Welche Methode? Wie implemtier ich denn eine Setter/Getter-Methode für dies Beispiel?
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11271
Beitrag akari Moderator 20:58:16 26.08.2010   Titel:              Zitieren

Hallo

Standard C++
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
class TMyClass
{
  public:
    UnicodeString GetMyString() {return MyString;}; // Getter-Methode
//    void SetMyString(UnicodeString x) {MyString = x;}; // Setter-Methode, hier nicht verfügbar

  private :
    UnicodeString MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt"; // geht nicht
UnicodeString x = MyClass->GetMyString();
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class TMyClass
{
public:
UnicodeString GetMyString() {return MyString;}; // Getter-Methode
// void SetMyString(UnicodeString x) {MyString = x;}; // Setter-Methode, hier nicht verfügbar

private :
UnicodeString MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt"; // geht nicht
UnicodeString x = MyClass->GetMyString();
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class TMyClass
{
  public:
    UnicodeString GetMyString() {return MyString;}; // Getter-Methode
//    void SetMyString(UnicodeString x) {MyString = x;}; // Setter-Methode, hier nicht verfügbar

  private :
    UnicodeString MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt"; // geht nicht
UnicodeString x = MyClass->GetMyString();


VCL
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
class TMyClass
{
  public:
    __property UnicodeString MyString = {read = _MyString};
  private :
    UnicodeString _MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt"; // geht nicht
UnicodeString x = MyClass->MyString; // geht
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
class TMyClass
{
public:
__property UnicodeString MyString = {read = _MyString};
private :
UnicodeString _MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt"; // geht nicht
UnicodeString x = MyClass->MyString; // geht
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
class TMyClass
{
  public:
    __property UnicodeString MyString = {read = _MyString};
  private :
    UnicodeString _MyString;
};

TMyClass *MyClass = new TMyClass();

MyClass->MyString = "Hallo Welt"; // geht nicht
UnicodeString x = MyClass->MyString; // geht

Weiterführendes zum Thema VCL-Eigenschaften findest du hier.

Noch zwei Anmerkungen :
- Verwende mit new erstellte Instanzen immer nur, wenn du wirklich dynamischen Speicher brauchst. In diesem Beispiel ist es nicht nötig. Und wenn du new verwendest, must du auch immer die Instanz mit delete wieder löschen
- Verwende lieber String anstelle von UnicodeString. Der Compiler kümmert sich dann um den richtigen Stringtyp.

bis bald
akari

_________________
In der nächsten Version wird alles besser!


Zuletzt bearbeitet von akari am 21:00:08 26.08.2010, insgesamt 1-mal bearbeitet
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 09:15:57 27.08.2010   Titel:              Zitieren

Ok, soweit so gut. Ich hab nun auch festgestellt, dass die Standard-C++ Syntrax unter CodeGear nicht funktioniert. Kann ich denn in der VCL-Syntax auch komplexere Setter-Funktionen umsetzen, beispielsweise mit Überprüfung des Strings?
Übrigens: Erstaunlicherweise finde ich in meinem C++-Buch keine Doku zu Getter und Setter. Haben die offiziell eine andere Bezeichnung?
VergissEs
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.06.2001
Beiträge: 1019
Beitrag VergissEs Mitglied 09:25:40 27.08.2010   Titel:              Zitieren

Heimelchen schrieb:
Ich hab nun auch festgestellt, dass die Standard-C++ Syntrax unter CodeGear nicht funktioniert.

Und wie bitte hast da das festgestellt?

_________________
MfG
VergissEs
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11271
Beitrag akari Moderator 10:54:45 27.08.2010   Titel:              Zitieren

Hallo

Die C++ Syntax muß auch im CodeGear funktionieren.

Ja du kannst in die property-Deklaration auch Methoden einbinden. Wie das geht steht in der von mir verlinkten Seite.

bis bald
akari

_________________
In der nächsten Version wird alles besser!
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 13:00:59 27.08.2010   Titel:              Zitieren

VergissEs schrieb:
Heimelchen schrieb:
Ich hab nun auch festgestellt, dass die Standard-C++ Syntrax unter CodeGear nicht funktioniert.

Und wie bitte hast da das festgestellt?

Ich hab es ausprobiert und es lief nicht.
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11271
Beitrag akari Moderator 13:03:10 27.08.2010   Titel:              Zitieren

Hallo

"läuft nicht" und "funktioniert nicht" sind keine ausreichende Fehlerbeschreibungen. Da kann dir auch niemand weiterhelfen.

bis bald
akari

_________________
In der nächsten Version wird alles besser!
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 13:44:32 27.08.2010   Titel:              Zitieren

MyClass hat keine Eigeschaft "MyString".
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11271
Beitrag akari Moderator 13:47:24 27.08.2010   Titel:              Zitieren

Hallo

Dieser Quellcode
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
class TMyClass
{
  public:
    String GetMyString() {return MyString;}; // Getter-Methode
//    void SetMyString(UnicodeString x) {MyString = x;}; // Setter-Methode, hier nicht verfügbar

  private :
    String MyString;
};
...
  TMyClass *MyClass = new TMyClass();

//  MyClass->MyString = "Hallo Welt"; // geht natürlich nicht
  String x = MyClass->GetMyString();
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class TMyClass
{
public:
String GetMyString() {return MyString;}; // Getter-Methode
// void SetMyString(UnicodeString x) {MyString = x;}; // Setter-Methode, hier nicht verfügbar

private :
String MyString;
};
...
TMyClass *MyClass = new TMyClass();

// MyClass->MyString = "Hallo Welt"; // geht natürlich nicht
String x = MyClass->GetMyString();
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class TMyClass
{
  public:
    String GetMyString() {return MyString;}; // Getter-Methode
//    void SetMyString(UnicodeString x) {MyString = x;}; // Setter-Methode, hier nicht verfügbar

  private :
    String MyString;
};
...
  TMyClass *MyClass = new TMyClass();

//  MyClass->MyString = "Hallo Welt"; // geht natürlich nicht
  String x = MyClass->GetMyString();

kompiliert ohne weitere Änderung auf meinem BCB5 ohne Fehler. Du hast etwas bei der Übernahme des Quellcodes falsch gemacht.

bis bald
akari

_________________
In der nächsten Version wird alles besser!


Zuletzt bearbeitet von akari am 13:49:11 27.08.2010, insgesamt 1-mal bearbeitet
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 09:45:39 31.08.2010   Titel:              Zitieren

akari schrieb:
C/C++ Code:
String x = MyClass->GetMyString();
C/C++ Code:
String x = MyClass->GetMyString();
C/C++ Code:
String x = MyClass->GetMyString();

Ne, du hast bei der Übernahme was falsch gemacht.

Gewollt ist:
C/C++ Code:
String x = MyClass->MyString();
C/C++ Code:
String x = MyClass->MyString();
C/C++ Code:
String x = MyClass->MyString();
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11271
Beitrag akari Moderator 09:48:27 31.08.2010   Titel:              Zitieren

Hallo

:confused: Du kannst deine Methode nennen wie du willst. Nur die Methode und die Membervariable dürfen nicht gleich heißen. In meinem Beispiel ist GetMyString() also völlig korrekt.

bis bald
akari

_________________
In der nächsten Version wird alles besser!


Zuletzt bearbeitet von akari am 09:48:51 31.08.2010, insgesamt 1-mal bearbeitet
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 10:12:23 02.09.2010   Titel:              Zitieren

Aber wenn ich auf TComponent::Components zugreifen will, verwende ich ja auch TComponent::Components und nicht TComponent::GetComponents(). Ein signifikanter Unterschied läge darin, dass hinter dem einen Klammern stehen, hinter dem andern nicht. Abgesehen vom Namen natürlich...

PS: Bei mir hat sich auch nen Fehler eingeschlichen: gewollt ist:
C/C++ Code:
String txt = MyClass->MyString;
C/C++ Code:
String txt = MyClass->MyString;
C/C++ Code:
String txt = MyClass->MyString;


Zuletzt bearbeitet von Heimelchen am 10:14:07 02.09.2010, insgesamt 1-mal bearbeitet
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11271
Beitrag akari Moderator 10:16:34 02.09.2010   Titel:              Zitieren

Hallo

:confused: Ich sehe immer noch nicht dein Problem. TComponent hat eben eine property die Components heißt und vom Typ Array ist. Möglich das es intern auch direkt lesend auf ein Array namens iComponents zugreift. Aber nichts davon widerspricht meinem Beispiel.

bis bald
akari

_________________
In der nächsten Version wird alles besser!
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 2256
Beitrag Th69 Mitglied 11:30:28 02.09.2010   Titel:              Zitieren

Hallo heimelchen,

akari hat dir hier http://www.c-plusplus.de/forum/viewtopic-var-p-is-1944764.html#1944764
doch schon die Lösung mittels Eigenschaften (Properties) genannt (Beispiel "VCL")...
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 13:07:52 02.09.2010   Titel:              Zitieren

Heimelchen schrieb:
Ich hab nun auch festgestellt, dass die Standard-C++ Syntax unter CodeGear nicht funktioniert.

Ich hab auch nicht behauptet, dass es mit __property nicht funktioniert...
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11271
Beitrag akari Moderator 13:57:03 02.09.2010   Titel:              Zitieren

Hallo

:confused: Und welche Frage ist denn nun noch offen?

/Edit : Natürlich funktioniert meine konkrete C++ Version auch nur bei VCL-Einbindung, da ich den Datentyp UnicodeString verwendet habe. Wenn du UnicodeString durch std::string ersetzt brauchst du keine VCL mehr. Aber das sollte doch wohl klar sein?

bis bald
akari

_________________
In der nächsten Version wird alles besser!


Zuletzt bearbeitet von akari am 14:25:25 02.09.2010, insgesamt 1-mal bearbeitet
Heimelchen
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
Beitrag Heimelchen Mitglied 14:38:09 02.09.2010   Titel:              Zitieren

Alles beantwortet.
C/C++ Forum :: VCL (C++ Builder) ::  Read only Eigenschaften von Klassen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.