Как оптимизировать определение границ произвольной фигуры ?

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

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

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 25.01.2017 16:27:56

Alex2013 писал(а):Есть идеи что у меня на ноте не все в порядке с совместной работой двух ядер цпу для программ не имеющих заточки на многоядерность ... (То есть ОС(или сам ЦПУ) самостоятельно пытается раскидать "обычный последовательный код " на несколько параллельных потоков ... и вот тут то и возникают "странные сбои" )

С твоим железно безбажным кодом даже ос справится неможет...
Спорим руки?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 25.01.2017 16:39:35

Лекс Айрин писал(а):
Alex2013 писал(а):Ошибки и глюки в сложных системах неизбежны .


Тогда работа программиста лишена смысла. И все сразу становится печально и безрадостно.

Просто не все зависит от конкретного "рыцаря мышки и клавиатуры" .
Но в своем "уголке пространственно временного континуума" мы можем как в анекдоте "загадочно и скромно улыбнувшись" спросить "А вы не думали кто создал Хаос?" ... :D
То есть в 99% процентах любых программных сбоев код можно переписать "эонами вариантов " так чтобы он четко и надежно работал в конкретной среде обитания или опирался только на документированные и рабочие свойства среды.
Мой опыт говорит, что тупиковых ситуаций (при верной постановке задачи и нужных знаниях о возможностях среды) не бывает в принципе ! Этим кстати программирование выгодно отличается от прочих ремесел и искусств ...
Все упирается только в способности конкретного "програмазера" и в сроках отпущенных на выполнение проекта ! :idea: :cry:

Но с нами духи Ады и Бебижда ! :idea: :D :D :D :D :D :D

Добавлено спустя 12 минут:
zub писал(а):
Alex2013 писал(а):Есть идеи что у меня на ноте не все в порядке с совместной работой двух ядер цпу для программ не имеющих заточки на многоядерность ... (То есть ОС(или сам ЦПУ) самостоятельно пытается раскидать "обычный последовательный код " на несколько параллельных потоков ... и вот тут то и возникают "странные сбои" )

С твоим железно безбажным кодом даже ос справится неможет...
Спорим руки?

Не спорим ... Есть на пример программа Эмулятор-3000 :arrow: http://www.emulator3000.org/rus-e3.htm
..так вот она у меня работает только после того как я РУКАМИ отключаю для ее процесса второе ядро ...
Так что не могу сказать, что в конкретной программе ошибка возникает именно из за "много - ядрености "
(Нужно проверить ) Но совершенно точно то что описываемый сценарий совершенно реален !
Зы
Код прилагался к посту
:arrow: viewtopic.php?p=108162#p108162
(Что там может быть НЕ ТАК? Можно написать иначе, возможно лучше, но где там хоть что-то не стандартное ? ).... :roll:
Последний раз редактировалось Alex2013 25.01.2017 16:59:28, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Лекс Айрин » 25.01.2017 16:53:31

Alex2013 писал(а):То есть в 99% процентах любых программных сбоев код можно переписать "эонами вариантов " так чтобы он четко и надежно работал в конкретной среде обитания или опирался только на документированные и рабочие свойства среды.


А теперь представьте разработку ИИ... БД готова... набор логики готов... запускается программа, проходит пару лет, а разума нет т.к. программист "создал Хаос" и интеграция не прошла из-за тупейшей ошибки. И никого не успокоит, что программу можно написать эонами вариантов.

Alex2013 писал(а):Мой опыт говорит, что тупиковых ситуаций (при верной постановке задачи и нужных знаниях о возможностях среды) не бывает в принципе ! Этим кстати программирование выгодно отличается от прочих ремесел и искусств ...


На данном этапе уже нужны средства создания полиморфных программ, визуальное конструирование осей и нейроввод. Но пока есть только стекло и .NET
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 25.01.2017 16:58:31

>>Есть на пример программа Эмулятор-3000
Да мало ли что где есть. Все необъяснимые баги - дело шаловливых ручек.
Давно бы уже сделал пример и вопрос бы снялся

Добавлено спустя 10 минут 1 секунду:
Re: Как оптимизировать определение границ произвольной фигуры ?
>>Что там может быть НЕ ТАК?
Минимальный компилируемый пример. по пути сам допрешь что где нетак
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 25.01.2017 17:13:42

zub писал(а):>>Есть на пример программа Эмулятор-3000
Да мало ли что где есть. Все необъяснимые баги - дело шаловливых ручек.
Давно бы уже сделал пример и вопрос бы снялся

Сегодня кину ( как я писал разработка у меня в "глубоком офлане" живет в то числе и что-бы не отвлекаться... )
А баги в Эмулятор-3000 как раз объяснимые низкоуровневый код и "псевдореальное время"... эмуляция пытается воссоздать точное время исполнения каждого такта "виртуального процессора " (причем в отличии от многих других эмуляторв делает это даже в фоновом режиме исполнения ) А многоядерность сбивает отсчеты . :idea:
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 25.01.2017 17:24:31

>>If CompareWord(PLine^,ELine^,b.Width-1)<>0 then
Это ерунда.
1 - если следовать твоей логике то должно быть b.Width - передается ведь размер.
2 - сли следовать моей логике - а сколько байт на пиксел? а где пересчет этого в word?
И так куда не ткни.

Вангую:
Возможно word совпадает в данном случае по длине с пикселом - создается впечатление что всё ок (кроме последнего пиксела)... байт не совпадает - вот и твой глюк - неправильный расчет длины строчки в байтах\словах
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 26.01.2017 01:12:58

:arrow: Ну очень тупой анимированный тест ( С исходником )

"Момент истины" определяемый блок начинает сжимается в ноль ....
ИзображениеИзображение
Зы
:arrow: http://www.freepascal.org/docs-html/rtl ... eword.html

..а извини... :oops: :idea: понял намекаешь, что размер нужно умножить на 3 ? Но почему с compareword работает ? (вот это уже в самом деле странно размер пикселя совершенно точно три байта ... ) :idea:
Сейчас проверю ... (Если дело в этом то допущена совершенно обычная ошибка по "не досмотру" ... а развели ... ну ладно ! "обидно досадно но ладно ") ...

Добавлено спустя 1 час 48 минут 37 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
И так "замри и гори " ... :wink: но функция все-же работает ! УФ ! :idea: :idea: :idea:
Код: Выделить всё
// Номер команды по клику
// и определение границ текущей фигуры
Function GetCMDOnClik(X,Y:Longint):Longint;
Type
  TLine=Array  [0..2] of byte;
Var
B:TBitmap;
T:SizeInt;LineSize,i,YF,Y1,X1:longint;
R:TRect;
PLine,ELine:^TLine;

BP:Byte;
begin
Result:=-1;

If drawlist= Nil  then exit;
If drawlist.Count=0  then exit;
B:=TBitmap.Create;
B.SetSize(rf1.PaintBox1.Width,rf1.PaintBox1.Height);

// Что-бы уже наверняка ...
LineSize:=B.RawImage.Description.BytesPerLine;
Bp:=B.RawImage.Description.BitsPerPixel div 8;

Getmem(ELine,LineSize);// ! Эталонная линия 
FillChar(ELine^,LineSize,$F2);// Заполнение
CurCanvas:=B.Canvas;
     For I:=DrawList.Count-1 downto 0 DO
      begin
        b.Canvas.Brush.Color:=$f2f2f2;
        CurCanvas.FillRect(0,0,b.Width,b.Height);

          CurCanvas.Pen.Mode:=pmWhite;// ! Режим создания маски (все рисуется белым )
            RF1.FastDrawFig(I,1); //Рисую одну фигуру на чистом битмапе 
          CurCanvas.Pen.Mode:=pmCopy;

      if  TLine(b.ScanLine[Y]^)[X*Bp]<>$f2 
          then
            begin
    //Дополнительно определение границ
    // текущей фигуры
    {-------------------}

   {Начальные значения "выворачиваю на изнанку" }
   R.Left:=b.Width;R.Top:=b.Height;   R.Right:=0;R.Bottom:=0;
   {========================================}
   // от текущей точки сканирую в вниз
      for Y1:=Y to b.Height-1 do begin
       PLine :=b.ScanLine[Y1];
      If CompareByte(PLine^,ELine^,LineSize)<>0 then
       //Быстрая проверка на пустую линию   
        for X1:=0 to b.Width-1 do
          if PLine^[X1*Bp]<>$f2 then
           begin
            If Y1<R.Top then R.Top:=Y1;
            If X1<R.Left then R.Left:=x1;
            If X1>R.Right then R.Right:=x1;
            If Y1>R.Bottom then R.Bottom:=Y1;
           end;
       end;
  // от текущей точки сканирую в вверх
     for Y1:=Y downto 0 do begin
      PLine :=b.ScanLine[Y1];
        If CompareByte(PLine^,ELine^,LineSize)<>0 then
        //Быстрая проверка на пустую линию   
         for X1:=b.Width-1 downto 0 do
           if PLine^[X1*Bp]<>$f2 then
                 begin
                 If Y1<R.Top then R.Top:=Y1;
                 If X1<R.Left then R.Left:=x1;
                 If X1>R.Right then R.Right:=x1;
                 //If Y1>R.Bottom then R.Bottom:=Y1;
                 end;
           end;
           CurRec:=R;
           fCurRec:=True;
           Result:=I;
           break;
        end;
     end;
CurCanvas:=rf1.PaintBox1.Canvas;
FreeMem(ELine,LineSize);
b.Free;
end;


Возможно можно еще что-то улучшить но скорость выполнения уже достаточная ....
...и главное никакой "шмагии" ! :mrgreen: Всем спасибо !
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 26.01.2017 06:37:46

Обрати внимание какой пример привел я viewtopic.php?f=5&t=14156&start=120#p108386 и какой ты. Твой про что угодно но не про CompareByte. Вообще имхо тут так сравнивать нельзя (в смысле использовать CompareЧтото).

Добавлено спустя 15 минут 3 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
И даже на твоем примере сразу ясно что ошибка не в CompareByte - т.к. момент "срыва" зависит от размера окна

Добавлено спустя 47 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
А зависимость скорости движения от размера окна даже не намекает, а кричит о хреновости метода

Добавлено спустя 2 минуты 29 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
>>...и главное никакой "шмагии" ! :mrgreen: Всем спасибо !
>>>>$f2
нуну))
>>... а развели ...
развел, а не развели. Тебе сразу было сказано что с CompareByte всё в порядке
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 26.01.2017 13:40:42

:roll: Ладно ладно, признаю, посыпаю голову пеплом и т.д. :wink:
Но что мне было думать если код ( Да я знал что CompareWord работать не должен но подумал "а вдруг.." ) заработал :?:
Единственное, что немного оправдает так это то что писал это чудовище со страшенной головной болью .
А первый пример, извини "не о чем" (я и сам похожий писал, когда искал способы "быстрого поиска пустых" :mrgreen: ... там тоже "все работало" )
Зы
Скорость замедленна примерно в 150 раз (иначе вообще ничего заметить нельзя ) а при изменении размеров тормозит не код определения границ а банальная очистка экрана ... Заменить CurCanvas.Clear на закраску "белым квадратом Малевича" (CurCanvas.FillRect(R) в конце цикла) и разница в скорости при изменении размеров сильно уменьшится ...

(от куска b.Canvas.Brush.Color:=$f2f2f2; CurCanvas.FillRect(0,0,b.Width,b.Height); избавится не выйдет ( в реальном случае там еще и проверка " Номера команды по клику" идет... можно ну разве, что попробовать оказаться от $f2f2f2 (заменив на ноль ) и нарисовать фигуру второй раз с CurCanvas.Pen.Mode:=pmBlack; ...что тоже не есть хорошо )
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 26.01.2017 14:53:44

Alex2013 писал(а):Скорость замедленна примерно в 150 раз (иначе вообще ничего заметить нельзя ) а при изменении размеров тормозит не код определения границ а банальная очистка экрана ... Заменить CurCanvas.Clear на закраску "белым квадратом Малевича" (CurCanvas.FillRect(R) в конце цикла) и разница в скорости при изменении размеров сильно уменьшится ...

Вот этот Ваш код, там где скрипт строит и рисует фигуру:
Код: Выделить всё
RF1.FastDrawFig(I,1); //Рисую одну фигуру на чистом битмапе 

почему нельзя дополнить вот таким кодом:
Код: Выделить всё
RF1.ReturnFastRect(I,1); //Возвращает один рект

либо более практичным вот таким кодом:
Код: Выделить всё
RF1.FastDrawFig(I,1,aRect); //Возвращает один рект и рисует фигуру


:?:

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 26.01.2017 20:35:39

Alex2013 писал(а):Зы
Скорость замедленна примерно в 150 раз (иначе вообще ничего заметить нельзя ) а при изменении размеров тормозит не код определения границ а банальная очистка экрана ... Заменить CurCanvas.Clear на закраску "белым квадратом Малевича" (CurCanvas.FillRect(R) в конце цикла) и разница в скорости при изменении размеров сильно уменьшится ...

Похоже ты не можешь оценить временные затраты своего творения. попробуй закоментить Clear, потом раскоменти Clear и закоиенти GetCMDOnClik... прекрасно видно куда тратится процессорное время и откуда 150 кратное замедление))
Alex2013 писал(а):А первый пример, извини "не о чем"

Первый пример ровно о том что CompareЧтототам прекрасно работает и проблему нужно искать в своем коде, а не в CompareЧтототам и мифических "многоядерных" проблемах.
То что ты грешишь на CompareByte, а в примере демонстрируешь какието левые рисовалки - образец как нельзя

vitaly_l писал(а):почему нельзя дополнить вот таким кодом:

vitaly_l писал(а):либо более практичным вот таким кодом:

Потому что процедура рисования (у Alex2013 это некий скрипт) должна быть как можно проще, и "трудности" надо решать в "движке", а не в этих процедурах. Сегодня нам понадобился габарит, завтра понадобится еще чтото - снова скрипты модифицировать?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 26.01.2017 20:57:16

zub писал(а):Потому что процедура рисования (у Alex2013 это некий скрипт) должна быть как можно проще, и "трудности" надо решать в "движке", а не в этих процедурах. Сегодня нам понадобился габарит, завтра понадобится еще что-то - снова скрипты модифицировать?

Почему нельзя продублировать функцию?
В изначальном варианте, она будет просто рисовать, а в дубле, будет: и рисовать, и + ещё возвращать рект.
И скорость рисования сохранится и рект можно будет получать из скриптового источника, там - явно проще рект посчитать. Или нет?
Хотя, безусловно, можно сделать отдельную функцию, которая будет возвращать только рект из скриптов.
наверняка в скриптах, все ограничения заданы, типа как в ректе.

.
Последний раз редактировалось vitaly_l 26.01.2017 21:12:56, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 26.01.2017 21:09:40

>>Или нет?
Нет, рект проще посчитать в "прокладке" между скриптом и канвасом. это нужно только движку, скрипт об этом знать ниче не должен.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 27.01.2017 17:13:51

1 Насчет скорости ...
Анимированая демка уже своим существованием показывает изрядный запас скорости
( В реальной программе нужна реакция на однократный клик, а это значит, что задержка реакции от 50 до 200 мс будет почти не заметна )
Но я уже еще кое-что "подшаманил" (сделал сканирование по горизонтали так-же как и по вертикали (то есть там теперь сканирование и по иксам идет от точки клика в обе стороны ) + обнаружил что самый лютый тормоз образуется при задании размеров буферного битмапа ...ну это довольно просто поправить ... (можно использовать и так существующую "теневую страницу" ))

2 Почему не так RF1.FastDrawFig(I,1,aRect); //Возвращает один рект и рисует фигуру ?
В принципе Zub за меня уже ответил .
Могу добавить что для получения aRect придется или :
1) Запускать при первичной сборке коллекции метафалов почти аналогичную процедуру поиска границ ...

2) Без особых гарантий добавить целый "слой слежения" в каждую процедуру передаваемую в скрипт для первичной прорисовки фигур, что не то чтобы совсем не достижимо... но сам посмотри вот кусок списка регистрации функций для передачи в скрипт
Код: Выделить всё
// Графика
AddFunction(@DRW_SetFontParam,
'procedure DRW_SetFontParam(C,CB,BUI,FS,FN:String);');
AddFunction(@DRW_GetTextWidth,'Function DRW_GetTextWidth(S:String):longint;');
AddFunction(@DRW_OutText,'Procedure DRW_OutText(X,Y:Longint;S:String);');
AddFunction(@DRW_MoveTo,'Procedure DRW_MoveTo(X,y:LongInt);');
AddFunction(@DRW_LineTo,'Procedure DRW_LineTo(X,y:LongInt);' );
AddFunction(@DRW_Rect,'Procedure DRW_FillRect(X,y,X1,Y1:LongInt);');
AddFunction(@DRW_Rect,'Procedure DRW_Rect(X,y,X1,Y1:LongInt);' );
AddFunction(@DRW_Elips,'Procedure DRW_Elips(X,y,X1,Y1:LongInt);');
AddFunction(@DRW_LINE,'Procedure DRW_Line(X,y,X1,Y1:LongInt);');
AddFunction(@DRW_SetPenColor,'Procedure DRW_SetPenColor(C:Longint);');
AddFunction(@DRW_SetBrushColor,'Procedure DRW_SetBrushColor(C:LongInt);');
AddFunction(@Drw_LoadIMG,'Procedure Drw_LoadIMG(X,Y,x1,y1:LongInt;N:String);');
AddFunction(@DRW_VGradientFill,'Procedure DRW_VGradientFill(X,y,X1,Y1,C1,c2:LongInt);');
AddFunction(@DRW_HGradientFill,'Procedure DRW_HGradientFill(X,y,X1,Y1,C1,c2:LongInt);');

И это возможно еще не финал ....
Ну и на закуску!
+ где-то все данные "слежения за скриптом" должны собираться в этот самый aRect + где-то нужно вести дополнительный список с проверкой актуальности данных + синхронизация данных со списком команд(теневым и основным ) + синхронизация со списками мета-файлов и вообще всеми активными действиям в редакторе ...
Возможно все не так страшно как кажется . Но побудительные мотивы заменить все это "грамадьё планов" ОДНОЙ функцией совершенно очевидны ... :idea:

3) Гибридный вариант : Рисовать локально все с точки 0,0 а выводить со смещением ...
В этом случае многое должно упростится но это тоже потребует много не совсем очевидной "работы над ошибками" :idea:

Добавлено спустя 34 минуты 30 секунд:
vitaly_l писал(а):
zub писал(а):Потому что процедура рисования (у Alex2013 это некий скрипт) должна быть как можно проще, и "трудности" надо решать в "движке", а не в этих процедурах. Сегодня нам понадобился габарит, завтра понадобится еще что-то - снова скрипты модифицировать?

Почему нельзя продублировать функцию?
В изначальном варианте, она будет просто рисовать, а в дубле, будет: и рисовать, и + ещё возвращать рект.
И скорость рисования сохранится и рект можно будет получать из скриптового источника, там - явно проще рект посчитать. Или нет?
Хотя, безусловно, можно сделать отдельную функцию, которая будет возвращать только рект из скриптов.
наверняка в скриптах, все ограничения заданы, типа как в ректе.

.

Ты просто загипнотизирован словом "фигура" и похоже считаешь что это просто фигура из канваса ...
Но это может быть например целый псевдослучайно нарисованный и рассчитанный по формулам фрактал
(Хоть дерево Пифагора, хоть треугольник Серпинского)
То есть в любом случае границы могу быть неопределенными (Как в том же демо-кубе, где в качестве основных исходных данных в скрипт предается некая точка привязки которая может вообще быть вне фигуры ).
Последний раз редактировалось Alex2013 27.01.2017 18:01:24, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 27.01.2017 17:52:11

Вот три функции, у которых рект находится внутри функции или придётся считать:
Код: Выделить всё
AddFunction(@DRW_OutText,'Procedure DRW_OutText(X,Y:Longint;S:String);');
AddFunction(@DRW_MoveTo,'Procedure DRW_MoveTo(X,y:LongInt);');
AddFunction(@DRW_LineTo,'Procedure DRW_LineTo(X,y:LongInt);' );


С другой стороны, в 90% функций, которые Вы привели, вы передаёте функциям уже готовый рект, вот они:
Код: Выделить всё
AddFunction(@Drw_LoadIMG,'Procedure Drw_LoadIMG(X,Y,x1,y1:LongInt;N:String);');
AddFunction(@DRW_VGradientFill,'Procedure DRW_VGradientFill(X,y,X1,Y1,C1,c2:LongInt);');
AddFunction(@DRW_HGradientFill,'Procedure DRW_HGradientFill(X,y,X1,Y1,C1,c2:LongInt);');
AddFunction(@DRW_Rect,'Procedure DRW_FillRect(X,y,X1,Y1:LongInt);');
AddFunction(@DRW_Rect,'Procedure DRW_Rect(X,y,X1,Y1:LongInt);' );
AddFunction(@DRW_Elips,'Procedure DRW_Elips(X,y,X1,Y1:LongInt);');
AddFunction(@DRW_LINE,'Procedure DRW_Line(X,y,X1,Y1:LongInt);');

Соответственно, все эти ректы, вы где-то храните (в каком-то списке или файле),
почему вы оттуда - не берёте значения ректов, а вместо этого повторно их высчитываете?
Или объекты рисуются друг на друге, а потом 10-ть объектов, вы считаете одной фигурой?

Но даже при таких обстоятельствах, высчитать наибольший рект из 10-ти складываемых ректов,
быстрее по времени и менее затратно для процессора, если брать ректы прямо из списка/файла в котором Вы храните данные для скриптов.


На самом деле безусловно пофигу, т.к. разница в скорости при громадном числе фигур максимум 1 или 20 секунд.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru