2009-07-23 22 views
0

Ich programmiere einen einfachen Texteditor mit Windows Forms. Wie in vielen Editoren zeigt die Titelleiste bei der Änderung des Textes ein Sternchen neben dem Titel an und zeigt an, dass noch nicht gespeicherte Arbeit vorhanden ist. Wenn der Benutzer speichert, geht das weg.Wie erkennt man den vorherigen Zustand des Textfelds in C#?

Es gibt jedoch ein Problem. Dies wird im Änderungsereignis des Haupttextfeldes behandelt. Aber dies wird auch aufgerufen, wenn eine Datei geöffnet wird oder der Benutzer "Neue Datei" auswählt, so dass das Programm sagt, dass es nicht gespeicherte Änderungen gibt, wenn Sie den Editor öffnen und dann eine Datei öffnen. Was ist eine mögliche Lösung?

Ich dachte an eine globale Variable, die besagt, ob der Text so geändert wurde, dass er nicht das Sternchen auslöst, aber es muss einen besseren Weg geben.

Antwort

1

vor Laden von Daten in eine Textbox, unassociate zuerst die Eventhandler für den Wandel

uxName.TextChanged -= uxName_TextChanged;  

uxName.Text = File.ReadAllText("something.txt"); 

uxName.TextChanged += uxName_TextChanged; 
0

In C# sind keine globalen Variablen vorhanden. Sie sollten eine solche Variable als Instanzvariable in Ihrem Formular haben (oder besser noch in einem Modell, für das Ihr Formular eine Ansicht ist), und das ist völlig in Ordnung.

+0

Das ist nicht wirklich genau. Sie können eine statische Klasse erstellen und dieser Klasse statische Variablen hinzufügen. Boom, globale Variablen. – jasonh

+0

Statische Variablen sind nicht global. Sie sind, naja, statisch. Ich weiß, das ist etwas pedantisch, aber ich finde es am besten, mit Begriffen genau zu sein. –

+0

Entschuldigung, ich meinte eine Instanzvariable des Formulars. Aber ich mag diese Lösung immer noch nicht. – Javier

1

Dies ist eine schreckliche Lösung, aber jedes Mal, wenn das Ereignis Textänderung ausgelöst wird, vergleichen Sie den Wert des Textfelds mit einer Variablen, und wenn sie unterschiedlich sind, speichern Sie den Inhalt in der Textbox in einer Variablen und fügen Sie das Sternchen hinzu. Wenn die Methode über den Dialog Neue Datei oder ein anderes Ereignis, das den Text NICHT ändert, aufgerufen wird, wird das Sternchen nicht angezeigt.

Dies ist keine praktikable Lösung für einen echten Texteditor, da der Speicher selbst bei mittelgroßen Dateien schnell außer Kontrolle gerät. Die Verwendung eines Fingerbaums oder einer anderen Datenstruktur, die Texteditoren verwenden, um "Versionen" des Textes zu vergleichen, ist die einzige wirklich effiziente Lösung, aber die Prämisse ist dieselbe.

http://scienceblogs.com/goodmath/2009/05/finally_finger_trees.php

Unter dem zweiten Bild erwähnt er die Verwendung von Fingern Bäume in Texteditoren eine extrem billig zu implementieren „Undo“ -Funktion, aber ich bin sicher, dass Sie die Gültigkeit des Baumes für Ihr Problem sehen können, wie Gut.

+0

Nichts für ungut oder irgendetwas, aber das scheint wie Overkill für das, was ich versuche zu tun. – Javier

+2

Nun, es scheint, als ob Sie einen Texteditor zum Spaß programmieren. Eine coole Datenstruktur wie ein Fingerbaum zu implementieren ist ziemlich cool IMO. – goldenratio

0

Dies ist eine sehr einfache und dumme Lösung. Ich würde dafür ein MVP-Designmuster verwenden, aber hier die schnellste und einfachste Lösung:

Verwandte Themen