cp866<>utf8

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Сообщение Attid » 07.02.2008 17:47:59

ViruZ
вопрос не понятен =) текущию в которой запущено приложение ?
тогда через переменую окружения LANG.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение ViruZ » 08.02.2008 10:06:47

А можно примерчик? :oops:
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение Attid » 08.02.2008 11:10:13

Код: Выделить всё
uses
{$ifdef FPC}{$ifdef linux}cthreads,baseunix,{$endif}{$endif}
begin
{$ifdef linux}
if fpGetenv('LANG') <> 'ru_RU.UTF-8' then
begin
   Writeln ('Bad locale ',fpGetenv('LANG'),' set it to ru_RU.UTF-8');
   halt;
end; 
{$endif}
end.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение ViruZ » 08.02.2008 11:43:33

Спасибо!
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение debi12345 » 08.02.2008 12:34:00

fpGetenv

Есть и библиотечная функция "GetEnvironmentVaraible" - работает в обоих операционках, и не требует включения юниксовых USES.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5638
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Uniser » 08.02.2008 13:40:34

Ввёл вас в заблуждение. У себя поправил только Ansi2Utf, а Wide2Utf забыл и выложил неверный вариант.
Вот исправленный:
Код: Выделить всё
function Wide2Utf(const S:WideString):UtfString;
var I,J,L:Integer; U:Unicode;
begin
  SetLength(Result,Length(S));
  J:=1;
  for I:=1 to Length(S) do begin
    U:=Unicode(S[1]);
    L:=LengthUnicode(U);
    IncLen(Result,J,Length(S),I,L,Length(S) div 2 + 6);
    inc(J,Uni2Utf(@Result[J],U,L));
  end;
  SetLength(Result,J-1); 
end;


PC - вообще убрал, потому что после IncLen может измениться длина Result, а это означает (обычно), что строка находится уже в новой памяти и автоматически указатель PC теряет актуальность и Uni2Utf(PC,U,L) вызывает Access Violation. Помнится, я долго ловил эту ошибку. Не повторите!

По поводу Локали в Линуксе попадался такой код
Кажется в исходниках Лазаруса
Код использовался для определения языка и мне понравился.

uses DOS; ==> GetEnv
uses SysUtils; ==> GetEnvironmentVariable

Код: Выделить всё
lang := GetEnv('LC_ALL');
if Length(lang)=0 then begin
  lang := GetEnv('LC_MESSAGES');
  if Length(lang)=0 then begin
    lang := GetEnv('LANG');
    if Length(lang)=0 then exit;
  end;
end;

как узнать кодовую страницу в винде не подскажу.
Uniser
новенький
 
Сообщения: 46
Зарегистрирован: 13.05.2005 23:13:57
Откуда: Украина, Полтава

Сообщение ViruZ » 14.02.2008 18:25:34

Добавил в CodeChanger следующую функцию:
Код: Выделить всё
function TCodeChanger.DosToUtf8(var Text: string): boolean;
var InString, OutString, b: string;
    i, Len: integer;
    c: byte;
    a: Char;
begin
Result:=true;
InString:=Text; OutString:='';
Len:=Length(InString);
try
        b:=#239#187#191; OutString:=OutString+b;
        for i:=1 to Len do begin
                a:=InString[i];
                c:=Ord(a);
                case c of
{a english}             97: b:=#97; 98: b:=#98; 99: b:=#99; 100: b:=#100; 101: b:=#101; 102: b:=#102; 103: b:=#103; 104: b:=#104; 105: b:=#105; 106: b:=#106; 107: b:=#107; 108: b:=#108; 109: b:=#109; 110: b:=#110; 111: b:=#111; 112: b:=#112; 113: b:=#113; 114: b:=#114; 115: b:=#115; 116: b:=#116; 117: b:=#117; 118: b:=#118; 119: b:=#119; 120: b:=#120; 121: b:=#121; 122: b:=#122;
{A english}             65: b:=#65; 66: b:=#66; 67: b:=#67; 68: b:=#68; 69: b:=#69; 70: b:=#70; 71: b:=#71; 72: b:=#72; 73: b:=#73; 74: b:=#74; 75: b:=#75; 76: b:=#76; 77: b:=#77; 78: b:=#78; 79: b:=#79; 80: b:=#80; 81: b:=#81; 82: b:=#82; 83: b:=#83; 84: b:=#84; 85: b:=#85; 86: b:=#86; 87: b:=#87; 88: b:=#88; 89: b:=#89; 90: b:=#90;
{0..9}                  48: b:=#48; 49: b:=#49; 50: b:=#50; 51: b:=#51; 52: b:=#52; 53: b:=#53; 54: b:=#54; 55: b:=#55; 56: b:=#56; 57: b:=#57;
{Ñïåö ñèìâîëû}          33: b:=#33; 13: b:=#13; 9: b:=#9; 10: b:=#10; 32: b:=#32; 64: b:=#64; 35: b:=#35; 36: b:=#36; 37: b:=#37; 94: b:=#94; 38: b:=#38; 42: b:=#42; 40: b:=#40; 41: b:=#41; 45: b:=#45; 95: b:=#95; 43: b:=#43; 61: b:=#61; 92: b:=#92; 47: b:=#47; 124: b:=#124; 46: b:=#46; 44: b:=#44; 59: b:=#59; 58: b:=#58; 123: b:=#123; 125: b:=#125; 63: b:=#63; 60: b:=#60; 62: b:=#62; 34: b:=#34; 91: b:=#91; 93: b:=#93; 96: b:=#96; 126: b:=#126; 252: b:=#223;
{à ðóññêèå}             160: b:=#208#176; 161: b:=#208#177; 162: b:=#208#178; 163: b:=#208#179; 164: b:=#208#180; 165: b:=#208#181; 166: b:=#208#182; 167: b:=#208#183; 168: b:=#208#184; 169: b:=#208#185; 170: b:=#208#186; 171: b:=#208#187; 172: b:=#208#188; 173: b:=#208#189; 174: b:=#208#190; 175: b:=#208#191; 224: b:=#209#128; 225: b:=#209#129; 226: b:=#209#130; 227: b:=#209#131; 228: b:=#209#132; 229: b:=#209#133; 230: b:=#209#134; 231: b:=#209#135; 232: b:=#209#136; 233: b:=#209#137; 234: b:=#209#138; 235: b:=#209#139; 236: b:=#209#140; 237: b:=#209#141; 238: b:=#209#142; 239: b:=#209#143; 241: b:=#209#145;
{À ðóññêèå}             128: b:=#208#144; 129: b:=#208#145; 130: b:=#208#146; 131: b:=#208#147; 132: b:=#208#148; 133: b:=#209#149; 134: b:=#208#150; 135: b:=#208#151; 136: b:=#208#152; 137: b:=#208#153; 138: b:=#208#154; 139: b:=#208#155; 140: b:=#208#156; 141: b:=#208#157; 142: b:=#208#158; 143: b:=#208#159; 144: b:=#208#160; 145: b:=#208#161; 146: b:=#208#162; 147: b:=#208#163; 148: b:=#208#164;  149: b:=#208#165; 150: b:=#208#166; 151: b:=#208#167; 152: b:=#208#168; 153: b:=#208#169; 154: b:=#208#170; 155: b:=#208#171; 156: b:=#208#172; 157: b:=#208#173; 158: b:=#208#174; 159: b:=#208#175; 240: b:=#208#129;
                        end;
                OutString:=OutString+b
                end;
        Text:= OutString
        except
        Result:=false
        end;
end;                                           

Получилось увидеть кириллицу :D в DBF
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение VirtUX » 19.02.2008 17:55:16

Посидел тут: http://www.suncloud.ru/workshop/wdhplus/encoding/encoding.htm, тут: http://ru.wikibooks.org/wiki/%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0, ну и еще там-сям. Вощем разобрался со стуктурой кодировок. Теперь такой вопрос:
читаем файл с CP866 кодировкой (при чем там русский символ "р" является латинской "p" #$70, т.е. слово "просто" выглядит - #$AF#$70#$AE#$E1#$E2#$AE)
Код: Выделить всё
VAR
  f: TextFile;
  s: string;
  ArrStr: array of string;
  iCou: integer;
BEGIN
  AssignFile(f, 'any.file');
  Reset(f);
  while not Eof(f) do
    BEGIN
      Readln(f, s);
      iCou := length(ArrStr);
      SetLength(ArrStr, succ(iCou));
      ArrStr[iCou] := s;
    END;
  CloseFile(f);
END;

Как разбить стоку (string) на массив байтов (array of Byte) для дальнейшей подстановки нужного символа из UTF8?
Спросите зачем?
Например в CP866 есть псевдографика. Она скудновата :( При определенных условиях на один и тот же символ #$B3 может быть #$E2#$94#$82 или #$E2#$94#$83 или #$E2#$94#$86 или #$E2#$94#$8B и т.п.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 869
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Сообщение ViruZ » 20.02.2008 12:24:50

По поводу псевдографики в cp866 - попробовал написать ф-ю для ПОЛНОЙ перекодировки в UTF8. Для этого создал файл со строкой символов с кодами #128-#255, сохранил его в UTF8 и написал простенькую программку, которая на входе берет файл oem8.txt (созданный методом, описанным выше), разбирает его и полученный результат выводит в файл out.txt
Код: Выделить всё
program printcodes;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils;
var fin: file of Char;
    fout : Text;
    i: Byte;
    c,c1: Char;
begin
AssignFile(fin,'oem8.txt');
Reset(fin);
AssignFile(fout,'out.txt');
Rewrite(fout);
Read(fin,c);
Read(fin,c);
Read(fin,c);
for i:=1 to 127 do begin
Read(fin,c);
Read(fin,c1);
WriteLn(fout,'                ',IntToStr(i+127),':b:=#',Ord(c),'#',Ord(C1),';   //',Chr(i+127));
end;
CloseFile(fin);
CloseFile(fout);
end.

В результате получил фрагмент программного кода на Паскале, который можно вставить в оператор выбора case (переменную b можете заменить на свою):
Код: Выделить всё
                128:b:=#145#208;   //А
                129:b:=#146#208;   //Б
                130:b:=#147#208;   //В
                131:b:=#148#208;   //Г
                132:b:=#149#208;   //Д
                133:b:=#150#208;   //Е
                134:b:=#151#208;   //Ж
                135:b:=#152#208;   //З
                136:b:=#153#208;   //И
                137:b:=#154#208;   //Й
                138:b:=#155#208;   //К
                139:b:=#156#208;   //Л
                140:b:=#157#208;   //М
                141:b:=#158#208;   //Н
                142:b:=#159#208;   //О
                143:b:=#160#208;   //П
                144:b:=#161#208;   //Р
                145:b:=#162#208;   //С
                146:b:=#163#208;   //Т
                147:b:=#164#208;   //У
                148:b:=#165#208;   //Ф
                149:b:=#166#208;   //Х
                150:b:=#167#208;   //Ц
                151:b:=#168#208;   //Ч
                152:b:=#169#208;   //Ш
                153:b:=#170#208;   //Щ
                154:b:=#171#208;   //Ъ
                155:b:=#172#208;   //Ы
                156:b:=#173#208;   //Ь
                157:b:=#174#208;   //Э
                158:b:=#175#208;   //Ю
                159:b:=#176#208;   //Я
                160:b:=#177#208;   //а
                161:b:=#178#208;   //б
                162:b:=#179#208;   //в
                163:b:=#180#208;   //г
                164:b:=#181#208;   //д
                165:b:=#182#208;   //е
                166:b:=#183#208;   //ж
                167:b:=#184#208;   //з
                168:b:=#185#208;   //и
                169:b:=#186#208;   //й
                170:b:=#187#208;   //к
                171:b:=#188#208;   //л
                172:b:=#189#208;   //м
                173:b:=#190#208;   //н
                174:b:=#191#226;   //о
                175:b:=#150#145;   //п
                176:b:=#226#150;   //░
                177:b:=#146#226;   //▒
                178:b:=#150#147;   //▓
                179:b:=#226#150;   //│
                180:b:=#147#226;   //┤
                181:b:=#148#164;   //╡
                182:b:=#226#149;   //╢
                183:b:=#161#226;   //╖
                184:b:=#149#162;   //╕
                185:b:=#226#149;   //╣
                186:b:=#150#226;   //║
                187:b:=#149#149;   //╗
                188:b:=#226#149;   //╝
                189:b:=#163#226;   //╜
                190:b:=#149#145;   //╛
                191:b:=#226#149;   //┐
                192:b:=#151#226;   //└
                193:b:=#149#157;   //┴
                194:b:=#226#149;   //┬
                195:b:=#156#226;   //├
                196:b:=#149#155;   //─
                197:b:=#226#148;   //┼
                198:b:=#144#226;   //╞
                199:b:=#148#148;   //╟
                200:b:=#226#148;   //╚
                201:b:=#180#226;   //╔
                202:b:=#148#172;   //╩
                203:b:=#226#148;   //╦
                204:b:=#156#226;   //╠
                205:b:=#148#128;   //═
                206:b:=#226#148;   //╬
                207:b:=#188#226;   //╧
                208:b:=#149#158;   //╨
                209:b:=#226#149;   //╤
                210:b:=#159#226;   //╥
                211:b:=#149#154;   //╙
                212:b:=#226#149;   //╘
                213:b:=#148#226;   //╒
                214:b:=#149#169;   //╓
                215:b:=#226#149;   //╫
                216:b:=#166#226;   //╪
                217:b:=#149#160;   //┘
                218:b:=#226#149;   //┌
                219:b:=#144#226;   //█
                220:b:=#149#172;   //▄
                221:b:=#226#149;   //▌
                222:b:=#167#226;   //▐
                223:b:=#149#168;   //▀
                224:b:=#226#149;   //р
                225:b:=#164#226;   //с
                226:b:=#149#165;   //т
                227:b:=#226#149;   //у
                228:b:=#153#226;   //ф
                229:b:=#149#152;   //х
                230:b:=#226#149;   //ц
                231:b:=#146#226;   //ч
                232:b:=#149#147;   //ш
                233:b:=#226#149;   //щ
                234:b:=#171#226;   //ъ
                235:b:=#149#170;   //ы
                236:b:=#226#148;   //ь
                237:b:=#152#226;   //э
                238:b:=#148#140;   //ю
                239:b:=#226#150;   //я
                240:b:=#136#226;   //Ё
                241:b:=#150#132;   //ё
                242:b:=#226#150;   //Є
                243:b:=#140#226;   //є
                244:b:=#150#144;   //Ї
                245:b:=#226#150;   //ї
                246:b:=#128#209;   //Ў
                247:b:=#128#209;   //ў
                248:b:=#129#209;   //°
                249:b:=#130#209;   //∙
                250:b:=#131#209;   //·
                251:b:=#132#209;   //√
                252:b:=#133#209;   //№
                253:b:=#134#209;   //¤
                254:b:=#135#209;   //■

Этот фрагмент вставил в функцию
Код: Выделить всё
function TCodeChanger.DosToUtf8(var Text: string): boolean;
var InString, OutString, b: string;
    i, Len: integer;
    c: byte;
    a: Char;
begin
Result:=true;
InString:=Text; OutString:='';
Len:=Length(InString);
try
        b:=#239#187#191; OutString:=OutString+b;
        for i:=1 to Len do begin
                a:=InString[i];
                c:=Ord(a);
                case c of
                1..127:b:=chr(c);
                128:b:=#208#144;   //└
                129:b:=#208#145;   //┴
                130:b:=#208#146;   //┬
                131:b:=#208#147;   //├
                132:b:=#208#148;   //─
                133:b:=#208#149;   //┼
                134:b:=#208#150;   //╞
                135:b:=#208#151;   //╟
                136:b:=#208#152;   //╚
                137:b:=#208#153;   //╔
                138:b:=#208#154;   //╩
                139:b:=#208#155;   //╦
                140:b:=#208#156;   //╠
                141:b:=#208#157;   //═
                142:b:=#208#158;   //╬
                143:b:=#208#159;   //╧
                144:b:=#208#160;   //╨
                145:b:=#208#161;   //╤
                146:b:=#208#162;   //╥
                147:b:=#208#163;   //╙
                148:b:=#208#164;   //╘
                149:b:=#208#165;   //╒
                150:b:=#208#166;   //╓
                151:b:=#208#167;   //╫
                152:b:=#208#168;   //╪
                153:b:=#208#169;   //┘
                154:b:=#208#170;   //┌
                155:b:=#208#171;   //█
                156:b:=#208#172;   //▄
                157:b:=#208#173;   //▌
                158:b:=#208#174;   //▐
                159:b:=#208#175;   //▀
                160:b:=#208#176;   //р
                161:b:=#208#177;   //с
                162:b:=#208#178;   //т
                163:b:=#208#179;   //у
                164:b:=#208#180;   //ф
                165:b:=#208#181;   //х
                166:b:=#208#182;   //ц
                167:b:=#208#183;   //ч
                168:b:=#208#184;   //ш
                169:b:=#208#185;   //щ
                170:b:=#208#186;   //ъ
                171:b:=#208#187;   //ы
                172:b:=#208#188;   //ь
                173:b:=#208#189;   //э
                174:b:=#208#190;   //ю
                175:b:=#208#191;   //я
                176:b:=#226#150;   //-
                177:b:=#145#226;   //-
                178:b:=#150#146;   //-
                179:b:=#226#150;   //ж
                180:b:=#147#226;   //+
                181:b:=#150#147;   //ж
                182:b:=#226#148;   //ж
                183:b:=#164#226;   //м
                184:b:=#149#161;   //м
                185:b:=#226#149;   //ж
                186:b:=#162#226;   //ж
                187:b:=#149#150;   //м
                188:b:=#226#149;   //-
                189:b:=#149#226;   //-
                190:b:=#149#163;   //-
                191:b:=#226#149;   //м
                192:b:=#145#226;   //L
                193:b:=#149#151;   //+
                194:b:=#226#149;   //T
                195:b:=#157#226;   //+
                196:b:=#149#156;   //-
                197:b:=#226#149;   //+
                198:b:=#155#226;   //ж
                199:b:=#148#144;   //ж
                200:b:=#226#148;   //L
                201:b:=#148#226;   //у
                202:b:=#148#180;   //ж
                203:b:=#226#148;   //T
                204:b:=#172#226;   //ж
                205:b:=#148#156;   //=
                206:b:=#226#148;   //+
                207:b:=#128#226;   //ж
                208:b:=#148#188;   //ж
                209:b:=#226#149;   //T
                210:b:=#158#226;   //T
                211:b:=#149#159;   //L
                212:b:=#226#149;   //L
                213:b:=#154#226;   //-
                214:b:=#149#148;   //у
                215:b:=#226#149;   //+
                216:b:=#169#226;   //+
                217:b:=#149#166;   //-
                218:b:=#226#149;   //-
                219:b:=#160#226;   //-
                220:b:=#149#144;   //-
                221:b:=#226#149;   //ж
                222:b:=#172#226;   //ж
                223:b:=#149#167;   //-
                224:b:=#226#149;   //Ё
                225:b:=#168#226;   //ё
                226:b:=#149#164;   //Є
                227:b:=#226#149;   //є
                228:b:=#165#226;   //Ї
                229:b:=#149#153;   //ї
                230:b:=#226#149;   //Ў
                231:b:=#152#226;   //ў
                232:b:=#149#146;   //°
                233:b:=#226#149;   //∙
                234:b:=#147#226;   //·
                235:b:=#149#171;   //√
                236:b:=#226#149;   //№
                237:b:=#170#226;   //¤
                238:b:=#148#152;   //■
                239:b:=#226#148;   // 
                240:b:=#140#226;   //и
                241:b:=#150#136;   //╕
                242:b:=#226#150;   //к
                243:b:=#132#226;   //║
                244:b:=#150#140;   //п
                245:b:=#226#150;   //┐
                246:b:=#144#226;   //б
                247:b:=#150#128;   //в
                248:b:=#209#128;   //░
                249:b:=#209#129;   //Х
                250:b:=#209#130;   //╖
                251:b:=#209#131;   //v
                252:b:=#209#132;   //╣
                253:b:=#209#133;   //д
                254:b:=#209#134;   //ж
               end;//case c
                OutString:=OutString+b
                end;
        Text:= OutString
        except
        Result:=false
        end;
end;

По идее, должно было бы работать, но на практике часть символов заменяется знаками вопроса. Почему и чно необходимо поправить?
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение ViruZ » 21.02.2008 10:26:10

Странно - если строку символов, сформированную из символов с кодами 128..255 вывести в текстовый файл, предварительно конвертировав ее из 866 в УТФ8, все символы отображаются нормально. Но почему, если выводить записи из Dbf конвертируя их из 866 в УТФ8, не все символы отображаются нормально?
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение ViruZ » 21.02.2008 15:10:56

:?: :?: :?: Где взять таблицы соответствия кодов Utf8 и cp866/cp1251/koi???
Гуглил - не помогло. Может, неправильно искал?
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение alexs » 21.02.2008 15:29:06

посмотри в сторону модуля rxiconv - в линуксе он используется библиотеку iconv и делает именно то что тебе надо.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3957
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение VirtUX » 25.03.2008 13:09:24

Вот накатал утилитку по конвертации:
UTF-8 > Windows-1251
UTF-8 > OEM-866
OEM-866 > UTF-8
OEM-866 > Windows-1251
Windows-1251 > OEM-866
Windows-1251 > UTF-8
http://www.utils.virtux.by.ru/index.html
Дело в том, что UTF-8 не 2-х байтная, а "переменная" от 1 до 4-ч байтной.
По ссылке есть под Linux и под Windows. Если для кого проблема еще актуальна, то там же есть исходники.
Последний раз редактировалось VirtUX 25.03.2008 18:18:26, всего редактировалось 1 раз.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 869
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Сообщение VirtUX » 25.03.2008 17:05:22

ViruZ писал(а)::?: :?: :?: Где взять таблицы соответствия кодов Utf8 и cp866/cp1251/koi???
Гуглил - не помогло. Может, неправильно искал?
А там, где я изучал смотрел? http://ru.wikibooks.org/wiki/%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 869
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Сообщение VirtUX » 25.03.2008 18:24:17

ViruZ писал(а):По ссылке смотрел, но не помогло.
Странно... Мне оччень помогло в изучении и написании перекодировщика. На сайте отпочковал утилиты в поддомен и добавил туда исходники http://www.utils.virtux.org.ua. Следующий этап борьба с принтером :)
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 869
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru