Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

Открыть новую тему     Написать ответ в эту тему

V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
         
Обсуждаем новые возможности и баги
 
Просьба писать про Embarcadero RAD Studio XE5, XE6, XE7, XE8, 10.x (Seattle, Berlin,Tokyo)
  По вопросам скачивания - Тема в Варезнике (lite-версии тут)
  Вопросы по неюникодным версиям Delphi — шестая бумага
  Бесплатные Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus
  Коммерческие компоненты и утилиты для Delphi/BCB
  Вопросы по компонентам для Delphi, C++ Builder разных версий
  Новые языковые возможности, начиная с Delphi 2005 по XE4 — здесь, и New!здесь еще
  Англоязычный официальный форум Embarcadero — здесь
  Embarcadero Quality Central, веб интерфейс — здесь, новый Quality Portal тут
  Программирование на Delphi — викиверситет
  Другие ресурсы
   Предыдущие бумаги
 
     Вопросы ..XE4       Вопросы ..XE3    Вопросы ..XE2      
  Вопросы ..2009-XE    Вопросы ..<2009 / ч.5    Вопросы ..<2009 / ч.4      
  Вопросы ..<2009 / ч.3    Вопросы ..Delphi 2 / ч.2    Вопросы ..Delphi  

  Выключение встроенного эксперта Castalia  для XE8 (иногда помогает при вылетах и тормозах)  
  Полезные плагины(эксперты)

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-09-2013 | Исправлено: Komandor, 15:49 31-03-2024
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sulphide
Ну если данные идут только в одном направлении, то еще ладно. В FMX ScanLine используется даже для того, чтобы сделать простое копирование картинки, без преобразований. Да даже и преобразования могли бы сделать на стороне видяхи, апи для этого уже давно есть. Причем для мобильных платформ это особенно актуально, так как процессоры там всегда медленные.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:24 19-04-2023
stanzdor



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Создал эмбаркадеровцам баг репорт

 
спасибо большое!
проверил ваш тестовый проект, увеличив размер битмапа в 3 раза (screen.Width*3 до 7680x4320)
 
на 11.3 без ускорения прыгает  от 50 до 94 мс, с ускорением 1-3 мс.
 
этот же код на 11.2  0-1 мс., где 1 проскакивает изредка.
подкорректировал по вашему примеру исходники FMX на 11.2: те же 0-1.
 
и это на винде, на андроиде даже не стал проверять... пока остаюсь на 11.2.
 
 

Всего записей: 594 | Зарегистр. 12-04-2004 | Отправлено: 18:22 20-04-2023
Sulphide

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stanzdor
Кстати проверил свои же правки твоего кода на андроиде со Skia5 и на удивление всё работает отлично, ничего не мерцает не моргает у меня на телефоне.  
 
добавил в dpr файлик следующее:
 
uses
  System.StartUpCopy,
  FMX.Forms,
  Skia.FMX,
  UnitTest in 'UnitTest.pas' {testForm};
 
перед app.init...
 
  GlobalUseSkia := True;
  GlobalUseSkiaRasterWhenAvailable := False;
 
В project -> deployment закинуть libsk4d.so из папки установки skia (в моем случае брал х64 андроид версию либы)
Там же в deployment заменить Remote Path добавленной либы на "library\lib\arm64-v8a\" для х64 андроид версии.
upd: или в инспекторе проекта кликнуть правой клавишей мыши по проекту и выбрать Enable Skia - что ещё проще. Всё само добавится.
 
Все остальное не менялось.
 
ms между 0 и 1. и поворот экрана работает и всё остальное. Без skia мерцало и вылетало и висло. При повороте экрана сразу вылетало. Андроид 12, ежели чего и 2400x1080 экран, image и bmp размером с экран сразу c Align = Client. Но у 5ой skia есть какой-то баг видимо, на андроиде справа как будто белая полоска по всей высоте окна в один пиксель. А на винде там же справа наоборот изображение заходит на 1 пиксель на правую черную рамку окна. Хотя именно в этом примере на винде у меня вроде всё ок, но как-то вылазила эта проблема, возможно в vcl. Не помню.))

Всего записей: 277 | Зарегистр. 20-03-2008 | Отправлено: 19:50 20-04-2023 | Исправлено: Sulphide, 00:41 21-04-2023
stanzdor



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sulphide, спасибо! я в своё время смотрел skia. крутил в голове как можно использовать, но кроме svg ничего для меня там интересного нет.
у меня и так за 50 метров апк, ещё таскать под 20 метров..
BeginUpdate; endUpdate; просто не убирайте и будет работать на андроид.
вариант Frodo_Torbins хороший.
 
вот ещё сижу туплю:
 

Код:
 
var
  textRect : TRectf;
  path: TPathData;
   bmp:= TBitmap;
 
..
  bmp:= TBitmap.Create; path := TPathData.Create;
  bmp.SetSize(trunc(screen.Width),  trunc(screen.Height));
     s:= 'test'
     textRect:= RectF(100, 100, bmp.width,  bmp.Height);
     bmp.Canvas.FillText( textRect, s, false, 1, [], TTextAlign.Center, TTextAlign.Center);
     path.Clear;
     bmp.Canvas.TextToPath(path, textRect, s, false, TTextAlign.Center, TTextAlign.Center);
     bmp.Canvas.DrawPath(path, 1);
 

 
ну должно же учитывать textRect  и в path, а нифига.
для винды нужно сдвинуть самому
Path.Translate( textRect.Left, textRect.Top);
а для андроид ещё и с учётом масштабирования scale

Код:
 
      if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
      scale:=ScreenService.GetScreenScale;
 

хотел вычислить формулу для андроид (как ни странно быстро не получилось), но оказалось настолько медленная эта операция, что лучше самому написать алгоритм обводки. правда пока не знаю как, что бы было быстрее вывода 4 раз строки со сдвигом))

Всего записей: 594 | Зарегистр. 12-04-2004 | Отправлено: 22:26 20-04-2023 | Исправлено: stanzdor, 22:52 20-04-2023
Sulphide

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stanzdor
У меня 4k монитор и 150% масштаб в винде, кстати, и screen.Width/Height дают 2560x1440 вместо нативного разрешения. Не знаю пригодится эта инфа или нет))
 
Короче так будет правильнее:

Код:
var
   ....
   clientScreenScale   : Double;
   clientScreenSize    : TSize;
   clientScreenService : IFMXScreenService;
 
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(clientScreenService)) then
    clientScreenScale := clientScreenService.GetScreenScale
  else  
    clientScreenScale := 1.0;
 
  clientScreenSize.CX := Round(clientScreenService.GetScreenSize.X * clientScreenScale);
  clientScreenSize.CY := Round(clientScreenService.GetScreenSize.Y * clientScreenScale);
 
  bmp:= TBitmap.Create;
  bmp.SetSize(clientScreenSize);
.....

 
в uses добавить FMX.Platform

Всего записей: 277 | Зарегистр. 20-03-2008 | Отправлено: 00:10 21-04-2023 | Исправлено: Sulphide, 00:46 21-04-2023
stanzdor



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я всё это понимаю, хоть и программирование чисто хобби для меня,
но Canvas.FillText( textRect.. и тут же Canvas.TextToPath(path, textRect..
выводят текст и обводку в разных местах, если textRect.left, top больше 0 (scale тут работает если x,y=0, а если смещение в Rectf, то где-то в стороне)
а можно посмотреть на ваш проект? у меня голова кругом читая что он делает. можно пощупать?

Всего записей: 594 | Зарегистр. 12-04-2004 | Отправлено: 01:21 21-04-2023 | Исправлено: stanzdor, 18:06 21-04-2023
Sulphide

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stanzdor
У меня проект (один из) "закрытый" если вы понимаете о чем я, и он не на FMX, а на кхм..cl + opengl 4.5 с вагоном шейдеров, на fmx написан только модуль управления для андроида)) И вообще он на freepascal, а не Delphi. =)))) Так что пощупать наверное не получится. Просто я на всякий случай для себя лично всякие такие хитрости и штуки сохраняю, если пригодятся. Типа skia и разные нюансы в fmx.

Всего записей: 277 | Зарегистр. 20-03-2008 | Отправлено: 02:35 21-04-2023
stanzdor



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо!

Всего записей: 594 | Зарегистр. 12-04-2004 | Отправлено: 03:16 21-04-2023 | Исправлено: stanzdor, 18:07 21-04-2023
Sulphide

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stanzdor
Я немного не понял, нужно получить типа аутлайнд текст? и внутри и снаружи чтобы цвета были?

Всего записей: 277 | Зарегистр. 20-03-2008 | Отправлено: 03:22 21-04-2023 | Исправлено: Sulphide, 03:26 21-04-2023
stanzdor



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

ну это типо аналог  VCL StrokeAndFillPath(bmp.Canvas.Handle);
то есть то что нарисовали, должно быть обведено контуром на Thickness пикселей.
 

Код:
 
procedure testpaint;
var
  bmp       : TBitmap;
  path: TPathData;
  textRect : TRectf;
  bitdata: TBitmapData;
  s: string;
begin
 
  bmp:= TBitmap.Create; path := TPathData.Create;
  bmp.SetSize(trunc(screen.Width),  trunc(screen.Height));
 
  bmp.Canvas.Fill.Color:= TAlphaColorRec.Cyan;
 
   bmp.Canvas.BeginScene;
   bmp.Canvas.Clear( TAlphaColorRec.Teal );
   bmp.Canvas.Font.Size:= 50;
 
   bmp.Canvas.Stroke.Kind := TBrushKind.Solid;
   bmp.Canvas.Stroke.Thickness := 3;
   bmp.Canvas.Stroke.Color := TAlphaColorRec.Black;
 
   s:= 'test';
 
   textRect:= RectF(100, 100, bmp.width,  bmp.Height);
 
   bmp.Canvas.FillText( textRect, s, false, 1, [], TTextAlign.Center, TTextAlign.Center);
 
   path.Clear;
   bmp.Canvas.TextToPath(path, textRect, s, false, TTextAlign.Center, TTextAlign.Center);
 
   bmp.Canvas.DrawPath(path, 1);
 
   bmp.Canvas.EndScene;
 
     testForm.Image1.BeginUpdate;
     testForm.Image1.Bitmap.Assign(bmp);
     testForm.Image1.endUpdate;
 
 
  bmp.Free; path.Free;
 
end;
 
procedure TtestForm.FormCreate(Sender: TObject);
begin
 
  Image1.Align:= TAlignLayout.Client;
  Image1.WrapMode:= TImageWrapMode.Fit;
  testpaint;
end;
 

 
 
 
 
 

Всего записей: 594 | Зарегистр. 12-04-2004 | Отправлено: 03:54 21-04-2023
Sulphide

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я понимаю, что занимаюсь фигней, но в данном случае мне интересны возможности Skia =)))) Вот тут рисуется один и тот же текст в одно и то же место, только сначала обводка в толщину 3 пикселя, а потом и сам текст. Красный текст с черной обводкой. Да не по середине, но это уже другая проблема. MeasureText у Skia есть, так что на самом деле не проблема. Работает быстро, 3мс у меня для 4k. И 4-5мс на андроиде, причем это полностью, а не только копирование бмпшки. Вернее без принудительного копирования бмпшки оно работает прекрасно. Вернее тут и не надо даже копировать бмпшку, работает сразу с бмпшкой внутри image1.
Главное не забыть прописать:
  GlobalUseSkia := True;
  GlobalUseSkiaRasterWhenAvailable := false;
 
А почему рендер в битмап вообще?)) Почему не прям на канву формы? Хотя тут в принципе понятно, ибо обновлять надо независимо от отрисовки формы... Хотя опять же можно в потоке только вызывать метод Paint формы и сам метод перехватить, ну ок хозяин - барин))
И на самом деле я бы отказался от анонимных потоков, ибо перед закрытием приложения, все же лучше завершить поток и подождать завершения потока... в случае с анонимными такое нереально.
 

Код:
 
procedure testpaint;
var
  fStopWatch: TStopwatch;
  WorkTime: Int64;
  bmp: TBitmap;
 
  clientScreenScale: Double;
  clientScreenSize: TSize;
  clientScreenService: IFMXScreenService;
 
  LFont1: ISkFont;
  LPaint1: ISkPaint;
  LPaint2: ISkPaint;
  LTypeface: ISkTypeface;
 
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(clientScreenService)) then
  begin
    clientScreenScale := clientScreenService.GetScreenScale;
  end
  else
    clientScreenScale := 1;
 
  clientScreenSize.CX := Round(clientScreenService.GetScreenSize.X * clientScreenScale);
  clientScreenSize.CY := Round(clientScreenService.GetScreenSize.Y * clientScreenScale);
 
  bmp := TBitmap.Create;
  bmp.SetSize(clientScreenSize);
  bmp.Canvas.Fill.Color := TAlphaColorRec.Cyan;
 
  testForm.Image1.Bitmap.Assign(bmp);
 
//  LTypeface := TSkTypeface.MakeFromName('Monospace', TSkFontStyle.Normal);
  LTypeface := TSkTypeface.MakeDefault;
  LFont1 := TSkFont.Create(LTypeface, 100, 1);
  LFont1.Edging := TSkFontEdging.AntiAlias;
 
  LPaint1 := TSkPaint.Create(TSkPaintStyle.Fill);
  LPaint1.AntiAlias := True;
  LPaint1.SetARGB($FF, $FF, $00, $00);
 
  LPaint2 := TSkPaint.Create(TSkPaintStyle.Stroke);
  LPaint2.AntiAlias := True;
  LPaint2.SetARGB($FF, $00, $00, $00);
  LPaint2.StrokeWidth := 3;
 
  while True do
  begin
    // засекаем время
    fStopWatch := TStopwatch.StartNew;
 
    TThread.Synchronize(nil,
      procedure
      begin
    testForm.Image1.Bitmap.SkiaDraw(
      procedure(const ACanvas: ISkCanvas)
      begin
        ACanvas.Clear(TAlphaColor($FF00FFFF)); //Cyan
        ACanvas.DrawSimpleText(TimeToStr(time) + '  ms: ' + IntToStr(WorkTime), 0, 300, LFont1, LPaint1);
        ACanvas.DrawSimpleText(TimeToStr(time) + '  ms: ' + IntToStr(WorkTime), 0, 300, LFont1, LPaint2);
      end);
      end);
 
    fStopWatch.Stop;
    WorkTime := fStopWatch.ElapsedMilliseconds;
 
   sleep(1); // чтобы не грузить одно ядро на 100%
  end;
 
  bmp.Free;
 
end;

Всего записей: 277 | Зарегистр. 20-03-2008 | Отправлено: 04:45 21-04-2023 | Исправлено: Sulphide, 07:19 21-04-2023
stanzdor



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
>> И на самом деле я бы отказался от анонимных потоков,
 
а чего их бояться, если они правильно работают?
 
завершить поток и подождать завершения потока
 
ок!
вот не поверите, там сто пудов есть проблема. у меня ума не хватает её найти, но она есть...

Всего записей: 594 | Зарегистр. 12-04-2004 | Отправлено: 10:22 21-04-2023
VitaliM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может кто знает, есть USB-считыватель смарт-карт (st-ce011em). Он в системе виден как клавиатура. Можно как-то отключать его программно на время, что бы он не считывал в какое попало поле ввода информацию с карты?

Всего записей: 2184 | Зарегистр. 12-01-2005 | Отправлено: 12:01 21-04-2023
waik



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
VitaliM
Я обходил это так: В конфигураторе считывателя задавал какой то префикс - например знак тильды  (в некотлрых самому нельзя задать а только выбрать точка с запятой или знак вопроса)  и вешал обработчик на форму в кейпревью.  Если префикс прошел и дальше код карты то в игнор эти кейдауны.  
Понятно что костыль, но отключить не получилось, а если виндовыми функциями с извлечением USB устройства, то жуткие тормоза и фризы.  В итоге работает уже не один год.

Всего записей: 605 | Зарегистр. 15-01-2003 | Отправлено: 16:49 21-04-2023
VitaliM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
waik
Спасибо! Я примерно так и думал сделать, просто для сканера штрих кодов его можно перевести в режим эмуляции СОМ порта, а дальше все просто. Вот и здесь думал, что может быть какой SDK есть, а я просто не знаю...

Всего записей: 2184 | Зарегистр. 12-01-2005 | Отправлено: 17:37 21-04-2023 | Исправлено: VitaliM, 17:38 21-04-2023
uranic2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите парсер на Delphi Html документов. С инета качала пару проектов с гитхаба, но оба спотыкаются

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 10:38 24-04-2023
Alexey_Gawrilow



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
uranic2
На текущий момент лучшее, что есть - HTML Components.
Если не смущает зависимость, можешь использовать DOM браузеров.

Всего записей: 640 | Зарегистр. 08-09-2003 | Отправлено: 13:32 24-04-2023
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
uranic2
Edge WebView2

Всего записей: 12399 | Зарегистр. 11-03-2002 | Отправлено: 13:47 24-04-2023
bicoqe

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
прошу совета. пишу код отправки XML файла на сервер. использую Indy на Delphi 11.2
на сервер файл не передаётся. хотя ответ success authorization;success upload;

Код:
 
procedure TForm1.btnUploadClick(Sender: TObject);
var
  Indy: TIdHTTP;
  responseStream: TStringStream;
  xmlStream: TStringStream;
  Params: TIdMultipartFormDataStream;
begin
  Indy := TIdHTTP.Create;
  Indy.AllowCookies := False;
  Indy.Request.BasicAuthentication := True;
  Indy.Request.Username := edUserName.Text;
  Indy.Request.Password := edPassword.Text;
  responseStream := TStringStream.Create('');
  xmlStream := TStringStream.Create('');
  try
    Params := TIdMultipartFormDataStream.Create;
    try
      xmlStream.LoadFromFile(edSourceXMLFile.Text);
      Params.AddFormField('document.xml', 'text/xml', 'utf-8', xmlStream, 'document.xml');
      try
        Indy.Post(edURL.Text, Params, responseStream);
      except
        on E: Exception do
          ShowMessage('Error encountered during POST: ' + E.Message);
      end;
      Memo1.Lines.Text := Memo1.Lines.Text + responseStream.DataString;
    finally
      Params.Free;
    end;
  finally
    xmlStream.Free;
    responseStream.Free;
    Indy.Free;
  end;
end;
 

Всего записей: 4 | Зарегистр. 13-02-2023 | Отправлено: 15:21 24-04-2023 | Исправлено: bicoqe, 09:39 04-05-2023
uranic2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 
Alexey_Gawrilow


Цитата:
На текущий момент лучшее, что есть - HTML Components.
Если не смущает зависимость, можешь использовать DOM браузеров.
 

Спасибо. Парсер отлично понял нужный мне xpath! похоже даже триальной версии будет достаточно.
 

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 08:23 25-04-2023
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru