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

Вниз

Порядок объявления библиотек   Найти похожие ветки 

 
saNat ©   (2008-02-11 08:59) [0]

Доброго времени суток, Мастера (:

Возник вот такой вот вопрос: имеет ли значение порядок объявления библиотек в разделе Uses? Често говоря, до сего дня считал, что не имеет.

Однако, сегодня столкнулся с ситуацией, когда код:

Procedure TProjectData.CopyImage(Value:String);
Var
 Expression:TExprClass;
 ImageExpression:TBitMap;
 MyFormat:Word;
 AData:THandle;
 APalette:HPalette;
Begin
Try
 ImageExpression:=TBitMap.Create;
 ImageExpression.Height:=20;
 ImageExpression.Width:=50;
 AData:=ImageExpression.Handle;
 APalette:=ImageExpression.Palette;
 Expression:=BuildExpr(Value);
 Expression.Font.Size:=12;
 Expression.Canvas:=ImageExpression.Canvas;
 Expression.Draw(0,0,ehLeft,evTop);
 ImageExpression.SaveToClipboardFormat(MyFormat,AData,APalette);
 Clipboard.SetAsHandle(MyFormat,AData);
Finally
 Expression.Free;
 ImageExpression.Free;
End;
End;

компилируется с ошибкой "[Error] ProjectDataUnit.pas(1431): Object or class type required" в выделенной строке. При этом модули обявлены в следующем порядке:

Uses
CalculateChargeUnit,ClipBrd,ComObj,ExprMake,ExprDraw,Graphics,SysUtils,Variants,Windows;

Если модуль Graphics переместить в конец

Uses
CalculateChargeUnit,ClipBrd,ComObj,ExprMake,ExprDraw,SysUtils,Variants,Windows,< B>Graphics;

... то компиляция происходит без ошибок. Просвятите меня, пожалуйста.

С уважением, ЕВА.


 
Григорьев Антон ©   (2008-02-11 09:13) [1]

Есть тип TBitmap в модуле Windows (это аналог системного типа BITMAP) и есть класс TBitmap в модуле Graphics. Когда в разных модулях встречаются одинаковые идентификаторы, то тот, который объявлен в модуле, упомянутом в uses позже, перекрывает тот, который объявлен в модуле, упомянутом раньше. У вас в первом случае Windows идёт позже, чем Graphics, поэтому TBitmap означает Windows.TBitmap, а не Graphics.TBitmap, а в Windows этот тип - запись, а не класс, поэтому конструктора Create у него нет.

Ещё порядок упоминания модулей влияет на порядок выполнения их секций инициализации и финализации, но так как в этих модулях могут быть свои uses, то отследить этот порядок в общем случае слишком сложно (особенно если есть кольцевые ссылки), поэтому считается, что программист не должен полагаться на какой-то определённый порядок вызова секций инициализации. Единственное исключение - инициализация модуля, упомянутого первым в dpr-файле, будет гарантировано выполнена первой после инициализаций System и SysInit, если этот модуль сам не содержит uses.


 
Anatoly Podgoretsky ©   (2008-02-11 09:15) [2]

При правильном написание порядок роли не имеет, да и легко представить ситуацию, когда никакой порядок не поможет, потому что для одних данных в модуле нужен один порядок, а для других другой.

Выход писать правильно, чтобы не зависеть от порядка, для этого использовать канонические имена.


 
saNat ©   (2008-02-11 09:58) [3]

to Григорьев Антон ©   (11.02.08 09:13) [1]
1. Спасибо за разъяснения
2. Спасибо за столь скорую реакцию на соседнем ресурсе по поводу использования Ваших модулей рисования формул.

Anatoly Podgoretsky ©   (11.02.08 09:15) [2]
Не могли бы вы укащать как писать правильно? Или почитать на данную тему, т.к. столкнулься с моментом впервые.

С уважением, ЕВА.


 
Григорьев Антон ©   (2008-02-11 10:10) [4]

Канонические имена - это, видимо, имелись ввиду полностью квалифицированные, т.е. когда перед идентификатором ставится имя модуля, откуда он берётся, например Windows.TBitmap или Graphics.TBitmap. В этом случае никакой путаницы не возникнет. Но это гарантирует от ошибок только в том случае, если так писать все без исключения идентификаторы. Мало кто способен на такой подвиг, за исключением программистов на Обероне, в котором вообще не допускается использование не полностью квалифицированных имён.


 
Anatoly Podgoretsky ©   (2008-02-11 10:23) [5]


> Григорьев Антон ©   (11.02.08 10:10) [4]

Да именно они, написаные по канонам - module.oblect.suboject....
Оберон кто писал, тото же, исправил свои ошибки.


 
saNat ©   (2008-02-11 10:32) [6]

Гм... Т.е. в данном случае нужно использовать именно каноническое имя? В том плане указать последовательность модулей и оставить "как есть" будет "большим грехом"?


 
Palladin ©   (2008-02-11 11:12) [7]

грехом это не будет, но ты должен будешь сам контролировать какое же реально объявление ты используешь... ошибок будет... немеряно :)
лучше вообще таких ситуаций не допускать...



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

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

Наверх




Память: 0.46 MB
Время: 0.047 c
15-1201808527
DrPass
2008-01-31 22:42
2008.03.09
Интересная статистика


15-1202116512
Dmitry S
2008-02-04 12:15
2008.03.09
Самый "дешевый" способ загрузить картинку PNG?


15-1201944617
Андрей
2008-02-02 12:30
2008.03.09
Браузер файлов на диске


8-1175899050
777-56@mail.ru
2007-04-07 02:37
2008.03.09
Увеличение изображения на Canvas


10-1132058772
ForgotPass
2005-11-15 15:46
2008.03.09
COM-объект FlashGet ("JetCar.Netscape")





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский