Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

Распознование Текста с сканера!   Найти похожие ветки 

 
pavels777   (2006-11-12 22:39) [0]

Уважаемые друзья!
Мне задали сделать программу которая распознаёт буквы, отсканированные с плохого листа бумаги.
Функцию очистки от шума я сделал. а вот сравнение с шаблоном в масиве сделать не получаеться :(
Я делал по сравнению количества чёрных пикселей, но ето приводит к неправильному результату!
Помогите пожалуйста!!


 
Palladin ©   (2006-11-12 22:41) [1]

девствительно... вот уж в орешник так в орешник...

ему задали сделать программу... фигасе... да еще с плохого листа бумаги... и то правда... контрольная работа для школьника...


 
pavels777   (2006-11-12 22:44) [2]

Ребята а может поможите?


 
pavels777   (2006-11-12 22:44) [3]

Ребята а может поможите?


 
DrPass ©   (2006-11-12 22:46) [4]


> pavels777   (12.11.06 22:44) [3]

Мы бы с радостью, да вот одна заминка - мой знакомый как раз занимался распознаванием букв в изображении... он эту работу делал четыре года, и получил за нее звание кандидата технических наук. У тебя есть столько времени?


 
Percent   (2006-11-12 22:48) [5]

Функцию очистки от шума я сделал

Это похвально. Какими алгоритмами ты пользовался?

Я делал по сравнению количества чёрных пикселей, но ето приводит к неправильному результату!

Ты неправильно написал программу.

Помогите пожалуйста!!

Чем тебе помочь?


 
pavels777   (2006-11-12 22:50) [6]

очистка от шумов (слабый цвет или другой цвет:)
begin
for y := 0 to Image1.Picture.Bitmap.Height - 1 do
for x := 0 to Image1.Picture.Bitmap.Width-1 do begin
 Color := image1.Canvas.Pixels[x,y];
if Color > $00878787
 then
 image1.Canvas.Pixels[x,y]:=$00FFFFFF;
  if Color < $00878787
 then
 image1.Canvas.Pixels[x,y]:=$00000000;

 end;


 
Ketmar ©   (2006-11-12 22:52) [7]

мда. если это -- очистка от шумов, то я точно танцую лучше Майи Плисецкой.


 
Kolan ©   (2006-11-12 22:53) [8]

Можешь использовать простейший алгоритм шаблона, но для букв врядли получится. Нейроннаня сеть - вариант 2...


 
pavels777   (2006-11-12 22:54) [9]

:)
но ето приметивная очистка. для перебора с шаблонами букв наверно подойдёт,


 
Palladin ©   (2006-11-12 22:55) [10]


> [6] pavels777

поможем... обязательно поможем понять, что даже простейшее определение примитивов стоит дипломной работы... если не больше... а то что ты там привел по поводу шумов это это знаешь... как уборка в квартире при помощи бульдозера...


 
Percent   (2006-11-12 22:56) [11]

Если у сканера шумы распределяются по такому закону, то в топку его, этот сканер.


 
Kolan ©   (2006-11-12 22:57) [12]

Нет если буквы, то шаблон лучьше не брать ошибаться будет он для чисел годится. Начни с выделения букв для этого можно использовать "проход фронтом". Те есть строка на картинке:

 абв

Идешь как-бы фронтом просматривая пикселы и находишь буквы...
Распознавание букв шаг 2


 
pavels777   (2006-11-12 22:59) [13]

Я тут кое что нашол

{&#194; &#253;&#242;&#238;&#233; &#247;&#224;&#241;&#242;&#232; &#232; &#239;&#240;&#238;&#232;&#241;&#245;&#238;&#228;&#232;&#242; &#240;&#224;&#241;&#239;&#238;&#231;&#237;&#224;&#226;&#224;&#237;&#232;&#229;}
{*}  repeat
{&#206;&#225;&#237;&#243;&#235;&#255;&#229;&#236; &#226;&#241;&#229; &#236;&#224;&#241;&#241;&#232;&#226;&#251;}
{*}  for i:=0 to 9 do
{*}  begin
{*}  dig[i]:=0;
{*}  s[i]:=0;
{*}  pos_x[i]:=0;
{*}  pos_y[i]:=0;
{*}  end;
{*}  for x:=dx to dx+mask_width-1 do
{*}  for y:=0 to 9 do  {&#206;&#239;&#240;&#229;&#228;&#229;&#235;&#229;&#237;&#237;&#224;&#255; &#238;&#225;&#235;&#224;&#241;&#242;&#252; &#237;&#224; &#234;&#224;&#240;&#242;&#232;&#237;&#234;&#229;}
{*}  begin
{*}  for i:=0 to 9 do s[i]:=0;
{*}  for x_:=0 to mask_width-1 do
{*}  for y_:=0 to mask_height-1 do  {&#193;&#229;&#240;&#229;&#236; &#239;&#238; &#238;&#247;&#229;&#240;&#229;&#228;&#232; &#226;&#241;&#229; &#242;&#238;&#247;&#234;&#232; &#232;&#231; &#236;&#224;&#241;&#234;&#232;}
{*}  begin
{*}  for i:=0 to 9 do begin   {&#207;&#238;&#228;&#241;&#242;&#224;&#226;&#235;&#255;&#229;&#236; &#226;&#241;&#229; &#236;&#224;&#241;&#234;&#232; &#239;&#238; &#238;&#247;&#229;&#240;&#229;&#228;&#232;}
{*}  if (pic[x_+x,y_+y]=masks[i][x_,y_])
{*}  and (masks[i][x_,y_]=1) then s[i]:=s[i]+1; {&#207;&#240;&#232; &#241;&#238;&#226;&#239;&#224;&#228;&#229;&#237;&#232;&#232; &#243;&#226;&#229;&#235;&#232;&#247;&#232;&#226;&#224;&#229;&#236; &#253;&#235;&#229;&#236;&#229;&#237;&#242; &#236;&#224;&#241;&#241;&#232;&#226;&#224; &#237;&#224; 1    }
{&#199;&#224;&#239;&#238;&#236;&#232;&#237;&#224;&#229;&#236; &#236;&#224;&#234;&#241;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#247;&#232;&#241;&#235;&#238; &#241;&#238;&#226;&#239;&#224;&#226;&#248;&#232;&#245; &#242;&#238;&#247;&#229;&#234; &#228;&#235;&#255; &#234;&#238;&#237;&#234;&#240;&#229;&#242;&#237;&#238;&#233; &#236;&#224;&#241;&#234;&#232;                                 }
{*}  if s[i]>dig[i] then  begin dig[i]:=s[i];pos_x[i]:=x;pos_y[i]:=y; end;
{*}  end;
{*}  end;
{*}  end;
{*}  max:=getmax(dig); {&#192; &#227;&#228;&#229; &#230;&#229; &#243; &#237;&#224;&#241; &#241;&#238;&#226;&#239;&#224;&#235;&#238; &#235;&#243;&#247;&#248;&#229; &#226;&#241;&#229;&#245;?                                          }
{C&#235;&#229;&#228;&#243;&#254;&#249;&#232;&#229; &#241;&#242;&#240;&#238;&#234;&#232; &#228;&#238; &#234;&#238;&#236;&#236;&#229;&#237;&#242;&#224;&#240;&#232;&#255; "!" &#236;&#238;&#230;&#237;&#238; &#226;&#251;&#234;&#232;&#237;&#243;&#242;&#252;                                                 }
{&#199;&#228;&#229;&#241;&#252; &#228;&#235;&#255; &#239;&#238;&#237;&#242;&#224; &#240;&#232;&#241;&#243;&#254;&#242;&#241;&#255; &#246;&#232;&#244;&#240;&#251; &#239;&#238; &#236;&#224;&#241;&#234;&#224;&#236;, &#226; &#242;&#229;&#245; &#239;&#238;&#231;&#232;&#246;&#232;&#255;&#245;, &#227;&#228;&#229; &#238;&#237;&#232; &#225;&#251;&#235;&#232; &#237;&#224; &#234;&#224;&#240;&#242;&#232;&#237;&#234;&#224;&#245;                }
{*}  for x:=dx to dx+fig_width do
{*}  for y:=0 to pic_height-1 do
{*}  image_out.Picture.Bitmap.Canvas.Pixels[x,y]:=clblack;
{*}  for x:=0 to mask_width-1 do
{*}  for y:=0 to mask_height-1 do
{*}  if masks[max][x,y]=1 then
{*}  image_out.Picture.Bitmap.Canvas.Pixels[x+pos_x[max],y+pos_y[max]]:=$00AAFFAA;
{!}
{&#199;&#224;&#239;&#238;&#236;&#232;&#237;&#224;&#229;&#236; &#241;&#224;&#236;&#243;&#254; &#236;&#229;&#237;&#252;&#248;&#243;&#254; &#226;&#229;&#240;&#238;&#255;&#242;&#237;&#238;&#241;&#242;&#252; &#241;&#238;&#226;&#239;&#224;&#228;&#229;&#237;&#232;&#255;                                                    }
{*}  if round(100*dig[max]/masks_pix[max])<prob then prob:=round(100*dig[max]/masks_pix[max]);
{*}  label1.Caption:=Label1.Caption+inttostr(max);
{*}  dx:=dx+fig_width; {&#209;&#228;&#226;&#232;&#227;&#224;&#229;&#236;&#241;&#255; &#226;&#239;&#240;&#224;&#226;&#238; &#228;&#235;&#255; &#241;&#235;&#229;&#228;&#243;&#249;&#229;&#233; &#246;&#232;&#244;&#240;&#251;}
{*}  until dx>=pic_width;


 
Gydvin ©   (2006-11-12 23:00) [14]

Как думаешь, fineReader наверное, профаны писали? И даже у них распознание с "плохого" листа толком не идет. Тем более там не только распознание по шаблону, а также есть встроенный словарь слов. С которым при сомнительном распознавание слов идет сравнение.


 
Percent   (2006-11-12 23:00) [15]

Kolan ©

Коля, давай ты будешь излагать только то, в чем ты совершенно уверен в теории и на практике.
В противном случае, давай, ты не будешь сбивать людей с толку, эти люди и сами собьются...


 
pavels777   (2006-11-12 23:03) [16]

извеняюсь :)
{В этой части и происходит распознавание}
{*}  repeat
{Обнуляем все массивы}
{*}  for i:=0 to 9 do
{*}  begin
{*}  dig[i]:=0;
{*}  s[i]:=0;
{*}  pos_x[i]:=0;
{*}  pos_y[i]:=0;
{*}  end;
{*}  for x:=dx to dx+mask_width-1 do
{*}  for y:=0 to 9 do  {Определенная область на картинке}
{*}  begin
{*}  for i:=0 to 9 do s[i]:=0;
{*}  for x_:=0 to mask_width-1 do
{*}  for y_:=0 to mask_height-1 do  {Берем по очереди все точки из маски}
{*}  begin
{*}  for i:=0 to 9 do begin   {Подставляем все маски по очереди}
{*}  if (pic[x_+x,y_+y]=masks[i][x_,y_])
{*}  and (masks[i][x_,y_]=1) then s[i]:=s[i]+1; {При совпадении увеличиваем элемент массива на 1    }
{Запоминаем максимальное число совпавших точек для конкретной маски                                 }
{*}  if s[i]>dig[i] then  begin dig[i]:=s[i];pos_x[i]:=x;pos_y[i]:=y; end;
{*}  end;
{*}  end;
{*}  end;
{*}  max:=getmax(dig); {А где же у нас совпало лучше всех?                                          }
{Cледующие строки до комментария "!" можно выкинуть                                                 }
{Здесь для понта рисуются цифры по маскам, в тех позициях, где они были на картинках                }
{*}  for x:=dx to dx+fig_width do
{*}  for y:=0 to pic_height-1 do
{*}  image_out.Picture.Bitmap.Canvas.Pixels[x,y]:=clblack;
{*}  for x:=0 to mask_width-1 do
{*}  for y:=0 to mask_height-1 do
{*}  if masks[max][x,y]=1 then
{*}  image_out.Picture.Bitmap.Canvas.Pixels[x+pos_x[max],y+pos_y[max]]:=$00AAFFAA;
{!}
{Запоминаем самую меньшую вероятность совпадения                                                    }
{*}  if round(100*dig[max]/masks_pix[max])<prob then prob:=round(100*dig[max]/masks_pix[max]);
{*}  label1.Caption:=Label1.Caption+inttostr(max);
{*}  dx:=dx+fig_width; {Сдвигаемся вправо для следущей цифры}
{*}  until dx>=pic_width;


 
Percent   (2006-11-12 23:04) [17]

pavels777
Я тут кое что нашол


Сидят мужики, ловят рыбу. Подваливает ёжик:
- Мужики, у вас изолента есть?
- Нет...
Ёжик уходит, через час возвращается:
- Мужики, я вам изоленту принес!
(С) Анекдот

То есть, зачем ты это тут выложил? Это твой код? Что он должен делать? Что он делает неправильно? Где, по твоему, ошибка?


 
Palladin ©   (2006-11-12 23:05) [18]

:)))


> [15] Percent  


Уже сбились, бо уверены что за две минуты могут сдвинуть гору, только бы подсказали как, а там уж они сами как нибудь... и ведь не переубедить...


 
Ketmar ©   (2006-11-12 23:14) [19]

>[16] pavels777 12-Nov-2006, 23:03
>извеняюсь :)
>{В этой части и происходит распознавание}
это тебя кто-то жестоко обманул.


 
KilkennyCat ©   (2006-11-12 23:17) [20]

Не, ну конкретно для конкретного плоо листа распознаватель, довольно-таки идеальный, за пару дней написать не проблема. Только экономически не выгодно :)


 
pavels777   (2006-11-12 23:17) [21]

ок привожу полный код!

procedure TForm1.Button1Click(Sender: TObject);
begin
{Запускаем диалог и открываем картинку                                                              }
{*}  If OpenPicture.Execute then Image_IN.Picture.LoadFromFile(OpenPicture.FileName);
{---------------------------------------------------------------------------------------------------}
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
OpenPicture.InitialDir:=ExtractFilePath(Application.Exename)+"TESTPICTURES";
end;

procedure TForm1.Button2Click(Sender: TObject);
const mask_height=10; {Высота маски}
     mask_width=8;   {Ширина маски}
     pic_height=20;  {Высота картинки}
     pic_width=48;   {Ширина картинки}
     fig_width=round(pic_width/3); {Третья часть картинки (для трех цифр)}
type mask=array[0..mask_width-1,0..mask_height-1] of byte; {Тип массива для маски}
var masks:array[0..9] of mask; {Массив масок}
   masks_pix:array[0..9] of integer; {Массив для хранения кол-ва белых пикселей для каждой маски}
   pic:array[0..pic_width-1,0..pic_height-1] of byte; {Массив для картинки}
   i,x,y,x_,y_,dx,max,prob:integer;
   dig,s,pos_x,pos_y:array[0..9] of byte; {вспомогательные массивы}
{Функция определения номера максимально совпавшей маски                                             }
{*}  function Getmax(dig:array of byte):byte;
{dig - число совпавших точек для каждой маски                                                       }
{*}  var i,i_:byte;
{*}  a,b:real;
{*}  begin
{*}  a:=0;
{*}  i:=0;
{*}  for i_:=0 to 9 do
{*}  begin
{Вычисляем вероятность совпадения                                                                   }
{*}  b:=dig[i_]/masks_pix[i_];
{*}  if a<b then
{*}  begin
{*}  a:=b;
{*}  i:=i_;
{*}  end;
{*}  end;
{*}  result:=i;
{*}  end;
{---------------------------------------------------------------------------------------------------}

begin
{Загружаем маски в массивы                                                                          }
{*}  for i:=0 to 9 do
{*}  begin
{*}  masks_pix[i]:=0;
{*}  Temp.Picture.LoadFromFile(ExtractFilePath(Application.Exename)+"MASKS\"+InttoStr(i)+".bmp");
{*}  for x:=0 to mask_width-1 do
{*}  for y:=0 to mask_height-1 do
{*}  if Temp.Canvas.Pixels[x,y]=clwhite then
{*}  begin
{*}  masks[i][x,y]:=1;
{*}  masks_pix[i]:=masks_pix[i]+1;
{*}  end
{*}  else masks[i][x,y]:=0;
{*}  end;
{---------------------------------------------------------------------------------------------------}

{Загружаем картинку в массив                                                                        }
{*}  for x:=0 to pic_width-1 do
{*}  for y:=0 to pic_height-1 do
{*}  begin
{*}  if  Image_IN.Canvas.Pixels[x,y]=clwhite then pic[x,y]:=1 else pic[x,y]:=0;
{*}  end;
{---------------------------------------------------------------------------------------------------}

{Подготовка Image_OUT}
{*}  Image_OUT.Picture.Bitmap.Width:=pic_width;
{*}  Image_OUT.Picture.Bitmap.Height:=pic_height;
{---------------------------------------------------------------------------------------------------}

{Очищаем картинку от мусора                                                                         }
{Мусор в данном случае - точки того же цвета, что и цифры                                           }
{*}  for x:=0 to pic_width-1 do
{*}  for y:=0 to pic_height-1 do
{*}  if pic[x,y]=1 then
{*}  begin
{*}  x_:=x;
{*}  y_:=y;
{*}  if x<=-1 then x_:=1;
{*}  if y<=-1 then y_:=1;
{Если нет соседних точек или точка лежит на краях картинки то убираем ее                            }
{Здесь может быть и какой-нибудь другой признак: различие по цвету, например                        }
{*}  if (pic[x_+1,y_]<>1) and   (pic[x_-1,y_]<>1) and
{*}  (pic[x_,y_+1]<>1) and  (pic[x_,y_-1]<>1) and
{*}  (pic[x_+1,y_+1]<>1) and  (pic[x_-1,y_-1]<>1) and
{*}  (pic[x_-1,y_+1]<>1) and (pic[x_+1,y_-1]<>1) then
{*}  pic[x_,y_]:=0;
{*}  end;
{---------------------------------------------------------------------------------------------------}
dx:=0;      {Смещение по горизонтали}
prob:=100; {Начальное значение вероятности успешного распознавания(в %)}
label1.Caption:="";
{В этой части и происходит распознавание}
{*}  repeat
{Обнуляем все массивы}
{*}  for i:=0 to 9 do
{*}  begin
{*}  dig[i]:=0;
{*}  s[i]:=0;
{*}  pos_x[i]:=0;
{*}  pos_y[i]:=0;
{*}  end;
{*}  for x:=dx to dx+mask_width-1 do
{*}  for y:=0 to 9 do  {Определенная область на картинке}
{*}  begin
{*}  for i:=0 to 9 do s[i]:=0;
{*}  for x_:=0 to mask_width-1 do
{*}  for y_:=0 to mask_height-1 do  {Берем по очереди все точки из маски}
{*}  begin
{*}  for i:=0 to 9 do begin   {Подставляем все маски по очереди}
{*}  if (pic[x_+x,y_+y]=masks[i][x_,y_])
{*}  and (masks[i][x_,y_]=1) then s[i]:=s[i]+1; {При совпадении увеличиваем элемент массива на 1    }
{Запоминаем максимальное число совпавших точек для конкретной маски                                 }
{*}  if s[i]>dig[i] then  begin dig[i]:=s[i];pos_x[i]:=x;pos_y[i]:=y; end;
{*}  end;
{*}  end;
{*}  end;
{*}  max:=getmax(dig); {А где же у нас совпало лучше всех?                                          }
{Cледующие строки до комментария "!" можно выкинуть                                                 }
{Здесь для понта рисуются цифры по маскам, в тех позициях, где они были на картинках                }
{*}  for x:=dx to dx+fig_width do
{*}  for y:=0 to pic_height-1 do
{*}  image_out.Picture.Bitmap.Canvas.Pixels[x,y]:=clblack;
{*}  for x:=0 to mask_width-1 do
{*}  for y:=0 to mask_height-1 do
{*}  if masks[max][x,y]=1 then
{*}  image_out.Picture.Bitmap.Canvas.Pixels[x+pos_x[max],y+pos_y[max]]:=$00AAFFAA;
{!}
{Запоминаем самую меньшую вероятность совпадения                                                    }
{*}  if round(100*dig[max]/masks_pix[max])<prob then prob:=round(100*dig[max]/masks_pix[max]);
{*}  label1.Caption:=Label1.Caption+inttostr(max);
{*}  dx:=dx+fig_width; {Сдвигаемся вправо для следущей цифры}
{*}  until dx>=pic_width;
{---------------------------------------------------------------------------------------------------}
label1.Caption:=Label1.Caption+" ("+inttostr(prob)+"%)";
end;



 
Palladin ©   (2006-11-12 23:19) [22]


> ок привожу полный код!

кому? [17] читал?


 
KilkennyCat ©   (2006-11-12 23:21) [23]

нехилые вложенные циклы...


> Здесь для понта рисуются


файнриадер и прочие - вы уволены! вот она - суперо-пуперо-распознавалка!


 
KilkennyCat ©   (2006-11-12 23:23) [24]

Очистка от мусора выполнена по алгоритму игры "Life" :))


 
Palladin ©   (2006-11-12 23:29) [25]


> Очистка от мусора выполнена по алгоритму игры "Life"

%))


 
Gydvin ©   (2006-11-12 23:31) [26]

Если интересно, у Керка или Подгорецкого выложен пример распознования цифр


 
Ketmar ©   (2006-11-12 23:35) [27]

мда. а ведь и я когда-то был таким же молодым и горячим...


 
KilkennyCat ©   (2006-11-12 23:39) [28]

> [26] Gydvin ©   (12.11.06 23:31)

Вау! Керк и Подгорецкий - одно и тоже лицо, оказывается! Теперь все ясно...
:)


> [27] Ketmar ©   (12.11.06 23:35)


А теперь ты старый и холодный :)


 
Gydvin ©   (2006-11-12 23:41) [29]


> KilkennyCat ©   (12.11.06 23:39) [28]
>
> > [26] Gydvin ©   (12.11.06 23:31)
>
> Вау! Керк и Подгорецкий - одно и тоже лицо, оказывается!
>  Теперь все ясно...
> :)

Почему? Волшебное слово - ИЛИ


 
KilkennyCat ©   (2006-11-12 23:42) [30]

> [29] Gydvin ©   (12.11.06 23:41)

вот именно.


 
Palladin ©   (2006-11-12 23:42) [31]

угу... лет 10-12 назад... когда все казалось очевидным... но подобный срез значений я уж никак чисткой шумов не называл... )


 
Gydvin ©   (2006-11-12 23:43) [32]


> > KilkennyCat ©   (12.11.06 23:39) [28]

Можно иногда полностью читать сообщение))


 
Gydvin ©   (2006-11-12 23:44) [33]


> KilkennyCat ©   (12.11.06 23:42) [30]
>
> > [29] Gydvin ©   (12.11.06 23:41)
>
> вот именно.

Ну и....

> Gydvin ©   (12.11.06 23:31) [26]

Читаем заново )))


 
KilkennyCat ©   (2006-11-12 23:44) [34]

> [31] Palladin ©   (12.11.06 23:42)

гы... я в то время пришел к выводу, что можно сделать аналоговый распознаватель :) устройство, типа аналогового ксерокса плюс печатная машинка.


 
Palladin ©   (2006-11-12 23:47) [35]

это типа если оцифровать голоса двух человек и вычислить среднестатистическую разницу циферек, то можно синтезировать голос одного в голос другого...

:)))


 
Palladin ©   (2006-11-12 23:48) [36]


> голоса двух человек

произносящих соответственно одну и туже фразу :)


 
Anatoly Podgoretsky ©   (2006-11-12 23:48) [37]

> KilkennyCat  (12.11.2006 23:39:28)  [28]

Так нас уже трое оказывается, ты Кетмаря забыл


 
Gydvin ©   (2006-11-12 23:51) [38]

Чет я не понял, в каком месте начинать смеяться..... где я сказал не так


 
KilkennyCat ©   (2006-11-12 23:53) [39]

> [37] Anatoly Podgoretsky ©   (12.11.06 23:48)

точно... эх, хорошо вам вместе, нескучно...


 
Palladin ©   (2006-11-12 23:55) [40]


> [38] Gydvin ©

ни в каком... народ частично ушел в детство...



Страницы: 1 2 3 вся ветка

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.055 c
2-1163253797
C@N
2006-11-11 17:03
2006.12.03
Ключи реестра на автозапуск программы


15-1163538255
MikePetrichenko
2006-11-15 00:04
2006.12.03
WiFi


15-1163434012
umbra
2006-11-13 19:06
2006.12.03
как в С объявить процедурный тип?


15-1163166355
paneller
2006-11-10 16:45
2006.12.03
Layout контролов


6-1152028321
SpellCaster
2006-07-04 19:52
2006.12.03
Странности у TTcpClient и TTcpServer