Zu blöd für CListCtrl?
-
Leute, das hat er doch gemacht. Wenn man ein Steuerelement mit der MFC erstellt muss man nicht Create aufrufen, da man einfach das Steuerelement auf den Dialog plaziert.
Ich warte noch auf den Source wo der Fehler ausgelöst wird.
-
Das er create bei einem Dialog nicht aufrufen muss, sollte klar sein.
Deswegen habe ich dabei geschrieben das ich es in einer CView gecodet habe.Ausserdem setze ich bei InsertColumn die subitems nicht auf 1!
m_lcProgramm.InsertColumn(0,"Uhrzeit",LVCFMT_CENTER,50,1);zudem setzt Trikor bei SetItemText das Item nicht auf das aktuelle von InsertItem zurückgelieferte Item sondern auf den Wert den GetCount() zurückliefert.
int nItem = m_lcProgramm.GetItemCount(); m_lcProgramm.InsertItem(nItem,"Uhrzeit" ,0); m_lcProgramm.SetItemText(nItem,1,"20:15");btw. ist das Image auf 0 gesetzt und nicht auf -1, was für KEIN Image steht.
Wenn das noch nicht hilft, kann man nur raten welche ListControl-Eigenschaften im DialogEditor eingestellt sind.
Vielleicht kein Report??? -> keine Ahnung endet eh nur in Vermutungen....
-
@unixtom- was war an meinem vorschlag schlecht?
@ anderer vorschlag. als ich das erste mal die klasse verwendet habe, habe ich in den eigenschaften nicht umgestellt. es ist ja am anfang ( dei den eigenschaften ) bei darstellung und dann ANSICHT ist es ja am anfang auf ICON hab ich umgestellt auf LISTE, dann gings, liegts daran???
-
Ich mach das immer so.
m_listctrl.InsertColumn(0,"Kurzwahl",LVCFMT_LEFT,100); m_listctrl.InsertColumn(1,"Keyword",LVCFMT_LEFT,100); m_listctrl.InsertItem(m_listctrl.GetItemCount(),neue.shortnumber); m_listctrl.SetItemText(m_listctrl.GetItemCount()-1,1,neue.keywordname);So wie Trikor es gemacht hat ist es aber auch richtig.
SDein Code ist richtig und deshalb hilft es nur wenn er mehr zu seinem Source erzählt. Vorallem wo es abstützt.
-
Egal was ich mache, das Programm schmiert immer in der winctrl.cpp bei Zeile 599
oid CListCtrl::DrawItem(LPDRAWITEMSTRUCT) { ASSERT(FALSE); }ab.
Mit dem Debugger läuft er durch die Funktion ohne zu meckern. Bis er irgenwann sagt, Kein Quellcode mehr verfügbar. Doch wenn ich dann F5 drücke um das Programm weiter laufen zu lassen, schmiert es ab.
Wenn ichnItem = m_lcProgramm.InsertItem(nItem, "20:15" ,-1);auskommentiere, läuft das Programm durch (ohne Absturz), schreibt aber natürlich keine Zeile dazu.

Create(WS_CHILD|WS_VISIBLE|LVS_REPORT, CRect(0,0,0,0), this, 0xff);funktioniert!
Aber dabei muß ich dannDDX_Control(pDX, IDC_LPROG, m_lcProgramm);auskommentieren. Aber das kann´s ja eigentlich nicht sein, oder?
-
wenn der Absturz bei SetItemText() kommt, könnte es daran liegen, dass versehentlich das "Besitzerdaten" (ownerdata) Häkchen gesetzt wurde.
Das hatte ich gerade kürzlich bei mir...
-
Besitzerdaten steht auf FALSE;
Und der Absturz scheint durch InsertItem zu entstehen.
-
Stell mal dein Project online.
-
Unix-Tom schrieb:
Stell mal dein Project online.
Ich schätze mal, wenn ich das mach, kann ich mir meine Papiere abholen.

Na ja, O.K. Das eine ist ja nur ein kleines Dialogfeld welches eingeführt wird.
Also die Header-Dateiclass CZeitschrift : public CDialog { DECLARE_DYNAMIC(CZeitschrift) public: CZeitschrift(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CZeitschrift(); // Dialogfelddaten enum { IDD = IDD_PROGRDLG }; protected: CBrush m_Brush; virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung virtual BOOL OnInitDialog(void); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); DECLARE_MESSAGE_MAP() public: CBrush dialog_brush; CBrush list_brush; afx_msg void OnBnClickedClose(); afx_msg void OnBnClickedTestbutton(); CString Datum; CStringArray strAEvent; CStringArray m_strTime; CStringArray m_strEvent; CStringArray m_strSender; CStringArray m_strStart; CStringArray m_strChannel; void FirstEintrag(void); CListCtrl m_lcProgramm; };Und die .cpp
// Zeitschrift.cpp : Implementierungsdatei // #include "stdafx.h" #include "Hauptprogramm.h" #include "HauptprogrammDlg.h" #include "Zeitschrift.h" #include ".\zeitschrift.h" #include <afxinet.h> // CZeitschrift-Dialogfeld IMPLEMENT_DYNAMIC(CZeitschrift, CDialog) CZeitschrift::CZeitschrift(CWnd* pParent /*=NULL*/) : CDialog(CZeitschrift::IDD, pParent) , Datum(_T("")) { dialog_brush.CreateSolidBrush(0x00E5E6E6); list_brush.CreateSolidBrush(RGB(255,255,255)); } CZeitschrift::~CZeitschrift() { } void CZeitschrift::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //DDX_Control(pDX, IDC_LPROG, m_lcProgramm); } BEGIN_MESSAGE_MAP(CZeitschrift, CDialog) ON_BN_CLICKED(IDC_CLOSE, OnBnClickedClose) ON_BN_CLICKED(IDC_TESTBUTTON, OnBnClickedTestbutton) ON_WM_CTLCOLOR() END_MESSAGE_MAP() // CZeitschrift-Meldungshandler void CZeitschrift::OnBnClickedClose() { OnOK(); } BOOL CZeitschrift::OnInitDialog(void) { CDialog::OnInitDialog(); // Hinzufügen des Menübefehls "Info..." zum Systemmenü. // IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } m_lcProgramm.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_BORDER, CRect(0,0,0,0), this, 0xff); m_lcProgramm.SetWindowPos(NULL, 10, 50, 502, 200, SWP_NOZORDER); m_lcProgramm.InsertColumn(0,"Uhrzeit",LVCFMT_LEFT,50,0); m_lcProgramm.InsertColumn(1,"Event",LVCFMT_LEFT,200,0); m_lcProgramm.InsertColumn(2,"Streamer",LVCFMT_LEFT,200,0); m_lcProgramm.InsertColumn(3,"ON AIR",LVCFMT_LEFT,50,0); m_Brush.CreateSolidBrush(0x00E5E6E6); return 0; } HBRUSH CZeitschrift::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); switch (nCtlColor) { case CTLCOLOR_EDIT: pDC->SetBkMode(TRANSPARENT); hbr = (HBRUSH)list_brush; // Setzt die Farbe für den Hintergrund break; case CTLCOLOR_LISTBOX: pDC->SetBkMode(TRANSPARENT); //pDC->SetDCBrushColor(0x00E5E6E6); hbr = (HBRUSH) list_brush; // Setzt die Farbe für den Hintergrund break; case CTLCOLOR_STATIC: pDC->SetBkMode(TRANSPARENT); hbr = (HBRUSH) TRANSPARENT; break; case CTLCOLOR_DLG: pDC->SetBkMode(TRANSPARENT); hbr = (HBRUSH) dialog_brush; break; default: pDC->SetBkMode(TRANSPARENT); hbr = (HBRUSH) dialog_brush; break; } return hbr; } void CZeitschrift::OnBnClickedTestbutton() { // Programm von Webseite holen CString Url = "http://irgendwas.com/auth.php"; Url += Datum; CString ReadTagesprog; ReadTagesprog = ((CHauptprogrammDlgnDlg*)GetParent())->GetHttpSource(Url); ReadTagesprog = "2015;EVENT1;Streamer1;112;Ja;|2015;EVENT2;Streamer2;0;Nein;|"; // String zerlegen CStringArray strATagesprogramm; int nAnzahlEvent = 0; int nAnzahlStreamer = 0; int i, j, old = 0,pos = 0; // String trennen while(-1 != (pos = ReadTagesprog.Find('|',pos))) { strAEvent.Add(ReadTagesprog.Mid(old,pos - old)); old = ++pos; nAnzahlEvent++; } int n_Trenner = 0; // Zeilenanzahl festlegen i = 0, j = 0; old = 0,pos = 0; while(j < strAEvent.GetSize()) { while( -1 != (pos = strAEvent[j].Find(';',pos))) { switch (n_Trenner) { case 0: m_strTime.Add(strAEvent[j].Mid(old, pos - old)); break; case 1: m_strEvent.Add(strAEvent[j].Mid(old, pos - old)); break; case 2: m_strSender.Add(strAEvent[j].Mid(old, pos - old)); break; case 3: m_strChannel.Add(strAEvent[j].Mid(old, pos - old)); break; case 4: m_strStart.Add(strAEvent[j].Mid(old, pos - old)); break; } old = ++pos; n_Trenner++; } j++; old = 0; pos = 0; n_Trenner = 0; } FirstEintrag(); } void CZeitschrift::FirstEintrag(void) { UpdateData(TRUE); int nItem; int nAnzahlEintraege = m_strTime.GetSize(); if( nAnzahlEintraege > 11) m_lcProgramm.SetWindowPos(NULL, 10, 50, 518, 200, SWP_NOZORDER); for(int i = 0; i < nAnzahlEintraege; i++) { nItem = m_lcProgramm.GetItemCount(); nItem = m_lcProgramm.InsertItem(nItem, m_strTime[i] ,-1); m_lcProgramm.SetItemText(nItem, 1, m_strEvent[i]); m_lcProgramm.SetItemText(nItem, 2, m_strSender[i]); m_lcProgramm.SetItemText(nItem, 3, m_strStart[i]); } }
-
Schon mal in letzter Zeit ein
Erstellen -> Bereinigen
Erstellen -> Alles neu erstellen
gemacht ?
-
isabeau schrieb:
Schon mal in letzter Zeit ein
Erstellen -> Bereinigen
Erstellen -> Alles neu erstellen
gemacht ?Aber sicher doch. War das erste!
-
Das mit dem Create scheint wohl doch nicht ganz übergekommen zu sein...
Bei dir braucht es kein create in der InitDialog, da bei Dialogen ja das control schon erzeugt wird.Du verwendest bei InsertItem CStringArrays. Vielleicht liegt da der Fehler.
CStrinArray operator[] liefert CObject* zurück und nicht LPCSTR!Versuch mal einen Cast auf das CObject nach CString.
-
nItem = m_lcProgramm.GetItemCount(); nItem = m_lcProgramm.InsertItem(nItem, LPCSTR(m_strTime[i]) ,-1); m_lcProgramm.SetItemText(nItem, 1, LPCSTR(m_strEvent[i])); m_lcProgramm.SetItemText(nItem, 2, LPCSTR(m_strSender[i])); m_lcProgramm.SetItemText(nItem, 3, LPCSTR(m_strStart[i]));Selber fehler

LPCTSTR klappt auch nicht.
-
Frank++ schrieb:
Das mit dem Create scheint wohl doch nicht ganz übergekommen zu sein...
Bei dir braucht es kein create in der InitDialog, da bei Dialogen ja das control schon erzeugt wird.Das ist ja das merkwürdige. Wenn ich die member-Variable von entferne und über Create ein ListCtrl erzeuge funktioniert InsertItem. Sogar ohne zu casten.
Mach ich ne Member-Varialble auf ein ListCtrl, dann schäppert es.Normal ist das nicht.
-
Versuche es mal mit
ElementAt(i)
-
Unix-Tom schrieb:
Versuche es mal mit
ElementAt(i)Leider auch nicht.

-
So, ich habe jetzt mal alles gelöscht, was irgendwie mit CListCtrl zu tun hat.
Alles von Anfang an eingefügt und Ihr glaubt es kaum es funktioniert.Aber fragt mich bitte nicht, warum es vorher nicht lief.

Keine Ahnung.Trotzdem DANKE an alle, die mir helfen wollten.
