Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1108108934
kull
2005-02-11 11:02
2005.02.27
Время ожидания действий пользователя


3-1106901753
denis24
2005-01-28 11:42
2005.02.27
добавление записи в основную и связаные таблицы


1-1108073576
Bes
2005-02-11 01:12
2005.02.27
100 раз...передача данных в DLL


14-1107530105
Pat
2005-02-04 18:15
2005.02.27
Колонтитулы в Excel е


3-1107103170
Ищущий ответ
2005-01-30 19:39
2005.02.27
Как построить запрос?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский