Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.09;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
15-1202135900
oldman
2008-02-04 17:38
2008.03.09
Где можно бесплатно завести большой почтовый ящик?


4-1184658001
Artog
2007-07-17 11:40
2008.03.09
SetupDiGetDeviceInterfaceDetail - ошибка 1784


2-1203002402
webpauk
2008-02-14 18:20
2008.03.09
Handle


15-1201722950
Марсер
2008-01-30 22:55
2008.03.09
Бесплатный прокси-сервер для обеспечения ноутбука Инетом


2-1202923180
Kirill
2008-02-13 20:19
2008.03.09
Cursor