![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тип в модуле, компоненте и библиотеке
olookin © (2004-12-04 22:58:00)Давно хотел узнать, можно ли реализовать тип и там, и сям. Так, есть один и тот же (по смыслу) тип в самом модуле проекта, в компоненте, включенном в проект, и в библиотеке, подключенной к проекту. Разумеется, все они разные с точки зрения компилятора. Поэтому в некотором стороннем модуле и возникают трения между этими типами - несовместимость и прочее. Мой вопрос таков - можно ли реализовать все эти типы так, чтобы не было и намека на несовместимость? А то надоело их разводить по разным лавкам...
olookin (2004-12-05 01:02:00) [1][10] DrPass © (05.12.04 00:40)
Ого-го, ничего себе! Работает конечно, но догадаться сложно было бы...
DrPass (2004-12-05 00:40:00) [2]Ага, так речь шла о перекрытии виртуального метода. Тогда раз метод базового класса определен, насколько я понял, в модуле MacroMath, указывай тип оттуда:
procedure GetValue(Parameter: string; var ValTyp: integer; var AsString: string; var AsNum: double; var As1DArray: MacroMath.TDoubleArray; var As2DArray: TExDoubleArray; var AsColor: TColor; var AsBoolean: boolean); override
И точно так же в implementation
olookin (2004-12-05 00:17:00) [3]unit lookin23;
interface
uses MacroMath, EqapTypes (или EqapTypes, MacroMath);
//в обоих этих модулях есть тип TDoubleArray
type TMainMacro = class(TMacroModule)
public
procedure GetValue(Parameter: string; var ValTyp: integer; var AsString: string; var AsNum: double; var As1DArray: TDoubleArray;var As2DArray: TExDoubleArray; var AsColor: TColor; var AsBoolean: boolean); override;
//эта процедура из компонента в модуле MacroMath
end;
.......
implementation
......
procedure TMainMacro.CreateCollection(Parameter: TStringArray);
var mi: TMenuItem;
begin
with EqapFileWnd[Length(EqapFileWnd)-1] do begin
WindowType:=wtCol ; //wtCol - элемент типа TWindowType из EqapTypes
end;
end;
тут вот ругаемся на несовместимость...
procedure TMainMacro.GetValue(Parameter: string; var ValTyp: integer; var AsString: string; var AsNum: double; var As1DArray: TDoubleArray;
var As2DArray: TExDoubleArray; var AsColor: TColor;
var AsBoolean: boolean);
begin
...... something is taking place here
end;
Замена местоположения EqapTypes не играет никакой роли...
PS Надеюсь этот пример понятен... Надеюсь, так как даже мне он несколько необычен....
olookin (2004-12-05 00:10:00) [4]Сейчас все таки постараюсь привести пример....
olookin (2004-12-05 00:09:00) [5][6] jack128 © (05.12.04 00:08)
Жаль, но не то я имел в виду...
jack128 (2004-12-05 00:08:00) [6]дошло что ты имеешь в виду. Самое простое сделать две перегруженные функции.
TWindowType = array of Double;
TDoubleArray = array of Double;
procedure SameFunc(const Arr: TDoubleArray); overload;
begin
... // твой код
end;
procedure SameFunc(const Arr: TWindowType); overload;
type
PDoubleArray = ^TDoubleArray;
begin
SameFunc(PDoubleArray(@Arr)^);
end;
olookin (2004-12-05 00:03:00) [7][3] DrPass © (04.12.04 23:59)
Не исключено, что я просто плохо описываю происходящее...
olookin (2004-12-05 00:01:00) [8][2] jack128 © (04.12.04 23:59)
Несовместимость...
jack128 (2004-12-04 23:59:00) [9]там где нужен этот тип ишешь EqapTypes.TWindowType
DrPass (2004-12-04 23:59:00) [10]
> Разумеется, если EqapTypes воткнуть в секцию interface,
> то ругается на несовместимость
Все равно, непонятно - на какую еще несовместимость он может ругаться? Ты хоть в каждом модуле переопределяй все типы, компилятор к этому совершенно лоялен. Он будет искать тип сначала в текущем модуле, потом в модулях из списка uses начиная с конца. Ты можешь так же явно подсказать, какой ты хочешь использовать - ModuleName.TypeName
olookin (2004-12-04 23:23:00) [11]Попытаюсь сформулировать пример...
Есть модуль из компонента - MacroMath. В нем есть тип TDoubleArray = array of double. Есть модуль в программе - EqapTypes - в нем также есть TDoubleArray, а кроме того, некий тип TWindowType.
Есть третий модуль, который использует как MacroMath, так и EqapTypes.
Суть мне все равно, откуда он берет TDoubleArray. Важно, чтобы он понимал TWindowType.
Разумеется, если EqapTypes воткнуть в секцию interface, то ругается на несовместимость. Аналогично, если в секцию implementation. Но ведь как то надо получить доступ к типу TWindowType.