Delphi выбирает объект по неизвестному типу класса - PullRequest
4 голосов
/ 01 апреля 2012

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

TClass (ObjectPointer) .Property: = Значение;

Но TClass - неизвестный тип класса

Могу ли я сделатьчто-то вроде этого:

ObjectPointer.ClassType (ObjectPointer) .Property: = Значение

или это

var
   ClassRef: TClass;
begin

   ClassRef := Sender.ClassType;
   ClassRef(ObjectPointer).DoStuff
   end;

Есть ли способ сделать этов Delphi без использования оператора if

1 Ответ

9 голосов
/ 01 апреля 2012

Обратите внимание, код из этого поста будет работать только для опубликованных свойств!

Чтобы ответить на ваш вопрос , если есть способ установить значение свойства без использования оператора if , проверьте следующие перегруженные функции.

Первый тип предназначен для типов свойств char, string, option, integer, 64-bit integer, float, enumeration, set и dynamic (phew). Второй только для свойств типа класса. Оба возвращают True, если данное свойство существует, и значение или экземпляр объекта назначены успешно, иначе False:

uses
  TypInfo;

function TrySetPropValue(AInstance: TObject; const APropName: string;
  const AValue: Variant): Boolean; overload;
begin
  Result := True;
  try
    SetPropValue(AInstance, APropName, AValue);
  except
    Result := False;
  end;
end;

function TrySetPropValue(AInstance: TObject; const APropName: string;
  AValue: TObject): Boolean; overload;
begin
  Result := True;
  try
    SetObjectProp(AInstance, APropName, AValue);
  except
    Result := False;
  end;
end;

И использование; когда Memo1.Lines установлен, вторая версия TrySetPropValue называется:

procedure TForm1.Button1Click(Sender: TObject);
var
  Strings: TStringList;
begin
  TrySetPropValue(Memo1, 'Width', 250);
  TrySetPropValue(Memo1, 'Height', 100);
  TrySetPropValue(Memo1, 'ScrollBars', ssBoth);

  Strings := TStringList.Create;
  try
    Strings.Add('First line');
    Strings.Add('Second line');
    TrySetPropValue(Memo1, 'Lines', Strings);
  finally
    Strings.Free;
  end;

  if not TrySetPropValue(Memo1, 'Height', 'String') then
    ShowMessage('Property doesn''t exist or the value is invalid...');
  if not TrySetPropValue(Memo1, 'Nonsense', 123456) then
    ShowMessage('Property doesn''t exist or the value is invalid...');
end;
...