Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Передача в функцию массива StringGrid.Cells как параметра


Автор: ChimMAG 11.07.17, 13:36
Есть функция, во которая работает с двумерным массивом String
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function TForm1.AllGud(const MassivQu:TCellsType):Integer;

и тип массив задаётся как
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    TCellsType=array of array of String;

Я хочу передать в функцию массив StringGrid.Cells командой
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if AllGud(StringGrid1.Cells)=-1 then ...
но при этом возникает ошибка
Цитата
[Error] OneModule.pas(88): '[' expected but ')' found

Возможно дело в несовместимости типов или неправильном задании типа массива? Или стоит скопировать все элементы из .Cells в новый массив и его передавать (хотя, конечно, удобнее без лишних операций)? В целом массив .Cells будет иметь одну единственную заранее известную размерность и количество элементов. В каком месте я делаю ошибку?

Автор: ^D^ima 11.07.17, 14:43
ChimMAG
Так для StringGrid1.Cells нужно обязательно указать номер строки и столбца в квадратных скобках []. об этом говорит компилятор.

Добавлено
Цитата ChimMAG @
В целом массив .Cells будет иметь одну единственную заранее известную размерность и количество элементов.

Я думаю что проще в массив его загнать или прямо в функции напрямую к StringGrid1 обращаться.

Автор: ChimMAG 11.07.17, 17:34
1. То есть это не совсем "обычный" массив?
2. Если создаю двумерный строковой массив a и пишу
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    a:=GridString1.Cells;
то всё равно ошибка. То есть копировать только поэлементно?
3. Обходной путь я придумал, но хочется понять, почему так "не катит".

Автор: MBo 11.07.17, 17:55
> То есть это не совсем "обычный" массив?

Cells не массив, а индексированное свойство (array property), обращение к которому выглядит, как обращение к массиву (т.н. "синтаксический сахар").


>То есть копировать только поэлементно?

Да, копировать поэлементно - под это можно сделать функцию.

Вообще есть свойство Rows, которое возвращает TStrings с ячейками одной строки, но это все равно не массив, да и внутри геттера этого свойства может выполняться немалая работа.

>но хочется понять, почему так "не катит".

Язык строго типизированный, массиву определенного типа можно присвоить только массив такого же типа (нельзя даже c точно таким же объявлением). В данном случае свойство типа TCellsType отсутствует, взять нечего.

Автор: ^D^ima 11.07.17, 20:37
Цитата ChimMAG @
a:=GridString1.Cells

a:=GridString1.Cells[1,2];
Без [] не работает.

Автор: ChimMAG 12.07.17, 04:39
Ясно, спасибо.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)