Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2011, 12:51   #1
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию передача имени массива в переменную процедуры

столкнулся с интересной задачей: есть 5 одномерных массивов (с разной длиной), например:
Код:
var
  tochka: array [1..2] of string = ('name1','value1');
  otrezok: array [1..4] of string = ('name1','name2',value1','value2');
  treugolnik: array [1..6] of string = ('name1','name2','name3',value1','value2','value3');
  kvadrat: array [1..8] of string = ('name1','name2','name3','name4',value1','value2','value3','value4');
  zvezda: array [1..10] of string = ('name1','name2','name3','name4','name5',value1','value2','value3','value4','value5');
На форме есть RadioGroup, с Item'ами: точка, отрезок, треугольник, квадрат, звезда - соответственно. Есть функция транслитерации - KirToLat. Обработчик RadioGroup.Onclick:
Код:
  begin
    MassivInfo(KirToLat(RadioGroup.Items[RadioGroup.ItemIndex]));      
  end;
Теперь опишем процедуру MassivInfo, в которой и возникла трудность в передающем параметре:
Код:
MassivInfo(masname: {какой тип должен быть?});
  type 
    tmas = array of string;
  var
    i,j,hm: integer;
  begin
    hm:=high(masname);
    setlength(tmas,hm);
    for i:=1 to hm do
      tmas[i]:=masname[i];
    stringgroup.rowcount:=hm;
    for i:=1 to hm/2 do
        stringgrid.cell[0,i-1]:=tmas[i];
    for i:=hm/2+1 to hm do
        stringgrid.cell[1,i-hm/2-1]:=tmas[i];
  end;
Исходники программ - http:\\www.kort.3dn.ru
KORT вне форума Ответить с цитированием
Старый 14.11.2011, 14:01   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Open array parameters allow arrays of different sizes to be passed to the same procedure or function. To define a routine with an open array parameter, use the syntax array of type (rather than array[X..Y] of type) in the parameter declaration. For example,

function Find(A: array of Char): Integer;

declares a function called Find that takes a character array of any size and returns an integer.
Код:
procedure MassivInfo(masname: array of string);
var
   j: integer;
begin
  for j:=low(masname) to high(masname) do begin
  end;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.11.2011, 14:42   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Есть ещё вариант с передачей нетипизированной переменной...

Код:
MassivInfo(var masname; len:integer);
А ещё лучше реорганизовать свои массивы...
Первое что пришло на ум - использовать TObjectList.

Код:
TFigureType = (ftPset,ftLine,ftCircle,ftRect,ftTriangle,ftStar);

TPset = class
	Value:integer;
	Name:string;
end;

TFigure = class (TObjectList)
private
	Procedure SetFigure(Index:integer;Value:TPset);
	Function GetFigure(Index:integer):TPset;
public
	FigureType: TFigureType;
	property Figures[Index:integer]:TPset read GetFigure write SetFigure; default;
end;
Конечно, немного громоздко, но если в дальнейшем будет усложняться задача - будет проще переделать. Да и объектное программирование, по моему мнению, лучше процедурного...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 14.11.2011 в 14:54.
Johnson вне форума Ответить с цитированием
Старый 14.11.2011, 15:22   #4
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
procedure MassivInfo(masname: array of string);
Вообще сначала так хотел сделать, но под рукой не оказалось компилятора...стал в блокноте сочинять...и что-то смутило...протестирую после работы...
Код:
MassivInfo(masname: array of string);
  var
    i,j,lm,hm: integer;
  begin
    lm:=low(masname);
    hm:=high(masname);
    stringgroup.rowcount:=hm;
    for i:=lm to hm/2 do
        stringgrid.cell[0,i-1]:=masname[i];
    for i:=hm/2+1 to hm do
        stringgrid.cell[1,i-hm/2-1]:=masname[i];
  end;
Цитата:
Сообщение от Johnson Посмотреть сообщение
Есть ещё вариант с передачей нетипизированной переменной...
..........
А ещё лучше реорганизовать свои массивы...
Первое что пришло на ум - использовать TObjectList.
..........
Конечно, немного громоздко, но если в дальнейшем будет усложняться задача - будет проще переделать. Да и объектное программирование, по моему мнению, лучше процедурного...
Может конечно и правильно, но дело не в объектах, просто стрельнуло что-то в голову как передать массив в процедуру или функцию, а компилятора нет под рукой....вот и накорябал что пришло в голову....
Исходники программ - http:\\www.kort.3dn.ru

Последний раз редактировалось KORT; 14.11.2011 в 15:27.
KORT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование имени процедуры в качестве параметра другой процедуры Alexey355 Помощь студентам 1 23.04.2011 13:59
как использовать переменную в имени ячейки (цикл) ? sonic007 Microsoft Office Excel 2 12.01.2011 00:36
Передача пути и имени файла Miha85193 Общие вопросы Delphi 13 07.07.2010 15:02
Обращение к листу по имени через переменную tae1980 Microsoft Office Excel 2 25.03.2010 14:33
Передача выражения функции (string) в переменную real Vohakisa Помощь студентам 3 12.05.2009 01:57