Probleme mit CListCtrl
-
Ich kann mir nicht vorstellen, dass es sich dabei um einen Bug handelt, dafür gibt's die MFC einfach schon zulange, daher würde ich mich freuen, wenn mir mal jemand auf die Sprünge hilft, wo ich meinen Denkfehler hab.

Ich bin gerade dabei, ein kleines Tool zu programmieren, das einfach nur eine stinknormale Ascii-Textdatei (diese enthält einen Eintrag, in diesem Fall ein Mannschaftsname, pro Zeile) einliest und deren Einträge in einem CListCtrl mit Nummerierung auflistet. Also eine Zeile in der Datei gleich Zeilennummer (1. Spalte) + Eintrag aus Datei (2. Spalte) im CListCtrl.
Erst hatte ich ohne Probleme die Numerierung ausgeben können, allerdings kamen die Einträge nicht dazu, erst nachdem ich die Datei ein zweites Mal ins ListCtrl geladen habe, ohne es vorher zu löschen. Und da ist mir der Fehler aufgefallen. Hier erstmal der aktuelle Code:
//Aufbau Liste aus OnInitDialog m_pList= (CListCtrl*) GetDlgItem(IDC_LIST); m_pList->InsertColumn(0,"Nr.",LVCFMT_LEFT,30); m_pList->InsertColumn(1,"Mannschaft",LVCFMT_LEFT, 130);if (file.Open(dlg.GetPathName(),CFile::modeRead)){ while(file.ReadString(line)){ nListElem = m_pList->GetItemCount()+1; pos.Format("%3d", nListElem); m_pList->InsertItem(nListElem, pos); //Position m_pList->SetItemText(nListElem-1, 1, line); //Mannschaft } }Warum muss ich nun beim SetItemText nListElem**-1** nutzen? Es müsste sich doch um dieselbe Zeile wie beim InsertItem handeln... Laut Definition der Methoden ist der Parameter auch immer die Zeile...
int InsertItem(int nItem, LPCTSTR lpszItem );
nItem
Specifies the index of the item to be inserted.BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );
nItem
Index of the item whose text is to be set.Würd mich freuen, wenn mir da mal einer auf die Sprünge helfen könnte.
Desweiteren würd ich gerne auf Mouseklick die zweite Spalte bearbeiten, hab dazu aber trotz vielen Suchens noch nix gefunden. Hat dafür auch mal jemand bitte eine Anregung? Falls da ein Event für zuständig ist, könnte das ja fast schon reichen, dann würd ich mich mal dran probieren.
Vielen Dank schonmal...

-
Warum denn
m_pList->SetItemText(nListElem-1, 1, line); //MannschaftDas ist irgendwie sinnfrei. Aber ich nehm an, dass du schon probiert hast, das "-1" einfach mal zu entfernen. Bi mir gehts so wunderbar (also ohne "-1").
-
Welches VC nutzt du?
Beim VC6 gibt es einen Service Pack 6.
Evtl. wars doch ein Fehler. 
-
is doch logisch das du -1 machen musst, da du ja mit
nListElem = m_pList->GetItemCount()+1; // +1gearbeitet hast
in einer CListCtrl ist element 1 wie in einem array 0
-
@Uruk: Genau das wundert mich ja auch. Aber das ging nur so. Ich hatte es natürlich zuerst ohne die -1 probiert, da es sich ja beim InsertItem und SetItemText um dieselbe Zeile handeln sollte...
@Mr. Evil: Nee damit hat das rein gar nix zu tun, das ist nur, um die aktuelle Anzahl an Beiträgen rauszufinden und ich will nicht mit 0 bei der Numerierung anfangen.
@estartu: Das könnte eine Lösung sein, ich hab es hier mit dem MS VC 6.0 probiert... ich teste es mal in einer späteren Version...
-
Knaecke schrieb:
Nee damit hat das rein gar nix zu tun,...
Dann sagst du aber, er soll das erste Element an Stelle 1 einfügen. Was ist dann an Stelle 0 (bei der die Zählweise startet) ?
Oder andersrum:
deine Liste enthält ein einziges Element an zweiter Stelle ?!?
-
Knaecke schrieb:
@Mr. Evil: Nee damit hat das rein gar nix zu tun, das ist nur, um die aktuelle Anzahl an Beiträgen rauszufinden und ich will nicht mit 0 bei der Numerierung anfangen.
Du willst vielleicht nicht - aber das CListCtrl fängt bei Null an mit der Zählung.
-
Hab hier mal nen hilfreichen link ausgegraben...
http://www.coding-help.de/listenelement.html
-
CStoll schrieb:
Knaecke schrieb:
@Mr. Evil: Nee damit hat das rein gar nix zu tun, das ist nur, um die aktuelle Anzahl an Beiträgen rauszufinden und ich will nicht mit 0 bei der Numerierung anfangen.
Du willst vielleicht nicht - aber das CListCtrl fängt bei Null an mit der Zählung.
Oh stimmt, hatte ich trotz mehrfachem Lesen übersehen.

Mich hatten einfach nur die unterschiedlichen Idizes in Zeile 7 und 8 iritiert.
-
Apropo Zeile 7 und 8...muss das dann nicht in beiden "-1" sein????
-
CStoll schrieb:
Knaecke schrieb:
@Mr. Evil: Nee damit hat das rein gar nix zu tun, das ist nur, um die aktuelle Anzahl an Beiträgen rauszufinden und ich will nicht mit 0 bei der Numerierung anfangen.
Du willst vielleicht nicht - aber das CListCtrl fängt bei Null an mit der Zählung.
Ok das war der Fehler *g* Dann entschuldige ich mich auch mal bei Mr Evil

Ich hab's nun abgeändert und die 1 nur beim String der Position addiert. Nun geht es. Danke für die schnelle Hilfe. (Mit dem 2003er Studio ging's übrigens auch nicht
)while(file.ReadString(line)){ nListElem = m_pList->GetItemCount(); pos.Format("%3d", nListElem+1); m_pList->InsertItem(nListElem, pos); //Position m_pList->SetItemText(nListElem, 1, line); //Eintrag }Nun hab ich aber noch das Problem, das ich gern die Einträge in der 2. Spalte bearbeiten möchte, das geht bisher aber default-mäßig nur mit der ersten, die zweite kann ich nicht mal markieren. Hat da einer einen Vorschlag? Da muss es doch irgendein Event geben... *such*
-
Knaecke schrieb:
die zweite kann ich nicht mal markieren. Hat da einer einen Vorschlag?
// Immer die gesamte Zeile auswählen SendDlgItemMessage(IDC_LSC_ERGEBNISSE, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);...oder in der FAQ.

Wegen dem Editieren kann ich dir nur Codeproject ans Herz legen: http://www.codeproject.com/listctrl/
-
*mitsucht*
m_pList->SetExtendedStyle(LVS_EX_FULLROWSELECT);
-
Hm für's Markieren war schon der Link von Uruk ganz hilfreich, aber zum editieren werd ich mir mal den anderen anschauen. Wenn's ein brauchbares Ergebnis gibt, werd ich das mal hier posten, falls später mal noch einer danach sucht

Danke nochmal für die Links. Wenn man selbst sucht findet man irgendwie immer nur die falschen Links bei sowas

EDIT: Hm der Link bei Codeproject ist gut, endlich mal was ausführliches. Sowas hab ich lange gesucht und nie gefunden. Da kann ich wahrscheinlich sogar mehr aus meinem kleinen Tool machen als geplant war

nochmal EDIT: Hab es nun doch anders gelöst, ohne direktes Editieren, daher hab ich doch leider keine Lösung
Damit kann das Thema eigentlich geschlossen werden.