Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.03.2012, 23:06
Kepler Kepler вне форума
Прохожий
 
Регистрация: 30.03.2012
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 131
По умолчанию Поле record через параметр процедуры

Здравствуйте. Задался глупым вопросом: каким образом можно передать поле записи через параметр процедуры/функции?

На примере:
Код:
type
  TM = record
    A:integer;
    B:integer;
    C:integer;
  end;
var
  Form1: TForm1;
  M:TM;

implementation

procedure GAVGAV( ??? );
begin
  M.X:=5; 
end;
...
Под X должно быть поле записи, которое передается через параметр процедуры GAVGAV.
Долго думал, но так и не придумал. Подскажите пожалуйста.
Ответить с цитированием
  #2  
Старый 30.03.2012, 23:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
procedure GAVGAV(var M:TM);
begin
  M.X:=5; 
end;

...

  GAVGAV(M);
хотя какой в этом смысл, когда М - глобальная переменная.
Никакого поля Х, там быть не может.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 30.03.2012, 23:28
Kepler Kepler вне форума
Прохожий
 
Регистрация: 30.03.2012
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 131
По умолчанию

Нет, дело в том, что мне нужно чтобы в сторонней процедуре я мог набрать нечто вроде
Код:
   GAVGAV(A,5);  // При этом к M.A добавлялось, к примеру, 5 
   GAVGAV(B,2);  // При этом к M.B добавлялось 2
Мне не понятно как можно научить понимать процедуру что производить действия надо именно с полем A, B или С. При этом мне надо, чтобы A,B или С передавалось через какую-то переменную, чтобы в GAVGAV можно было написать что-то вроде
Код:
procedure(X:??;Num:integer);
begin
   M.X := M.X+ Num;
end;
Ответить с цитированием
  #4  
Старый 30.03.2012, 23:39
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Немного не так:
Код:
procedure(var X : Integer; Num : Integer);
begin
   X := X + Num;
end;
...
   GAVGAV(M.A, 5);  // При этом к M.A добавлялось, к примеру, 5 
   GAVGAV(M.B, 2);  // При этом к M.B добавлялось 2
или
Код:
function(X : Integer; Num : Integer) : Integer;
begin
   Result := X + Num;
end;
...
   M.A := GAVGAV(M.A, 5);  // При этом к M.A добавлялось, к примеру, 5 
   M.B := GAVGAV(M.B, 2);  // При этом к M.B добавлялось 2
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 30.03.2012 в 23:41.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Kepler (31.03.2012)
  #5  
Старый 31.03.2012, 00:05
Kepler Kepler вне форума
Прохожий
 
Регистрация: 30.03.2012
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 131
По умолчанию

Понял, спасибо. Тем не менее через переменную X поле передать нельзя? Дело просто в том, что в основной программе у меня массив из записей, в каждой из которой несколько полей. Я не могу войти в поле записи, как это предлагаете вы, когда у меня массив, а не один record.
Ответить с цитированием
  #6  
Старый 31.03.2012, 00:08
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Kepler
Я не могу войти в поле записи, как это предлагаете вы, когда у меня массив, а не один record.
Конечно можешь.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 31.03.2012, 00:11
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
var
m:array[0..9] of TM;
...
procedure(var X : Integer; Num : Integer);
begin
   X := X + Num;
end;
...
GAVGAV(m[1].A, 5); 
разве нет?
Ответить с цитированием
  #8  
Старый 31.03.2012, 00:31
Kepler Kepler вне форума
Прохожий
 
Регистрация: 30.03.2012
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 131
По умолчанию

Это разумеется. Не могу зайти по другой причине.
У меня есть процедура, которая сравнивает и сортирует N элементов с k-й позиции в массиве. Но теперь у меня массив из записей с кучей полей. Процедура должна проводить операции сравнения и сортировки для указанного поля, перемещая тем самым элементы массива.

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

Проще говоря было:
Код:
if B[locB] < C[locC] then ...
Надо:
Код:
if B[locB].X < C[locC].X then ...
Ответить с цитированием
  #9  
Старый 31.03.2012, 00:41
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Это не жуткое усложнение, это непродуманный алгоритм. Отсюда и все проблемы. Лучше пока не поздно, просчитать все варианты обращения к массиву и изменить сейчас, чем потом бороться с ветряными мельницами.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 02.04.2012, 11:32
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Как вариант - если все поля одинакового типа и расположены подряд, то можно извернуться так

Код:
type
  TM = record
    case boolean of
      true:( 
          A:integer;
          B:integer;
          C:integer;
          );
     false:(X:array[0..2] of integer;)
  end;
прочитайте про case внутри record
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:01.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025