CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - GDI+ AddString - problem z tekstem
Strona 1 z 2

GDI+ AddString - problem z tekstem

Nowy postNapisane: sobota, 11 listopada 2017, 11:43
przez pioro700
Dzień dobry.
Mam problem z wyświetleniem tekstu w funkcji Gdiplus GraphicsPath.AddString(const WCHAR *string, INT length, const FontFamily *family, INT style, REAL emSize, const Rect &layoutRect, const StringFormat *format)

Żeby nie śmiecić, nie będę wrzucał całego kodu, bo nie ma z nim problemu. Problem jest z tekstem, który chcę wyświetlić, a mianowicie:
jeżeli użyję String tekst = Memo1->Text; a później w funkcji AddString(tekst.c_str(), -1 .......... ) Wszystko jest OK.
natomiast kiedy używam String tekst = Memo1->Lines->Strings[0]; - wtedy na ekranie jest pustka mimo, że funkcja "AddString" zwraca status=OK.
Ma ktoś jakieś pomysły. ???
Wiem, że długość obu ciągów jest różna, różnica dwóch znaków, ale dodawanie "\r", "\n" lub "\r\n" nic nie zmienia ...

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: sobota, 11 listopada 2017, 17:16
przez Cyfrowy Baron
Memo1->Lines->Strings[0] oznacza pierwszą linię tekstu z Memo1. Czy ta linia coś zawiera. Najpierw sprawdź czy po takim przypisaniu zmienna tekst coś zawiera:

KOD cpp:     UKRYJ  
String tekst = Memo1->Lines->Strings[0];
ShowMessage(tekst);


Problem nie leży w funkcji AddStrings lecz w przypisaniu wartości do zmiennej tekst.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: sobota, 11 listopada 2017, 17:47
przez pioro700
Cyfrowy Baron napisał(a):Problem nie leży w funkcji AddStrings lecz w przypisaniu wartości do zmiennej tekst.

Tego się domyślam, gdyż kiedy użyję Memo1->Text.SubString(x,x), to też wszystko jest OK, tylko że wszystkie te funkcje zwracają zmienną typu UnicodeString, czyli nie powinno to mieć żadnego znaczenia ... a ma. :roll:
Cyfrowy Baron napisał(a):Czy ta linia coś zawiera. Najpierw sprawdź czy po takim przypisaniu zmienna tekst coś zawiera:

Zanim napisałem, to była to pierwsza rzecz którą sprawdziłem. Co najśmieszniejsze, to to, że nie ma znaczenia czy jest to jedna, czy wiele linii tekstu. :evil:

A na koniec wisienka. Napisałem bardzo durną "przekładankę":

TStringList *lista = new TStringList;
lista->Add(Memo1->Text);
UnicodeString tmp = lista->Strings[0];
delete lista;

użyłem "tmp" w AddSring ... i ..... wyświetla :lol:

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: sobota, 11 listopada 2017, 20:18
przez Cyfrowy Baron
Przekombinowane to.

Nie rozumiem dlaczego nie działa z Memo1->Lines->Strings[0]. Cały czas mam wrażenie, że coś mi umyka.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: sobota, 11 listopada 2017, 21:28
przez pioro700
Cyfrowy Baron napisał(a):Przekombinowane to.

Nie powiem ... jestem w tym niezły.
Cyfrowy Baron napisał(a):Nie rozumiem dlaczego nie działa z Memo1->Lines->Strings[0].

Są rzeczy, o których się nawet filozofom nie śniło. .. :o

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: niedziela, 12 listopada 2017, 19:29
przez Cyfrowy Baron
pioro700 napisał(a):
Cyfrowy Baron napisał(a):Przekombinowane to.


Przekombinowane, znaczy, że takie rozwiązanie nie jest dobre. Może zamiast Memo1 powinieneś użyć ListBox skoro pobierasz linia , wtedy nie musiałbyś tak kombinować.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: poniedziałek, 13 listopada 2017, 23:13
przez pioro700
Przede wszystkim ogromne dzięki za zainteresowanie.
Cyfrowy Baron napisał(a):takie rozwiązanie nie jest dobre

Doskonale o tym wiem. Tak tylko strzelałem "Ślepakami" na oślep i takie coś wyszło.

Natomiast przez przypadek doprowadziłem do sytuacji, że wyświetlam tekst. A tym przypadkiem było wpisanie
String line = Memo->Lines->Strings[0].w_str();
..
..
Gdiplus::GraphicsPath path;
path.AddString(line.w_str(), .......) i to działa :o
Jestem za cienki, żeby to pojąć. Masz może jakieś wytłumaczenie ??

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: wtorek, 14 listopada 2017, 11:17
przez polymorphism
No a tak:
KOD cpp:     UKRYJ  
path.AddString(Memo->Lines->Strings[0].w_str(), .......);

nie działa?

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: wtorek, 14 listopada 2017, 15:13
przez pioro700
Ano niestety nie ... ale za to
KOD cpp:     UKRYJ  
String linia = ListBox1->Items->Strings[0];
AddString(linia.w_str() .... )
 

już tak, ale
KOD cpp:     UKRYJ  
AddString(ListBox1->Items->Strings[0].w_str() .... )
 

już nie.
Tak w ogóle, to myślałem, że pojmuję, choć w część GDI+ w Builderze, ale szybko się okazało, że poruszam się jak dziecko we mgle.
Teraz mam następną zagwozdkę, a mianowicie Gdiplus::Graphics

Kiedy tworzę obiekt
KOD cpp:     UKRYJ  
HDC hDC = this->Canvas->Handle;
   Gdiplus::Graphics f(hDC);

mogę wtedy rysować, wypełniać, kreślić .... ale nie mogę zmierzyć wielkości ciągu, MeasureString ... nie pokazuje błędu, tylko zwraca RectF(0,0,0,0)
Kiedy zmienię deklarację na:
KOD cpp:     UKRYJ  
Gdiplus::Graphics f(Canvas->Handle);

Otrzymuję właściwe wyniki ...

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: wtorek, 14 listopada 2017, 19:19
przez polymorphism
Dziwne...

Dałeś gdzieś na początku aplikacji:
KOD cpp:     UKRYJ  
ULONG gdiplusToken;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;

Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);


I na końcu:
KOD cpp:     UKRYJ  
Gdiplus::GdiplusShutdown(gdiplusToken);

:?:

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: wtorek, 14 listopada 2017, 19:36
przez pioro700
Oczywiście. Inaczej zawsze otrzymywałbym "GdiplusNotInitialized" ....
Zaczynam podejrzewać jakieś złośliwe trolle w moim kompie.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: wtorek, 14 listopada 2017, 22:34
przez Cyfrowy Baron
pioro700 napisał(a):Ano niestety nie ... ale za to
KOD cpp:     UKRYJ  
String linia = ListBox1->Items->Strings[0];
AddString(linia.w_str() .... )
 

już tak, ale

A u mnie to nie działa.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 00:57
przez polymorphism
Fajny ten Builder... :)

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 08:53
przez pioro700
Cyfrowy Baron napisał(a):
pioro700 napisał(a):Ano niestety nie ... ale za to
KOD cpp:     UKRYJ  
String linia = ListBox1->Items->Strings[0];
AddString(linia.w_str() .... )
 

już tak, ale

A u mnie to nie działa.


Właśnie ten kod działa .... może ja umieściłem komentarze w niewłaściwym miejscu.
To co nie działa to (kod poniżej)
KOD cpp:     UKRYJ  
AddString(ListBox1->Items->Strings[0].w_str() .... )
 


polymorphism napisał(a):Fajny ten Builder... :)

Wiele razy myślałem o innym środowisku .... ale chyba za stary jestem ... i za leniwy.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 11:42
przez polymorphism
Szczerze mówiąc ciężko mi uwierzyć, żeby inny zapis tego samego może powodować aż takie różnice w działaniu.