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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2010, 10:12   #1
borispnz
Новичок
Джуниор
 
Регистрация: 05.02.2010
Сообщений: 2
По умолчанию Как передать в функцию параметр разных типов

Есть 2 разных объекта с похожими методами, например, O1:Type1 и O2:Type2 (напр., SqlDataset из вкладки DbExpress и Dbf)
Код:
O1.Add, O1.Value 
O1.Add, O1.Value
Как передать в функцию параметр(-ы) с заранее неизвестным типом?Примерно так

Код:
Funct(O: Type)
 O.Add()
 Result := O1.Value

x := Funct(O1)
x := Funct(O2)
Понятно, что можно использовать overload
Код:
Funct(O: Type1); overload
Funct(O: Type2); overload
Но это не выход - слишком много разнородных объектов по типам и количеству параметров может быть. Чувствую, что в направлении pointer копать надо. Но вот как? Заранее надеюсь на помощь

PS Извините, если вопрос поднимался, но что-то после многочасового копания в Гугле так и не нашел. Вероятно, руки кривые :-)

У нас принято оформлять код специальным тэгом - при помощи кнопочки "#".
Только...
И не значком #.
И не РНР-кодом.
И не значком цитаты.
И не собственными "ручками".
Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Модератор

Исправился. Но вообще-то у меня не код. Скорее псевдокод для иллюстрации

Последний раз редактировалось borispnz; 06.02.2010 в 08:33.
borispnz вне форума Ответить с цитированием
Старый 05.02.2010, 11:14   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Если у классов объектов, с которыми тебе нужно работать, имеется общий предок, то объявляй функцию, указывая этого общего предка в качестве типа параметра. То есть, наример, TStringList имеет предком класс TStrings и какой-нибудь TListBoxStrings тоже имеет предком TStrings. И для работы с объектами обоих типов мы объявляем такую процедуру:

Код:
procedure DoSomething(AStrings : TStrings);
begin
  // blablabla
end;
и можем передавать ей в качестве параметра объект любого класса, унаследованного от TStrings.
maxionans вне форума Ответить с цитированием
Старый 05.02.2010, 11:25   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Open array parameters

Это работает медленнее, чем вызов перегруженной функции, так что злоупотреблять такими выкрутасами не стоит.
пыщь
JTG вне форума Ответить с цитированием
Старый 05.02.2010, 20:58   #4
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

использовать тип variant
пауэрлифтинг вне форума Ответить с цитированием
Старый 05.02.2010, 21:08   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
int DoSomeHere(int a, ...);
Код:
intDoSomeHere(int a, ...)
{
	va_list args;
	va_start(args, a);
	// char param1 = va_arg(args, char);
        // int param2 = va_arg(args, int);
	va_end(args);
}
BOBAH13 вне форума Ответить с цитированием
Старый 06.02.2010, 08:37   #6
borispnz
Новичок
Джуниор
 
Регистрация: 05.02.2010
Сообщений: 2
По умолчанию

Цитата:
Сообщение от maxionans Посмотреть сообщение
Если у классов объектов, с которыми тебе нужно работать, имеется общий предок, то объявляй функцию, указывая этого общего предка в качестве типа параметра....
Вообще-то интересно, надо попробовать. Спасибо (кнопочку не нашел). А что делать, если объекты принципиально разные?

Цитата:
Сообщение от пауэрлифтинг Посмотреть сообщение
использовать тип variant
Для объектов моего класса (напр.,SqlExpr) неприменим. Variant используется только для простых типов. (Совет: прежде чем подсказать, попробуй сам на живом Delphi; многие советы отпадут автоматически)

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Код:
int DoSomeHere(int a, ...);
Код:
intDoSomeHere(int a, ...)
{
	va_list args;
	va_start(args, a);
	// char param1 = va_arg(args, char);
        // int param2 = va_arg(args, int);
	va_end(args);
}
Можно подробнее? Ничего не понял

Последний раз редактировалось borispnz; 06.02.2010 в 08:43.
borispnz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать параметру записи, что в нем параметр это статический массив с данными? SkAndrew Общие вопросы Delphi 6 26.06.2009 02:02
Как передать параметр в другое(модальное) окно? kiber0net0 Общие вопросы Delphi 3 21.09.2008 13:03
Как передать параметр? Иллидан Общие вопросы Delphi 8 12.07.2008 12:57
как связать поля разных типов doncova1 Microsoft Office Access 5 11.03.2008 00:15