CListView Fenster und Behandlung der Einträge



  • Nabend zusammen,

    ich weiß jetzt nicht wie gut meine Wahl beim Titel ist. Aber werde mal versuchen meine Frage so klar als mir möglich stellen.

    Ich möchte ein Programm schreiben mit dem ich meine Favoriten verwalten kann.
    Dazu habe ich ein SDI MFC Projekt angelegt das den Explorer Stil unterstützt.
    Als Grundlage habe ich folgendes Tutorial verwendet, was meines erachtens am besten die Grundlage wieder spiegelt: http://www.functionx.com/visualc/applications/explorer.htm

    Nun zu meiner Frage:
    Wie kann ich es realisieren, das ich einen Eintrag (ListItem) im rechten Fenster mit einer Url verlinken kann? Denke da an einen Doppelklick.

    Ich habe mir heute abend schon einen Wolf gesucht im Google und hier im Forum, aber nichts gefunden, was mir in irgendeiner weise geholfen hätte.

    Vieleicht kann mir da mal einer eben einen Tip geben, mit welcher Function ich das machen muss.

    Dann fällt mir gerade noch eine kleine Frage ein.
    Irgendwo sollten ja die Daten auch gespeichert werden. Was würdet ihr da verwenden?
    Meine Ideen reichen von XML über SQL bis hin zu Access.

    Grüße Stipo



  • Nimm XML und die Bibliothek TinyXML.



  • Hi,

    das war auch schon mein gedanke... Access finde ich ein krampf da was zu machen, und SQL finde ich ein bissel zu weit ausgeholt für die anwendung.



  • Erhard Henkes schrieb:

    Nimm XML und die Bibliothek TinyXML.

    Eventuell würde da auch noch SQLite in Frage kommen.



  • Vielleicht kannst du mit http://www.codeproject.com/listctrl/CListCtrlLink.asp für dein URL Problem was anfangen.



  • Hi Günni,

    Eventuell würde da auch noch SQLite in Frage kommen.

    Das hört sich ganz interessant an was da auf der Website steht. Doch bin ich nicht so sehr der Englischen Sprache mächtig, das ich jetzt nicht verstehe wie ich das nutzen ( einbauen ) kann.

    Hast du dazu ein Tutorial oder so etwas in der richtung?

    Vielleicht kannst du mit http://www.codeproject.com/listctrl/CListCtrlLink.asp für dein URL Problem was anfangen.

    Denke mit dem kann ich was anfangen. So halbwegs hab ich daa auch schon verstanden. Muss da halt mal rum probieren.

    Grüße Stipo



  • Also, die SQLite Api bittet von Haus aus nur eine C API an. Du kannst aber einen Wrapper wie http://www.codeproject.com/database/CppSQLite.asp für das Programmieren nutzen. Dies erleichert die nutzung doch um einiges. Wie man dies einbindet siehst du anhand des Beispielprojektes 😉



  • Okay,
    das mit dem Wrapper hab ich glaube mal soweit verstanden. Auch wie man den einbindet.

    Nur dachte ich mir da eben, mach doch aus dem Wrapper eine nette DLL, denn die kann man sicher auch öfters mal noch in anderen Projekten gebrauchen.

    Nun gut, mehr als ein Gedanke mit tausenden Fehlermeldungen hab ich da nicht geerntet.

    Wäre hier jemand bereit mir da mit Rat und Tat im Messenger zu helfen? Irgendwie brauche ich da wohl etwas länger um etwas zu raffen 😕

    Meine Messenger Addy kann man gerne per Email ( Im Profil ) anfragen. Möchte das nicht den Spammern zum fressen anbieten 😉

    Antwort suchende Grüße
    Stipo



  • Bei XML kann ich Dir helfen, SQL mache ich immer via ODBC o.ä.
    http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel12.htm



  • Nabend zusammen,

    ich hab hier ne nette Compiler Meldung an der ich eben am verzweifeln bin:

    error C2664: 'HTREEITEM CTreeCtrl::InsertItem(LPTVINSERTSTRUCTA)': Konvertierung des Parameters 1 von 'char' in 'LPTVINSERTSTRUCTA' nicht möglich
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Hier noch die betreffende Stelle aus dem Code:

    char str;
    	str = db.execDML("select * from owl");
    	hRoot = ctlLeagues.InsertItem(str);
    


  • char str; // hier definierst Du Platz für ein(!) Zeichen, nicht für einen String.
    str = db.execDML("select * from owl"); // das muss daher schief gehen
    hRoot = ctlLeagues.InsertItem(str); // hier erwartet man bei einem Parameter einen Zeiger auf eine Struktur (siehe Fehlermeldung) oder auf einen char-String.
    

    😉 ... so läuft das nicht. Du hast keine ausreichenden Kenntnisse bezüglich C/WinAPI und hantierst mit komplexen Controls. Viel Spaß weiterhin. 😃

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_ctreectrl.3a3a.insertitem.asp
    Du findest an dieser Stelle in der MSDN ein konkretes Codebeispiel.



  • Ich versteh jetzt nicht, was das mit der Fehlermeldung zu tun hat?



  • Schau dir mal das beispiel vom Wrapper an. Hier wirst du dann feststellen, dass du dein Statment zum einen mit der falschen Funktion aufrufst und zum anderen die Daten falsch auslist.
    Beispiel von der codeproject Seite

    ///////////////////////////////////////////////////////////////////
         // Query data and also show results of inserts into auto-increment field
         //////////////////////////////////////////////////////////////////
            cout << endl << "Select statement test" << endl;
            CppSQLiteQuery q = db.execQuery("select * from emp order by 1;");
    
            for (fld = 0; fld < q.numFields(); fld++)
            {
                cout << q.fieldName(fld) << "(" << q.fieldType(fld) << ")|";
            }
            cout << endl;
    
            while (!q.eof())
            {
                cout << q.fieldValue(0) << "|";
                cout << q.fieldValue(1) << "|" << endl;
                q.nextRow();
            }
    


  • Ich versuche mal zu erklären.
    Vor ein paar Jahren hatte ich schon mal angefangen mit C/C++ und hatte mir da dann stolze 5 Bücher zu gelegt. Manche von diesen Büchern kann man getrost vergessen, aber sowas weiß man vorher ja nie. Da ich aber immer probleme hatte mal aus dem was einem in den Büchern gelernt wurde, auch mal eigene Projekte zu starten und somit eigenen Code zu erstellen (Was meistens in einem totalen chaos endete) und ich feststellte, das ich eigentlich noch rein garnichts kapierte, hat mich der Mut verlassen.

    Zwischenzeitlich habe ich aber dann PHP gelernt, wo ich auch guten Code schreiben kann.

    Da ich aber immer noch ein Programm im Kopf habe, das ich zu Papier bringen will, hat mich der Ergeiz nun doch wieder gepackt.

    Daher hab ich nun wieder angefangen mit VC++.



  • Okay ihr beiden,

    ich habs jetzt gelöst. Hier mein jetziger Code

    // Datenbank einbinden
    	const char* gszFile = "F:\\Visual Studio 2005\\Projects\\Favoriten\\debug\\favoriten.db";
    	CppSQLite3DB db;
        db.open(gszFile);
    	if(!db.tableExists("emp"))
    	{
    		db.execDML("create table emp(empno int, empname char(20));");
    		db.execDML("insert into emp values (1, 'World Football Championships2');");
    	} 
    
    	HTREEITEM hRoot;
    	HTREEITEM hSeason;
    
    	CppSQLite3Query q = db.execQuery("select * from emp order by 1;");
    
        hRoot = ctlLeagues.InsertItem(q.fieldValue(1), 0, 1);
    

    Grüße Stipo



  • Bravo!

    HTREEITEM hRoot, hSeason;
    

    ist einfacher.
    char(20) ist das so mit runden Klammern o.k.?



  • Schönen Sonntag,

    jetzt hab ich so ne nette Fehlermeldung die ich nicht kapiere und auch nicht weg bekomme:

    nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) ist bereits in LIBCMTD.lib(dbgdel.obj) definiert.
    F:\Visual Studio 2005\Projects\Favoriten\Debug\Favoriten.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

    Wie kann ich die beheben? Was will mir der Compiler damit sagen?

    Grüße Stipo





  • So da bin ich wieder 🙂

    // Datenbank einbinden
    	const char* gszFile = "F:\\Visual Studio 2005\\Favoriten\\debug\\favoriten.db";
    	CppSQLite3DB db;
        db.open(gszFile);
    	// Tabelle Testweise mit Daten füllen
    	if(!db.tableExists("tree"))
    	{
    		db.execDML("create table tree(id int, parent_id int, user char(150));");
    		db.execDML("insert into tree values (1, 0, 'Haupt 1');");
    		db.execDML("insert into tree values (2, 0, 'Haupt 2');");
    		db.execDML("insert into tree values (3, 1, 'Unter 1');");
    		db.execDML("insert into tree values (4, 1, 'Unter 2');");
    		db.execDML("insert into tree values (5, 3, 'Item 1');");
    		db.execDML("insert into tree values (6, 3, 'Item 2');");
    	} 
    
    	CppSQLite3Query q = db.execQuery("select * from tree where parent_id=0;");
    	while (!q.eof())
        {
    		HTREEITEM hRoot, hSeason;
    		hRoot = LeftTree.InsertItem(q.fieldValue(2), 0, 1);
    		CppSQLite3Query q1 = db.execQuery("select * from tree where parent_id=1;");
    		while (!q1.eof())
    		{
    			hSeason = LeftTree.InsertItem(q1.fieldValue(2), 2, 3, hRoot);
    			CppSQLite3Query q2 = db.execQuery("select * from tree where parent_id=3;");
    			while (!q2.eof())
    			{
    				LeftTree.InsertItem(q2.fieldValue(2), 4, 5, hSeason);
    				q2.nextRow();
    			}
    			q1.nextRow();
    		}
    		q.nextRow();
        }
    

    Den Quellcode hab ich jetzt mal erstellt und die Daten des Tree dynamisch aus der Datenbank generieren zu können.
    Soweit funktioniert das ganze auch wie es soll.
    Nun zu meiner Frage:
    Wie kann ich bei den SQL Abfragen im C++ einen Wert einer voherigen abfrage zufügen?

    Bsp:

    hRoot = LeftTree.InsertItem(q.fieldValue(2), 0, 1);
    CppSQLite3Query q1 = db.execQuery("select * from tree where parent_id="q.fieldValue(0)";");

    Denn so kann ich das beim PHP machen. Hab nur keine Ahnung wie das im C++ geht.

    Grüße Stipo



  • Schau dir mal die Klasse CppSQLiteBuffer an. Ebenfalls findest du ein Beispiel davon in den Beispieldaten 😉

    CppSQLiteBuffer bufSQL;
    

Anmelden zum Antworten