Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];

Вниз

Коллизия имён функций. Общий вопрос.   Найти похожие ветки 

 
Skyle ©   (2008-01-22 07:59) [0]

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

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

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

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


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

dt := MyVariants.VarToDateTime(..);

?


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

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


 
Skyle ©   (2008-01-22 08:25) [3]


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

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


 
Skyle ©   (2008-01-22 08:27) [4]


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

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

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


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

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

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


 
Skyle ©   (2008-01-22 08:47) [6]


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

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

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

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

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


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

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

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


 
Skyle ©   (2008-01-22 08:52) [8]


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

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

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


 
Ega23 ©   (2008-01-22 10:11) [9]


> 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 10:21) [10]


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

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

Спасибо.


 
Anatoly Podgoretsky ©   (2008-01-22 19:14) [11]

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

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


 
Ega23 ©   (2008-01-22 19:24) [12]


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


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


 
Kolan ©   (2008-01-22 19:28) [13]

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


 
Anatoly Podgoretsky ©   (2008-01-22 19:40) [14]

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

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


 
Skyle ©   (2008-01-23 07:30) [15]


> 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;


 
Ega23 ©   (2008-01-23 09:15) [16]


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


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


> PackVarCreation: Boolean = True;


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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.038 c
3-1191567149
абв
2007-10-05 10:52
2008.02.17
IBBackUpService


15-1200583170
asdf
2008-01-17 18:19
2008.02.17
Кто как кодит?


15-1200254896
Kostafey
2008-01-13 23:08
2008.02.17
Синхронизация каталогов


1-1194786224
9899100
2007-11-11 16:03
2008.02.17
обработка строк текстового файла


2-1201095633
MishaL
2008-01-23 16:40
2008.02.17
DBGridEh1.Options ошибка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский