ListBox gibt den Inhalt nicht korrekt zurück

Thopeto

Erfahrenes Mitglied
Hallo Hallo

Ich habe eien TreeCTrl, der mit die Ordner von der Festplatte zurück gibt, und der Inhalt der Ordner soll in der Listbox wiedergegeben werden.

kann mir jmd sagen, wo mein fehler liegt?!

PHP:
BEGIN_MESSAGE_MAP(CDlgBarExplorer, CDialog)
	//{{AFX_MSG_MAP(CDlgBarExplorer)
	ON_NOTIFY(TVN_SELCHANGED, IDC_EXPLORER_TREE, OnSelchangedExplorerTree)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten CDlgBarExplorer 

BOOL CDlgBarExplorer::OnInitDialog() 
{
	CDialog::OnInitDialog();

	TCHAR  szWorkDir[MAX_PATH];
	_getcwd(szWorkDir, 256);
	
	if(!m_ctrlTree.m_hWnd)
	{
		if (m_ctrlTree.SubclassDlgItem(IDC_EXPLORER_TREE, this))
		{			
			m_ctrlTree.DisplayTree(NULL, FALSE);
			

			m_ctrlTree.SetSelPath(szWorkDir);
		}
	}
	
	InitListDir(szWorkDir);
	
	return TRUE;  // return TRUE unless you set the focus to a control
    			  // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
}

void CDlgBarExplorer::InitListDir(CString strPathName)
{
	LV_COLUMN column;

	column.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
	column.fmt = LVCFMT_LEFT;
	column.cx = 100;
	column.pszText = "Name";
	column.iSubItem = 0;
	m_ctrlList.InsertColumn(0, &column);
	column.cx = 50;
	column.pszText = "Datum";
	column.iSubItem = 1;
	m_ctrlList.InsertColumn(1, &column);
}

void CDlgBarExplorer::ChangeListDir(CString strPathName)
{
	int iItem, iActualItem;
	char buf[256];
	LV_ITEM item;
	HANDLE handle;
	WIN32_FIND_DATA fd;

	iItem = 0;
	item.iImage = 0;

	CString strSearchSpec = strPathName + "*.*";

	handle = ::FindFirstFile((LPCTSTR)strSearchSpec, &fd);

	do
	{
		if(fd.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)
		{
			CString strFilename = (LPSTR)&fd.cFileName;
			if((strFilename != ".") && (strFilename !=".."))
			{
				item.mask = LVIF_TEXT | LVIF_IMAGE;
				item.iSubItem = 0;
				item.iItem = iItem++;
				item.pszText = (LPSTR)&fd.cFileName;
				iActualItem = m_ctrlList.InsertItem(&item);
				CTime cTime(*(&fd.ftCreationTime));
				CString strTime = cTime.Format("%d.%m.%y");
				sprintf(buf,"%s",strTime);
				item.pszText = buf;
				item.mask = LVIF_TEXT;
				item.iItem = iActualItem;
				item.iSubItem = 1;
				m_ctrlList.SetItem(&item);
			}
		}
	}
	while(::FindNextFile(handle,&fd));
	::FindClose(handle);
}

void CDlgBarExplorer::OnSelchangedExplorerTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	ChangeListDir(m_ctrlTree.GetFullPath(pNMTreeView->itemNew.hItem));

	UpdateData( FALSE );
	*pResult = 0;
}

er öffnet die liste der dateien in der Listbox entweder sporatisch oder zu 90% zeigt er sie gar nicht erst an
 
Habs nicht weiter nachverfolgt, aber

CString strFilename = (LPSTR)&fd.cFileName;

sollte eher

CString strFilename = (LPSTR)fd.cFileName;

(ohne &) sein.
 
Ausserdem haben nicht alle Files das Archive-Attribut gesetzt. Prüfe einfach, ob NICHT das Directory-Attribut gesetzt ist und du hast alle Dateien.
 
klasse, aber jetzt zeigt er mir das ganze wie eine history an, wenn ich auf nen ordner klicke, zeigt er mir dann in der listbox den ordner name an, aber nicht die dateien die drin sind, und so geht das weiter. bloss wird dann die liste mit den neuen ordner namen ergänzt, ohne den vorherigen inhalt zu löschen....

ich dreh durch, ich find meine fehler nicht und in meinen büchern find ich auch nichts :-(
 
Thopeto hat gesagt.:
klasse, aber jetzt zeigt er mir das ganze wie eine history an, wenn ich auf nen ordner klicke, zeigt er mir dann in der listbox den ordner name an, aber nicht die dateien die drin sind, und so geht das weiter. bloss wird dann die liste mit den neuen ordner namen ergänzt, ohne den vorherigen inhalt zu löschen....

ich dreh durch, ich find meine fehler nicht und in meinen büchern find ich auch nichts :-(
Du musst mal an deiner Suchtechnik arbeiten und eventuell auch mal in der MSDN nachsehen; da ist schliesslich alles erklärt.
http://msdn.microsoft.com/library/d...vclib/html/_MFC_member_functions_CListbox.asp

Wenn du es in Deutsch haben willst, musst du auf deiner Festplatte nachsehen. Jedenfalls hat CListbox unter anderem auch Methoden, um alle Listeneinträge zu löschen. ResetContent! Presto! Dawai!
 
HI!
Ich hätt da ein paar Fragen. Ich möchte genau das Gleiche machen wie du.
Aber wie hast du dem Tree Control gesagt er soll zu Anfang die Drives / Ordner anzeigen?
Weiter: Hast du es nun geschafft, dass die Listbox nur die Files anzeigt im Ordner?

gruss ana
 
ja habs geschafft und zwar so:

Code:
 void CDlgBarExplorer::ChangeListDir(CString strPathName)
 {
 	int iItem, iActualItem;
 	char buf[256];
 	LV_ITEM item;
 	HANDLE handle;
 	WIN32_FIND_DATA fd;
 
 	iItem = 0;
 	item.iImage = 0;
 
 	m_ctrlList.DeleteAllItems();
 
 	CString strSearchSpec = strPathName + "//*.*";
 
 	handle = FindFirstFile(strSearchSpec, &fd); 
 	if (handle == INVALID_HANDLE_VALUE)
 			return;
 
 	do
 	{
 		if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
 		{
 				item.mask = LVIF_TEXT | LVIF_IMAGE;
 				item.iSubItem = 0;
 				item.iItem = iItem++;
 				item.pszText = (LPSTR)&fd.cFileName;
 				iActualItem = m_ctrlList.InsertItem(&item);
 				CTime cTime(*(&fd.ftCreationTime));
 				CString strTime = cTime.Format("%d.%m.%y");
 				sprintf(buf,"%s",strTime);
 				item.pszText = buf;
 				item.mask = LVIF_TEXT;
 				item.iItem = iActualItem;
 				item.iSubItem = 1;
 				m_ctrlList.SetItem(&item);
 
 				SetRedraw();
 				InvalidateRect(NULL);
 		}
 
 	}
 	while(::FindNextFile(handle,&fd));
 	::FindClose(handle);
 
 	SetRedraw();
 	InvalidateRect(NULL);
 }

das wegen dem Tree, ich glaub das würd hier nicht reinpassen, da meine Tree Klasse zu stark an mein Programm gebunden ist
 
Danke.
Hat denn keiner eine Ahnung wie ich die Drives im Tree anzeige?
Ich weiss das man mit:
Code:
m_MFC_Tree.InsertItem("ItemText",TVI_ROOT);
ein Item dem Tree hinzufügen kann,aber ich weiss ja nicht was alles im C rumliegt da kann ich doch das nicht manuell schreiben ;)

Gibt es keine Funktion wie tree.showItems("My Computer") oder sowas ähnliches?
Ich meine der Explorer müsste doch auch so eine haben?!
 
astaluego hat gesagt.:
Danke.
Hat denn keiner eine Ahnung wie ich die Drives im Tree anzeige?
Ich weiss das man mit:
Code:
m_MFC_Tree.InsertItem("ItemText",TVI_ROOT);
ein Item dem Tree hinzufügen kann,aber ich weiss ja nicht was alles im C rumliegt da kann ich doch das nicht manuell schreiben ;)

Gibt es keine Funktion wie tree.showItems("My Computer") oder sowas ähnliches?
Ich meine der Explorer müsste doch auch so eine haben?!
Vielleicht liest du dir den Thread einfach mal genauer durch. :rolleyes:
 

Neue Beiträge

Zurück