Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тип в модуле, компоненте и библиотеке


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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо