Ein paar fragen ;-)



  • @(D)Evil

    also bei mir läufts(währe schön wenn de mir sagst was falsch läuft)

    zum Stil ist halt das erste mal das ich ne Klasse geschireben habe is noch net so perfekt und so gut bin ich im Programmieren noch nicht.
    Und weil ich weis das des noch net so perfekt läuft frage ich ja hier die "Profis".

    z.b.
    SetNextQuizState() und DisplayNextQuestion()
    muss ich nochmal überarbeiten
    Weiterhin hab ich grad festgestellt das in LoadQuestions() ein fehler drin ist sollte keine datei vorhanden sein schmiert mein Programm ab



  • Sry. k lag wirklich daran das die Datei nicht da war 😉

    Soll ich dirs mal korrigieren?! Und verbessern?! 😃

    Aja was mal so direkt auffält... warum machst du den StringArray Public?!



  • Aja... evt. solltest du das mal ändern.. es würde sich warscheinlich eher empfehlen je Frage eine Strukt anzulegen... also in etwa:

    struct Question__
    {
        char cQuestion[256];
        unsigned int nID;
        bool bUsed;
    }* HQUESTION;
    

    ... Dann solltest du bUser beim laden auf false setzen und wenn die Frage dann gestellt wurde auf true... so das de verhinderst das Fragen doppel vorkommen...

    Sonnst gib mal diene eMail Addresse dann schick ich dirs mal 😃



  • Das mit dem StringArray war nen Ausrutscher da hab ich mist gebaut keine Ahnung was ich da vorhatte irgendwie dachte ich wohl das ich auch von aussen irgendwie drauf zugreifen wollte.

    wird erstmal schnell behoben

    zum fehler mit der Datei muss ich sagen ich hatte das aus nem Forum so übernommen dachte es funktioniert. Aber wie man sieht funktioierts doch nicht perfekt



  • So erstmal angemeldet

    das mit dem struct werd ich mir nochmal anschauen.
    ich wolts einfach so machen das ich jede beantwortete frage rauslösche und dann eben die Variable mit der anzahl der fragen um eins verringere.
    wollte mir halt die zusätzlichen Variablen Sparen. hätte dann aber den Nachteil das ich für jedes neuen Quiz das ganze Array neuladen müssen.
    Also ist ein Struct wohl die bessere Wahl 🙂

    ich weiss auch das Char besser währe hatte aber String genommen damit ich keine begrenzung in der Länge der frage + antworten habe, nehme aber wohlwissend den größeren Speicherverbrauch im Ram in kauf.

    jo email skipy@gmx.de



  • Hehe... so ist raus... hab dir kurz noch dazu geschrieben was de machen kannst um nen bissel das UI aufzubessern 😉 Hubs... kannst die Membervariable CStringArray übrigends löschen 😉



  • Du solltest vieleicht bevor Du die Datei lädst mit GetModulHandle den Pfad zur exe ermitteln und von dort aus relativ deine Quizdatei laden, sonst wirst Du immer wieder mal Probleme bekommen. Achso und es fehlen eindeutig noch Buttons für die Antworten 😉

    Edit: Wenn sich jemand mal mein Freizeitprojekt anschauen will 😉
    http://p4.forumforfree.com/hier-klicken-vp170-curlingclub.html#170



  • @connan beides notiert 😃
    mit den buttons bin ich noch am überlegen erstmal sore ich dafür das man auch mit tasten 1-4 und a-d das ding bedienen kann.

    dann muss noch ein kleines Problem mit dem hintergrundbild beseitigt werden.

    nachher bastle ich aber erstmal den 50/50Joker rein und nen §fehler modus wollt ich auch noch rein bekommen da such ich grad wie man das mit den Bitmap (zum darstellen des Kreuzez pro fehler am besten macht)

    dein Projekt sieht gut aus auf jedenfall Optisch um längen besser als meins



  • mit dem Hintergrund hab ich dir ja geschrieben wie de das am einfachsten machst 😉 das Kreuz... kommt drauf an wo de es hin haben willst... ich vermute mal so am oberen rand eines buttons? Dann einfach mit GetClientRect das rect von dem button holen und dann em ehesten einfach mit gdi ein image draufmalen 😉



  • @(D)Evil yep deine Methode hatte ich auch genommen nur wurde der text nicht gelöscht sondern immer nur "überschrieben" also einmal Invalidate(1); aufgerufen wenn man den text ändert und schon hat mans maleur jedesmal ein leichtes flickern.

    und nee die 3 kreuze sollen einfach unten im Programm hinterlegt werden bin zwar noch am überlegen ob ich sie erst inaktiv darstelle(gegraut) und dann durch farbige ersetze oder ob ich sie "aus dem nichts " einblende



  • öhm wenn dann Invalidate(); nicht die 1 da rein ,)



  • So hab dat ding erstmal geupdatet

    http://skippy.uttx.net/downloads/OneMillion.rar
    nun 109kb

    Hinzugefügt wurden:

    -Bitmap als Hintergrund
    -Farbige Buttons (habe die Klasse CRoundButton2 von Codeproject.com verwendet)
    -Fifty Fifty Joker (funktion selbst sieht aber Bescheiden aus)
    -erstmal nen vorläufiges Icon und Logo

    Was noch kommen soll:
    -Noch ein paar Optische Spielereien mit den buttons
    -Dialog für die Einstellungen 🙄
    -Klasse für SplashScreen?
    -Laden der Fragen in eignen Threat auslagern?
    -3Unterschiedliche Schwierigkeitstufen für die Fragen? je ne eigene Datei
    - möglichkeit endlich mit tastatur zu Spielen 😉

    sonst noch jemand ein paar Ideen auf Lager?

    Eine frage hätte ich noch wie kann man zur Laufzeit des Programmes das Bild eines Picture Controls ändern? find das leider irgendwie nicht



  • PictureCtrl ?! Naja...

    Referenzen
    CStatic::SetBitmap
    CWnd::Invalidate

    aja:

    for(int i = 0; i<=8; ++i)
    

    ...

    for(unsigned int i = 0; i < 9; ++i)
    

    Weißt du auch warum ++i und nicht i++ ?! usw ?! 😃

    Ne public membervariable ist meistens auch sehr unsauber... also bsw dein CStatic m_Frage... wenn de da von außen drauf zugreifen willst... Getter.. Setter

    Was soll dieses Denglish ?! bsw. IsAnswerKorrekt(...)

    Hmm noch was... BOOL != bool !!! BOOL ist als int definiert.. d.h. verbraucht mehr byte!



  • so hab mal wieder nen kleines Problem

    LRESULT CALLBACK COneMillionDlg::WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) 
    { 
        switch(uMessage) 
        { 
            case WM_KEYDOWN: 
    		{
                switch(wParam) 
                { 
                    case 'A': 
    				case '1':
                        OnStnClickedAntwA(); 
                        break; 
                    case 'B': 
    				case '2':
                        OnStnClickedAntwB(); 
                        break; 
                    case 'C': 
    				case '3':
                        OnStnClickedAntwC(); 
                        break; 
                    case 'D': 
    				case '4':
                        OnStnClickedAntwD(); 
                        break; 
    			};
              return 0;
    	     }
    	    default:
                return CDialog::DefWindowProc(hWnd, uMessage, wParam, lParam);
    	};
    return 0;
    
    }
    

    warum bekomme ich folgenden fehler
    : error C2660: 'CWnd::DefWindowProcA' : function does not take 4 arguments
    und was ist falsch an der funktion



  • Boa warum sollte man dir was sagen wenn du es eh wieder nicht umsetzt?! Das ist ja abartig... du hast keinerlei Fehlerbehandlung wenn die Fragen Datei nicht existiert nix! arg -.- Man neeee

    So das ist das letzte was ich dir noch helfe... deine Fragen sind so stupide.

    Guckst du vllt auch mal in die MSDN Library?! CWnd::DefWindowProc

    Arg jetzt denkt sich der kleine Bubal... ohh wie kann das denn?! Jo ganz einfach... CDialog ist von CWnd abgeleitet! UI! Und was stellen wir fest ... Wobei ich garnicht wissen will was das geben soll was du da fummelst.. -.-

    [edit]Ahh jo jetzt weiß ich was das werden soll... CWnd::OnChar
    CWnd::OnKeyDown
    Wenn de jetzt noch überlegst was ich oben geschrieben hab... AHH... stimmt ja.. CDialog ist von CWnd abgeleitet! Boa goil da kann ich die Funktion ja überschreiben! WAHNSINN!!![/edit]



  • @(D)Evil

    wollt mal schnelle deine Textchen beantworten(hoffe du hast heut bessere Laune) 😉

    for(int i = 0; i<=8; ++i)
    

    korrigiert

    public membervariable CStatic m_Frage

    korrigiert ist jetzt protected

    Denglish

    alte Angewohnheit da ich früher meisst nur Opensource Anwendungen angepasst habe hatte ich meisst meine variabeln u Funktionen in Deutsch angegeben um sie besser unterscheiden zu können. Wird also stück für stück mal nebenbei gefixt

    BOOL != bool

    habe das erstmal umgeändert bool true und false sind jetzt kleingeschrieben

    aber ne frage hätte ich dazu was ist denn der genaue unterschied weil a selbst bei einem mit dem Assistenten erstellte anwendung schon BOOL verwendet wird anstatt bool. Und ich habe es zumindest so gelernt das bool true und false defines sind die den Code optisch besser lesbar machen sollen aber logisch keine veränderung im verhalten des Compiliers bewirken.

    WndProc

    zu dem Blödsinn sach ich mal am besten nichts hatte bei Google ei bissl rumgesucht aber halt nach WM_KEYDOWN ud fand halt nur lösungen über WndProc nach deinem Post und dem Stichpunkt

    kann ich die Funktion ja überschreiben!

    hab ich dann Spaßenshalber nochmal nach ON_WM_KEYDOWN
    gegoogelt und siehe da man fand dann auch die richtige Lösung (dachte ich jedenfalls)
    Stellte dann nach ratlosen rumsuchen und benutzen von Spy++ fest das ich in
    meinem Schei.. Programm gar keine WM_KEYDOWN Messages bekomme sondern nur WM_SYSKEYDOWN

    Boa warum sollte man dir was sagen wenn du es eh wieder nicht umsetzt?! Das ist ja abartig... du hast keinerlei Fehlerbehandlung wenn die Fragen Datei nicht existiert nix! arg -.- Man neeee

    zum Anfang ich hoffe mal du meinst damit nicht deine Sinnlose änderung

    catch(CFileException* e)
    

    geändert zu

    catch(CFileException* pException)
    

    Ich den Source zu der funktion auch über Google gefunden angeblich ja funktionsfähig. mittlerweile hab ich das aber geändert zwar nicht so sauber wies vorher war mit catch sondern billig über if open = 0 aber es funktioniert

    bool CQuiz::LoadQuestions() 
    {
      CStdioFile file;
      int Anzahl = 0;
      CFileException FileExc;
    
               if(file.Open("Questions.txt", CFile::modeRead | CFile::typeText, &FileExc) == 0 )
    		      {
    	           FileExc.ReportError();
                   //file.Close();
    	           return false;
    	          }
    		   else
    		      {
    
    		       CString strLine;
    
                   // Datei zeilenweise auslesen
                   while (file.ReadString(strLine) > 0)
                     {
                       Questions.Add(strLine);
                       Anzahl++;
    			     }
    
    			   strLine.Format("%d", Anzahl);
                   NumberOfQuestions = Anzahl;
    			   AfxMessageBox(strLine);
    		      }
    
    file.Close(); 
    
    return true;
    }
    

    fehlt halt noch nen bissl was in der Richtung datei kann nicht geladen werden mal nachher schauen entweder 10 fragen ins array laden oder nen dialog öffnen über dem man dann per internet ne standard datei laden kann (oder vielleicht soagr per auswahl??) bin mir da noch nicht ganz Schlüssig



  • was soll

    for(int i = 0; i<=8; ++i)
    

    schon wieder?! erklär ersteinmal warum ++i und nicht i++ ... ich glaub nähmlich das du das so nach belieben machst...

    for(unsigned int i = 0; i < 9; ++i)
    

    wäre die 100% saubere Lösung...

    BOOL ist ein Windowstype. Bzw. BOOL ist in den Windows Headern als int definiert... was du sehr leicht herrausfinden kannst, wenn du mal nen rechtsklick darauf machst und dann auf "Gehe zur Definition.." klickst..

    Was das heißt, solltest du wissen ;)Überlegen wir einfach mal:

    +-Datentype--+--Bytes--+--Mögliche Werte------------+
    | bool       |  1      |  true; false               |
    | int        |  4      |  -2147483648 - +2147483647 |
    +------------+---------+----------------------------+
    


  • @(D)Evil

    schon wieder?! erklär ersteinmal warum ++i und nicht i++ ... ich glaub nähmlich das du das so nach belieben machst...

    erstens hab ich nur Zitiert was du angekreidet hast geändert habe ich das nach deinem vorschlag zum ++i heisst das es vor beginn der Schleife schon adiert wird, i++ hingegen erst nach dem Schleifen durchlauf

    → in meinem fall könnte ich auch schreiben

    for(unsigned int i = 1; i < 9; i++)
    

    zum BOOL dachte ich halt das bool genauso ein normal int ist.
    Wobei ich dann nicht verstehe warum die bei MS dann sowas machen die müssten das dann doch am besten wissen



  • tjo du hast im Punkto i++ und ++i schwachsin gequatscht... bei ++i wird einfach i um 1 erhöht.. bei i++ wird ein Objekt von type int erstellt usw usf.



  • ++i = Praeinkrement (erst erhoehen und dann naechsten Schritt vollziehen)
    i++ = Postkrement (erst naechsten Schritt vollziehen und dann erhoehen)

    So stehts geschrieben

    und halbwegs funktioniert das auch

    int a = 0;
    for(int i = 0; i<=8; i++)
    {
        CString strLine;
    	strLine.Format("%d", a++);
    	AfxMessageBox(strLine);
    }
    

    zählt 0,1,2,3,4,5,6,7,8

    int a = 0;
    for(int i = 0; i<=8; i++)
    {
        CString strLine;
    	strLine.Format("%d", a++);
    	AfxMessageBox(strLine);
    }
    

    zählt 1,2,3,4,5,6,7,8,9

    warum das allerdings hier

    for(int i = 0; i<=8; i++)
    

    keine auswirkungen hat obwohl es das laut test sollte weiss ich nicht


Anmelden zum Antworten