Форум: "Начинающим";
Текущий архив: 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.044 c