umwandeln von Tchar* nach Tchar[]
-
hallo. ich habe ne ganz simple frage. aber ich krieg die lösung einfach nicht hin. ich hoffe ihr könnt mir helfen.
ich habe folgendes gegeben:
TCHAR* szText = NULL;
ich habe ein
TCHAR mystring [100];
in den ich daten aus einer textdatei schreibe.
wie kann ich jetzt die daten aus der variable mystring in meine variable szText verschieben ?
also wenn ich sage: sztext = mystring. zeigt mir das keinen fehler an. aber es stehen dann falsche werte in szText.
wie kann ich das vernünftig machen ???
danke euch !!
-
brian_t schrieb:
wie kann ich jetzt die daten aus der variable mystring in meine variable szText verschieben ?
da gibts nichts zu verschieben. du kannst höchstens szText, weil es ein pointer ist, auf mystring zeigen lassen.
brian_t schrieb:
also wenn ich sage: sztext = mystring. zeigt mir das keinen fehler an. aber es stehen dann falsche werte in szText.
in dem fall zeigt szText auf mystring^^. wenn du dann z.b. mit stText[index] auf die elemente von mystring zugreifen würdest, wäre es das gleiche, al würdest du mystring[index] hinschreiben. sollte also klappen.
-
Erklär du mir mal bitte was die Variable szText ist (in Worten), damit ich dein Problem verstehe.
-
also mein problem ist:
ich habe zum einen:
szText = _T("ABCDEFG HIJKLMNOP QRSTUVWXYZ");
in einer funktion stehen. dabei ist szText als globale variable deklariert da ich sie weiter unten mit einem DrawText wieder ausgebe. so funktioniert das auch wunderbar.
ich möchte aber nicht diese zeichen die in szText stehen ausgeben, sondern den inhalt einer datei.
so lese ich ein:
fp=_tfopen(_T("My Documents/scan1.txt"),_T("r")); if (fp != NULL){ while(_fgetts(mystring,100,fp)) { _putts(mystring); } } fclose(fp);
da hab ich mir gedacht setze ich am ende einfach das
szText = mystring;
und alles ist gut und der text wird angezeigt
aber läuft nicht irgendwie. wenn ich mystring über printf ausgebe werden die richtigen werte angezeigt. also da sollte es richtig drin stehen.
ka warum das nicht geht.
habt ihr ne idee??
danke !!
-
Hast du mal _tprintf mit szText versucht?
-
aso ja klar.. _tprintf .. damit kann ich die werte richtig ausgeben. nur dann halt nicht über drawtext. ich weiss nicht worin da der unterschied besteht warum er es einmal macht wenn ich szText mit den werten direkt fülle oder wenn ich dann szText auf mystring zeigen lasse
-
Ok, dann zeig mal deinen DrawText Aufruf mit szText, so wie er derzeit nicht funktioniert und vllt. noch mit myString, so wie er funktioniert.
-
brian_t schrieb:
ich weiss nicht worin da der unterschied besteht warum er es einmal macht wenn ich szText mit den werten direkt fülle oder wenn ich dann szText auf mystring zeigen lasse
Wir auch nicht.
Mehr Code!
-
alles klar.. hier der relevante code:
#include <windows.h> #include <string.h> . . TCHAR* szText = NULL; . . . void TfillMsgPuffer(void){ FILE* fp; TCHAR mystring [100]; szText = _T("ABCDEF GHIJK LMNOPQ"); fp=_tfopen(_T("My Documents/scan1.txt"),_T("r")); if (fp != NULL){ while(_fgetts(mystring,100,fp)) { _putts(mystring); } } fclose(fp); szText = mystring; //_tprintf(mystring); } . . . int WINAPI WinMain(HINSTANCE hInstance,...... . . LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; int cCount = 0; hWND = hWnd; TfillMsgPuffer(); static const int iRand = 65; static const int iZeichenhoehe = 15; static RECT rect; static int iScrollRange; static int iScrollPos; . . . case WM_SIZE: { HDC hDC; RECT TextRect; rect.left = iRand; rect.top = 0; rect.right = LOWORD(lParam) - iRand; rect.bottom = HIWORD(lParam); TextRect = rect; hDC = GetDC(hWnd); { 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; } 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, szText, lstrlen(szText), &rect, DT_WORDBREAK); } EndPaint(hWnd, &ps); return 0; } . . . . }
so das ist der code soweit. also wenn ich in TfillMsgPuffer szText so belasse bekomme ich die szText zugeweisenen werte ausgegeben.
sobald ich aber sage:
szText = mystring;
dann wird komischerweise gar nichts mehr ausgegeben, obwohl mystring (meiner meinung nach) richtig gefüllt ist. aber das weiss ich eben nicht genau.
-
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 !!