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

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

Здравствуйте! научите передавать особый параметр в процедуру [D7]


Layner ©   (2005-02-13 15:12:00) 

Нужно передать массив данных такого формата в процедуру:

par1: integer;
par2: string;
par3: double;
par4: double;
par5: TDateTime;

Т.е. данные примерно такие:

(1, 'stroka1', 45.56, 7888.01, 66554);
(2, 'stroka2', 45.57, 7888.01, 66554);
...
(201, 'stroka201', 45.58, 7888.01, 66554);


Как можно все это передать в процедуру (для дальнейшей обработки)?

У меня есть вариант, передавать все как TStingList, или можно как то по другому? Например передавать массив String?


Anatoly Podgoretsky   (2005-02-14 13:09:00) [1]

Proc(Param: TPar5ar);


Anatoly Podgoretsky   (2005-02-14 13:08:00) [2]

Для массива, надо и передавать массив нужного типа.

type
  TPar5rec = record
    par1: integer;
    par2: string;
    par3: double;
    par4: double;
    par5: TDateTime;
  end;

  TPar5ar : array ofTPar5rec;

  Proc(TPar5ar);


Чапаев   (2005-02-14 12:38:00) [3]

Не понял... А почему array of const никто не вспоминает?
procedure My(Par:array of const);
begin
end;
...
My([2, 'stroka2', 45.57, 7888.01, 66554]);

Хотя в данном случае это -- из пушки по воробьям. ;-)


Layner   (2005-02-14 08:22:00) [4]

Анатолий, приветствую!
Проблема вся в том, что надо передать сразу строк 200..300... т.е. массив, и с Record реализация просто супер!
:)


Anatoly Podgoretsky   (2005-02-13 23:18:00) [5]

Смотрел, смотрел, ну не вижу ничего особого в параметрах. А вот почему не хочешь передавать прямо, как указано в вопросе совсем непонятно.

Proc(2, 'stroka2', 45.57, 7888.01, 66554);


Layner   (2005-02-13 22:25:00) [6]

begin...end ©   (13.02.05 16:31)
Спасибо огромнейшее!!! Уже перегнал все со стринг массива на Record, все просто супер! Record наидубнейшая штука, особенно когда умеешь пользоваться :) begin...end, VMcL, желаю вам удачи!!!


VMcL   (2005-02-13 17:08:00) [7]

>> begin...end ©   (13.02.05 16:31) [9]

В данном случае лучше:
procedure MyProcedure( constArr: TMyRecordArray);

ИМХО.


begin...end   (2005-02-13 16:31:00) [8]

> Layner ©   (13.02.05 16:23) [8]

type
 TMyRecord = record
   par1: Integer;
   par2: string;
   par3: Double;
   par4: Double;
   par5: TDateTime
 end;
 TMyRecordArray = array of TMyRecord;

procedure MyProcedure(var Arr: TMyRecordArray);
begin
 ShowMessage(Arr[Low(Arr)].par2)
end;

var
 A: TMyRecordArray;
begin
 SetLength(A, 1);
 A[0].par2 := 'Hello'
 MyProcedure(A)
end.


Если массив будет постоянной длины, то динамический здесь не нужен - объявляйте статический.


Layner   (2005-02-13 16:23:00) [9]

Спасибо за ответы, пока время шло, накатал передавать с помощью TStringList, разделитель выставляю обычный символ - "|".
В процедуре разбираю посточно. Хотел воспользоваться примерно так:


procedure  Tmod.pr_razbor(data: TStringList);
var
i: integer;
Tmp: TStringList;
begin
 Tmp := TStringList.Create;
 for i:=0 to data.Count-1 do
 begin
   tmp.Delimiter:='|';
   tmp.DelimitedText:=data.Strings[i];
   showmessage(data.Strings[i]+'====='+tmp.Strings[0]+'........'+tmp.Strings[1]+'........'+tmp.Strings[2]);
 end;
 Tmp.Free;
end;

так видимо, если в data.Strings[i] слова с пробелами, то "режет" по пробелам, а не по разделителю "|", придется на Copy, DELETE, Paste дописать...

olookin, Alexander Panov
Можно ли чуть поподробнее про Record, я сам создать (простую) запись могу, а как ее описать в данном моём случае?
Примерно так:


type Rec = record
  par1: array of Integer;
  par2: array of String;
  par3: array of double;
  par4: array of double;
  par5: array of TDateTime;
end

?


begin...end   (2005-02-13 16:16:00) [10]

> olookin ©   (13.02.05 16:08) [6]

Угу :-)


olookin   (2005-02-13 16:08:00) [11]

[5] begin...end ©   (13.02.05 16:04)
>>Кстати, var можно убрать.

Тут Вы сильно ошибаетесь...


begin...end   (2005-02-13 16:04:00) [12]

> olookin ©   (13.02.05 16:02) [4]

Да, в этомслучае - не обойтись. Кстати, var можно убрать.


olookin   (2005-02-13 16:02:00) [13]

[3] begin...end ©   (13.02.05 15:52)
>>Добавлю, что в случае одномерных массивов объявлять тип TMyStrings >>необязательно.

Например в этом случае. как я понимаю, без этого объявления не обойтись:

procedure Do(var s: array of string);
begin
SetLength(s,Length(s)+1); //Incompatible types
end;

type TMyString = array of string;

procedure Do(var s: TMyString);
begin
SetLength(s,Length(s)+1); //Compatible types
end;


begin...end   (2005-02-13 15:52:00) [14]

> olookin ©   (13.02.05 15:15) [1]

> А если массивом строк, то надо завести свой тип
> TMyStrings = array of string, и передавать уже его в
> качестве паратметра в процедуру.

Добавлю, что в случае одномерных массивов объявлять тип TMyStrings необязательно.


Alexander Panov   (2005-02-13 15:20:00) [15]

Используй либо VarArray, либо Record.


olookin   (2005-02-13 15:15:00) [16]

Мне кажется, что все эти параметры можно организовать в виде record и передавать уже record как параметр в процедуру. А если массивом строк, то надо завести свой тип TMyStrings = array of string, и передавать уже его в качестве паратметра в процедуру.


Наверх

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