Programmieren mit C++

Visual C++

ListView Control

Navigation in den Zeilen einer CList Control per Tastatur und Maus

Aus einer Datenbank sollen eine variable Anzahl von Felder editierbar sein, indem ein Label sowie der Feldname gefolgt von einer Editbox angezeigt werden, in der die Daten eingegeben werden sollen. Die Felder können dabei durchaus untereinander stehen. Wie geht man sinnvollerweise vor?

Frage

Als ein möglicher Lösungsansatz kann eine CListCtrl erzeugt werden, die in zwei Spalten den Feldnamen und Feldwert abbildet.

Hier kann zum einen mit Kanonen auf Spatzen geschossen werden, da Untereinträge problemlos editierbar gemacht werden können. Da jedoch nur ein Eintrag pro Zeile editiert werden muß, ist es sinnvoller, die Liste bezüglich der Spalten zu sortieren, so daß der zu editierende Eintrag in der zweiten Spalte zu liegen kommt. Dazu reicht der nachfolgende Code aus:

int aiCol[2] = { 1, 0 };
m_List.SetColumnOrderArray (2, aiCol);

Etwas problematischer wird es, wenn der Anwender in der Lage sein soll, mittels Tabulator- und Pfeil-Tasten durch die Felder zu blättern. Dies liegt primär daran, daß die CListCtrl ihre eigenen Editboxen für zu editierende Einträge erzeugt und dadurch alle Tastatureingaben schluckt.

Da es nicht unbedingt wünschenswert ist, eine eigene Editbox zu zeichnen und zu verwalten, kommt als Ausweg in Frage, eine von CEdit abgeleitete Klasse zu erzeugen und für die von der CListCtrl erzeugte Editbox Subclassing anzuwenden.

Für das Subclassing der Edit Cotrol mit einer eigenen Edit Control m_Edit sind zwei wesentliche Arbeitsschritte erforderlich.

Innerhalb der Nachrichtenbehandlung für das Ereignis LVN_BEGINLABELEDIT ist der nachfolgende Code einzufügen:

HWND hWnd = (HWND)SendMessage (LVM_GETEDITCONTROL);
ASSERT (hWnd != NULL);
 
if (m_Edit.m_hWnd != 0)
  m_Edit.DestroyWindow ();
 
VERIFY (m_Edit.SubclassWindow (hWnd));

In der Ereignisbehandlung der Nachricht LVN_ENDLABELEDIT ist analog der bereinigende Code

if (m_Edit.m_hWnd)
  VERIFY(m_Edit.UnsubclassWindow () != NULL);

einzusetzen, um das Subclassing zu beenden.

Anschließend kann über die eigene m_Edit Klasse ein Messagehandler verwendet werden, um das KeyDown-Ereignis abzufangen und bezüglich der auszuwerten. Liegt eine Tabulator- bzw. Pfeil-Taste an, kann das Editieren des nächsten bzw. vorherigen Eintrags veranlaßt werden.

Lösung





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:47:40 von textarchiv.alojado.de