Methode aus anderer Klasse nutzen
-
Hallo zusammen,
wiedermal muss ich einen neuen Thread eröffnen, um ein paar Frage zu stellen (ich hoffe ich nerve euch nicht).In einem vorangegangen Thread habe ich eine Klasse TWord erschaffen. Ich habe eine Methode definiert, die in ein RichEdit einen Text laden soll.
Unit1.h
class TWord : public TObject { public: __fastcall TWord (); void __fastcall GetText (String DateiName, TRichEdit *Rich1); private: };
Unit1.cpp
void __fastcall TWord::GetText (String DateiName, TRichEdit *Rich1) { Rich1->Lines->LoadFromFile (DateiName); } //--------------------------------------------------------------------------- void __fastcall TForm1::Oeffnen1Click(TObject *Sender) { if (OpenDialog1->Execute()) GetText (OpenDialog1->FileName); }
Leider funktioniert, dass nicht so, da es Probleme mit der Methode GetText in der Oeffnen1Click - Methode von TForm1 gibt. Folgende Fehler erscheinen:
E2247 Zugriff auf '_fastcall TControl::GetText()' nicht möglich
E2227 Zu viele Parameter im Aufruf von _fastcall TControl::GetText()Wenn ich GetText als Methode von TForm1 vereinbare, dann funktioniert alles. Das Aufrufen der Methode vom Typ TWord macht also Schwierigkeiten. Leider weiß ich wiedemal keine Lösung
Könnt ihr mir helfen??
Vielen Dank
lg, freakC++
-
Hallo
Zunächst einmal fehlt in deinem Funktionsaufruf der zweite Parameter, so sollte es aussehen : (OpenDialog1->FileName, RichEdit);. Nur ein Fehler beim Kopieren?
Das eigentliche Problem dürfte sein das du nicht nur die Klasse TWord brauchst, sondern noch davon eine Instanz damit du methoden davon aufrufen kannst. Mal einfach :
#include "TWord.h" ... void __fastcall TForm1::Oeffnen1Click(TObject *Sender) { TWord myword; if (OpenDialog1->Execute()) myword.GetText (OpenDialog1->FileName, RichEdit); }
Hier wird eine lokale Instanz von TWord angelegt, natürlich kannst du es auch anderer Stelle deklarieren. Hauptsache in dieser Oeffnen-Methode ist irgendeine Instanz bekannt.
bis bald
akari
-
Oh, ne diesmal handelt es sich um keinen Fehler beim Kopieren!! Einfach vergessen. Ich habe auch eine Instanz vereinbart, nämlich in der FormCreate Mothide. Hätte ich eigentlich noch dazu schreiben müssen.
void __fastcall TForm1::FormCreate (TObject *Sender) { Word1 = new TWord; }
Muss es dann nicht so heißen:
void __fastcall TForm1::Oeffnen1Click(TObject *Sender) { if (OpenDialog1->Execute()) GetText (OpenDialog1->FileName, Rich1); }
Trotzdem funktioniert es nicht, da genau die gleichen Fehler kommen. Auch wenn ich deinen Vorschlag komplett übernehme meckert der Builder rum....
Vielen Dank für eure Hilfe
lg, freakC++
-
Hallo
*seufz* "meckert rum" ist keine Fehlerbeschreibung!
Das du eine Instanz deklariert hast ist gut, nur verwenden must du sie noch.
void __fastcall TForm1::Oeffnen1Click(TObject *Sender) { if (OpenDialog1->Execute()) Word1->GetText (OpenDialog1->FileName, Rich1); }
noch ein paar Anmerkungen :
- Ich hoffe Word1 ist ein Member des Forms, und keine globale Variable
- Statt OnCreate lieber den Konstruktor des Forms benutzen
- Muß Word1 wirklich als Pointer verwendet werden? Vermutlich reicht doch auch eine einfache Stack-Variable ausbis bald
akari
-
Hi,
klar das ist keine Fehlerbeschreibung. Sorry dafür. Ich wollte damit eigentlich sagen, dass die gleichen Fehlermeldungen kommen . Ich werde versuchen das zu verwirklichen, was du gesagt hast. Dann meld ich mich einfach nochmalVielen Dank für deine Unterstützung
lg, freakC++
-
Hallo,
ich habe es nun dank akaris Hilfe geschafft, das Programm zu Laufen zu kriegen. Mir bleibt aber noch eine Frage übrig. Ich möchte eine Methode zum Speichern eines Textes, den man über TRichEdit eingegeben hat, erstellen. Das soll unter anderem mit TSaveDialog passieren:void __fastcall TWord::PutText (String DateiName, TRichEdit *Rich1) { String Kennung = UpperCase (ExtractFileExt (OpenDialog1->FileName)); if (Kennung == ".RTF") Rich1->PlainText = false; else Rich1->PlainText = true; Rich1->Lines->SaveToFile (DateiName); }
Nun soll TSaveDialog ins Spiel kommen:
void __fastcall TForm1::Speichern1Click(TObject *Sender) { if (SaveDialog1->Execute()) Word1->PutText (SaveDialog1->FileName, RichEdit1); }
Das Problem ist hier auch, dass in der PutText-Methode OpenDialog1 umbekannt ist, was ja auch normal ist. Ich kann mir vorstellen, dass man das Problem mit einem Parameter löst, doch ich kriegs nicht hin...
Könnt ihr mir helfen?
Vielen Dank
lg, freakC++
-
Wozu brauchst du in PutText den orginalen Dateinamen? Setze das PlainText außerhalb von PutText oder übergib das Flag.
void __fastcall TWord::PutText (String DateiName, TRichEdit *Rich1) { Rich1->Lines->SaveToFile (DateiName); } // dann beim Aufruf void __fastcall TForm1::Speichern1Click(TObject *Sender) { if (SaveDialog1->Execute()) { String Kennung = UpperCase (ExtractFileExt (OpenDialog1->FileName)); if (Kennung == ".RTF") Rich1->PlainText = false; else Rich1->PlainText = true; Word1->PutText (SaveDialog1->FileName, RichEdit1); } }
oder mit Flagübergabe
void __fastcall TWord::PutText (String DateiName, TRichEdit *Rich1, bool plain) { Rich1->PlainText = plain; Rich1->Lines->SaveToFile (DateiName); } // dann beim Aufruf void __fastcall TForm1::Speichern1Click(TObject *Sender) { if (SaveDialog1->Execute()) { String Kennung = UpperCase (ExtractFileExt (OpenDialog1->FileName)); bool plain = Kennung != ".RTF"; Word1->PutText (SaveDialog1->FileName, RichEdit1, plain); } }