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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2014, 09:50   #1
victorixx
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 21
По умолчанию Массив как параметр по ссылке

Здрасьте всем.
В коде программы необходимо во многих случаях удалять какой-то элемент дин. массива, при этом массивы разные и типы элементов в них, соответственно, тоже - как простые типы, так и ссылочные (объекты).
Решил вот написать такой метод:
Код:
type vArray=array of variant; 
............................................
procedure ArrayDelItem(index: Integer; var v: vArray);
var i:integer;
begin
if (index<0) or (index>high(v))
   then begin
   exit;
   end; //if
if index<high(v)
   then begin
   for i:=index to high(v)-1
      do begin
      v[i]:=v[i+1];
      end;//for
   end; //if
SetLength(v, length(v)-1);
end;
Вызываю этот метод с массивом ссылочного типа:
Код:
Type DBObject=class
............
end;
............
var DBObjects:array of DBObject;
..............
ArrayDelItem(index, DBObjects);
Ругается - говорит, тип формального параметра не соответствует действительному. Как быть?

Последний раз редактировалось victorixx; 19.12.2014 в 10:21.
victorixx вне форума Ответить с цитированием
Старый 19.12.2014, 10:00   #2
victorixx
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 21
По умолчанию

Здесь было сообщение, что проблема решена - похожую тему отыскал, но там другое. Так что тем по-прежнему актуальна (для меня)

Последний раз редактировалось victorixx; 19.12.2014 в 10:20.
victorixx вне форума Ответить с цитированием
Старый 19.12.2014, 10:59   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Потому что vArray это variant а вы ему DBObject толкаете.
Человек_Борща вне форума Ответить с цитированием
Старый 19.12.2014, 11:33   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
var v: Variant;
...
TVarData(v).VType:=VarByRef;
TVarData(v).VPointer:=Label1;
...
TLabel(TVarData(v).VPointer).Caption:='123';
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.12.2014, 04:09   #5
victorixx
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 21
По умолчанию

Простите, многоуважаемый Аватар, я долго смотрел на приведенный Вами код. Как я понял, Вы хотели показать мне какую-то аналогию с моим кодом и, возможно, способ решения проблемы, но какую именно аналогию и какой именно способ - не допёр.
Может, мне стоит немного перефразировать вопрос. Передо мной стоит на данный момент задача написать такую процедуру, которая могла бы принять в качестве параметра по ссылке динамический массив с элементами любого типа - будь то объекты либо данные простых типов, и произвести с элементами этого массива какие-либо манипуляции, ну, там удалить элемент, поменять местами элементы, уменьшить/увеличить размерность массива...
Это в принципе возможно? Или придется писать отдельные процедуры для каждого типа данных?
victorixx вне форума Ответить с цитированием
Старый 29.12.2014, 07:30   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это в принципе возможно?
Это невозможно. Если бы Variant умел принимать объекты то да, однако он этого не умеет. Возможно в новых Делфи и есть ему какая то суперпупер замена, однако в классическом такое не пройдет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.12.2014, 08:36   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Убери var из функции. Компайлер ругается именно на него.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 30.12.2014, 00:57   #8
victorixx
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Убери var из функции. Компайлер ругается именно на него.
Тогда не будет параметра по ссылке. Придется делать действительно функцию и возвращаемое значение. Задача-то была несколько иной...
victorixx вне форума Ответить с цитированием
Старый 30.12.2014, 01:35   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от victorixx Посмотреть сообщение
Тогда не будет параметра по ссылке.
А что представляет собой параметр по ссылке для динамического массива? И что для него же представляет собой параметр по значению? Уверены ли вы что вы правильно это понимаете?
Я лично уверен что не понимаете.

Последний раз редактировалось northener; 30.12.2014 в 01:43.
northener вне форума Ответить с цитированием
Старый 30.12.2014, 01:47   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

P.S.
"Шляпки" - вред! Но отсутствие паскалевских шляпок в Делфи (при почти не изменившемся тексте хэлпа) много кого вводит в заблуждение.
northener вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив как параметр запроса sdsfy БД в Delphi 5 11.11.2011 04:46
массив как параметр функции makc101 Помощь студентам 2 19.04.2011 22:47
Массив как параметр функции MovsesIV Общие вопросы C/C++ 2 02.12.2010 03:07
C++ - массив как параметр функции kefir Помощь студентам 8 12.04.2010 17:48
Динамически массив как параметр ф-ии SNUPY Помощь студентам 2 11.05.2008 01:16