Мне не удается встроить такие конструкции, как
var FileName: array[0..2047] of Char;
Это работает:
procedure TForm1.AcceptFiles(var Msg: TWMDropFiles);
var FileName: array[0..2047] of Char;
begin
DragQueryFile(msg.Drop, $FFFFFFFF, FileName, 2048);
...
end;
Но это не удается, если FileName
встроен:
procedure TForm1.AcceptFiles(var Msg: TWMDropFiles);
begin
var FileName: array[0..2047] of Char; // E2029 Expression expected but array found
DragQueryFile(msg.Drop, $FFFFFFFF, FileName, 2048);
...
end;
Мне удалось встроить 12 КБ переменных любого типа, но похоже, что ничего из приведенной ниже формы не может быть встроено:
begin
var Name: array[X..Y] of Z;
end;
Посоветуйте, пожалуйста, как это делается в Rio 10.3.3.
Предыдущие встроенные вар-тикеты уже разрешены: 22113 , quality.embarcadero.com/browse/RSP-21680
проблема исчезнет, если вы заранее определите тип массива? type TFileNameArr = array[0..2048] of Char; var FileName: TFileNameArr;
Кстати, вы передаете 2048 в API, но массив имеет длину 2049.
@RemyLebeau это работает. процедура Proc1; константа MAX_FILENAME_LEN = 2048; typeTFileNameArray = массив [0..MAX_FILENAME_LEN - 1] из Char; begin var FileName: TFileNameArray; DragQueryFile(Msg.Drop, $FFFFFFFF, FileName, MAX_FILENAME_LEN); Пожалуйста, не стесняйтесь отправлять в качестве ответа, чтобы я мог одобрить.
Возможно, объявление встроенных переменных массивов следует тем же правилам, что и процедурных параметров: когда вы объявляете подпрограммы, которые принимают параметры массива, вы не можете включать спецификаторы типа индекса в объявления параметров.
Как справедливо предположил @Remy Lebeau, решение состоит в том, чтобы сначала объявить тип
procedure TForm1.AcceptFiles(var Msg: TWMDropFiles);
type
TFileNameArray = array[0..2047] of Char;
begin
var FileName: TFileNameArray;
DragQueryFile(msg.Drop, $FFFFFFFF, FileName, 2048);
...
end;
Билет QC открыт по адресу: quality.embarcadero.com/browse/RSP-31970