sonderzeichen in file??? -> absturz :(



  • Aziz schrieb:

    Ich hab bereits in einem anderen Thread von dir ein Code-Schnipsel gepostet, das den Text eines Edit Controls holt. Also hier nochmal:

    int nLen = SendMessage(hwndEdit, WM_GETTEXTLENGTH, 0, 0); 
      TCHAR *pText = new TCHAR[nLen +1]; 
      pText[nLen] = 0; // Macht wahrscheinlich auch das Control selber, aber wir gehen am besten sicher 
      SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)nLen+1, (LPARAM)pText);
      delete[] pText; //löschen nicht vergessen
    

    ja aber wie kriege ich denn die textlänge ohne ne neue nachricht abzuschicken? ich hab das ganze jetzt gemacht indem ich die vars mit new initialisiere...geht eigentlich ganz gut...nur am ende des geladenen textes hängen manchmalm ungewollte textstücken dran, das lös ich noch...das mit der textlänge muss mir jetzt nich weiner sagen, dann isses fertig.

    edit: mit der variable...die länge der chars kann ich ja erst bestimmen wenn ich die länge des feldinhaltes bestimmen kann.



  • ja aber wie kriege ich denn die textlänge ohne ne neue nachricht abzuschicken? ich hab das ganze jetzt gemacht indem ich die vars mit new initialisiere...geht eigentlich ganz gut...nur am ende des geladenen textes hängen manchmalm ungewollte textstücken dran, das lös ich noch...das mit der textlänge muss mir jetzt nich weiner sagen, dann isses fertig.

    Ich verstehe deine Frage ehrlich gesagt nicht ganz. Du willst die Textlänge erhalten ohne eine "neue" Nachricht zu schicken? Ist die Textlänge etwa konstant? Oder ist das so eine philosophische Frage ähnlich wie "Wie kann man programmieren ohne zu programmieren?" 😕 😃



  • NEIN ich meine ohne den Send Message befehlt! ich dachte in etwas so: GetTextLength(HWND hWnd, int length);
    ????



  • Achsooo 💡

    Es gibt leider keine andere Möglichkeit die Textlänge eines Edit-Controls zu erhalten.

    Wenn du willst kannst du dir aber eine hübsche inline Funktion schreiben, z.B.:

    inline int GetEditTextLength(HWND hWnd)
    {
      SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
    }
    


  • 🙂 😕 inline?
    wieso nennst du die nicht inline skater() ^^
    nein :D, was heisst denn inline? gibt die die länge zurück oder wie erhalti ich die int? muss ich das per switch/case WM_GETTEXTLENGTH abfangen oder krieg ich das einfach aus der funktion raus? 😉 thx für die hilfe btw

    edit: deine funktion braucht ein return ^^ sagt mein compiler zumindest!



  • Das Schlüsselwort inline bewirkt bei den Compilern (die es unterstützen), dass der Inhalt der Funktion an der Stelle des Funktionsaufrufes ausgebreitet wird. Das kann man sich so wie eine einfache Textersetzung vorstellen. Der Vorteil ist, dass der Overhead der bei einem Funktionsaufruf entsteht vermieden wird, weil der Funktionscode direkt an der Aufrufstelle ausgeführt wird, und dadurch keine Parameter auf den Stack gepushed bzw. keine Rücksprungadresse gespeichert werden müssen. Der Nachteil hingegen, ist, dass der Programmcode sich dementsprechend aufbläht aber der intelligente Compiler entscheidet ohnehin ob es sinnvoll ist die Funktionen auszubreiten oder nicht (man kann es mit einem speziellen Schlüsselwort jedoch erzwingen).

    Ich habe übrigens einen schlimmen Fehler in meiner Funktion gemacht, hab' nämlich das 'return' vergessen.

    inline int GetEditTextLength(HWND hWnd)
    {
      return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
    }
    


  • Aziz schrieb:

    Das Schlüsselwort inline bewirkt bei den Compilern (die es unterstützen), dass der Inhalt der Funktion an der Stelle des Funktionsaufrufes ausgebreitet wird. Das kann man sich so wie eine einfache Textersetzung vorstellen. Der Vorteil ist, dass der Overhead der bei einem Funktionsaufruf entsteht vermieden wird, weil der Funktionscode direkt an der Aufrufstelle ausgeführt wird, und dadurch keine Parameter auf den Stack gepushed bzw. keine Rücksprungadresse gespeichert werden müssen. Der Nachteil hingegen, ist, dass der Programmcode sich dementsprechend aufbläht aber der intelligente Compiler entscheidet ohnehin ob es sinnvoll ist die Funktionen auszubreiten oder nicht (man kann es mit einem speziellen Schlüsselwort jedoch erzwingen).

    Ich habe übrigens einen schlimmen Fehler in meiner Funktion gemacht, hab' nämlich das 'return' vergessen.

    inline int GetEditTextLength(HWND hWnd)
    {
      return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
    }
    

    jo dankee klappt..n kleiner tipp noch ;):

    inline int GetEditTextLength(HWND hWnd)
    {
      return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0)+1;
    }
    

    achja wenn mir schon grad n profi fragen beantwortet 🕶 :
    wieso hab ich am textende sowas: ýýýý oder auch sowas: ýýýýÝÝÝÝÝÝî? , wenn ich was lade?

    ladefunktion:

    char *LoadFileToObj(char* file)
    {
    	FILE *topen;
    		if((topen = fopen(file, "rb")) != NULL)
    		{
    			int fileSize;
    			fseek(topen, 0, SEEK_END);
                fileSize = ftell(topen);
    			if(fileSize!=0) {
    				char *buffer;
    				buffer = new char[fileSize];
    				fseek(topen, 0, SEEK_SET);
    				fread(buffer, 1, fileSize, topen);
    				fclose(topen);
    				return buffer;
    			}
    		}
    
    	return "File is empty or does not exist!";
    }
    

    aufruf:

    if(LOWORD(wParam)==1) 
    		{
    			toLoad = new char[GetEditTextLength(loadEdit)];
    			GetWindowText(loadEdit, toLoad, GetEditTextLength(loadEdit));
    			SetWindowText(textField, LoadFileToObj(toLoad)); 
    		}
    

    danke!



  • Kannst du natürlich machen. Aber für gewöhnlich geben solche Funktionen die Textlänge exklusive des NULL-Zeichens zurück...Du ersparst dir kurzläufig zwar das +1 beim allozieren von Textspeicher aber es könnte dir irgendwann passieren, dass du ständig 1 von der Länge abziehen musst...



  • achja wenn mir schon grad n profi fragen beantwortet :
    wieso hab ich am textende sowas: ýýýý oder auch sowas: ýýýýÝÝÝÝÝÝî? , wenn ich was lade?

    Hmm, das könnte vielleicht daran liegen, dass du diese Zeichen auch tatsächlich in der Datei drinnen stehen hast (also falls wir davon ausgehen, dass deine Funktion richtig funktioniert). Andererseits kann's daran liegen, dass du den String einer Funktion übergibst, die einen null-terminierten String erwartet (es läuft dann so lange im Speicher wild herum bis es eine Null gefunden hat, denn dann weiß er: "Aha! Hier hört der String auf."). Ich hab deine Funktion mal verbessert:

    char *LoadFileToObj(char* file) 
    { 
        FILE *topen; 
            if((topen = fopen(file, "rb")) != NULL) 
            { 
                int fileSize; 
                fseek(topen, 0, SEEK_END); 
                fileSize = ftell(topen); 
                if(fileSize!=0) { 
                    char *buffer; 
                    buffer = new char[fileSize+1];
                    buffer[fileSize] = 0; // Wichtig: String null-terminieren
                    fseek(topen, 0, SEEK_SET); 
                    fread(buffer, 1, fileSize, topen); 
                    fclose(topen);
    
                    return buffer; 
                } 
            } 
    
        return NULL; // Am besten du gibst NULL bei Zeigern zurück wenn es einen Fehler gab
    }
    


  • oder deinen Speicher (falls du mehr reserviert hast, als du nachher reinliest) vorher mit ZeroMemory initialisieren bzw. nach dem Einlesen eben entsprechend der Anzahl der eingelesenen Zeichen das 0-Zeichen reinsetzen.



  • aziz hatte recht, flenders nicht ^^ ich hab mit zero memory nach dem initialisieren von buffer allen inhalt von buffer auf 0 gesetzt, fehler trotzdem da...aziz' funktion klappt!
    wie kann ich n int in nen char* umwandeln?
    char *lol = char(sizeof(toLoad));
    so gehts nich 😞

    btw.: danke nochmal für die nette hilfe hier 😉



  • flenders hatte eigentlich nur meine Worte ergänzt. Er hatte nicht in Frage gestellt ob ich Recht habe oder nicht...



  • Mit itoa() kannst du einen Integer in einen String umwandeln.



  • war ja nicht bös gemeint 😉
    danke!



  • pixartist schrieb:

    war ja nicht bös gemeint 😉
    danke!

    Das nahm ich auch nicht an 😉



  • wo wir so schön dabei sind...wie heisst die msg um die schriftart eines textedits zu ändern?
    thx
    👍



  • Die heißt WM_PIXARTIST_MUSS_ERSTMAL_EIN_C++_TUTORIAL_DURCHLESEN, gefolgt von WM_PIXARTIST_MUSS_ERSTMAL_EIN_WINAPI_TUTORIAL_DURCHLESEN



  • ich bin mal nicht so gemein - WM_SETFONT 😉

    Aber der von Hepi vorgeschlagene Weg ist sicher der langfristig bessere. 🕶


Anmelden zum Antworten