Sergei I. Gorelkin писал(а):Но код, исправленный для режима objfpc, потом нормально работает обратно в Дельфи, за исключением этого злополучного "@" перед методами.
Да мне уже не важна совместимость с Delphi. Исправил. Несколько явных преобразований типа пришлось добавить, всё заработало.
Вылетает, правда на этом месте:
with cbPolicyHolder do Params[0].AsString := PString(Items.Objects[ItemIndex])^;
Но не всегда... Там, в окрестностях, просто где-то баг.
Но, видимо, без посильного вклада проблем со строками не обошлось.
Размер AnsiString ограничен только доступной памятью. Естественно, место надо выделять заранее, для этого есть ф-ция SetLength. Если в строке есть нули, ф-ции, принимающие PChar, с ней будут работать неправильно.
Ну, длина-то хранится в нулевом байте, как обычно, а не в какой-то структуре?
Точнее, получается в двух байтах... Обычно.
Какое-то там руководство писал(а):Тип cardinal используется на данный момент как тип longword. Определения типов cardinal и integer могут изменяться от одной архитектуры к другой и от одного компилятора к другому. Они обычно имеют тот же размер, что и целевая архитектура.
Т.е., обычно длина строки ограничена 64 Кб?
Если присмотреться, там еще хватает косяков. Например, в strsnew считается размер size вроде правильно, но памяти выделяется вместо этого len байт (а должно быть size). В strdel второй аргумент FreeMem - считается без учета sizeof(Cardinal) байт, в которых хранится длина.
Такое впечатление, что я пьяный это писал.
Блин. Башка у меня не работает.
Вообще, StrNew и StrDispose должны работать в этом сценарии, при условии что они взяты из модуля SysUtils.
В том-то и дело, что не работают. Я бы не стал тогда делать самостоятельно. Причём, есть ещё StrAlloc.
С ним, вместо самостоятельного выделения памяти, та же фигня: SEGFAULT.
alexrayne писал(а):можно наверное перегрузить класс TObjectList в который вы строки складываете и ввести там пару своих методов, которые будут заниматься корректным преобразованием типов и возвращать\сохранять строки в качестве параметров.
А возможно про это поподробнее? Что значит "перегрузить класс"? Разьве есть что-то вроде перегрузки функций, но только с классами?
И мне не придётся наследовать, а, затем переделывать TComboBox?
можно сделать процедуры вроде
GetStr(Src : TList; idx : integer) : AnsiString;
PutStr(Src : TList; idx : integer; value : AnsiString);
которые будет скрывать все преобразования типов.
Хм... Пожалуй... В них уже обёртку на строкой...
чтобы етого небыло надо наверно обманывать следилку сцылок, вроде такого
Мда... Героически преодолевать.
здесь счетчик сцылок увеличивается при присваивании ansivar, но неуменьшается обратно при выходе из процедуры ибо мы последним присваиванием стираем доступ к строке, но реально она ведь уже лежит в списке, посему значение счетчика корректно.
Ага, понял. Но ведь получается, что если этого не сделать, число ссылок после выхода уменьшится.
Следовательно рано или поздно оно станет нулевым.
И менеджер должен разрушить строку и освободить память.
Т.е., получается, что если этого не сделать, в данном случае, работать всё если и будет, то "святым духом"?
Только до того как кто-то решит выделить память по тому же адресу и записать туда что-то?