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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

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 (иногда помогает при вылетах и тормозах)  
  Полезные плагины(эксперты)

Всего записей: 945 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-09-2013 | Исправлено: virussnu, 01:29 27-10-2018
xpin2013



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

Цитата:
и что? хелпер копирует содержимое, а приведение в изначальном примере копирует указатель.

Приведение для XE7 не нужно, приводится тот же тип к тому же, для D2010 нужно.
 

Цитата:
ты ошибаешься, и это не признак ума, когда ошибки свои не хочешь признавать ..  

Только представь, Питер Нортон написал Нортон Коммандер. Когда нажимаем F3 он показывает внутренности файла в виде байтов, но его попросили показать как текст. Конечно он мог бы выделить такой же буфер как для байтов и перекопировать туда байты как AnsiChar, но увы DOS память была маленькая и про то, что желание не делать лишнюю копию считается ошибкой никто не знал от Нортона до Delphi 2010. Все ошибались...
 

Цитата:
Разница между D2010 и XE7 может быть только в порядке финализации объектов.  


Цитата:
В Delphi 2010 могло быть иначе

Проверяется на раз:

Код:
procedure TForm2.Button1Click(Sender: TObject);
var
  B: TBookmarkStr;
  v: variant;
begin
  Table1.Open;
  B := TBookmarkStr(Table1.Bookmark);
  v := null;
  Table1.Bookmark := TBookmark(B);
end;

1)В финализации - финализируется динамический массив. Количество ссылок 1. Вызывается фреемем
2)Финализируется строка. Количество ссылок 1. Вызывается фреемем.
3)Сравниваем адреса переменных в стеке - они разные. В _DynArrayClear попатает динамический массив с корректным typeinfo. Переменная строки туда не попадает.
4):=TBookmarkStr(Table1.Bookmark); вызывает LStrLAsg - собственно копирование строки. И в D2010 и в XE7. В D2010 вызывается GetMem для новой строки, в XE7 GetMem не вызывается, увеличивается ссылка, по этому Current := '' - уменьшает ссылку и затирает в стеке "неверный" указатель на строку, хотя компонентам гридам не надо изменять строку, не надо typeinfo, ничего не надо - счётчик ссылок и размер у динамического массива и строки в одном и том же месте. TBookmark2 повторяет D2010,
Только := TBookmark2(vTable1.Bookmark); делает тоже самое но корректно - UniqueString копирует строку, а LStrLAsg в код не подставляется. По выделениям памяти - всё то же, + стек увеличен на рекорд. Но TBookmark2 не вызывает всякие Winapi.MultiByte, а LStrLAsg в 2010 вызывает, так что код 2010 медленнее чем Xe7 + TBookmark2.
 

Цитата:
Разница в том, что в случае с LStrClr в FreeMem передается указатель (p-sizeof(TStrRec)),  
а в DynArrayClear -- указатель (p-sizeof(DynArrayRec)).  
Они не одинаковые. Доходит?  

Нет, передаётся один и тот же указатель у которого p-Sizeof(4)-это размер у DynArrayRec и у TStrRec, и p-Sizeof(8) -это счётчик ссылок и у DynArrayRec и у TStrRec. Весь код работы с букмарками не использует вообще других данных DynArrayRec и TStrRec.
Для всего кода программы кроме финализации они одинаковые. Доходит?
 

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  b: TBytes;
  a: array of Byte;
begin
  a := b;

Сообщение компилятора
[dcc32 Error] Unit1.pas(80): E2010 Incompatible types: 'Dynamic array' and 'System.TArray<System.Byte>'
Можешь перевести? Чувствую что Dynamic array не то же самое что "Динамический массив"? Боюсь Вы начнёте объяснять разницу, а не станете аккуратнее использовать фразу "Динамический массив".
 
Призываю, давайте объясним Питеру Нортону, что показывать текст не копируя при этом массив байтов в массив букв - это не признак ума это ошибка. Это нам доказал AlekXL и .NET своими генериками, которые кстати легко преобразуются UNSAFE методами без всяких каприз - как угодно вообще. Но нубы которые не знают системных объектов, этого конечно не сделают, отсюда мажорные нападки о несовместимости.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 13:00 12-01-2015 | Исправлено: xpin2013, 13:02 12-01-2015
Eternal_Shield

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

Код:
 
1. Result := TBookmarkStr(AValue.FValue);  
2. AValue.FValue := nil;  
3. UniqueString(Result);
 

Давайте разберёмся, что здесь проиходит? А происходит вот что:
1. При такой преобразовании, происходит инкремент RefCount (=2) поля у дин. массива из-за того, что поле RefCount совпадает с таковым у заголовка AnsiString. Поэтому считается, что вы просто заимели вторую ссылку на один и тот же AnsiString;
2. Происходит декремент RefCount (=1) у дин. массива. Но память остаётся жить, т.к. RefCount <> 0 на момент присвоения из-за действий в п.1;
3. Вы создаёте новую правильную строку, но память от дин. массива так и остаётся жить с RefCount = 1;
 
В итоге: У вас гарантированная утечка памяти и новая правильная строка;
 
С размерами хедеров AlekXL подметил верно: у AnsiString хедер = 12 байт в х32, а у дин. массива - 8 байт в х32. При наложении хедеров только RefCount (-8) и Length (-4) совпадают, собственно поэтому то п.1 и отрабатывает без проблем, т.к. самое необходимое для операции есть и оно верное. Но скорее всего, какая-нибудь операция с такой строкой приведёт к AV из-за того, что поля CodePage и ElementSize AnsiString'a лежат на мусоре.
 
Я рекомендую делать так:

Код:
SetString(Result, PAnsiChar(FValue), Length(FValue));

или  

Код:
Result := PAnsiChar(AValue.FValue);

если в конце массива гарантировано #0;
 
Первый вариант будет быстрее из-за отсутсвия начальных проверок во 2-ом варианте;
 
Добавлено:

Цитата:
[dcc32 Error] Unit1.pas(80): E2010 Incompatible types: 'Dynamic array' and 'System.TArray<System.Byte>'  

Потому что Alias - это Alias, а конкретный тип - это конкретный тип. У них разный Rtti. Это особенность реализации генериков в Delphi.

Всего записей: 737 | Зарегистр. 18-05-2009 | Отправлено: 13:24 12-01-2015 | Исправлено: Eternal_Shield, 13:30 12-01-2015
xpin2013



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

Цитата:
В итоге: У вас гарантированная утечка памяти и новая правильная строка;  

1) Во всех моих примерах используется ReportMemoryLeak:=True - утечки нет
2) UniqueString - копирует строку, присваивает ей счётчик 1 и обязательно!!!! обязательно делает декремент у исходной строки которая указывает на динамический массив - утечек нет.
 

Цитата:
Потому что Alias - это Alias, а конкретный тип - это конкретный тип. У них разный Rtti. Это особенность реализации генериков в Delphi.
 

Нет, точнее не только генериков. Та же ошибка будет в DelphiXe7, В2010..D2009, D7, D6... далее не помню, ошибка та же, - это разные типы, когда счётчик располагается непостредственно в стеке.
 
 
Странно, поговорил с одним программистом, который ужасно любит спорить и знает джейсоны и тд, в общем я его считаю авторитетным. Он сказал только одно - имей ввиду, что при переходе на новую Делфи может не работать. Я спросил, а много что может не работать при переходе - он сказал да. Я ещё спросил, а правильно ли, что человек берущий на себя ответственность за преобразование данных имеет право преобразовывать и нести за это ответственность? Он сказал что эта формулировка даже лучше.
 
Добавлено:

Цитата:
В итоге: У вас гарантированная утечка памяти и новая правильная строка;

Проверяется как 2 пальца, ставим брейкпоинт на SysFreeMem с условием что адрес будет равен указателю на динамический массив - 8. Eternal_Shield знает почему -8.
 
 
http://forum.ru-board.com/topic.cgi?forum=33&topic=10884&start=5840#3
Там имеем AV со  следующим стеком:  
KERNELBASE.lstrlenA  
USER32.GetClassNameA  
Работа строк всё же была нарушена нововведениями.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 14:26 12-01-2015 | Исправлено: xpin2013, 19:48 12-01-2015
AlekXL



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

Цитата:
правильно ли, что человек берущий на себя ответственность за преобразование данных имеет право преобразовывать и нести за это ответственность?  

ты имеешь право выстреливать себе в ногу.
Но код, который  написанный с подобным подходом, в свой проект я бы не включил.  
 
Изобретать проблемы на ровном месте -- это не мудро.  
Если нужна скороть, можно использовать указатели. А не приводить один автоматический тип к совершенно другому.
 

Цитата:
Я вообще уже поражаюсь - все делают громкие заявления, но никто кроме меня свои слова под отладчиком не проверяет
Я проверял твой код под отладчиком XE7. Детально, на уровне буфера и ассемблера.  
 
---
Все, хватит. Это не баг компилятора. Тебе многие опытные уже сказали, что ты не прав и в чем. Дальше дело твое.
--
Я даже понимать начинаю, для каких программистов было придуман managed код.

Всего записей: 789 | Зарегистр. 24-04-2008 | Отправлено: 19:52 12-01-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто-нибудь использовал Slim Reader/Writer (SRW) Locks
_http://msdn.microsoft.com/en-us/library/windows/desktop/ms683483%28v=vs.85%29.aspx
_http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937%28v=vs.85%29.aspx
Можете пример использования скинуть?

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 20:28 12-01-2015
xpin2013



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

Цитата:
Это не баг компилятора.

Да я же уже писал - разобрался с этим. Из _LStrLAsg исключили  
CMP     [EDX-Skew].StrRec.elemSize,1
компилятор не причём и гереники тоже, этот грех на мне. При преобразовании уже не происходит копирования, жить с багами тоже не хочу. Я же писал, как дальше быть.
Eternal_Shield

Цитата:
3. UniqueString(Result);  


Цитата:
3. Вы создаёте новую правильную строку

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

Код:
class operator BookmarkStr.Implicit(AValue: BookmarkStr): TBookmarkStr;
var
  L: Integer;
begin
  L := Length(AValue.FValue);
  if L > 0 then
  begin
    SetLength(Result, L);
    System.Move(AValue.FValue[0], Result[1], L);
  end else
    Result := '';
  AValue.FValue := nil;
end;
...
Current := BookmarkStr(Bookmark)

Отлажено во всех местах во всех вариациях. (Да, забыл, проверял это и в D2010 - работает оптимальнее чем простое преобразование со спрятанным вызовом _LStrLAsg, так что результирующий код и для d2010 лучше)

Цитата:
Изобретать проблемы на ровном месте -- это не мудро.

Проблема так и стояла, нужно было преобразовать в TBookmarkStr. Разработчики Дельфи собираются вообще отказаться от AnsiString (строка из System.pas)
>  vtAnsiString    = 11{$IFDEF NEXTGEN} deprecated 'Type not supported' {$ENDIF NEXTGEN};
Так, что им на наши тёрка далеко пофиг.
 

Цитата:
Тебе многие опытные уже сказали, что ты не прав и в чем.

Опытные в XE7, но не Дельфи 2010 и ниже. Так что мне они ничего не сказали - там всё работало и работает. А вот то что такое иплицитный typecast они не знают, это я уже заметил.
 

Цитата:
Все, хватит.

А действительно хватит, я уже предложил разобраться почему у DevExpress новых ошибки работы со строками сваливаются в Kernel? Мне эту задачу трудно потянуть и я вот на их бажный код тоже пока не хочу переходить.
http://forum.ru-board.com/topic.cgi?forum=33&topic=10884&start=5840#3

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 20:53 12-01-2015 | Исправлено: xpin2013, 21:15 12-01-2015
landy



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

Цитата:
Можете пример использования скинуть?

Сравнение и модуль

Всего записей: 573 | Зарегистр. 17-01-2003 | Отправлено: 21:08 12-01-2015 | Исправлено: landy, 21:08 12-01-2015
DYUMON



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Народ,  а не кто не в курсе, можно ли в xe7 вернуть старые иконки как xe2? вроде на какой то предыдущей версии это отключалось.

Всего записей: 78 | Зарегистр. 03-11-2009 | Отправлено: 21:11 12-01-2015
SuPriTo



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

Цитата:
Сравнение

А есть сравнение для TJclMultiReadExclusiveWrite? Что-то в гугле не нашел по быстрому.
DYUMON
Удать файл ModernTheme200.bpl из папки $(BDSBIN). Студия один раз ругнется, а потом перестанет, и все иконки сделаются привычными.  

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 21:45 12-01-2015 | Исправлено: SuPriTo, 21:46 12-01-2015
landy



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

Цитата:
А есть сравнение для TJclMultiReadExclusiveWrite? Что-то в гугле не нашел по быстрому.  

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

Всего записей: 573 | Зарегистр. 17-01-2003 | Отправлено: 23:33 12-01-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
landy
Я сейчас пишу библиотеку. Пока не тестировал, смотрю, какие блокировки лучше использовать. Собственно и спрашиваю по этому.

Цитата:
 Также, наверное, стоит рассмотреть неблокируемые структуры..

Например?

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 00:03 13-01-2015 | Исправлено: SuPriTo, 00:06 13-01-2015
landy



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

Цитата:
Например?

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

Всего записей: 573 | Зарегистр. 17-01-2003 | Отправлено: 09:27 13-01-2015 | Исправлено: landy, 09:33 13-01-2015
Andryshok



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я вот давно бросил бесперспективную дельфю...., но вот на днях нужно было сваять одну мелочь под win32 - я накатил XE7 и упс.....   где делись компоненты шелла  ShellTreeView ?  Что это за бред

Всего записей: 639 | Зарегистр. 03-06-2009 | Отправлено: 09:48 13-01-2015
landy



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

Цитата:
где делись компоненты шелла  ShellTreeView ?

Вполне себе лежит в \Embarcadero\Studio\15.0\lib\win32\debug\Vcl.Shell.ShellCtrls.dcu, просто его нужно ставить руками теперь.

Всего записей: 573 | Зарегистр. 17-01-2003 | Отправлено: 10:34 13-01-2015
MGAlex



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

Цитата:
Студия один раз ругнется, а потом перестанет

Не совсем так. Нужно нажать кнопку "No", когда появится сообщение с вопросом нужно ли попытаться найти и загрузить библиотеку ModernTheme200.bpl при следующем старте студии. Иначе сообщение будет появляться каждый раз при старте.
Вообще, могли бы в настройках сделать возможность выбирать нужную тему. Мне больше по  душе старая тема. Хотя, после установки Office 2013 мне он показался жутко неудачным в плане иконок и оформления. А потом привык и все устраивает, а 2010 офис уже кажется непривычным. А с учетом косяков Outlook 2010 вообще кошмар
 

Цитата:
просто его нужно ставить руками теперь

Что-то они перемудрили. BDE нужно ставить отдельно, ShellTreeView вручную.

Всего записей: 1640 | Зарегистр. 12-10-2007 | Отправлено: 11:36 13-01-2015
landy



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

Цитата:
Что-то они перемудрили. BDE нужно ставить отдельно, ShellTreeView вручную

Это всё теперь deprecated (а BDE вообще давно пора закопать). Вот более подробная нота

Всего записей: 573 | Зарегистр. 17-01-2003 | Отправлено: 11:55 13-01-2015
dred2k



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще, к примеру, отказались от Web.Win.Sockets.pas (начиная с XE6, кажется) - зачастую популярные TTcpClient/TTcpServer.
Тоже лежат теперь в примерах (Samples\Object Pascal\VCL\InetWinSockets) и требуют ручной установки.

Всего записей: 403 | Зарегистр. 15-02-2006 | Отправлено: 13:06 13-01-2015 | Исправлено: dred2k, 13:07 13-01-2015
Andryshok



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да они там походу вообще сбрендили.... лучше бы компилятор под линукс делали чем людей какой то ерундой путать, + я еще раз не пожалел что завязал с дельфей.

Всего записей: 639 | Зарегистр. 03-06-2009 | Отправлено: 18:24 13-01-2015
xpin2013



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

Цитата:
Да они там походу вообще сбрендили....

Не совсем ещё, но могут. Когда появился .NET все деньги бросили на создание Delphi8, которая даже win32 не компилила. Потом вышла D2005 .Net + win32 который ничем не отличался от D7. Со временем Микрософт осознал, что больше уже не захватит у рынка и перестал вливать в .NET больших денег. Дельфисты осознали это и потихоньку .NET отпочковался от среды разработки в виде продукта, которым мало интересуются. Сейчас Дельфи кидает все средства в захват мобильного рынка, но когда уже будет всё, то вполне возможно все эти мобилы так же отпочкуются как и .NET. Важно, чтобы за это время произошло меньше глупостей, но мы на это повлиять не можем.
 
Добавлено:
А вот преподаватели наши до сих пор учат, что за сишарпом будущее. Их программа может поменяться только через 10 лет, так что учите .NET

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 18:39 13-01-2015
ChSerg



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

Цитата:
я еще раз не пожалел что завязал с дельфей

И на чем же остановили свой выбор?

Всего записей: 936 | Зарегистр. 30-08-2001 | Отправлено: 21:14 13-01-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

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

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru