umwandeln von Tchar* nach Tchar[]



  • Verschieb mal myString[100] nach oben zu szText, die Variable ist nur lokal gültig, das ist das Problem.



  • Hä?? schrieb:

    Verschieb mal myString[100] nach oben zu szText, die Variable ist nur lokal gültig, das ist das Problem.

    Kurze Erläuterung: Wenn Du szText = mystring machst, zeigt szText tatsächlich auf den eben eingelesenen String. Dieser liegt aber auf dem Stack der Funktion TfillMsgPuffer. Wenn diese Funktion beendet wird, wird auch der Stack zerstört. In szText steht jetzt zwar immernoch eine Adresse, das ist aber jetzt "irgendeine" Adresse. An der steht, spätestens nach dem nächsten Funktionsaufruf, nicht mehr der eingelesene String.



  • das macht sinn 🙂 habs auch umgeändert.

    aber leider hat es das problem nicht gelöst 😞

    die anzeige bleibt leer.

    wenn ich diese zeile ausblende

    szText = mystring;
    

    dann wird der text aus sztext ausgegeben.
    wenn die zeile drin ist dann wird gar nichts ausgegeben.

    hoffe ihr habt noch weitere ideen. =7

    danke euch !!



  • vllt wird nur die adresse übergeben und mann kann nicht einfach

    szText = mystring sagen.

    wenn ich zb nen "strcpy" versuche kann er das nicht weil er das nicht umwandeln kann. sprich : cannot convert parameter 1 from 'unsigned short *'to 'char *'

    also erstmal von unsigned short nach char umwandeln ??

    oder besser mein char nach unsigned short umwandeln =)..



  • Du verwendest Unicode, d.h. dein TCHAR ist kein char, sondern wchar_t bzw. unsigned short.
    Wenn du das genau so gemacht hast wie ich es gesagt habe, dann muss es funktionieren und im Prinzip kannst du dann sogar dein szText weglassen, weil myString dann ja von überall aus zugänglich ist.

    strcpy funktioniert da natürlich nicht, da gibt es dann _tcscpy oder so ähnlich, aber davor müsstest du erstmal Speicher anfordern wo du hinkopierst, dann eher strdup benutzen bzw. _tcsdup oder wie das heißen mag.



  • also ich habe jetzt szText weggelassen und direkt mit mystring gearbeitet.
    komischerweise vrursacht das " _putts(mystring);" jetzt irgednwei das auch ohne _tprintf ein neues fenster geöffnet wird in dem die daten aus mystring ausgegeben werden.

    da bin ich echt verwundert. wenn ich diese zeile deaktiviere dann ist das problem abgetsellt. das wundert mich.

    zum anderen habe ich szText jetzt ersetzt:

    TextRect     = rect;
    
             hDC = GetDC(hWnd);
             {
               DrawText(hDC, mystring, lstrlen(mystring), &TextRect, DT_WORDBREAK | DT_CALCRECT);
    		//	 DrawText(hDC, szText, lstrlen(szText), &TextRect, DT_WORDBREAK | DT_CALCRECT);
             }
             ReleaseDC(hWnd, hDC);
    
             if (TextRect.bottom > rect.bottom)
             {
                iScrollRange = (TextRect.bottom - rect.bottom) / iZeichenhoehe + 1;
                iScrollPos   = (iScrollRange < iScrollPos) ? iScrollRange : iScrollPos;
    
                SetScrollPos(hWnd, SB_VERT, iScrollPos, TRUE);
    
    			rect.top  =  -iScrollPos * iZeichenhoehe;
                //rect.top  = (rect.top + rb.bottom-rb.top) -iScrollPos * iZeichenhoehe;
             }
    
             else
             {
                iScrollRange = 0;
                rect.top     = 0;
             }
    
             SetScrollRange(hWnd, SB_VERT, 0, iScrollRange, TRUE);
    
             return 0;
          }
    
       case WM_PAINT:
          {
             PAINTSTRUCT   ps;
             HDC           hDC;
    
             hDC = BeginPaint(hWnd, &ps);
             {
              DrawText(hDC, mystring, lstrlen(mystring), &rect, DT_WORDBREAK);
    		//	DrawText(hDC, szText, lstrlen(szText), &rect, DT_WORDBREAK);
             }
             EndPaint(hWnd, &ps);
    
             return 0;
          }
    

    aber irgednwie bleibt meine anzeige leer. ich weiss nicht warum. oder kann man über drawtext nur unsigned short ausgeben ??

    danke !!



  • Kein Wunder du verwendest ja schon wieder falsche Funktionen um mit deinen Strings zu arbeiten: lstrlen funktioniert nicht mit Unicode, du benutzt den generischen Typen TCHAR und damit musst du _tcslen benutzen (zumindest glaub ich, dass die Funktion _tcslen heißt).



  • Hallo,

    Hä?? schrieb:

    lstrlen funktioniert nicht mit Unicode

    Doch, das funktioniert, auch mit UNICODE. Dennoch würde ich DrawText die Zeichen selber zählen lassen, durch Angabe von -1 statt der Länge.

    MfG,

    Probe-Nutzer



  • guten morgen 🙂
    also ich habe beides probiert. also auch mit -1 zählen lassen. wenn ich das tue dann gibt er mir den letzten wert aus. also der letzte wert der in der textdatei steht.

    aber warum nicht alle??

    danke euch !!



  • brian_t schrieb:

    aber warum nicht alle??

    Ist das dein Ernst?

    Du liest die Datei zeilenweise ein, in einem Rutsch. Deshalb steht danach der Inhalt der letzten Zeile in deiner Variablen.

    Du erwartest hoffentlich nicht, dass dein Programm auf magische Weise deine Einleseschleife unterbricht, um Zwischenergebnisse darzustellen.



  • ich hab das deshalb gedacht.

    TCHAR* szText = NULL;
    ...
    
    szText = _T("HUI-4444-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-6666-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-9999-01-10 HUI-1111-01-10 HUI-2222-01-10 HUI-3333-01-10 HUI-4444-01-10 HUI-5555-01-10 HUI-6666-01-10 HUI-7777-01-10 HUI-8888-01-10 HUI-9999-01-10");
    
    ....
    
     hDC = GetDC(hWnd);
             {
    		 DrawText(hDC, szText, -1, &TextRect, DT_WORDBREAK | DT_CALCRECT);
    
             }
             ReleaseDC(hWnd, hDC);
    
             if (TextRect.bottom > rect.bottom)
             {
                  iScrollRange = (TextRect.bottom - rect.bottom) / iZeichenhoehe + 1;
    
    		      iScrollPos   = (iScrollRange < iScrollPos) ? iScrollRange : iScrollPos;
    
                  SetScrollPos(hWnd, SB_VERT, iScrollPos, TRUE);
    
    		      rect.top  =  -iScrollPos * iZeichenhoehe;
             }
    
             else
             {
                iScrollRange = 0;
                rect.top     = 0;
             }
             SetScrollRange(hWnd, SB_VERT, 0, iScrollRange, TRUE);
    
             return 0;
          }
    
       case WM_PAINT:
          {
             PAINTSTRUCT   ps;
             HDC           hDC;
    
             hDC = BeginPaint(hWnd, &ps);
             {
    			 GetWindowRect(g_hwndCB, &rb);
    			 rect.top = (rect.top + rb.bottom-rb.top)+10;
    
    			DrawText(hDC, szText, -1, &rect, DT_WORDBREAK);
             }
             EndPaint(hWnd, &ps);
    
             return 0;
          }
    

    wenn ich szText ausgebe wird ja auch alles auf einmal ausgegeben. das war mein test. jetzt mit den daten aus der datei:

    TCHAR mystring [100];
    ...
      FILE* fp;
    
      fp=_tfopen(_T("My Documents/scan.txt"),_T("r"));
    
    	if (fp != NULL){
    		while(_fgetts(mystring,100,fp))
    		{
    	      mystring[_tcslen(mystring)-1] = 0;
              _putts(mystring);
    		} 
    	}
      fclose(fp);
    
    ....
    
     hDC = GetDC(hWnd);
             {
    		 DrawText(hDC, mystring, -1, &TextRect, DT_WORDBREAK | DT_CALCRECT);
    
             }
             ReleaseDC(hWnd, hDC);
    
             if (TextRect.bottom > rect.bottom)
             {
                  iScrollRange = (TextRect.bottom - rect.bottom) / iZeichenhoehe + 1;
    
    		      iScrollPos   = (iScrollRange < iScrollPos) ? iScrollRange : iScrollPos;
    
                  SetScrollPos(hWnd, SB_VERT, iScrollPos, TRUE);
    
    		      rect.top  =  -iScrollPos * iZeichenhoehe;
             }
    
             else
             {
                iScrollRange = 0;
                rect.top     = 0;
             }
             SetScrollRange(hWnd, SB_VERT, 0, iScrollRange, TRUE);
    
             return 0;
          }
    
       case WM_PAINT:
          {
             PAINTSTRUCT   ps;
             HDC           hDC;
    
             hDC = BeginPaint(hWnd, &ps);
             {
    			 GetWindowRect(g_hwndCB, &rb);
    			 rect.top = (rect.top + rb.bottom-rb.top)+10;
    
    			DrawText(hDC, mystring, -1, &rect, DT_WORDBREAK);
             }
             EndPaint(hWnd, &ps);
    
             return 0;
          }
    

    wäre das dann nicht das gleiche ?? ich kann z.B. auch sagen tprintf(mystring); und es werden alle daten aus der Datei ausgegeben und nicht nur eine zeile.

    irgednwie versteh ich den unterschied noch nicht so ganz 🙂
    hoffe du kannst mich aufklären.

    danke dir !!



  • brian_t schrieb:

    wäre das dann nicht das gleiche ??

    Nein. Zu keinem Zeitpunkt steht in mystring der gesamte Dateiinhalt, sondern immer nur eine einzige Zeile. Dass du bei Ausgabe auf die Konsole (tprintf usw) trotzdem die ganze Datei siehst, liegt daran, dass du nach dem Einlesen jeder Zeile die Ausgabefunktion aufrufst, und dass die Konsole eben auch alte Ausgaben weiter anzeigt.

    Dein Fenster tut das nicht. WM_PAINT bedeutet, dass das Fenster neu gezeichnet werden muss. Damit werden alte Ausgaben gelöscht.

    Außerdem passiert das überhaupt erst dann, wenn deine Einleseschleife abgeschlossen ist, und damit die letzte Zeile in mystring steht.

    Wenn du den ganzen Text sehen willst, musst du auch den ganzen Text in einer Variablen vorhalten, nicht nur eine Zeile.



  • ok danke, gut zu wissen 🙂
    dann mach ich mich mal auf die suche nach einer art wie ich den kompletten text in meine variable bekomme.

    also so, wie ich es jetzt mache geht es dann ja wohl schonmal nicht (fgets)
    mit fscanf hab ich es auch schonmal probiert. damit geht es auch nicht.
    und der iostream steht mir mit embedded visual studio nicht zur verfügung.

    naja.. ich werde erstmal suchen 🙂 .. danke dir !!



  • versuche jetzt den text komplett in mystring zu schreiben. ist laut code, fuer mich jedenfalls, auch einleuchtend. jedoch hängt sich mein programm nach aufrufen der funktion auf.

    entdeckt ihr einen fehler ??

    FILE* fp;
      int i = 0;
      TCHAR buf[1024];
      TCHAR *c;
    .....
    
    fp=_tfopen(_T("My Documents/scan.txt"),_T("r"));
    
    if (fp != NULL){
    	while(i<255 && _fgetts(buf, 1023, fp)){
    
             _tcscpy(mystring[i], buf);
    
            i++;
    	}
    }
    
    fclose(fp);
    


  • Hallo,

    brian_t schrieb:

    entdeckt ihr einen fehler ??

    Nein, aber vielleicht liegt es daran, wie mystring definiert wurde. Um Zeichenketten hintereinander zusammen zu fügen, kann man übrigens auf str(n)cat zurückgreifen...

    MfG,

    Probe-Nutzer



  • also es liegt auf jeden fall an der zeile.

    mystring wurde so definiert: TCHAR* mystring [1024];



  • ich habs so versucht. jedoch bekomme ich dann einen fehler:

    strcat(mystring[i], *buf);
    

    error C2664: 'strcat' : cannot convert parameter 1 from 'unsigned short *'
    to 'char *'

    also das funktioniert auch nicht so ohne weiteres. !?!?

    warum ist das nur so schwer 😕



  • _tcscat( mystring, buf )
    

    Wenn du mystring vorher mit '\0' initialisiert hast.



  • also ich versuche mich ja wirklich nicht dumm anzustellen 😕 .. aber irgednwie klappt das nicht.

    initialisieren mit '\0':

    --> TCHAR* mystring [1024] = _T('\0');;
    --> Fehler: cannot convert from 'const unsigned short' t
    o 'unsigned short *[1024]'

    vorschlag: _tcscat( mystring, buf );

    --> fehler: cannot convert parameter 1 from 'unsigned short *[
    1024]' to 'unsigned short *'

    ich hoffe ihr habt noch geduld mit mir !!

    danke euch vielmals !



  • brian_t schrieb:

    --> TCHAR* mystring [1024] = _T('\0');;

    Ach, mystring ist jetzt ein Array von TCHAR-Zeigern? Das hättest du erwähnen müssen.
    Du musst aber nicht jede Zeile in einem eigenen Puffer speichern.

    Wenn du das aber tun willst, musst du für jede Zeile einzeln Speicher reservieren.


Anmelden zum Antworten