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

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

Как в рантайме заменить один комп. на другой с таким же именем? [D6, D7]


vasilly ©   (2003-02-11 19:48:00) 

т.е. объявлено A: TType1... а некоторый момент времени сделать A.Free; после чего A:= TType2.Create()...
Такое взможно??


y-soft   (2003-02-11 22:04:00) [1]

>vasilly © (11.02.03 21:48)

Только не забудьте методы интерфейса в классах-потомках реализовать :)


vasilly   (2003-02-11 21:48:00) [2]


> 1. Объявить интерфейс и написать компоненты-потомки искомых
> с поддержкой этого интерфейса. Потом объявить переменную
> типа этого интерфейса и делать с ней все, что угодно (внутренняя
> реализация COM)

Спасибо огромное, это наверное то что нужно:)) что то я про это и не подумал..


y-soft   (2003-02-11 21:36:00) [3]

Есть еще варианты

1. Объявить интерфейс и написать компоненты-потомки искомых с поддержкой этого интерфейса. Потом объявить переменную типа этого интерфейса и делать с ней все, что угодно (внутренняя реализация COM)

type
IQuery = interface
procedure Open;
procedure Close;
.....................
end;

TInterfacedQuery = class(TQuery, IQuery)
........................................

TInterfacedADOQuery = class(TADOQuery, IQuery)
.........................................

var
InterfacedQuery : IQuery;
Query : TQuery;
ADOQuery : TADOQuery;

Query := TQuery.Create(Self);
ADOQuery := TADOQuery.Create(Self);

InterfacedQiery := Query as IQuery;
with InterfacedQuery do
begin
Open;
............
Close;
end;

InterfacedQiery := ADOQuery as IQuery;
with InterfacedQuery do
begin
Open;
............
Close;
end;
................................

2. Использовать инкапсуляцию. Написать базовый класс-оболочку, а в его потомках уже обеспечивать работу с нужными классами. Использовать переменную типа этого базового класса для динамической смены инкапсулированных классов


Vit@ly   (2003-02-11 21:11:00) [4]

Аккуратней со словом комп. На существующем сленге это то-ли компьютер, то-ли компонент, что ближе к обсуждениям на форуме. Мне кажется, что не стоит экономить на всякого рода сокращениях


Романов Р.В.   (2003-02-11 21:00:00) [5]

var
Query: TDataSet;
begin
// Работаем с БДЕ
Query := TQuery.Create( Self);
TQuery(Query).SQL.Add(...
Query.Open;
Query.Free;
// Работаем с АДО
Query = Components[i] // Components[i] - TADOQuery
TADOQuery(Query).SQL.Add(...
Query.Open;
Query.Free;
end;


vasilly   (2003-02-11 20:41:00) [6]

var
Query: TQuery;
begin
Query:= TQuery.Create( Self);
CompName:= Components[i].Name;
Components[i].Free;
Query.Name:= CompName;
end

Components[i] - TADOQuery


Романов Р.В.   (2003-02-11 20:25:00) [7]


> Точнее вопрос как изменить compiler-generated runtime type
> information

Что то ты все усложняешь. Для чего это?


vasilly   (2003-02-11 20:22:00) [8]

общий наследник у них есть, базовый клас сделать уже не возможно...
немогу же я переписать VCL.. :)


vasilly   (2003-02-11 20:20:00) [9]

Точнее вопрос как изменить compiler-generated runtime type information ? Получить то ее можно, а вот как сказать что она совсем другая уже?


Романов Р.В.   (2003-02-11 20:19:00) [10]


> Мне необходимо в одном случае пользовать один клас...а в
> другом совершенно другой

А почему бы не сделать на них отдельные указатели.


> именоо что они не наследники одного класса

По крайней мере они должны быть наследниками TObject


Anatoly Podgoretsky   (2003-02-11 20:19:00) [11]

Наследние есть всегда, как минимум от TObject, кроме того никто не мешает сделать базовый класс с абстрактными методами.


vasilly   (2003-02-11 20:13:00) [12]

такое возможно?...именоо что они не наследники одного класса


vasilly   (2003-02-11 20:12:00) [13]

Проблема в том что эти два класса имеют только несколько методов с общими названиями.... наследника общего нет. Мне необходимо в одном случае пользовать один клас...а в другом совершенно другой :) ну например, если сравнить бде и адо компоненты.. то сначала через бде, затем обращаясь к тому же (якобы компоненту) через адо


Anatoly Podgoretsky   (2003-02-11 20:10:00) [14]

Так как ты написал, типы TType1 и TType2 должны быть совместимыми, то есть один должет быть наследником.


vasilly   (2003-02-11 20:06:00) [15]

? кто еще знает :)


vasilly   (2003-02-11 19:53:00) [16]

Как?? если не секрет.. я только что попробывал у мен не вышло :(


Anatoly Podgoretsky   (2003-02-11 19:51:00) [17]

Возможно


Наверх

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