![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Коллизия имён функций. Общий вопрос. [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(..);
?