CListCtrl::SetItemText probleme
-
Hi,
ein paar Treahds weiter unten hab ich den Tip bekommen wie man eine CListCtrl "spaltenweise" beschreiben kann (nämlich mit SetItemText()). Ich muss aber eine andere CListCtrl-Klasse (MeineListCtrl) benutzten die von der CListCtrl abgeleitet ist. Das Problem ist aber, das die überschriebene SetItemText-fkt von MeineListCtrl nicht funktioniert (Unbehandelte Ausnahme int test.exe: 0xC0000005: Access Violation).
Also dachte ich mir (so ausgefuchst wie ich doch bin) benutzte mal die Funktion der Basisklasse. Das wär dann ja:
m_List.CListCtrl::SetItemText(zeile,spalte,Eintrag[i]);
Das funktioniert ja auch, allerdings lassen sich so die erstellten Einträge nicht wieder Löschen (z.B. DeleteAllItems), auch nicht wenn ich CListCtrl::DeleteAllItems() benutzte. Das führt dann wieder zu neuen Abstürzen.
Durch rumprobieren mit dem Debugger weis ich, das der belegte speicher nicht freigegeben werden kann...
kann mir jemand sagen wie ich die Spalten "sicher" Löschen kann?
-
Zeig doch mal die SetItemTExt Funktion. Vielleicht kann man dort ja was hinbiegen.
-
Diese Abgeleitete Klasse hab ich aber nicht selbst geschrieben
BOOL CSortListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText) { if( !CListCtrl::SetItemText( nItem, nSubItem, lpszText ) ) return FALSE; LPTSTR* arrpsz = GetTextArray( nItem ); LPTSTR pszText = arrpsz[ nSubItem ]; delete[] pszText; pszText = new TCHAR[ lstrlen( lpszText ) + 1 ]; (void)lstrcpy( pszText, lpszText ); arrpsz[ nSubItem ] = pszText; return TRUE; }
-
Ach, das SortListCtrl - das verwende ich auch.
Wenn er die Access Violation meldet, zeigt er dann auch, wo es gekracht hat? Zeig doch mal. Und mach nen Pfeil (//<---) an die Zeile, wo der grüne Pfeil vom Debugger steht.
Das Problem mit dem Löschen entsteht bestimmt, weil er sich das nicht in sein internes Array kopieren kann (du arbeitest ja an der Klasse vorbei).
Also, ruf mal nicht die Basisklasse auf und zeig wo es kracht.
-
also der Debugger zeigt nicht in die SetItemText Funktion, sondern in die ShowWindow() funktion.
BOOL CWnd::ShowWindow(int nCmdShow) { ASSERT(::IsWindow(m_hWnd)); //<--- hier if (m_pCtrlSite == NULL) return ::ShowWindow(m_hWnd, nCmdShow); else return m_pCtrlSite->ShowWindow(nCmdShow); //<--- hier kommt dann //eine unbehandelte ausnahme }
-
Die hab ich hier nicht.
Die einzige Stelle, wo die Zeile mit dem Pfeil bei mir vorkommt, liegt in der Funktion FreeItemMemory vom SortListCtrl.
Das ist doch das Control von Codeproject, oder?
-
Ahh was schreib ich denn da für einen mist! Das liegt daran das zu jeder Spalte ein EditFeld angezeigt wird. Und beim neuladen, müssten zuerst die spalten gelöscht werden (somit werden 0 Edifelder angezeigt) und dann wieder hinzugefügt werden (anzahl der Editfelder = anzahl der spalten). Aber das geschiet nicht. Wenn ich 3 mal neulade dann hab ich 12 Editfelder auf meinem Dialog (
) beim 4. mal gibts den Crash weil kein "platz mehr" zum anzeigen ist.
Also liegt es daran das die Spalten nicht wirklich gelöscht werden können
-
estartu_de schrieb:
Die hab ich hier nicht.
Die einzige Stelle, wo die Zeile mit dem Pfeil bei mir vorkommt, liegt in der Funktion FreeItemMemory vom SortListCtrl.Ja genau, mit FreeItemMemory hab ich auch was gehabt. Ich denke mal das es daran liegt...
void CSortListCtrl::FreeItemMemory(const int iItem) { ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( iItem ) ); LPTSTR* arrpsz = pid->arrpsz; //<------- hier der pfeil for( int i = 0; i < m_iNumColumns; i++ ) delete[] arrpsz[ i ]; delete[] arrpsz; delete pid; VERIFY( CListCtrl::SetItemData( iItem, NULL ) ); }
-
Sorry, das wird per "Ferndiagnose" zu komplex. Damit würde ich ja schon meine Probleme haben, wenn ich den Code hier hätte.
Wenn du die Edits anlegst, gibst du sie dem Control bekannt? Wenn nicht, kann es die ja kaum löschen. Schlimmstenfalls musst du an dem Control ändern.
-
hm glaub ich auch...
die anzahl der benötigten EditFelder lese ich einfach mit
int count = m_Liste.GetColumnCount();
aus.
Trozdem danke für deine hilfe
-
Wie wäre es mit folgendem:
Möglichkeit 1: Du legst normale Edits an, deren Größe du daynamisch anpasst. Quellcode kann ich dir geben, mache ich so.
Möglichkeit 2: Du gibst die Zeiger auf die Edits dem Listctrl und das löscht die dann bei bedarf.