Главная страница
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.15 c
2-1202772539
Abcdef123
2008-02-12 02:28
2008.03.09
Вопрос по Exception.


15-1201834853
Slider007
2008-02-01 06:00
2008.03.09
С днем рождения ! 1 февраля 2008 пятница


4-1184532413
Eugem
2007-07-16 00:46
2008.03.09
Работа с модемом


2-1202742959
alexsashkan
2008-02-11 18:15
2008.03.09
Выборка из нескольких таблиц,с вычисляемым полем


15-1202128056
nikfel
2008-02-04 15:27
2008.03.09
Что вы думаете о программе