| Autor |
Nachricht |
Heimelchen
Mitglied
Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
akari Moderator
09:48:27 31.08.2010 Titel: |
|
Zitieren |
Hallo
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
|
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
|
akari Moderator
10:16:34 02.09.2010 Titel: |
|
Zitieren |
Hallo
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
|
Th69 Mitglied
11:30:28 02.09.2010 Titel: |
|
Zitieren |
|
 |
Heimelchen
Mitglied
Benutzerprofil
Anmeldungsdatum: 22.06.2010
Beiträge: 325
|
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
|
akari Moderator
13:57:03 02.09.2010 Titel: |
|
Zitieren |
Hallo
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
|
Heimelchen Mitglied
14:38:09 02.09.2010 Titel: |
|
Zitieren |
|
 |