TMemo bei Add(...) (in eigner Klasse) = Zugriffsverletzung
-
ThorstenSteinberg schrieb:
Hallo, ich bekomme eine Zugriffsverltzung Exception wenn ich mit
Add("irgendwas") in ein erzeugtes MemoFeld speichern möchte.kleiner Tipp: wo erzeugst du denn besagtes Memo? In dem von dir geposteten Code sehe ich nur einen Zeiger der in's Nirwana zeigt.
-
Vielleicht solltest Du doch erst mal ein paar Grundlagen lernen...
Nein, so kannst Du kein TMemo verwenden. Du mußt auch eine Instanz erzeugen, respektive eine vorhandene Instanz referenzieren.
Nur für die Zwischenspeicherung der Daten würde sich innerhalt der Klasse eher eine TStringList anbieten, deren Inhalt Du dann einem TMemo zuweisen kannst, sobald Du die Daten anzeigen möchtest.
-
hmm, dass man das mit "new" erzeugt weiß ich ja eigentlich, nur als ich das mit new in den header geschrieben hatte, kam immer nur
[C++ Fehler] htmlausgabe.h(12): E2233 Klassenelement kann hier nicht initialisiert werden.
dabei raus.
Zeile war: TMemo *htmlausgabe = new TMemo();
auch wenn ich es so lasse wie es oben steht und dann hinterher
TMemo *htmlausgabe = new TMemo();
mache kam immer nur[C++ Fehler] htmlausgabe.cpp(13): E2285 Keine Übereinstimmung für 'TMemo::TMemo()' gefunden
dabei rauß.
hmmm hab ich da noch was flasch verstanden?
-
-
Hallo,
Du kannst das Memo ja nicht im Header erzeugen. Das sollte im Konstruktor deiner Klasse geschehen. Die andere Fehlermeldung wird durch einen fehlenden Parameter (Owner) im Konstruktor von TMemo hervorgerufen.
Das müsste also so aussehen.htmlausgabe::htmlausgabe() { bool i=true; htmlausgabe = new TMemo(NULL); };Ausserdem mußt du dieses Memo im Destruktor dieser Klasse wieder löschen. Wie Joe schon gesagt hat wäre hier aber eine TStringList besser geeignet.
Ciao
-
hmm ok, ich glaube ich habe da noch was flasch verstanden, habe die datein nun wie folgt geändert:
.cpp
#include "htmlausgabe.h" htmlausgabe::htmlausgabe() { bool i=true; memhtml=new TMemo(NULL); }; bool htmlausgabe::setPath(AnsiString Path) { Path=Path+"index.htm"; memhtml->Lines->Add("buhh"); // htmlcode->Lines->LoadFromFile(Path); // htmlcode->Lines->Add("hhallo"); return true; }; AnsiString htmlausgabe::getPath(void) { return (AnsiString)Pfad; } AnsiString htmlausgabe::getHTML(void) { return (String)memhtml->Lines->Text; } htmlausgabe::~htmlausgabe() { delete memhtml; };.h
//=================== #ifndef htmlausgabe_H #define htmlausgabe_H //=================== #include <vcl.h> using namespace std; //=================== class htmlausgabe{ AnsiString Pfad; TMemo *memhtml; public: htmlausgabe(); ~htmlausgabe(); bool setPath(AnsiString Path); AnsiString getPath(void); String getHTML(void); }; //=================== #endifFehlermeldung nun:
[C++ Fehler] htmlausgabe.cpp(8): E2015 Mehrdeutigkeit zwischen '_fastcall Stdctrls::TMemo::TMemo(Classes::TComponent *)' und '_fastcall Stdctrls::TMemo::TMemo(void *)'
nun verzweifle ich langsam
-
Du hast da nichts falsch verstanden. Ich habe nur übersehen, dass TMemo zwei Konstruktoren hat und nun kann sich der Kompiler nicht entscheiden welchen er nehmen soll. Memo scheint den Parameter wirklich zu brauchen. Du müsstest also hier deine einen Pointer auf die Form übergeben in der das memo angezeigt werden soll. Weiterhin benötigt TMemo einen Parent.
Nimm lieber TStringList anstelle von Memo (wenn du die Daten erstmal nicht anzeigen willst), dann hast du das Problem nicht.
-
Hallo
oder einfach casten
TMemo *Test = new TMemo((TComponent*)NULL);/Edit : wobei TStringList natürlich die eindeutig bessere Wahl wäre.
bis bald
akari
-
@akari
Hab ich gerade auch probiert. Funktioniert aber auch nicht. Dann kommt ein Fehler
"... EInvalidOperation, Element hat kein übergeordnetes Fenster"
Man muß den Parent auch noch angeben.
-
hmm, was soll man dazu noch sagen??
habe jetzt alle TMemo nach TStringList umbenannt. und was sehe ich nun??
Alles läuft SUUUUUUPER GEIL!!
Ihr seit immer weider die besten !!