Zu blöd für CListCtrl?



  • also wenn du die spalten machst, und compelierst dann siechst ja die spalten mit der entsprechenden beschriftung und breite ( oh welche weissheit )

    jetzt möchtest du z.b. eine ( erste ) zeile machen wo du dann ( 4 spalten ) also 4 sachen reinschreiben willst

    dann musst du erst

    [cpp]
    m_mylist.InsertItem(row,""); // eine neue leere erzeugen

    m_mylist.SetItemText(row,0,wert1); // row ist am anfang 1 oder sogar 0( musst ausprobieren ), 0 bedeutet erste spalte und wert1 ist z.b. deine uhrzeit
    m_mylist.SetItemText(row,1,wert2); // row immer noch 0 oder 1, 1 = 2te spalte usw
    //usw

    [/cpp]

    so müsste es gehen.

    ich hab row in die .h geschrieben, und zähle immer dann eines hoch wenn ich eine neue zeile brauche.
    maybe gibts ne elegantere lösung, aber mit der kann ich leben



  • 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 ich

    nItem = 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 dann

    DDX_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-Datei

    class 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. 👍


Anmelden zum Antworten