Qreport и проблема с кодировкой...

  • Автор темы brink
  • Дата начала
B

brink

Гость
#1
Помогите решить проблему:
В отчете использую band типа detail в него помещен QRDBText. Проблема в том, что его значение может составлять порядка 160 символов, что не вмещается в облати выводимого листа, как можно перенести на следующую строку текст, или может есть альтернативный способ?

Есть еще одна проблема с отчетами:
Входной dbf-файл формируется в FoxPro8 (по моему), таблица символов _866 кодировка (досовская типа), но если его, то есть dbf-файл выводить в отчет или открывать через Builder, то вместо букв - "кракозябры", пытался поиграть с настройками текстовых полей но ничего не получилось.

Помогите, пожалуйста, вопрос очень важен!
 
B

brink

Гость
#2
С первым пунктом разобрался. Там все просто - получаешь в real-time значение Value, события OnPrint компоненты QRDBText и "лишние" символы переносиш ниже, например, в QRLabel :)

А вот со вторым вопросом, думаю, там нужно этоже значение конвертировать в _win кодировку, но как? :)
 
B

brink

Гость
#3
Нашел решение проблемы - но оно для делфи, если кто может, помогите перевести на язык С, хотя б пару намеков, или может есть какойто аналог в С?

Код:
procedure tform1.button1click(sender: tobject); 
var 
code1, code2: tcode; 
s: string; 
c: char; 
i: integer; 
chars: array [char] of char; 
str: array [tcode] of string; 
begin 
case combobox1.itemindex of 
1: code1 := koi; 
2: code1 := iso; 
3: code1 := dos; 
else code1 := win; 
end; 
case combobox2.itemindex of 
1: code2 := koi; 
2: code2 := iso; 
3: code2 := dos; 
else code2 := win; 
end; 
s := memo1.text; 
str[win] := 'АаБбВвГгДдЕеЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя'; 
str[koi] := 'юЮаАбБцЦдДеЕфФгГхХиИйЙкКлЛмМнНоОпПяЯрРсСтТуУжЖвВьЬыЫзЗшШэЭщЩчЧъЪ'; 
str[iso] := 'РрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯяа№бёвђгѓдєеѕжізїијйљкњлћмќн§оўпџ'; 
str[dos] := 'Ђ ЃЎ‚ўѓЈ„¤…Ґ†¦‡§?Ё‰©ЉЄ‹"ЊЌЋ®ЏЇђа'б'в"г"де–ж—з?и™йљк›лњмќнћоџп'; 
for c := #0 to #255 do 
chars[c] := c; 
for i := 1 to length(str[win]) do 
chars[str[code2][i]] := str[code1][i]; 
for i := 1 to length(s) do 
s[i] := chars[s[i]]; 
memo2.text := s; 
end;
 
B

brink

Гость
#4
!!!Нашел решение, все очень просто :ph34r:

Код:
//из ДОС в Windows
char* Decode_DOS_to_Win(char * str)
{
unsigned char *cstr=str;//"unsigned" - чтоб избежать предупреждений комп-ра
for(; *cstr; cstr++)
{
if(*cstr>=128 && *cstr<=175)
*cstr+=64;
else 
if(*cstr>=224 && *cstr<=239)
*cstr+=16;
else if(*cstr==252)
*cstr=185;
}
return str;
}
//----------------------------------------------------
//из Windows в ДОС
char* Decode_Win_to_DOS(char * str)
{
unsigned char *cstr=str;
for(;*cstr;cstr++)
{
if(*cstr>=240)
*cstr-=16;
else if(*cstr>=192)
*cstr-=64;
else
if(*cstr==185)
*cstr=252;
}
return str;
}
//----------------------------------------------------
Google - РУЛЕЗ :D