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

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

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

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
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
Кстати сейчас встретился с ошибкой финализации в XE7. Я портировал туда старые компоненты, которые перестали выпускать после Delphi7. Когда на end; в отладке нажать F7, то начинаем гулять по ассемблерному коду финализации. Программа валилась на _LStrClr. В процедуре, в локальных переменных была только TBookmarkStr. Я ей присвоил пустую строку перед выходом, ошибка исчезла. Ну в общем, исправил в чужом коде за 10 минут, и КвелитиЦентрал мне не понадобился. Но предупреждаю, какие то косяки ещё есть и в XE7.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 01:57 11-01-2015 | Исправлено: xpin2013, 10:49 11-01-2015
AlekXL



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

Цитата:
Кстати сейчас встретился с ошибкой финализации в XE7.  

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

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 11:12 11-01-2015
xpin2013



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

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

Тут некоторые нюансы есть, сейчас думаю как это сделать проще...
 
Добавлено:
AlekXL

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

Написал пример ошибки. Отпишите в QC пожалуйста, Вы обещали, можете упомянуть меня (там и в QC - xpin). В примере нужна заполненная таблица. Я взял FireDac с FireBird, но база не важна. Валится на Button1Click.
Unit1.pas
Unit1.dfm
Ну и ссылочку, если будет статья, посмотреть хотелось бы.
 
 
Добавлено:
Если перед end ставим Current := '' то ошибки нет.
 
Добавлено:
Я полагаю что связано с тем что букмарки стали генериками.
TBookmark = TArray<Byte>;

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

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

Цитата:
Ну в общем, исправил в чужом коде за 10 минут, и КвелитиЦентрал мне не понадобился. Но предупреждаю, какие то косяки ещё есть и в XE7.

У тебя не ошибка финализации, а некорректное приведение типа, которое портит память.

Всего записей: 450 | Зарегистр. 15-02-2006 | Отправлено: 15:15 11-01-2015
xpin2013



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

Цитата:
У тебя не ошибка финализации, а некорректное приведение типа, которое портит память.

1) Если бы портилась память то

Код:
var  
   Current : TBookMarkStr;  
   V : Variant;  
 begin  
   Current := TBookmarkStr(FDTable1.Bookmark);  
   V := Null;  
   FDTable1.Bookmark := TBookmark(Current);  
   Current := ''; //<-- Вот это бы не помогло.
 end;  
...
initialization
  ReportMemoryLeaksOnShutdown := true;
end.

Обнуление Current не помогло бы. Ошибка вылетает только в end (финализация).
2) Если бы было бы некорректное приведение типа, - его бы не допустил компилятор (хотя допускает и TArray<Word>).
3) Если бы нельзя было бы TBookmark<-->TBookmarkStr конвертить, то написали бы процедурки конвертации в DB, так как этим пользуются уже на протяжении около 10-и лет.
 
Подумай головой иногда прежде чем писать, и перечитай пункт 1 если не понял.
 
Простите.
 
Добавлено:
Тем кто переживает за конвертацию:

Код:
{$IFDEF DELPHI21}
function TBookmark2(const BookmarkStr: TBookmarkStr): TBookmark;
  inline;
begin
  if Length(BookmarkStr) > 0 then
  begin
    SetLength(Result, Length(BookmarkStr));
    System.Move(BookmarkStr[1], Result[0], Length(BookmarkStr));
  end else
    Result := nil;
end;
 
function TBookmarkStr2(const Bookmark: TBookmark): TBookmarkStr;
  inline;
begin
  if Length(Bookmark) > 0 then
  begin
    SetLength(Result, Length(Bookmark));
    System.Move(Bookmark[0], Result[1], Length(Bookmark));
  end else
    Result := '';
end;
{$ENDIF}

Простите но Record Helper не поддерживает классовые операторы Implicit/Explicit, так бы завернул преобразование с глаз долой.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 16:31 11-01-2015 | Исправлено: xpin2013, 16:46 11-01-2015
NickNNN



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

Цитата:
1) Если бы портилась память то  

 
Если писать всякий бред, то не только в финализации можно проблем нахвататься.  
 
По поводу примера - там две строчки кода, там больше нечему валится кроме как в финализации.  
 
kaz_av четко указал причину, не вертите - пишите на QC, там доступно и вежливо напишут кто идиот

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 16:46 11-01-2015
xpin2013



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

Цитата:
По поводу примера - там две строчки кода, там больше нечему валится кроме как в финализации.  

Ошибаетесь. И Вы прочитайте пункт 1. Current := '' это то, что делает (должна делать) финализация. Ошибка должна была валиться в этой строке - освобождается память, ошибки - её нет.  
2.
Цитата:
initialization    ReportMemoryLeaksOnShutdown := true;  
не выдаёт потерянной памяти, и нет двойного высвобождения памяти, значит Current := '' вполне корректен.
3)
Цитата:
Если писать всякий бред
, вот и не пишите.
 

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 16:54 11-01-2015
Vadimsta



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013
Ах-ах, ностальгия, 2011 год, стандартные проблемы обновления работы с источниками данных... Решённые и разобранные по косточкам в том же году.
 
Из справочной системы Delphi XE7:
 
Note: Any use of either TBookmarkStr or Pointer in user code should change to TBookmark. The TBookmarkStr type is deprecated.  
 
Поэтому на QC даже обсуждать это не будут (начиная с Delphi 2009). Я даже не буду приводить ассемблерные листинги.
 
Отмечу, что в стабильной ветке Free Pascal всё наоборот - используется именно TBookmarkStr: http://www.freepascal.org/docs-html/fcl/db/tbookmark.html .
 
P.S. Если очень хочется поизвращаться со строками, можно достаточно безопасно использовать StringOf(Букмарк) и BytesOf(Строка).
 
P.P.S. Из то же справки:  
Note: Different types of datasets can implement bookmarks differently. Do not use a TBookmark from one type of dataset (for example, a client dataset) with methods on another type of dataset (for example, an InterBase Express dataset).

Всего записей: 2 | Зарегистр. 01-02-2006 | Отправлено: 17:15 11-01-2015
NickNNN



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vadimsta, кто же читает рекомендации при обновлении от одной версии к другой. Это ж для умников, а depricated вообще для тру'сов

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 17:21 11-01-2015
Vadimsta



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ведь даже на сайте прекрасно написано в What's New in Delphi and C++Builder 2009 (http://docwiki.embarcadero.com/RADStudio/XE7/en/What%27s_New_in_Delphi_and_C%2B%2BBuilder_2009)
 
TDataSet Changes in Bookmark Handling:  DB.TDataSet has some significant changes in its handling of Bookmarks:  
- The TBookmarkStr type is being deprecated.  
- The TBookmark type definition has changed from Pointer to TBytes, which means that it is now reference-counted and lifetime-managed.  
- TDataSet.Bookmark property now returns a TBookmark instead of a TBookmarkStr.  
- Any use of either TBookmarkStr or Pointer in user code should change to TBookmark.  
- The following code results in invalid access to freed memory on the GotoBookmark line, because no valid TBookmark reference is made:  

Код:
var
 Bookmark: Pointer;
begin
 Bookmark := MyDataSet.GetBookmark;
 ...
 MyDataSet.GotoBookmark(Bookmark);

 
Коротко и ясно...

Всего записей: 2 | Зарегистр. 01-02-2006 | Отправлено: 17:37 11-01-2015
xpin2013



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

Цитата:
Из справочной системы Delphi XE7:    Note: Any use of either TBookmarkStr or Pointer in user code should change to TBookmark. The TBookmarkStr type is deprecated.    

1) Из моей справочной системы в Delphi 2010 этот код прекрасно работает (XE3 может и раньше не работает так как генерик).  
2) Ошибки должны быть вразумительными, не все такие прошаренные как я.
3) При чём сдесь TBookmarkStr вообще????? Вы хоть проверьте этот текст.
type TWordArray = TArray<Word>;
var
  S: AnsiString;
  W: TWordArray;
begin
  S := AnsiString(W);
Это преобразование компилируется на ура и влечёт те же ошибки...  
 
Кому интересно поразбирать косточки.

Код:
var
  MonitorC: PPointer;
  MonitorI: PInteger;
 
function xxx: AnsiString;
begin result := #0#1#2#3; end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Current : TBookMarkStr;
  V : Variant;
begin
  Current := TBookmarkStr(FDTable1.Bookmark);
  //Current := TBookmarkStr(xxx);
  //V := Null;
  //FDTable1.Bookmark := TBookmark(Current);
  MonitorC := @Current;
  MonitorI := Pointer(Current);
  Dec(MonitorI, 2);
 // Current := '';
end;

MonitorI - это счётчик ссылок на строку Current. Когда мы присваиваем преобразованный букмарк, к финализации подключается процедура _DynArrayClear.
Присвоение увеличивает счётчик ссылок на 1. Но _DynArrayClear уменьшает на 1 и _LStrClr тоже пытается уменьшить на 1, следовательно вызывает FreeMem. Но кто сказал что это правильно? Bookmark ещё нужен датасету. Анализатор финализации не сравнивает адреса, он мог бы подсчитать что на этот адрес 2 финализации, а увеличение счётчика на 1.
NickNNN

Цитата:
, не вертите - пишите на QC, там доступно и вежливо напишут кто идиот

Это я Вам вежливо скажу, будет XE9 проверьте - всё будет работать, не обязательно так как мы хотим, но будет, видимо идиотов они уважают больше чем тех кто не знает про что пишет.  
В частности чем TArray<Word> похож на Букмарк, это Вы уж можете объяснить, Вы же не идиот???
 
Добавлено:
Без букмарков с WideString пример сканает для QC????

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



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

Цитата:
Хватит умничать. Я не на пустом месте этот пример взял. Возьмите тот же ExpressQuantumGrid 3.2.2 (DevExpress Delphi7) и портируйте его в Delphi XE7

 
А обновления сторонних компонентов для кого выходят? И что производители зря пишут что добавилась поддержка новых версий Delphi ?  Или вы думаете там идиоты сидят, вместо того чтобы "портировать" просто код переделывают от нечего делают?
 
Свой проект переводил сразу с D6 на XE3, потом с XE3 на XE7. Сторонние компоненты обновил. Странно, все работает хорошо. Наверно нужно было FastReport и DevExpress портировать, не читать рекомендации, наделать кучу ошибок и потом кричать на весь мир о глючности последней среды
 
Продолжать дискуссию считаю бессмысленной, уже несколько человек указывают Вам на грубые ошибки, а вы все заладили "компилятор же пропустил, значит должен работать"
 
Кстати, никто никого не заставляет обновлять среду разработки, не нравится - не работайте. В варесе среда появляется с минимальной задержкой от официальной, можно вполне оценить качество продукта

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 19:29 11-01-2015
xpin2013



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

Цитата:
Или вы думаете там идиоты сидят, вместо того чтобы "портировать" просто код переделывают от нечего делают?  

Если утверждаете, то не плохо бы сначало узнать что Вы утверждаете. Попридержите язык, хватит хамить здесь. Через слово у Вас идиоты.
 

Цитата:
Продолжать дискуссию считаю бессмысленной


Цитата:
уже несколько человек указывают Вам на грубые ошибки,

ога. Они ещё скажут что преобразование Integer(Pointer(String(S))):=0 грубая ошибка, хотя этим трюком пользовался стринглист и описывалось в каждом учебнике как уловка. Ну надо же грубая ошибка которую я исправил с помощью Current:=''. Это же нарушение, это хаккерство какое-то.  
 
Добавлено:

Цитата:
и потом кричать на весь мир о глючности последней среды

Держу мышку над надписью Сообщить модератору.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 19:41 11-01-2015 | Исправлено: xpin2013, 00:24 12-01-2015
landy



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

Цитата:
ExpressQuantumGrid 3.2.2 прекратил существование после Delphi7. Нет никого кроме добровольцев типа меня. Могу дать ссылку на портированный 3.2.2 под XE3 там зип с паролём как наш сайт, видимо "идиоты" какие-то выкладывали

Кстати, xpin2013, я бы попросил опубликовать эту ссылку - у меня есть один недопортированный проект, который как раз застрял на ExpressQuantumGrid 3.

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 19:58 11-01-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
landy
Так, вопросы обменника здесь не обсуждаем (будет в ПМ). Посмотрел XE3, красиво, но пострадал другой компонент - дерево, так что мне не подходит. В свете описанной ошибки выпуск задерживается дня на два.  
 
Я то ребята за собой чищу. Убраю бяки.

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013
все-таки это не баг, приведение  
FDTable1.Bookmark к TBookMarkStr  
то есть дин массива к AnsiString
--
скажем прямо, глупейшее дело.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 23:26 11-01-2015 | Исправлено: AlekXL, 23:26 11-01-2015
xpin2013



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

Цитата:
все-таки это не баг, приведение   FDTable1.Bookmark к TBookMarkStr   то есть дин массива к AnsiString  --  скажем прямо, глупейшее дело.  

О, Вы же меня и просили выложить. Ответьте тогда почему преобразование TBookmarkStr в TBookmark работает без проблем вообще, а в обратную сторону в 20 процедурах без глюков в одной с глюком? Не вяжется неверное приведение типов.
 
(Динамические массивы это TBytes в 2010, а в XE7 это генерики всё же. Так что тут могут многие Вас не понять.)
 
AlekXL

Цитата:
то есть дин массива к AnsiString  

сколько можно писать AnsiString не при чём, я состряпаю пример на конвертации WideString и TArray<Word>.
 
 
Кто нибудь нормальный то есть, чтобы ответить именно на этот вопрос, что ниже?:
А выдавать ошибку AV и вываливать GETMEM.inc в редактор пользователя, это у Вас называется хороший тон? Да это бред, господа. Умоляю ответьте на этот вопрос!
 
 
Что я сделал, чтобы заткнуть фонтан изобретений от генериков "XE3"?:

Код:
{$IFDEF VER280}{$DEFINE BM2}{$ENDIF}
...
{$IFDEF BM2}
type
  //жаль что нельзя делать class operator Implicit!!!!
  TBookmarkHelper = record helper for TBookmark
    public function bm: TBookmarkStr; inline;
  end;
{$ENDIF}
...
{$IFDEF BM2}
function TBookmarkHelper.bm: TBookmarkStr;
begin
  if Length(Self) > 0 then
  begin
    SetLength(Result, Length(Self));
    System.Move(Self[0], Result[1], Length(Self));
  end else
    Result := '';
end;
{$ENDIF}
...
Current := TBookmarkStr(Bookmark{$IFDEF BM2}.bm{$ENDIF});
 

Кстати я уже всё отрефакторил.
{$IFDEF BM2}.bm{$ENDIF}
- Ваша подножка обходится в 23 буквы. В Delphi 2006 TDataSet.GetFieldNames(List: TStrings); deprecated, так эта глупость прошла у них давно. Добавляем 23 буквы и хвалёная генерика заткнулась, генерика, которая нафиг не сдалась датасетам, ни одного, ни одного оператора генериков датасеты вообще не используют, ни в сторонних компонентах ни в исходниках Delphi.DB. Это просто подножка.
 
У себя в библиотеке добавлю везде комментарий //TBookmark deprecated because unsafe typecast
 
 
Добавлено:
ОБРАТИТЕ ВНИМАНИЕ
Любые Ваши доводы, что я не прав будут комментироваться следующим кодом:

Цитата:
Current := TBookmarkStr(Bookmark{$IFDEF BM2}.bm{$ENDIF});  

Опрос на тему кто ошибается закрыт.

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



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

Цитата:
Динамические массивы это TBytes в 2010, а в XE7 это генерики всё же

TBytes -- это динамический массив, в XE7 и как и в 2010

Цитата:
сколько можно писать AnsiString не при чём, я состряпаю пример на конвертации WideString и TArray<Word>
конечно, и там будут проблемы.
WideString выделяется из системной кучи, а TArray - из кучи дефолтной для Delphi приложения , то есть например , FastMM
--xpin2013, то и другое -- глупейшая, нубская ошибка.  

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 00:39 12-01-2015
xpin2013



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

Цитата:
то и другое -- глупейшая, нубская ошибка.

Смотрите выше пост в конце:
Любые Ваши доводы, что я не прав будут комментироваться следующим кодом:  Цитата: Current := TBookmarkStr(Bookmark{$IFDEF BM2}.bm{$ENDIF});    
Опрос на тему кто ошибается закрыт.
 

Цитата:
TBytes -- это динамический массив, в XE7 и как и в 2010  

Привожу копипаст для нубов утверждающих ересь.
>Delphi2010 (SysUtils.pas)  
>TBytes = array of Byte;
В Delphi2010 все функции выделения памяти, счётчики изменения размеров совместимы со строками.
>Delphi XE7
>TBytes = TArray<Byte>;
Всё то же, только сделана неумелая попытка финализации переменной типа AnsiString с помощью функции _DynArrayClear. Это нормально что в функцию _DynArrayClear попадает адрес строки? Нет. Но главное
 
TBytes = array of Byte; <> TBytes = TArray<Byte>;
 
 
Добавлено:







Цитата:
Опрос на тему кто ошибается закрыт.

Да закрыт, потому что надо найти всё таки решение как выпутаться из этой ситуации. Допустим в задаче стоит преобразование байтов считанных из файла в текст, если мы уверены, что это не картинка, однако тип букмарк пока не буду заменять для наглядности.
Вот пример:

Код:
type
  TBookmark2 = packed record
  private
    FValue: TBookmark;
  public
    class operator Implicit(AValue: TBookmark): TBookmark2;
    class operator Implicit(AValue: TBookmark2): TBookmarkStr;
  end;
 
{ TBookmark2 }
 
class operator TBookmark2.Implicit(AValue: TBookmark): TBookmark2;
begin
  Result.FValue := AValue;
end;
 
class operator TBookmark2.Implicit(AValue: TBookmark2): TBookmarkStr;
begin
  Result := TBookmarkStr(AValue.FValue);
  AValue.FValue := nil;
  UniqueString(Result);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Current : TBookMarkStr;
  V : Variant;
begin
  Current := TBookmark2(FDTable1.Bookmark);
 

Ошибок не возникает, правда - цена вопроса уже 1 буква - это цифра 2. Так я и не понимаю, можно так делать? Или есть лучшее предложение?

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 00:56 12-01-2015
AlekXL



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

Цитата:
Любые Ваши доводы, что я не прав будут комментироваться следующим кодом:  Цитата: Current := TBookmarkStr(Bookmark{$IFDEF BM2}.bm{$ENDIF});

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

Цитата:
Опрос на тему кто ошибается закрыт.  

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

Цитата:
>Delphi2010 (SysUtils.pas)  
>TBytes = array of Byte;
В Delphi2010 все функции выделения памяти, счётчики изменения размеров совместимы со строками.
>Delphi XE7
>TBytes = TArray<Byte>;  

 
а
 TArray<T> = array of T;
таким образом, TBytes =array of Byte;
то же самое, что и в 2010
 

Цитата:
Всё то же, только сделана неумелая попытка финализации переменной типа AnsiString с помощью функции _DynArrayClear. Это нормально что в функцию _DynArrayClear попадает адрес строки? Нет

не так. Это в функцию LStrClr попадает адрес дин. массива.
Ты же строке Current впердолил указатель на динамический массив: вот , в эпилоге, LStrClr и освобождает память для блока, который считает строкой, но который строкой не является.
Разница между D2010 и XE7 может быть только в порядке финализации объектов.
То есть XE7 вызывает сначала DynArrayClear для безымянного массива, который ты вытащил выражением FDTable1.Bookmark, а потом уже LStrClr .
 
В Delphi 2010 могло быть иначе: сначала финализируется, наверное,строка Current(но , поскольку счетчик не будет нулевым вследствие ссылки от безымянной переменной-массива, то освобождения памяти там не происходит).
А потом финализируется безымянная посредством DynArrayClear .
 
Разница в том, что в случае с LStrClr в FreeMem передается указатель (p-sizeof(TStrRec)),
а в DynArrayClear -- указатель (p-sizeof(DynArrayRec)).  
Они не одинаковые. Доходит?
 

Цитата:
Ошибок не возникает, правда - цена вопроса уже 1 буква - это цифра 2

ты сам то понимаешь смысл написанного, потому что я -- нет

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 09:41 12-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 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 324 325 326 327

Компьютерный форум 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