umwandeln von Tchar* nach Tchar[]
-
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 !!
-
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