Variable MAKEINTRESOURCE !



  • Das ist alles gut, aber wo liegt das Problem?



  • Hallo,

    da ich mich nur schlecht Ausdrücken kann, möchte ich erstmal meinen Code posten.

    void CSpeekDlg::OnSpeek3() 
    {
        CString strText;
        GetDlgItemText( IDC_TEXT, strText); //strText z.B mein name ist hans
    
        for (int i=0; i< strText.GetLength(); i++)
        {
            CString strVierStellen = strText.Mid(i, +4);
            CString strDreiStellen = strText.Mid(i, +3); 
            CString strZweiStellen = strText.Mid(i, +2); 
            CString strEineStelle  = strText.Mid(i, +1); 
    
            char* VierStellenSilbe[] = {"mail","mich","dich"}; // 3
    
            char* DreiStellenSilbe[] = {"dra","dre","dro","dru","lei","lie","wie","kuh"}; // 8
    
            char* ZweiStellenSilbe[] = {"ba","be","bo","bu","da","de","do","du","ei","eu",
                                        "ga","ge","go","gu","la","le","lo","lu","ll","mm",
                                        };// 20
    
            char* EineStelleSilbe[]  = {"a","b","c","d","e","f","g","h","i","j","k",
                                        "l","m","n","o","p","q","r","s","t","u","v",
                                        "w","x","y","z","' '"}; // 26
    
            char* EineStelleID[]  = {"IDR_a","IDR_b","IDR_c","IDR_d","IDR_e","IDR_f","IDR_g","IDR_h","IDR_i","IDR_j","IDR_k",
                                     "IDR_l","IDR_m","IDR_n","IDR_o","IDR_p","IDR_q","IDR_r","IDR_s","IDR_t","IDR_u","IDR_v",
                                     "IDR_w","IDR_x","IDR_y","IDR_z"," "}; // 26
    
            for(int j = 0;j < 3;j++) 
            { 
              if(strcmp(strVierStellen,VierStellenSilbe[j]) == 0) 
              { 
               ::PlaySound(MAKEINTRESOURCE(IDR_4), NULL, SND_RESOURCE | SND_ASYNC );
               Sleep(400);
                i+=3;
                continue;
              } 
            }
            for(int k = 0;k < 8;k++) 
            { 
              if(strcmp(strDreiStellen,DreiStellenSilbe[k]) == 0) 
              { 
               ::PlaySound(MAKEINTRESOURCE(IDR_3), NULL, SND_RESOURCE | SND_ASYNC );
               Sleep(300);
                i+=2;
                continue;
              } 
            }
            for(int l = 0;l < 20;l++) 
            { 
              if(strcmp(strZweiStellen,ZweiStellenSilbe[l]) == 0) 
              { 
               ::PlaySound(MAKEINTRESOURCE(IDR_2), NULL, SND_RESOURCE | SND_ASYNC );
               Sleep(200);
                i+=1;
                continue;
              } 
            }
            for(int m = 0;m < 26;m++) 
            { 
              if(strcmp(strEineStelle,EineStelleSilbe[m]) == 0) 
              { 
                CString bla;
                bla.Format("%s", EineStelleID[m]);
    
                int iw = atoi(bla);
    
                MessageBox(bla);
    
               ::PlaySound(MAKEINTRESOURCE("iw"), NULL, SND_RESOURCE | SND_ASYNC );
               Sleep(200);
                continue;
              } 
            }
        }
    }
    

    Das Problem an dem Code ist der Teil
    ::PlaySound(MAKEINTRESOURCE((iw)), NULL, SND_RESOURCE | SND_ASYNC );

    ich will MAKEINTRESOURCE(), immer eine andere ID zuweisen oben aus meiner Char Liste. Beispiel man gibt ein a ein öffnet Sich die MessageBox wo drin steht IDR_a was gut funktioniert und auch richtig ist. Jetzt möchte ich das das IDR_a in MAKEINTRESOURCE() aufgrufen wird also so

    ::PlaySound(MAKEINTRESOURCE(IDR_a), NULL, SND_RESOURCE | SND_ASYNC );

    aber es funktioniert nicht. Im String bla steht richtig die ID IDR_a aber wenn ich den String in ein int konvertiere muss etwas schief laufen da das Wave mit der ID IDR_a nicht abgespielt wird.

    Ich küsse jedem die Füße der mir weiter helfen kann.

    [ Dieser Beitrag wurde am 20.02.2003 um 12:47 Uhr von asmodia editiert. ]



  • Bei dir steht:
    MAKEINTRESOURCE("iw")
    richtig wäre aber:
    MAKEINTRESOURCE(iw)



  • sorry, Tippfehler!

    aber mit MAKEINTRESOURCE(iw) spielt er das Wave auch nicht. Noch ein Problem wie kann ich meine Char Liste char* EineStelleSilbe[] ein leerzeichen + Sonderzeichen wie (*\) prüfen. Ich habe es mit ," " und mit ,"' '" versucht, aber leider ohne erfolg.



  • Ausserdem würde ich statt

    char* EineStelleID[]  = {"IDR_a","IDR_b","IDR_c","IDR_d","IDR_e","IDR_f","IDR_g","IDR_h","IDR_i","IDR_j","IDR_k", "IDR_l","IDR_m","IDR_n","IDR_o","IDR_p","IDR_q","IDR_r","IDR_s","IDR_t","IDR_u","IDR_v", "IDR_w","IDR_x","IDR_y","IDR_z"," "};
    

    so deklarieren:

    enum EineStelleID {IDR_a = 1, IDR_b = 2, /*u.s.w.*/}
    

    dann brauchst du keine Konvertierung zu machen



  • kann ich dann Leerzeichen deklarieren wenn ich enum EineStelleID [cpp]enum EineStelleID {IDR_a = 1, IDR_b = 2, /*u.s.w.*/}

    verwende?
    
    vorher habe ich das mit 38.000 einzelnen if Abfragen gemacht, wie hier
    [code type="C++" tabs="4"\]  
        if(strText[i] == ' '){::PlaySound(MAKEINTRESOURCE(IDR_blank), NULL, SND_RESOURCE | SND_ASYNC ); Sleep(180); }
    

    das ist zwar ka..e programmiert aber ich konnte Leerzeichen abfangen!

    Wie komme ich an die Werte aus deiner enum Liste ran?

    mit EineStelleID[1] wäre dann der Wert IDR_a ?

    [ Dieser Beitrag wurde am 20.02.2003 um 13:41 Uhr von asmodia editiert. ]



  • Naja, wenn du deinen Code so lassen willst, wie er ist, dann müsstest du die IDs so ablegen:

    int EineSilbeID[] = {IDR_a, IDR_b, ...

    der Aufruf in deiner Funktion dann einfach mit

    MAKEINTRESOURCE(EineSilbeID[m])

    Also jetzt alles analog zu deinem Code von ein paar Beiträgen weiter oben. Aber diese IDs sind nix weiter als Zahlen. Schau mal in deiner resource.h. Da stehen alle drin. Wenn du jetzt dafür sorgst, dass alles fortlaufend numeriert sind, dann kannst due dir Array sparen und mit IDR_a + m arbeiten.

    Grüße, Volle.



  • Also, dein Code funzt bei mir so, wie er jetzt ist (etwas angepasst).
    Alle deine Sounds-ID in Ressourcen müssen allerdings mit deinen IDR_a u.s.w. übereinstimmen



  • Original erstellt von Laie:
    Also, dein Code funzt bei mir so, wie er jetzt ist (etwas angepasst).
    Alle deine Sounds-ID in Ressourcen müssen allerdings mit deinen IDR_a u.s.w. übereinstimmen

    Danke für eure mühen. Aber Laie was meinst du mit etwas angepasst

    Kannst du den etwas angepassten Code nicht hier reinschreiben oder mir per Mail schicken. Ich werde es gleich mal testen aber was ist mit den Leerzeichen & Sonderzeichen?

    Wie kann ich daraus eine Liste machen



  • nun läuft es auch bei mir.

    Jetzt ist nur noch das Problem mit den Leerzeichen und Sonderzeichen.
    Habe mich schon einmal im Forum umgeschaut aber leider nichts passendes gefunden.

    char* EinStelleSilbe[] = {" ", "\", "/", "@", usw...}; // 1
    

    funktioniert nicht.

    char* EinStelleSilbe[] = {"' '", "'\'", "'/'", "'@'", usw...}; // 1
    

    funktioniert nicht.

    char* EinStelleSilbe[] = {' ', '\', '/', '@', usw...}; // 1
    

    funktioniert nicht.

    nun bin ich am ende mit meinem Latein! ich weis das ich noch nicht viel Latein kann aber die dreifach gebückte und am ende gestreckte for Schleife war doch nicht schlecht 🙂



  • So läuft es bei mir ("angepasst"):

    char* Test[]  = {"133", "140", "141"};
    CString str;
    for(int i = 0; i < 3; ++i)
    {
       str.Format("%s", Test[i]);
       int iw = atoi(str);
    
       ::PlaySound(MAKEINTRESOURCE(iw),NULL, SND_RESOURCE | SND_ASYNC);
       Sleep(300);
    }
    

    Leerzeichen kann man einfach abfangen, wenn du statt atoi(...) strtol(...) benutzt.
    Beispiel:

    char* tmp;
    char* test[] = {"123", " ", "abc"};
    int i = strtol(test[1], &tmp, 10); // und jetzt steht in tmp ein Leerzeichen
    
    i = strtol(test[2], &tmp, 10); // jetzt tmp = "abc"
    

    Und schon kannst du tmp nach Leerzeichen abfragen



  • Hallo,

    ich habe noch eine letzte Frage dann kann ich das Thema abhaken.

    Das ist mein neuer Code der sehr gut funktioniert bis auf eine Kleinigkeit.

    Hier ist ersmal der Code:

    void CSpeekDlg::OnSpeek3() 
    {
        CString strText;
        GetDlgItemText( IDC_TEXT, strText); //strText z.B mein name ist hans
        m_cList.SetCurSel(m_cList.AddString( strText));// Text im Listenfeld anzeigen   
        m_cInput.SetCurSel(m_cInput.AddString( strText));// Text im Inputfeld ablegen   
        SetDlgItemText( IDC_TEXT, "");
    
        for (int i=0; i< strText.GetLength(); i++)
        {
            start:;
            CString strVierStellen = strText.Mid(i, +4);
            CString strDreiStellen = strText.Mid(i, +3); 
            CString strZweiStellen = strText.Mid(i, +2); 
            CString strEineStelle  = strText.Mid(i, +1); 
    
            //// ----------------------------------- Silben ------------------------------------- ////
    
            char* VierStellenSilbe[] = {"mail"}; // 1
    
            char* DreiStellenSilbe[] = {"dra","dre","dro","dru","lei","lie","wei","www"," pc","pc ",
                                        "sch",".de","all","mir","dir","ben","ach","och","min","max",
                                        "kau" }; // 21
    
            char* ZweiStellenSilbe[] = {"ba","be","bo","bu","da","de","do","du","ei","eu",
                                        "ga","ge","go","gu","la","le","lo","lu","ll","mm",
                                        "nn","ck","ie","ch","sp","ha","ho","hu","ka","ko",
                                        "ku","ma","me","mo","mu","na","ne","no","nu","ta",
                                        "to","tu"};// 42
    
            char* EineStelleSilbe[]  = {"a","b","c","d","e","f","g","h","i","j",
                                        "k","l","m","n","o","p","q","r","s","t",
                                        "u","v","w","x","y","z"," ","ä","ö","ü",
                                        "ß","0","1","2","3","4","5","6","7","8",
                                        "9",".",":",";","(",")","{","}","[","]",
                                        "-","+","@","=","\"","/","\\","!","?","#",
                                        "%","*","&"}; // 62
    
            //// ----------------------------------- Wave IDS ----------------------------------- ////
    
            int VierSilbenID[] = {IDR_email}; // 1
    
            int DreiSilbenID[] = {IDR_dra, IDR_dre, IDR_dro, IDR_dru, IDR_lei, IDR_lie, IDR_wei, IDR_www, IDR__pc, IDR__pc,
                                  IDR_sch, IDR__punktDE, IDR_all, IDR_mir, IDR_dir, IDR_ben, IDR_ach, IDR_och, IDR_min, IDR_max, 
                                  IDR_kau, }; // 21
    
            int ZweiSilbenID[] = {IDR_ba, IDR_be, IDR_bo, IDR_bu, IDR_da, IDR_de, IDR_do, IDR_du, IDR_ei, IDR_eu,
                                  IDR_ga, IDR_ge, IDR_go, IDR_gu, IDR_la, IDR_le, IDR_lo, IDR_lu, IDR_l,  IDR_m,
                                  IDR_n,  IDR_ck, IDR_ie, IDR_ch, IDR_sp, IDR_ha, IDR_ho, IDR_hu, IDR_ka, IDR_ko, 
                                  IDR_ku, IDR_ma, IDR_me, IDR_mo, IDR_mu, IDR_na, IDR_ne, IDR_no, IDR_nu, IDR_ta, 
                                  IDR_to, IDR_tu}; // 20
    
            int EineSilbeID[]  = {IDR_a, IDR_b, IDR_c, IDR_d, IDR_e, IDR_f, IDR_g, IDR_h, IDR_i, IDR_j,
                                  IDR_k, IDR_l, IDR_m, IDR_n, IDR_o, IDR_p, IDR_q, IDR_r, IDR_s, IDR_t,
                                  IDR_u, IDR_v, IDR_w, IDR_x, IDR_y, IDR_z, IDR_blank, IDR_ae_, IDR_oe_, IDR_ue_,
                                  IDR_s,    IDR_0, IDR_1, IDR_2, IDR_3, IDR_4, IDR_5, IDR_6, IDR_7, IDR_8,
                                  IDR_9, IDR__punkt, IDR__komma, IDR__semicolon, IDR__klammerauf, IDR_klammerzu, IDR__klammerauf, IDR__klammerzu, IDR__eckigeklammerauf, IDR__eckigeklammerzu,
                                  IDR__minus, IDR__plus, IDR__aetzeichen, IDR__gleich, IDR__anfuehrungszeichen, IDR__slash, IDR__backslash, IDR__ausrufezeichen, IDR__fragezeichen, IDR__raute,
                                  IDR__prozent, IDR__sternchen, IDR__und}; // 62
    
            //// --------------------------------- Wave Pausen ---------------------------------- ////
    
            int VierSilbenP[]  = {650};
    
            int DreiSilbenP[]  = {250,   550,   550,   550,   550,   550,   550,   550,   550,   550,
                                  550,   550,   550,   550,   550,   550,   550,   550,   550,   550,
                                  550};
    
            int ZweiSilbenP[]  = {400,   300,   300,   300,   300,   300,   300,   300,   300,   300,
                                  300,   300,   300,   300,   300,   300,   300,   300,   300,   300,
                                  300,   300,   300,   300,   300,   300,   300,   300,   300,   300,
                                  300,   300,   300,   300,   300,   300,   300,   300,   300,   300,
                                  300,   300};
    
            int EineSilbeP[]   = {100,   100,   100,   100,   100,   100,    80,   100,   100,   100,
                                  100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
                                  100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
                                  100,   350,   350,   350,   350,   350,   350,   350,   350,   350,
                                  350,   100,   100,   100,   650,   650,   650,   650,  1150,  1150,
                                  350,   650,   650,   650,  1350,   100,   100,   100,   100,   100,
                                  100,   100};
    
            //// ----------------------------- Abfrage Zeichenfolge ----------------------------- ////
    
            for(int j = 0;j < 1;j++) 
            { 
              if(strcmp(strVierStellen,VierStellenSilbe[j]) == 0) 
              { 
               ::PlaySound(MAKEINTRESOURCE(VierSilbenID[j]), NULL, SND_RESOURCE | SND_ASYNC );
               sleep(VierSilbenP[j]);
                i+=4;
              } 
            }
            for(int k = 0;k < 21;k++) 
            { 
              if(strcmp(strDreiStellen,DreiStellenSilbe[k]) == 0) 
              { 
               ::PlaySound(MAKEINTRESOURCE(DreiSilbenID[k]), NULL, SND_RESOURCE | SND_ASYNC );
               sleep(DreiSilbenP[k]);
               i+=3;
              } 
            }
            for(int l = 0;l < 20;l++) 
            { 
              if(strcmp(strZweiStellen,ZweiStellenSilbe[l]) == 0) 
              { 
               ::PlaySound(MAKEINTRESOURCE(ZweiSilbenID[l]), NULL, SND_RESOURCE | SND_ASYNC );
               sleep(ZweiSilbenP[l]);
               i+=2;
              } 
            }
            for(int m = 0;m < 62;m++) 
            { 
              if(strcmp(strEineStelle,EineStelleSilbe[m]) == 0) 
              { 
               ::PlaySound(MAKEINTRESOURCE(EineSilbeID[m]), NULL, SND_RESOURCE | SND_ASYNC );
               sleep(EineSilbeP[m]);
              } 
    
              if (strEineStelle == ' ')
              {
              ::PlaySound(MAKEINTRESOURCE(IDR_blank), NULL, SND_RESOURCE | SND_ASYNC );
              sleep(180);
              i+=1;
              goto start;
              }
            }
        }
    }
    

    das einzige Problem ist nur das die Waves komisch abgespielt werden.

    Z.B die Silbe dra wird so abgespielt drad also das d hört man nocheinmal am ende
    bei den zweistelliegen Silben ist es das selbe. Die Silbe ba wird bab abgespielt. Also man hört das b nochmal.

    Habt Ihr vieleicht eine Idee warum der erste Buchstabe der Silbe nocheinmal am ende der Silbe zu hören ist?

    [ Dieser Beitrag wurde am 20.02.2003 um 22:43 Uhr von asmodia editiert. ]



  • Hallo,

    den Fehler habe ich gefunden und behoben.

    Es lag an foleenden Zeilen:

    CString strVierStellen = strText.Mid(i, +4);
    CString strDreiStellen = strText.Mid(i, +3);
    CString strZweiStellen = strText.Mid(i, +2);
    CString strEineStelle = strText.Mid(i, +1);

    Die müssen nämlich zwischen den for Schlefen aufgerufen werden, jeweils for
    der entsprechenden Schleife.

    Vielen Danke für eue Mühe.

    [ Dieser Beitrag wurde am 21.02.2003 um 02:13 Uhr von asmodia editiert. ]



  • Zu Deinem Problem mit "\":

    Du mußt wohl Escape-Sequenzen benutzen!

    Wie bei \n für Zeilenumbruch.

    Also z.B. \\ für \
    \? für ?
    \" für "

    etc.

    Sarge



  • Original erstellt von <Sgt. Nukem>:
    **Zu Deinem Problem mit "\":

    Du mußt wohl Escape-Sequenzen benutzen!

    Wie bei \n für Zeilenumbruch.

    Also z.B. \\ für \
    \? für ?
    \" für "

    etc.

    Sarge**

    Jo, das habe ich auch s.i oben.

    für \ habe ich "\" und für " habe "\"" usw. genommen.

    Es funktioniert alles super und ich bin mehr als zufrieden.


Anmelden zum Antworten