Eingabetabellen wie in Excel

DonCube

Mitglied
Guten morgen,
eine kurze Frage. Gibt es in MFC die Möglichkeit zur Erstellung von "Eingababellen"?
Ähnlich die in Excel. Ich habe ein Programm mit mehreren hundert Eingabewerten die
Vorzugsweise aus einer Exceltabelle kopiert werden, oder halt von Hand eingegeben werden.

Nun erscheint es mir aber etwas müselig ca. 150 Edit Boxen zu machen. Ausserdem
ist dann die Eingabe nicht so komfortabel.

Ich habe schon die Möglichkeit angedacht es über ein benutzerdefiniertes Steuerelement
zu machen. Allerdings hat sich mir die Möglichkeit der Gestaltung eines jenen nicht sofort erschlossen.
 
Hi,

verwende das CListCtrl.

Dieses Control kommt einer Tabelle am nähesten (Stil LVS_REPORT!!).

Standardmäßig hast du aber keine Eingabemöglichkeit bei diesem Control.

Das musst du dann entweder schon selbst programmieren oder schau bei http://www.codeguru.com, ob ein solches Control schon von jemanden geschrieben wurde.

Falls du es selbst coden möchtest, leitest du deine Klasse von CListCtrl ab.

Halte dir ein CEdit Objekt in deiner Klasse und positioniere es bei einem Mausklick genau auf die Tabellenzelle, auf die geklickt wurde. Dann setzt du noch den Fokus auf dieses CEdit.

Du leitest dieses InplaceEdit Control von CEdit ab (z.B. CInplaceEdit), in welchem du auf WM_KILLFOCUS und WM_KEYDOWN (Enter-Taste) reagierst. Schicke der Tabelle eine selbstdefinierte Message wie z.B. WM_INPLACE_EDIT STOPPED.

Die Message definierst du wie folgt:

#define WM_INPLACE_EDIT_STOPPED WM_USER +1

Auf diese Message reagierst du dann in deiner WindowProc.

Code:
LRESULT MyList::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {

    switch(message) {
        case WM_INPLACE_EDIT_STOPPED:
            // Ermittle den text aus deinem Edit Control
            CString txt;
            m_pInplaceEdit->GetWindowText(txt);
            // Setze diesen Text in deiner Tabellenzelle
            SetItemText(reihe, spalte, txt);
            // Lass das InplaceEdit-Control verschwinden
            m_pInplaceEdit->ShowWindow(SW_HIDE);

Wenn du aus Excel die Sachen kopieren und in deine Tabelle einfügen möchtest, musst du bei den entsprechenden Events das Clipboard auslesen und die Einfügeoperationen ebenfalls selbst coden.

Der Inhalte des Clipboards (Clipboardformat CF_TEXT)sieht bei einer Kopieroperation dann so aus:

<WertZeile1Zelle1>\t<WertZeile1Zelle2>\t<WertZeile1Zelle3>\n<WertZeile2Zelle1>\t<WertZeile2Zelle2>\t<WertZeile2Zelle3>

u.s.w.

Denke, das sind genug Anregungen um deine Ziele zu erfüllen.

Viel Erfolg,

Peter
 
Danke für deine gute Antwort. Hat mir echt geholfen. Habe zunächst selbst ne kleine Lösung gebastelt. Allerdings als ich dann das GridCtrl von Chris Maunder sah, habe ich mich doch dafür entschieden.

Die Arbeit die der da hinein gesteckt hat, kann ich niemals investieren. Dafür reicht die Zeit nicht. Werde also seine eindeutig professionelle Lösung einbauen.


Gruß
DonCube
 
Hi,

ja Zeit ist immer ein sehr gutes argument.

Und der Code vom Chris Maunder ist auch immer sehr sehr gut !

Ich schaue auch oft erstmal, ob jemand mein Problem in irgendeiner Weise gelöst hat.

Allerdings sind die fertigen Controls dann auch oft zu vollgestopft mit Funktionalitäten, welche ich nicht brauche oder haben will.

Dann schreibe ich diese Controls auch schon mal um, was aber deutlich schneller ist, als es komplett neu zu entwickeln.

Viel Spaß noch,

Peter
 

Neue Beiträge

Zurück