Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Открытый массив для записей [D7]


Alon121 ©   (2007-05-09 15:19:00) 

Возможно ли передать открытым массивом записи во внутрь процедуры, не объявляя при этом массив при вызове?

Наверное туманно описал, приведу пример:

type
 TRec = record
   r: Integer;
   d: string;
 end;

procedure _smap(const rc: array of TRec);
begin
 for i := Low(rc) to High(rc) do ShowMessage(rc[i].d) ;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 _smap([(1, 'test-1'), (2, 'test-2'), (3, 'test-3')]);


Возможно ли осуществить вызов таким образом?


Rial   (2007-05-09 17:29:00) [1]

> [6] Alon121   (09.05.07 16:32)
> Да, это я знаю, но хотелось сделать именно вызов без промежуточной
> переменной (RecArray).

Если ты ее не объявяешь, это не значит, что
она на самом деле не создается.

Лучше сделай все явно сам.


{RASkov}   (2007-05-09 16:38:00) [2]

> Возможно ли передать открытым массивом записи во внутрь
> процедуры, не объявляя при этом массив при вызове?

> [6] Alon121   (09.05.07 16:32)

Нет, не получится... объявлять придется, либо см[5], или:
type
TRec = record
  r: Integer;
  d: string;
end;
TArrRec: array of TRec;

procedure _smap(const rc: TArrRec);
begin
for i := Low(rc) to High(rc) do ShowMessage(rc[i].d);
end;

procedure TMainForm.FormCreate(Sender: TObject);
var ArR: TArrRec;
begin
 SetLength(ArR, 3);
 ArR[0].r:=...
.....
 _smap(ArR);
end;


Но может и это устроит:
procedure _smap(rc: array of const);
var i: Integer;
begin
for i := Low(rc) to High(rc) do
 case rc[i].VType of
  vtAnsiString, vtString, vtChar: ShowMessage(rc[i].VPChar);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
_smap([1, 'test-1', 2, 'test-2', 3, 'test-3']);
end;


Alon121   (2007-05-09 16:32:00) [3]


> const  RecArray: array [1..3] of TRec =    ((r: 1; d: 'test-
> 1'), (r: 2; d: 'test-2'), (r: 3; d: 'test-3'));begin  ..
> .  _smap(RecArray);  ...end


Да, это я знаю, но хотелось сделать именно вызов без промежуточной переменной (RecArray).


begin...end   (2007-05-09 16:26:00) [4]

const
 RecArray: array [1..3] of TRec =
   ((r: 1; d: 'test-1'), (r: 2; d: 'test-2'), (r: 3; d: 'test-3'));
begin
 ...
 _smap(RecArray);
 ...
end


Alon121   (2007-05-09 16:09:00) [5]

Хммм... ну получается, что нельзя так сделать?


> А сложно сделать procedure MyProc(Const stArray : Array
> of String; Const nArray : Array of Integer):?


Просто сам record на самом деле побольше и если я буду так делать, я просто запутаюсь.


X9   (2007-05-09 15:32:00) [6]

> [2] Rial ©   (09.05.07 15:29)

Нужно объявить Array of string и Array of Integer как типы.


Rial   (2007-05-09 15:29:00) [7]

А сложно сделать
procedure MyProc(Const stArray : Array of String; Const nArray : Array of Integer):
?


X9   (2007-05-09 15:27:00) [8]

А попробовать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо