Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
ВнизЗдравствуйте! научите передавать особый параметр в процедуру Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.032 c