Delphi: Wie, um text in TEdit/TMaskEdit ohne aufrufen des onchange-Ereignis
Ich habe ein ziemlich großes setup form, die möchte ich füllen mit Daten aus einer Klasse. also mache ich eine Menge
Edt1.text := ASettings.FirstThing;
Möchte ich vermeiden
Edt1.onchange := nil;
Edt1.text := ASettings.FirstThing;
Edt1.onchange := edt1Onchange;
Wie ändere ich den text in ein Textfeld und umgehen das onchange-Ereignis.
InformationsquelleAutor Peter Turner | 2010-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benutzt habe ich etwas wie die änderung der OnChange-handler, aber mehr oft, ich benutze eine Flagge.
dann
Auch, statt hardcoding das OnChange-die die tatsächliche OnChange-Prozedur, ich würde speichern, das Edit-Steuerelement den aktuellen Wert, dann setzen Sie es (die Arbeit, wenn es nicht gesetzt ist, oder wenn ein anderer Ort hat es geändert, etc.)
Nein. Der Absender der OnChange-Ereignis wird immer TEdit, unabhängig davon, ob der Text vom Benutzer aktualisiert oder programmably. Die VCL-nie legt die Absender-parameter auf null.
InformationsquelleAutor jasonpenny
Soweit ich weiß, wenn das OnChange-Ihr Objekt ist entworfen, um Feuer, wenn die Text-Eigenschaft geändert, Sie haben zu stick mit der Einstellung der Veranstaltung zu null temporär. Mir, ich mache es auf diese Weise (in einem try-finally):
Könnten Sie auch tun, einige Verfahren zu behandeln, das es für Sie:
+1 für die exception-block
InformationsquelleAutor AlexV
Könnten Sie erwägen, ein Objekt zu verwalten, die NIL ' Ing der Veranstaltung und wiederherstellen des zuvor installierten Ereignishandler. Es ist ein wenig gefährlich, anzunehmen, dass das Ereignis wiederhergestellt werden, passiert einfach zu sein, die ihm zur design-Zeit/was haben der "name, der passt" - Sie sollten immer speichern/wiederherstellen der aktuell zugewiesenen handler, nur um sicher zu sein.
Damit würde ein noch mehr re-usable-Dienstprogramm als der SetTextWithoutOnChange () - routine:
In der Nutzung, dies würde folgendermaßen Aussehen:
Für die "Du sollst nicht verwenden 'mit' crowd" - mit allen Mitteln deklarieren sich eine weitere lokale variable, und verwenden Sie, dass, wenn es wird Ihnen helfen, besser schlafen in der Nacht. 🙂
Oder, um es noch bequemer zu bedienen und zu beseitigen "mit", würde ich das machen TSuspendEvent Klasse ein Objekt mit Referenzzählung und wickeln Ihre Verwendung in einer Funktion, ergab eine Referenz zur Benutzeroberfläche Referenz zur es konnte zugelassen werden, um "Leben in scope", wie am Beispiel von meinem AutoFree () - Implementierung. In der Tat könnte man nutzen, AutoFree () - zu verwalten, dies bereits:
Dsabling Ereignisse für eine Periode erstreckt sich über den Rahmen eines einzigen Verfahrens erfordert jedoch mehr Verwaltungsaufwand, als alle Helfer die Dienstprogramme sind wahrscheinlich in der Lage sein werden in einer generischen Mode, die ich denke, zumindest nicht ohne spezifische Mittel für die Wiederherstellung der Ereignisse explizit, anstatt automatisch.
Wenn Sie einfach gewickelt TSuspendEvent innen eigene Schnittstelle nachgeben Funktion, nach dem gleichen Muster wie AutoFree() könnte man vereinfachen, dieses weiter zu:
Als ein letzter Hinweis, ich denke, es sollte ziemlich einfach sein, zu sehen, wie diese können Recht einfach erweitert um Unterstützung für die Aussetzung mehrerer Ereignisse auf einem Objekt in einem einzigen Aufruf, wenn erforderlich, zum Beispiel:
Es ist nicht viel Arbeit, wirklich (es dauerte etwa 3 Minuten, und "AutoFree" dauerte etwa 10 Minuten). Und das Ergebnis ist eine ersparnis, die auch in Zukunft anfallen, über die Lebensdauer der Projekte, in denen Sie dann die Ergebnisse verwenden (der code ist vollständig generisch - kleine 'g').
InformationsquelleAutor Deltics
Ich weiß, das ist eine alte Frage, aber ich dachte, ich möchte hinzufügen, meine Lösung ist nicht mit der komplizierten Verfahren, die in den vorherigen Antworten wenn es hoch kommt, einen anderen suchen.
Das problem ist das onChange-Ereignis selbst. Ich benutze es nicht für text-Felder.
entfernen Sie alle OnChange und verwenden Sie die OnExit statt und binden Sie es an die OnKeyUp.
Alle Änderungen haben einen gemeinsamen Vorfahren TCustomEdit.
Ich in der Regel verwenden Sie eine Methode namens CustomEditKeyUp und zeigen alle änderungen in einem Formular zu diesem einzigen Methode (TEdit, TLabeledEdit usw. usw.)
Aus irgendeinem Grund, das OnExit-ist privat in einem TCustomEdit so der Hack benötigt wird. Wenn Sie wissen, dass die Bearbeitungen sind von einer anderen Strecke, wo die OnExit-ist die öffentlichkeit, die-cast, wenn anders und der Hack ist nicht notwendig.
Dann Für jede Edit-Steuerelement, die Verwendung einer bestimmten OnExit
Wenn Sie möchten, um den Wert zu ändern programmgesteuert, ohne es brennen 'OnExit'
Der große Vorteil für mich ist, dass, wenn ich mich auf die Analyse der Eingaben für sagen eine gültige Zahl ich nur einmal gemacht werden, wenn die Bearbeitung abgeschlossen ist und nicht für jede einzelne backspace, löschen, einfügen etc umgeben von versuchen, sofern es die verschiedene Formatierung-Funktionen Fehler heraus, da Sie nicht verstehen, Leerzeichen etc.. Für die Datenbank etc, die Anzahl der calls deutlich reduziert werden.
Dass ' s meine zwei penneth.
InformationsquelleAutor PhilipO