Speichernproblem mit Memo+RichEdit in Datei
-
Hallo,
ich habe folgendes Problem.
Wenn ich den unten beschr. Code verwende um eine Datei zu füllen werden die Mem->Lines->Insert... angehängt. Was heißen soll, dass sie dann mehrmals, genau so oft wie man auf speichern geklickt hat in der Datei auftauchen. Sie sollen allerdings nur einmal in der Datei auftauchen.Die Auswirkung ist sogar so, dass der Part Mem=MemoSave nur einmal auftaucht, aber alles ab Mem->Lines->Insert(Mem->Lines->Count, FileType + " " + FileName); in der Datei nicht nur wiederholt wird, sondern sogar nur die aktuelle Version der RichEditFelder enthält!
Ich hätte eigentlich gedacht, dass wenn ich den Inhalt von Memo1 Mem zuweise ( Mem=Memo1; ), Mem dann nur das enthält und die count Funktion bei Mem->Lines... quasi genau nur die Zeilen von Memo1 durchzählt, welches ja nun Inhalt von Mem ist.void __fastcall TFormMain::SavePrepare() { Mem = [b]new[/b] TMemo(FormMain); Mem = MemoSave; //Memo1 contains Header FileType = Page->Caption; //Type of File FileName.Delete(FileName.Pos('.'), FileName.Length()); //extract File Name Mem->Lines->Insert(Mem->Lines->Count, FileType + " " + FileName); Mem->Lines->Insert(Mem->Lines->Count, (RichEdit1->Text)); Mem->Lines->Insert(Mem->Lines->Count, (RichEdit2->Text)); //Zusammenfügen aller Daten in ein Memo (Mem) zum Dateischreiben } //--------------------------------------------------------------------------- void __fastcall TFormMain::Speichernunter1Click(TObject *Sender) { if (SaveDialog1->Execute()) { FileName = ExtractFileName(SaveDialog1->FileName); //get FileName from User Input SavePrepare(); Mem->Lines->SaveToFile(SaveDialog1->FileName); //write File } else FileName = "untitled"; //Aufrufart um Dateinamen von der Usereingabe zu erhalten, für die Verarbeitung in SavePrepare() }Auswirkung inder Datei bspw.:
"Inhalt von MemoSave" "Inhalt vom ersten Mem->Lines... erste Version" "Inhalt vom zweiten Mem->Lines... erste Version" "Inhalt vom dritten Mem->Lines... erste Version" "Inhalt vom ersten Mem->Lines... neuere Version" "Inhalt vom zweiten Mem->Lines... neuere Version" "Inhalt vom dritten Mem->Lines... neuere Version" "Inhalt vom ersten Mem->Lines... weitere Version" "Inhalt vom zweiten Mem->Lines... weitere Version" "Inhalt vom dritten Mem->Lines... weitere Version" . . .usw. also wie man vlt. sieht werden die veränderten oder auch nicht veränderten Versionen der Mem->Lines... immer wieder angehängt.
Genau das möchte ich aber nicht!Übrigens funktioniert ein
[b]delete[/b] Mem;im "Speichernunter1Click" nicht... Ich würde den Speicherbereich aber doch gern wider freigeben, wenn möglich.
MfG M

-
[cpp]void __fastcall TFormMain::SavePrepare(*TStringList tmpList)
{
tmpList->Clear();
tmpList->Add(FileType + " " + FileName);
tmpList->Add(RichEdit1->Text);
tmpList->Add(RichEdit2->Text);
}//---------------------------------------------------------------------------
void __fastcall TFormMain::Speichernunter1Click(TObject *Sender)
{
FileType = Page->Caption; //Type of File
FileName.Delete(FileName.Pos('.'), FileName.Length()); //extract File Name
if (SaveDialog1->Execute()) {
FileName = ExtractFileName(SaveDialog1->FileName); //get FileName from User InputTStringList *list = new TStringList();
SavePrepare(list);
list->SaveToFile(SaveDialog1->FileName); //write File
delete list;
}
else FileName = "untitled";
} [/cpp]
-
Hallo
Mem = new TMemo(FormMain); Mem = MemoSave;Das wird nichts. Denn statt dem Inhalt des Memos wird die Speicheradresse kopiert. Damit hast du dann zwei Zeiger auf ein realles Memo und ein totes Memo.
Du willst sicherMem = new TMemo(NULL); Mem->Lines->Assign(MemoSave->Lines);Dann sollte das delete auch funktionieren.
/Edit : Aha, Jansen hats gleich komplett umgeschrieben.
bis bald
akari
-
Warum nutzt du nicht einfach TStringList?
Ich denke das eigentliche Problem ist die Zeile
Mem = MemoSave;in SavePrepare().
Du erzeugst zwar immer ein neues Memo, dirigierst aber den entsprechenden Zeiger sofort wieder um, so dass alles in MemoSave geschrieben wird. Und wenn du dessen Inhalt nicht löschst, doppeln sich die Einträge.
Außerdem bekommst du so ein massives Speicherleck...
/Edit: Manchmal habe ich das Gefühl, ihr macht das mit Absicht...
-
Ach Gott ja C++, mein Leidensweg.
Ich danke euch für die fixe Hilfe!
Deinen Code Jansen, werde ich gleich mal ausprobieren.
An eine StringList hatte ich auch schon gedacht, nachdem ich schon für ein andrees Problem zu einem Thread hier gelengt wurde mit StringListen.Mit Absicht würde ich nicht sagen, nur aus Unfähigkeit...

MfG M
-
Dein Code Jansen war genau der richtige Anstoß

Allerdings muss es heißen:[cpp]
void __fastcall TFormMain::Speichernunter1Click(TObject *Sender)
{
FileType = Page->Caption; //Type of File
if (SaveDialog1->Execute()) {
FileName = ExtractFileName(SaveDialog1->FileName); //get FileName from UserInput
FileName.Delete(FileName.Pos('.'), FileName.Length()); //extract File NameTStringList *list = new TStringList();
SavePrepare(list);
list->SaveToFile(SaveDialog1->FileName); //write File
delete list;
}
else FileName = "untitled";
} [/cpp]Sonst wird beim Dateinamen nicht die Endung abgeschnitten.
Wie gesagt, DANKE.
-
Eine Frage hätte ich aber noch dazu.
Wie kann ich in der StringListe ohne eine Leerzeile etwas anfügen. Mit der Add Funktion erhalte ich jeweils eine Leerzeile zwischen den RichEdits und zw. Memo und RichEdit.
Ich habe es schon mit Inser versucht und die Länge der Liste mit Count ermittelt, aber wenn ich da verusche über Count eine Position fest zulegen "tmpStrList->Count+3" erhalte ich nur den Fehler Maximum oder minimum überschritten.MfG M
-
Hallo
Add() fügt keine Leerzeile hinzu, sondern einen Zeilenumbruch. Die Leerzeile muß aus deinen Daten kommen.
bis bald
akari
-
macsmac schrieb:
Mit Absicht würde ich nicht sagen, nur aus Unfähigkeit...

War auch nicht auf dich bezogen, sondern auf diejenigen, die es immer wieder schaffen eine halbe Sekunde vor mir zu posten...
-
Aso, ja das ist sicher mit Absicht

Also das Problem mit der Leerzeile habe ich nun gelöst.
Ich habe das MemoSave pertmpList->AddStrings(MemoSave->Lines);eingelesen. wird es als ..(MomoSave->Text); in die Strinliste geschrieben wird es als ein eniziger String behandelt. Das steht natürlich nirgens in der BCB Hilfe... Da wird dann wohl ein \n mitgelesen, was das Ende vom Memofeld signalisiert, obwohl doch da besser ein \0 stehen sollte oder? Na nun ist's auch egal.
MfG M
-
Ha, ich habe doch noch ein Problem. Vermutlich ist es trivial.
Meine RichEdits liegen auf TabSheets einer PageControl, deren TabSheets wärend der Laufzeit erzeugt werden.
Beim speichern soll natürlich der Inahlt der RichEdits in eine Datei gespeichert werden, deren TabSheet gerade aktiv ist.
Wie kann ich das RichEdit Feld der gerade aktuellen Page auswählen?
ich habe schon mit PageControl->ActivePage usw. rumprobiert, bekomme aber nur Fehlermeldungen.Der Thread zum PageControl/TabSheet Thema auf das ich mcih beziehe ist hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-108024.htmlMfG M
-
Moin, moin!
Ist die Nuss zu schwer zu knacken oder ist es zu einfach, dass keine antwortet?

Ich habe mir auch schon überlegt meine neu angelegten RichEdits in ein dynamisches Feld zu packen. Dynamisch, weil es es ja so viele TabSheets mit drauf platzierten RichEdits auf der PageControl geben kann, wie der Anwender es wünscht. Allerdings weiß ich da noch nicht wie ich an die Sache rangehen soll.
Prinzipiell müsste ich ja jedesmal das Feld um die hinzukomenden RichEdits vergrößern, wenn der Anwender auf "Neue Seite einfügen" klickt und das Feld genauso verkleinern, wenn der Anwender das TabSheet schließt. Das ist natürlich etwas aufwendig, daher wäre mit eine Lösung, wei ich so an die RichEdits rankomme lieber.Falls doch noch jemdand hier liest und nicht weiß wie ich es meine würde ich den Quzelltext auch per E-mail zur Ansicht verschicken.
MfG Martin
-
macsmac schrieb:
Wie kann ich das RichEdit Feld der gerade aktuellen Page auswählen?
Durch das Controls-Array der ActivePage iterieren und nach TRichEdit casten. Siehe FAQ, "Komponenten - Zugriff nicht über Namen".
PS.
In Zukunft bitte die Faustregel beachten: ein Thema pro Thread, ein Thread pro Thema. Danke!