![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Всем привет!
Есть разные динамические массивы. Например: Код:
var A : array of integer; B : array of TPoint; C : array of TClass; Есть желание определять вхождение в размерность функцией, т.е. Код:
function IndexInArray(Index : integer; ABC : TArray) : boolean; begin Result := (Index >= Low(ABC)) and (Index <= High(ABC)); end; Открытый статический массив (array of const) использовать нельзя, т.к. массив динамический, а для открытого динамического надо указывать конкретый тип. Может как то можно через указатель, но как потом с ним работать? Есть решение данной задачи? Кто подскажет? Последний раз редактировалось Admin, 08.10.2016 в 17:19. |
|
#2
|
||||
|
||||
|
Здесь видимо нужно передавать в функцию не массив, а его размерность
Код:
function IndexInArray(Index, lw, hg: integer) : boolean; begin Result := (Index >= lw) and (Index <= hg); end; Код:
if IndexInArray(3, Low(ABC), High(ABC)) then ... |
|
#3
|
||||
|
||||
|
Так Variant. И VarArrayHighBound (Low)
Последний раз редактировалось NumLock, 07.10.2016 в 14:26. |
|
#4
|
||||
|
||||
|
Действительно
Код:
function IndexInArray(Index : integer; ABC :array of Variant) : boolean; ![]() |
|
#5
|
||||
|
||||
|
Либо
ABC: Variant |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
||||
|
||||
|
Имелось ввиду что оно работает с разными типами, если A,B,C: array of variant, я делал так при проверке
|
|
#8
|
|||
|
|||
|
Generics вам в руки (как минимум с Delphi XE, вроде. Этот пример проверял на Delphi 10.1 Berlin):
Код:
type
TArrayHelper<T> = class
class function IndexInBounds(AIndex : Integer; A : Array Of T) : Boolean;
end;
class function TArrayHelper<T>.IndexInBounds(AIndex : Integer; A : Array Of T) : Boolean;
begin
Result := (AIndex >= Low(A)) And (AIndex <= High(A));
end;
procedure TForm1.btTestClick(Sender: TObject);
function BoolToStr(V : Boolean) : String;
begin
if V then Result := 'Yes' Else Result := 'No';
end;
var
A : Array Of String;
B : Array Of Integer;
C : Array Of TObject;
D : Array [1..20] Of Pointer;
E : Array [20..30] Of Char;
begin
edLog.Lines.Clear;
SetLength(A,10);
SetLength(B,20);
SetLength(C,30);
edLog.Lines.Add('Dynamic array A Of String, Index 15: ' + BoolToStr(TArrayHelper<String>.IndexInBounds(15,A)));
edLog.Lines.Add('Dynamic array B Of Integer, Index 15: ' + BoolToStr(TArrayHelper<Integer>.IndexInBounds(15,B)));
edLog.Lines.Add('Dynamic array C Of TObject, Index 15: ' + BoolToStr(TArrayHelper<TObject>.IndexInBounds(15,C)));
edLog.Lines.Add('Static array D Of Pointer, Index 15: ' + BoolToStr(TArrayHelper<Pointer>.IndexInBounds(15,D)));
edLog.Lines.Add('Static array E Of Char, Index 15: ' + BoolToStr(TArrayHelper<Char>.IndexInBounds(15,E)));
end;Результат: Код:
Dynamic array A Of String, Index 15: No Dynamic array B Of Integer, Index 15: Yes Dynamic array C Of TObject, Index 15: Yes Static array D Of Pointer, Index 15: Yes Static array E Of Char, Index 15: No Последний раз редактировалось lmikle, 08.10.2016 в 22:05. |
|
#9
|
|||
|
|||
|
Сейчас еще раз посмотрел. Без обходных путей, похоже, способа нет.
Можно просто декларировать массивы через TArray<T> и сделать хэлпер именно к этому generic'у. Можно не пользоваться массивами, а применить различные контейнеры на основе классов (TList, TStringList, TObjectLost, etc). тогда там можно просто сделать этот метод встроенным. |