Niedawno zainteresowałem się środowiskiem Lazarus (nie ma w tej chwili żadnej darmowej wersji Delphi bezpośrednio obsługującej bazy danych). Napisałem sobie mały testowy programik łączący się z bazą MS SQL przy pomocy ODBC. Okazuje się, że zamiast polskich znaków w DBGrid pokazują się pytajniki. Gdzie szukać problemu?
- Rejestracja:ponad 22 lata
- Ostatnio:około 11 godzin
dzieje się tak z powodu różnych kodowań, lazarus obsługuje UTF8, a bazę zapewne masz w cp1250.
aby to rozwiązać we wszystkich polach dataset'u (sqlquery) typu string, w zdarzeniu OnGetText dodaj coś takiego:
aText:=CP1250ToUTF8(Sender.AsString);
oczywiście do modułów musisz dodać LConvEncoding.
- Rejestracja:prawie 13 lat
- Ostatnio:3 dni
- Postów:1855
Paweł Dmitruk napisał(a):
we wszystkich polach dataset'u (sqlquery) typu string, w zdarzeniu OnGetText dodaj coś takiego:
aText:=CP1250ToUTF8(Sender.AsString);
oczywiście do modułów musisz dodać LConvEncoding.
możecie mi to bardziej łopatologicznie wyjaśnić ?
EDIT:
Próbuje znaleźć info czym właściwie jest "dataset", ale nic konkretnego nie wyczytałem...
To jakiś komponent (jeśli tak to go u siebie nie mogę zidentyfikować....)?
EDIT:
Znalazłem dataset w zdarzeniach DataSource - chyba o to chodziło ?
Jednak nie mam w nim zdarzenia OnGetText...
Eksperymentalnie wstawiłem
aText:=CP1250ToUTF8(Sender.AsString);
w zdarzenie OnNewRecord -> otrzymałem dwa błędy:
unit1.pas(324,6) Error: Identifier not found "aText"
unit1.pas(324,27) Error: Identifier not found "Sender"
- Rejestracja:prawie 13 lat
- Ostatnio:3 dni
- Postów:1855
Znalazłem w sieci wskazówkę ab wstawic w kodzie:
SQLQuery1.SQL.Text := 'set names ' + #39 + 'utf8' + #39;
SQLQuery1.ExecSQL;
SQLTransaction1.Commit;
SQLQuery1.Close;
Jednak wtedy otrzymuje błąd:
Możecie mi pomóc, podpowiedzieć co powinienem zrobić ?

- Rejestracja:około 20 lat
- Ostatnio:ponad 9 lat
hipekk napisał(a):
Paweł Dmitruk napisał(a):
we wszystkich polach dataset'u (sqlquery) typu string, w zdarzeniu OnGetText dodaj coś takiego:
aText:=CP1250ToUTF8(Sender.AsString);
oczywiście do modułów musisz dodać LConvEncoding.
możecie mi to bardziej łopatologicznie wyjaśnić ?
Już bardziej łopatologicznie to trudno będzie. Klikasz 2x na swój DataSet - otworzy się lista pól tego DataSet'u. Wybierasz odpowiednie pole i w Object Inspectorze masz dostęp do jego właściwości i zdarzeń. Znajdujesz zdarzenie OnGetText, klikasz na nim 2x i w kodzie zdarzenia dopisujesz tę 1 linijk e, o której tutaj jest mowa.
Co do tego, czym jest DataSet:
http://podgoretsky.com/ftp/Docs/Delphi/D5/dg/5_datset.html
Niestety nie znalazłem na szybko niczego ładnie opisanego po polsku (może kiepsko szukałem).
- Rejestracja:prawie 13 lat
- Ostatnio:3 dni
- Postów:1855
Dzięki uprzejmości Pociech'a udało mi się zmienić kodowanie, jednak pojawił się nowy problem...
Po zmianie kodowania na UTF8 dane w DbGrid wyświetlają się poprawnie jednak przy użyciu np SqlQuery2.Fields[0].AsString; skopiowany tekst znów ma "?" zamiast polskich liter...
Czemu tak się dzieje ?
- Rejestracja:około 12 lat
- Ostatnio:około 12 lat
- Postów:4
hipekk napisał(a):
@Pawelper utf8tocp1250() ;)
Oczywista oczywistość :D, tylko w którym miejscu ją wpisać ;)
- Rejestracja:około 12 lat
- Ostatnio:około 12 lat
- Postów:4
Paweł Dmitruk napisał(a):
dzieje się tak z powodu różnych kodowań, lazarus obsługuje UTF8, a bazę zapewne masz w cp1250.
aby to rozwiązać we wszystkich polach dataset'u (sqlquery) typu string, w zdarzeniu OnGetText dodaj coś takiego:
aText:=CP1250ToUTF8(Sender.AsString);
oczywiście do modułów musisz dodać LConvEncoding.
Dziękuję za ten tekst, bo przepytałem całego google i nie znalazłem podopowiedzi. Natomiast tutaj bardzo precyzyjnie Paweł Dmitruk wyjasnił problem. Drogą analogii myślałem, żę stosując UTF8ToCP1250 do zdarzenia OnSetText przekonwertuję wyedytowaną wartość do bazy. Niestety pojawia się błąd :(. Być może problem jest banalny i pytanie jest lamerskie, ale wybaczcie, bo od tygodnia uczę się Lazarusa i wydaje mi się, że jest fajny :). Chyba, że może w składni zapytania SQL zastosować tę funkcję, jeśli tak to proszę o link do jakiegoś faq.
Dzięki za zainteresowanie
pozdr
Pawel
- Rejestracja:około 12 lat
- Ostatnio:około 12 lat
- Postów:4
Paweł Dmitruk napisał(a):
dla ustawiania wartości w OnSetText wpisujesz:
Sender.AsString:=UTF8ToCP1250(aText);
jeżeli chodzi Ci o edycję danych w gridzie
Działa :-D
Dziękuję Dobry Człowieku :)