powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Интересный вопрос с наследованием
29 сообщений из 29, показаны все 2 страниц
Интересный вопрос с наследованием
    #32353808
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
Здравствуйте!

Есть модуль данных md1, на нем набор данных с персистентным полем X.
От этого модуля унаследован новый модуль md2, добавлено персистентное поле Y.

Вопрос:
как в Run-time определить какие поля есть только на кастомном (md1)
модуле ?
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32353834
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Tmd1(md2).Query1.Fields
Так?
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32353878
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
че-то мне сдается, что там будет и Y
:(
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32353887
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
md1.Query1.Fields


А это чем не устраивает? Да и вариант Артем1 должен работать.
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32353888
alr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
alr
Гость
Ну, можно поробовать так (сам не проверял, только идея):

1. Определить предка.
2. Найти ресурс формы предка.
3. Создать экземпляр предка из ресурса.
4. Прочитать список полей.
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32353897
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pkarklin писалДа и вариант Артем1 должен работать.

Хотя нет, будет вызван метод объекта dm2, который соответсвенно вернет и Y.
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32353914
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
md1.Query1.Fields

не устраивает, потому что md1 может не быть, а создаватьего нехорошо, потому что там могут быть абстрактные функции!

вот.

Насчет чтения ресурса -- интересно, но... по-моему очень уж гемморойно.
Уж лучше статически сформировать строковой список этих полей...
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354104
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svче-то мне сдается, что там будет и Y
Да не будет там Y. я же попробовал
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354139
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Артем1

авторДа не будет там Y. я же попробовал

Как вы пробовали, если не секрет? Вот в этом вызове

Код: plaintext
Tmd1(md2).Query1.Fields


метод Fileds какого объекта будет вызван? Правильно md2. То, что вы его привели к Tmd1 еще не о чем не говорит.
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354215
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верно, глупость сморозил.

Я проверял проще. Поставли после квери точку, смотрю, в списке только одно
поле: Query1X :))

Поторопился, сорри. :(
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354255
Фотография GroZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Кто-нибудь из вас делал чтонибудь вроде того чтоб создать клас а потом проверать какие поля в этом классе есть? ... это то что хочет sv ... простите но попахивает маразмом ...
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354269
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
2 GroZ: выы сами поняли, что сказали?

Если имеется ввиду создание экземпляра, то я уже сказал:
"...создаватьего нехорошо, потому что там могут быть абстрактные функции! "
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354277
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 sv

Я вот, например, понял о чем говорил GroZ. Вы же сам создали класс, который dm1, а теперь в коде хотите узнать, какие у него значение свойств, причем не создавая экземляра.
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354302
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
2pkarklin
я не понял насчет маразма
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354306
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, на счет маразма, может и перебор. :-)
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354358
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мало того, даже и не свойства класса хотите проверить, а свойства компонентов. А они могут измениться - что и происходит. Так что тут даже не знаю, как.

-- Tygra's --
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354368
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Унаследован он как ?
____
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354401
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
2Tygra:
если бы вопрос был совсем тривиальный, то я его не задавал бы.


2JibSkeart:
Код: plaintext
1.
2.
3.
4.
5.
6.
type

  Tmd2 = class (Tmd1)
  ...
  Y: TIntegerField;
  ...
  end;


вот так!

А как еще можно унаследовать?
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354415
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
И еще:
хочу акцентировать ваше внимание на том, что меня интересует только факт наличия (отсутствия) полей на предковом модуле.
Чтобы было понятнее зачем это, объясню:
на предковом модуле лежит набор данных с каким-то количеством полей, от него унаследованы другие модули, в каждом из которых добавлены некоторые поля. При изменении полей которые есть ТОЛЬКО на дочерних модулях мне необходимо выполнять какое-то действие.
Не хочется списиок полей держать в виде константы.
Создавать предковый модуль тоже нельзя.

Мне этот вопрос показался очень оригинальным, я бы даже сказал -- почти олимпиадная задача.
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354427
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно но ведь в любом случае толко у наследника будет
Y

или я что то недопонял ?
____
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354492
Hammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
procedure TForm1.Button1Click(Sender: TObject);
{}
function GetFieldsList( const ADataSet: TADOQuery ): String;
var
List: TStrings;
FieldsList: String;
i: Integer;
begin
List := TStringList.Create;
try
ADataSet.GetFieldNames( List );
FieldsList := List.CommaText;
for i := 0 to Length( FieldsList ) do
if FieldsList = ',' then FieldsList := ';';
finally
List.Free;
end;
Result := FieldsList;
end;
{}
var
FieldsList1, FieldsList2: String;
begin
FieldsList1 := GetFieldsList( DataModule2.ADOQuery1 );
FieldsList2 := GetFieldsList( DataModule3.ADOQuery1 );
ShowMessage( FieldsList1 + ' ' + FieldsList2 );
end;


...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354494
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
Правильно: Y будет только у наследника .

Но проблема в том, что предка, как экземпляра не существует. Есть класс предка, а самого модуля нету.
Используя чудесные возможности полиморфизма, я могу обратится к потомку через переменную типа предка, но это ничем, в данной ситуации не поможет. Как выразился мой коллега: "Попались в ловушку полиморфизма..."
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354499
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
2Hammer:
DataModule2 не существует!
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354501
Hammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Як енто не существует?
Код в студию, пж-та!
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354515
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
unit Unit2;

interface

uses
  SysUtils, Classes, DB, DBClient;

type
  TDataModule2 = class(TDataModule)
    ClientDataSet1: TClientDataSet;
    ClientDataSet1x: TIntegerField;
  private
    { Private declarations }
  protected
    function GetResult: string; virtual; abstract;
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

end.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, DB, DBClient;

type
  TDataModule3 = class(TDataModule2)
    ClientDataSet1y: TIntegerField;
  private
    { Private declarations }
  protected
    function GetResult: string; override;
  public
    { Public declarations }
  end;

var
  DataModule3: TDataModule3;

implementation

{$R *.dfm}

end.


Создается
Код: plaintext
  DataModule3 := TDataModule3.Create(Application);
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32354521
Hammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и чего?
Типа тады так:

procedure TForm1.Button1Click(Sender: TObject);
{}
function GetFieldsList( const ADataSet: TADOQuery ): String;
var
List: TStrings;
FieldsList: String;
i: Integer;
begin
List := TStringList.Create;
try
ADataSet.GetFieldNames( List );
FieldsList := List.CommaText;
for i := 0 to Length( FieldsList ) do
if FieldsList = ',' then FieldsList := ';';
finally
List.Free;
end;
Result := FieldsList;
end;
{}
var
FieldsList1, FieldsList2: String;
begin
with TDataModule2.Create( nil ) do
try
FieldsList1 := GetFieldsList( ADOQuery1 );
finally
Free;
end;
FieldsList2 := GetFieldsList( DataModule3.ADOQuery1 );
ShowMessage( FieldsList1 + ' ' + FieldsList2 );
end;


...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32355230
sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sv
Гость
...однако работает

Вот если бы не создавая... ;-)
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32355581
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот какой огород с хакеризмами можно нагородить... А можно просто применить ОО подход и задачка получается примитивная :

Самое простое - проверять
if Dataset is TMd2
then // это дочка - соотв. знаем, что есть ... поле.
else if Dataset is TMd1 then // это предок
else // Чужой dataset

Или так, если ожидаются разные Md2,Md3,Md4... с помощью признака :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Md1a=class(Md1)
  IsFather : Boolean;
end;

constructor Md1a::Create()
begin
  inherited;
  IsFather:=True;
end;

Md2=class(Md1a)
end;

constructor Md2::Create()
begin
  inherited;
  IsFather:=False;
end;


Md1a - будет новым предком (если нельзя модифицировать Md1, иначе можно сразу вписывать IsFather в Md1)

Если хочется работать прямо со списком полей, то заведите в базовом классе два списка - один определяется в базовом классе как эталонный - в конструкторе, скажем, а в дочернем определяется второй. И сравнивайте их на здоровье.
...
Рейтинг: 0 / 0
Интересный вопрос с наследованием
    #32355618
Sclif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем если я правильно понимаю задачу, то надо сделать дву функции, одна из которых перегрузит другую, которая будет возвращать список полей. Тогда кастя к предку ты вызовешь метод предка. С методами типа GetFieldsList не выйден потому что функция не перегружается ни в предке ни в потомке, и вызываться она будет от того класса чей экземпляр создан.

Мне так кажется :)
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Интересный вопрос с наследованием
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]