Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверить существование свойства 
V
    Опции темы
Beltar
Дата 23.5.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Имеем экземпляр класса.
В него заносится неизвестный наследник. Я знаю, что некоторые наследники имеют полезное мне свойство. Вроде можно проверить, что мой экземпляр принадлежит к классу имеющему такое свойство через FieldAddres, но можно ли как-нибудь к этому свойству обратиться?





--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Alexeis
Дата 23.5.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Только если это published свойство. См. TypInfo.pas


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Felan
Дата 23.5.2008, 11:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



А что, операторы is и as и поля ClassName и ClassType не подходят?
Как раз и определишь, что именно за наследник там находится.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
pseud
Дата 23.5.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



вот пример выставления строкового свойства
но учти!
как сказал Alexeis выставляемое свойство должно быть published

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure SetStringProperty(ABindingControl: TControl;
      ABindingProperty: string; AValue: string);
  end;

var
  Form1: TForm1;

implementation

uses
  TypInfo;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetStringProperty(Edit1, 'Text', 'значение');
end;

procedure TForm1.SetStringProperty(ABindingControl: TControl;
  ABindingProperty: string; AValue: string);
var
  pProperty: PPropInfo;
begin
  pProperty := GetPropInfo(ABindingControl, ABindingProperty);
  if pProperty <> nil then
  begin
    if pProperty.PropType^.Kind in [tkString, tkLString, tkWString] then
      SetStrProp(ABindingControl, ABindingProperty, AValue);
  end;
end;

end.





--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Beltar
Дата 23.5.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



ClassName и ClassType позволяют явно привести тип на этапе компиляции, но если у меня базовый тип TFather 

Код

type
TChild=class(TFather)
  published
  NewField:Integer; 


То записать
Код

var F:TFather
begin
F:=TChild.Create;
(F as F.ClassType).NewField;
end


Не получится. Откуда компилятору знать, будет-ли NewField у класса. Х) Потому и спрашиваю.
Про то, что published я в хелпе по FieldAddress сам прочитал, сильно удивился, почему так.

Пошел я пока с работы домой, приду разберусь с примером выше.

Это сообщение отредактировал(а) Beltar - 23.5.2008, 15:05


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
pseud
Дата 23.5.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Beltar @  23.5.2008,  15:02 Найти цитируемый пост)
Откуда компилятору знать, будет-ли NewField у класса


но ты же пишешь 

Код

F := TChild.Create;


следовательно вполне правомерно можешь писать

Код

TChild(F).NewField :=  ...



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Beltar
Дата 25.5.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Цитата

но ты же пишешь 
Код

F := TChild.Create

  


У меня классы вообще-то компоненты. И в общем случае я не знаю каким будет TChild.

Ладно, с GetPropInfo вроде как все или почти все понятно. Thx.



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Felan
Дата 26.5.2008, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Как это? Совсем неизвестный?
Ты же все равно должен знать, какой он может быть. Значит можно попробовать все, и на нужном остановится... Ну через Try...Except хотябы...

Это сообщение отредактировал(а) Felan - 26.5.2008, 07:42


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.