2 Stimmen

TDrawGrid OnSetEditText feuert zweimal + Inplace Editors + TCustomGrid

Ich habe (in D2010) ein TDrawGrid auf meinem Formular. Im Umgang mit meinem OnDrawCell, OnSetEditText, OnSetEditText etc alls gfine dort.

Wenn Sie jedoch in eine Zelle gehen, die Text enthält, markieren Sie den gesamten Text und geben dann ein zu ersetzendes Zeichen ein. Jetzt wird das OnSetEditText-Ereignis zweimal hintereinander von einem Tastendruck ausgelöst, zuerst mit einer leeren Zeichenfolge, dann wieder mit einer Zeichenfolge, die das eingegebene Zeichen enthält. Ist dies korrekt oder ein Fehler? Ich hätte erwartet, dass das Ereignis nur einmal mit der Zeichenfolge ausgelöst wird, die mein einzelnes eingegebenes Zeichen enthält.

Ich verwende OnSetEdit Text, um andere Klasseneigenschaften zu setzen, die Sachen wie Validierung tut, so dass, wenn die oben genannte Situation meinen anderen Code verursacht, um zu betrachten, vorübergehend meine Klasseneigenschaften ungültig zu sein, bevor sofort wieder auf gültig auf die 2.

Da wir gerade beim Thema Gitter sind, möchte ich euch um hilfreiche Tipps für die folgenden Dinge bitten. Ich bin ziemlich neu in deplhi von c# (ich gehe den anderen Weg!), aber Im finden die Dokumente ziemlich dünn auf dem Boden, und bin immer überraschend begrenzte Ergebnisse googeln für Dinge, so dass Ihre Hilfe wirklich geschätzt wird.

1) Benutzerdefinierte Inplace-Editoren für TDrawGrid - alle Tipps oder gute Links geschätzt! 2) Für custome Inplace-Editoren, bin ich besser mit TDrawGrid oder absteigend meine eigene Kontrolle von TCustomGrid und gehen von dort? 3) TCustomGrid. Ich komme hier nicht weiter... Wenn ich eine neue Komponente erstelle und von TCustomGrid absteige, erhalte ich nur einen "abstrakten Fehler", wenn ich es in mein Formular einfüge. Daher weitere Experimente ist sehr viel canclled - ein Rat auf gerade sogar mit TCustomGrid begonnen geschätzt!

Mein Plan ist es, zuerst Comboboxen (im virtuellen Modus) als Zell-Editoren zu arbeiten. Das ist ein Standard-VCL-Steuerelement. Danach habe ich vor, mein eigenes Steuerelement auf der Grundlage einer virtuellen Combobox zu erstellen, aber mit einer Suche Sache an der Spitze, um die Liste nach unten zu filtern (ein bisschen wie in der Delphi IDE Tool-Palette), und verwenden Sie diese Komponente als inlace-Editor, wenn möglich. Im ein ziemlich weit weg, dass im Moment! Vielen Dank an alle

Bearbeiten: Remy - Hier sind meine beiden Aufrufstapel von Schnabelpunkt in OnSetEditText. Links ist der erste Aufruf mit der leeren Zeichenkette, rechts der zweite Aufruf mit dem korrekten Zeichenkettenwert. Die 5 abgeschnittenen Zeilen in der Mitte sind alle Verweise auf comctl32.dll in beiden. Ty.

Klicken Sie hier für die Anrufliste

2voto

Remy Lebeau Punkte 498719

El OnSetEditText Ereignis wird immer dann ausgelöst, wenn der Inhalt des Inplace-Editors aus irgendeinem Grund aktualisiert wird, wenn ein Dropdown-Editor geschlossen wird, nachdem ein anderer Wert ausgewählt wurde, wenn auf einen Dropdown-Editor doppelgeklickt wird, oder wenn die RestoreContents() Methode aufgerufen wird. Sie erhalten also sehr wahrscheinlich mehrere Aktionen, die den Editor nacheinander aktualisieren. Ich schlage vor, Sie setzen einen Haltepunkt innerhalb der TCustomDrawGrid.SetEditText() Methode und sehen Sie, wie der Aufrufstapel jedes Mal aussieht, wenn das Ereignis ausgelöst wird.

Zu Nr. 2: Es spielt keine Rolle, wovon Sie sich ableiten. Jeder TCustomGrid-Nachkomme kann einen eigenen Inplace-Editor haben. Überschreiben Sie einfach die virtuelle CreateEditor() Methode.

In Bezug auf # 3, wenn Sie einen abstrct Fehler erhalten, wenn von TCustomGrid direkt ableiten, dann haben Sie nicht override seine abstrakten Methoden korrekt.

Ein Grid unterstützt bereits von Haus aus einen Dropdown-Editor, der eine Combobox imitiert. Sehen Sie sich die TInplaceEditList Klasse. Sie können die OnGetPickListItems Ereignis, um den Editor mit Werten zu füllen. Sehen Sie sich auch an, wie TValueListEditor implementiert seine benutzerdefinierten Editoren.

-1voto

mg30rg Punkte 1311

Über "abstrakte Fehler" :

Unter Delphi Die Ursache für einen "abstrakten Fehler" ist die Tatsache, dass Sie versuchen, eine Klasse mit einer nicht überschriebenen Eigenschaft zu instanziieren virtual abstract Methode. Wenn Sie solche Fehler sehen, sollten Sie sich die Definitionen des übergeordneten Objekts ansehen ( TCustomGrid in diesem Fall), um zu sehen, welche seiner Methoden virtual abstract dann sollten Sie override diese Funktion in Ihrer Nachfolgeklasse.

Beachten Sie, dass Sie in Delphi (leider) nur die Funktionen überschreiben müssen, die aufgerufen werden Daher kennen viele Programmierer nicht einmal die Ursache für das genannte Verhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X