Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

Здравствуйте! научите передавать особый параметр в процедуру   Найти похожие ветки 

 
Layner ©   (2005-02-13 15:12) [0]

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

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?


 
olookin ©   (2005-02-13 15:15) [1]

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


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

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


 
begin...end ©   (2005-02-13 15:52) [3]

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

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

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


 
olookin ©   (2005-02-13 16:02) [4]

[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 16:04) [5]

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

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


 
olookin ©   (2005-02-13 16:08) [6]

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

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


 
begin...end ©   (2005-02-13 16:16) [7]

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

Угу :-)


 
Layner ©   (2005-02-13 16:23) [8]

Спасибо за ответы, пока время шло, накатал передавать с помощью 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:31) [9]

> 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.


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


 
VMcL ©   (2005-02-13 17:08) [10]

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

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

ИМХО.


 
Layner ©   (2005-02-13 22:25) [11]

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


 
Anatoly Podgoretsky ©   (2005-02-13 23:18) [12]

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

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


 
Layner ©   (2005-02-14 08:22) [13]

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


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

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

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


 
Anatoly Podgoretsky ©   (2005-02-14 13:08) [15]

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

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

  TPar5ar : array of TPar5rec;

  Proc(TPar5ar);


 
Anatoly Podgoretsky ©   (2005-02-14 13:09) [16]

Proc(Param: TPar5ar);



Страницы: 1 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
1-1108275949
Вовик
2005-02-13 09:25
2005.02.27
Какие dll использует моя прога. Как их запускать из моей папки?


14-1107851666
Vlad Oshin
2005-02-08 11:34
2005.02.27
Поставлю памятник автору Radminов! и Вопрос


14-1107830961
Думкин
2005-02-08 05:49
2005.02.27
С Днем рождения! 8 февраля


14-1107881734
AG.Smit
2005-02-08 19:55
2005.02.27
Кто скажет что значит "ИМХО"?


1-1107949628
kivadim
2005-02-09 14:47
2005.02.27
св-во ReadOnly у компонента ComboBox