Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Коллизия имён функций. Общий вопрос. [D5, D7]


Skyle ©   (2008-01-22 07:59:00) 

Есть большой проект на D5. В нём используется некий самописный модуль MyVariants, в котором есть самописная же функция VarToDateTime. При попытке перебраться на D7 столкнулись с проблемой неоднозначности: в D7 варианты вынесены в отдельный юнит Variants и в нём есть такая же функция (но с иной реализацией). Да, в D5 она тоже есть, но там она была в system и не мешала.

Собственно вопрос: Как можно решить эту проблему (родная функция VarToDateTime нам не нужна)?

Генофонд править не хочется, гарантировать порядок MyVariants и Variants в uses я не могу, административные меры не подействуют.

Пока что наиболее приемлемое решение - переименовать нашу функцию. Но народ привык уже к её названию, так что ошибки не за горами.


Ega23   (2008-01-23 09:15:00) [1]


> То есть понимаешь, что это зависит от реализации.


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


> PackVarCreation: Boolean = True;


Не знал. Сейчас почитаю.


Skyle   (2008-01-23 07:30:00) [2]


> Ega23 ©   (22.01.08 10:11) [9]

Кстати, Олег, похоже это лечится. Variants.

 // If TRUE then when variants are created we will try to create the smallest
 //  type possible.  Set this to FALSE to simulate Delphi v5 behavior.

 PackVarCreation: Boolean = True;


Anatoly Podgoretsky   (2008-01-22 19:40:00) [3]

> Ega23  (22.01.2008 19:24:12)  [12]

То есть понимаешь, что это зависит от реализации.


Kolan   (2008-01-22 19:28:00) [4]

Открыть модуль/проект в BDS и рефакторингом изменить имя, он изменит все что надо.


Ega23   (2008-01-22 19:24:00) [5]


> А с чего ты взял, что А это Integer?


Я в курсе, что это varByte. Просто в пятёрке такая конструкция прокатывала. Я где-то полтора года назад как раз тему по этому вопросу поднимал, когда проет с пятёрки на семёрку переводили.


Anatoly Podgoretsky   (2008-01-22 19:14:00) [6]

> Ega23  (22.01.2008 10:11:09)  [9]

А с чего ты взял, что А это Integer?


Skyle   (2008-01-22 10:21:00) [7]


> Ega23 ©   (22.01.08 10:11) [9]

Да, есть такое, примем к сведению.

Спасибо.


Ega23   (2008-01-22 10:11:00) [8]


> Skyle ©


Обрати внимание на то, что работа с вариантами в D5 отличается от работы с вариантами в D7

пример:
const a = 5;

function Foo(v : variant):Boolean;
begin
 Result := Vartype(v)=varInteger;
end;


Так вот, если мне не изменяет память, в delphi5 вызов Foo(a) даст True, а в Delphi7 - False.


Skyle   (2008-01-22 08:52:00) [9]


> Юрий Зотов ©   (22.01.08 08:51) [7]

Да, на этом пожалуй и остановимся.

Всем спасибо, тему можно закрыть.


Юрий Зотов   (2008-01-22 08:51:00) [10]

Дефолтный параметр, конечно, не годится. И передавать мусор не есть гуд - но что ж делать, раз уж так вышло?

Я бы переименовал функцию и вживил эксперт.


Skyle   (2008-01-22 08:47:00) [11]


> Юрий Зотов ©   (22.01.08 08:39) [5]

Про эксперта думал, сейчас это непринципиально. Скорее всего именно он и будет.

А по поводу параметра не совсем понял. Предлагаете передавать его постоянно в явном виде?

Потому как изменение декларации с
function VarToDateTime(AValue : Variant) : TDateTime;
на
function VarToDateTime(AValue : Variant; ADummy : Integer = 0) : TDateTime;
ничего не даст.. А передавать мусор несколько накладно.

Но всё равно спасибо за идею.


Юрий Зотов   (2008-01-22 08:39:00) [12]

> Skyle ©   (22.01.08 08:27) [4]

Эту функцию лучше выполнить в виде эксперта и вживить прямо в IDE (см. BeforeCompile в ToolsAPI.pas). Еще вариант: добавить в Вашу функцию фиктивный (неиспользуемый) параметр, чтобы ее заголовок отличался от штатной.


Skyle   (2008-01-22 08:27:00) [13]


> Юрий Зотов ©   (22.01.08 08:24) [2]

Да, всё так и есть.

Похоже нужно будет переименовать нашу функцию и сделать некую программку, которая перед билдом будет искать вхождениее названия VarToDateTime и сигнализировать. На случай, если кто-нибудь забудет.


Skyle   (2008-01-22 08:25:00) [14]


> Сергей М. ©   (22.01.08 08:23) [1]

Хм... Это по-моему похоже на переименование нашей функции...


Юрий Зотов   (2008-01-22 08:24:00) [15]

Можно в тексте заменить VarToDateTime на MyVariants.VarToDateTime. Но ошибки все равно будут не за горами. Потому что народ будет забывать указывать модуль.


Сергей М.   (2008-01-22 08:23:00) [16]

dt := MyVariants.VarToDateTime(..);

?


Наверх

Титульная страница Поиск, карта сайта Написать письмо