![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ищется элегантное решение. [D7]
Василий Василич Пупкинд © (2008-05-15 17:53:00)Имеется иерархия форм отображения данных бд.
Весь функционал и окончательный внешний вид реализован в предпоследних элементах иерархии (форма для конкретных данных).
В последних элементах иерархии (наследниках предпоследних) добавлены компоненты доступа к бд и переопределены некоторые методы зависимые от движка.
Как сделать доступным в методах предпоследнего элемента датасеты последнего элемента иерархии?
Юрий Зотов (2008-05-15 23:50:00) [1]> по поводу профана в ооп - юмор мимо кассы.
Ну что ж, Вам виднее. Хотя вызывается почему-то все же метод потомка.
Полиморфизьм, панимашь... тудыть его в качель... мимо кассы...
;o)
Василий Василич Пупкинд (2008-05-15 23:46:00) [2]А если его там и нет вовсе? Например, потомок TDataSet, который и не с БД работает вовсе, а с XML-файлом, или с IStorage каким-нибудь? И никакие SQL ему и на фиг не нужны?
<Цитата>
и в чем проблема? ехлибовский метод получения sql просто ничего не вернет. А метод ИШ будет перебирать все известные на момент написания грида имена свойств в которых могут находится sql выражения
Василий Василич Пупкинд (2008-05-15 23:44:00) [3]Но вообще-то, Вам сказали правильно - надо делать наоборот. Предки (или модули данных) должны определять данные, а потомки - визуальную часть.
кому надо наоборот? мне не надо. мне надо так, как задумано.
по поводу профана в ооп - юмор мимо кассы.
в чем действительно была причина возникшего недоразумения? объясняю.
был специализированных модуль данных (под конкретную библиотеку)
на основе его был написан универсальный модуль-предок всех модулей данных.
в исходном модуле была куча процедур с шаблоном вида:
with TAdoDataSet.Create(self) do
try
...
finally
Free;
end;
в универсальном предке они были изменены на нечто подобное :
if createdatasetcomponent(ASQLtext, DSComp) then
try
finally
Free;
end;
то есть после копипаста и стирания with по невнимательности в одном месте остался висячий Free, который грохал модуль данных.
Вот из за этой ерунды мне и причудилось странное.
Юрий Зотов (2008-05-15 23:39:00) [4]> Василий Василич Пупкинд (15.05.08 23:20) [37]
А если его там и нет вовсе? Например, потомок TDataSet, который и не с БД работает вовсе, а с XML-файлом, или с IStorage каким-нибудь? И никакие SQL ему и на фиг не нужны?
Василий Василич Пупкинд (2008-05-15 23:20:00) [5]Разумеется.
Игорь Шевченко (2008-05-15 23:15:00) [6]Василий Василич Пупкинд (15.05.08 23:09) [35]
Ты из произвольного потомка DataSet желаешь достать SQL ?
Василий Василич Пупкинд (2008-05-15 23:09:00) [7]Тоже мне, бином Ньютона:
function GetSQLText (DataSet: TdataSet): string;
var
SQL: TStrings;
begin
Result := '';
if IsPublishedProp(DataSet, 'SQL') then
begin
SQL := GetObjectProp(DataSet, 'SQL') as TStrings;
if Assigned(SQL) then
Result := SQL.Text;
end;
end;
Открыл чайнику америку ртти.
А откуда знаем-то что текст sql лежит в свойстве с именем SQL?
Palladin (2008-05-15 21:54:00) [8]
> Никто же Delphi не ругает (а мартышка ругала очки).
а :)... в этом плане да... не похоже... но подход... ему говорят одень, а он - "так не надевается, неыозможно" и продолжает нюхать...
Юрий Зотов (2008-05-15 21:40:00) [9]> Palladin © (15.05.08 21:22) [32]
Не... тут другое. Никто же Delphi не ругает (а мартышка ругала очки). Тут довольно сильное завышение оценки собственного понимания ООП и знания Delphi.
В частности, вот это меня просто убило:
> В модуле предпоследнего класса заводим паблик переменную
> типа предпоследнего класса. при создании экземпляра наследника
> инициализируем её экземпляром наследника.
И не понимает человек элементарнейше вещи - что это будет просто тот же самый Self. Хотя слов произносит много, и все они такие умные, и спорит еще...
Ппц. Полный.
PS
Василий Василич, уж извините великодушно за обидные, возможно, слова, но ведь правда это. Да ведь и сами Вы виноваты, если уж честно-то.
Palladin (2008-05-15 21:22:00) [10]Вот, Юр, наглядный пример мартышки и очков... все знаем, но чет сделать не можем...
Игорь Шевченко (2008-05-15 21:11:00) [11]
> Берем грид + датасорс.
> датасорс смотрит либо на TADODataset либо на TQuery.
> Задача: Внутри методов грида узнать текст sql результаты
> которого в гриде.
Тоже мне, бином Ньютона:
function GetSQLText (DataSet: TdataSet): string;
var
SQL: TStrings;
begin
Result := '';
if IsPublishedProp(DataSet, 'SQL') then
begin
SQL := GetObjectProp(DataSet, 'SQL') as TStrings;
if Assigned(SQL) then
Result := SQL.Text;
end;
end;
Юрий Зотов (2008-05-15 20:54:00) [12]> Василий Василич Пупкинд
Но вообще-то, Вам сказали правильно - надо делать наоборот. Предки (или модули данных) должны определять данные, а потомки - визуальную часть.
Юрий Зотов (2008-05-15 20:44:00) [13]> Василий Василич Пупкинд (15.05.08 20:25) [27]
> как установить значение поля класса предка при том, что его экземпляра
> не существует.
Написать виртуальный сеттер и перекрыть его в потомке.
Юрий Зотов (2008-05-15 20:39:00) [14]> Василий Василич Пупкинд (15.05.08 20:16) [25]
Для таких детских игрушек даже и Delphi не нужна. Ловите готовый код, вот прямо здесь его щас и напишу.
type
TАncestorForm = class(TForm) // Можно поместить в репозиторий
Grid: TDBGrid;
Button: TButton;
procedure ButtonClick(Sender: TObject);
// Добавить обработчик OnClose с Action := caFree
protected
function GetDataSource: TDataSource; virtual; abstract;
end;
procedure TАncestorForm.ButtonClick(Sender: TObject);
begin
Grid.DataSource := GetDataSource;
Grid.DataSet.Open;
end;
===============
type
TDescendantForm = class(TАncestorForm)
DataSet: TQuery; // Или какой Вам нужен. Настроить в design-time.
DataSource: TDataSource; // Настроить в design-time.
protected
function GetDataSource: TDataSource; override;
end;
function TDescendantForm.GetDataSource: TDataSource;
begin
Result := DataSource;
end;
============
В программе создаем рабочую форму:
TAncestorForm.Create(Application).Show;
И жмем на ней кнопку.
Василий Василич Пупкинд (2008-05-15 20:25:00) [15]Ну или чтоб не блазнил мой пример с глобальной переменной (самого воротит от нее) скажите как установить значение поля класса предка при том, что его экземпляра не существует.
Василий Василич Пупкинд (2008-05-15 20:18:00) [16]Василий Василич, будет вызван метод ПОСЛЕДНЕГО класса, уверяю Вас. Надо только сделать его виртуальным (как и было показано).
А если у меня десять наследников, то метод какого из них будет вызван?
ЗЫ кнопка-то в предке лежит и обработчик нажатия там же.
И переносить этот код в последние классы мне не улыбается.
Василий Василич Пупкинд (2008-05-15 20:16:00) [17]Чтобы было совсем понятно объясняю "на пальцах" :
откройте любую демку от делфи из папке db.
возьмите любую форму с гридом у которой создаются экземпляры на рантайме.
уберите из нее все датасеты (или почистите юзес если все они в модуле данных)
создайте наследника этой формы и положите туда скажем TpFIBDataset
после чего найдите способ сохранить весь фукционал в предке так, чтобы он был независим от фибсов.
Юрий Зотов (2008-05-15 20:16:00) [18]> Василий Василич Пупкинд (15.05.08 19:56) [21]
Немного поясню: человек, который понимает, что такое полиморфизм м виртуальный метод ни за что не напишет вот такого:
> хоть ты запереопределяйся методы гетми в последнем классе, но
> диспетчиризация то вызовет метод предпоследнего класса, а не
> последнего.
Василий Василич, будет вызван метод ПОСЛЕДНЕГО класса, уверяю Вас. Надо только сделать его виртуальным (как и было показано).
Василий Василич Пупкинд (2008-05-15 20:12:00) [19]Да мне-то они знакомы хорошо знакомы и известны.
Как и то, что метод предложенный вами не прокатит.
Подозреваю, что вы просто не врубились в то, что мне нужно было реализовать.
С классовым методом - да. Глаз под вечер замылен, не заметил. Что впрочем никоим образом не меняет сути сказанного.
Юрий Зотов (2008-05-15 20:07:00) [20]Василий Василич, скажите, а Вам слова "наследование", "полиморфизм" и "виртуальный метод" знакомы?
И понятны?
Очень похоже, что нет.
По крайней мере, из Ваших слов "Если метод классовый как у вас" (то есть, у меня в [19]) следует однозначный вывод о том, что термин "классовый метод" Вы точно не понимаете.
Поскольку в [19] ни одного классового метода просто нет.