Ошибка Delphi OTA и RTTI

Я пишу эксперту Delphi. Мне нужно иметь возможность записать значение свойства для свойства, которое является объектом. Например. У меня есть GroupBox в форме, и я хочу изменить свойство Margins.Left. Я использую следующую процедуру, чтобы сделать это, но если выдает AV на отмеченной строке.

Процедура берет компонент из (редактора свойств) имя свойства (например, "Margins.Left") и новое значение, анализирует имя свойства, извлекает объект, считывает текущее значение и пытается изменить его, если оно отличается. Затем он вызывает метод для регистрации любых изменений.

procedure EditIntegerSubProperty(Component: IOTAComponent;const PropName: String;NewValue: Integer);
var AnObject: TObject;
  TK: TTypeKind;
  At: Integer;
  AClassName, APropName: String;
  PropInfo: PPropInfo;
  OldValue: Integer;
begin
  At := Pos('.', PropName);
  if At < 1 then
  raise Exception.Create('Invalid SubProperty Name: '+PropName);

  AClassName := Copy(PropName, 1, At-1);
  APropName := Copy(PropName, At+1, length(PropName));

  TK := Component.GetPropTypeByName(AClassName);
  if TK <> tkClass then
    EXIT;

  AnObject := GetObjectProp((Component as INTAComponent).GetComponent, AClassName);
  if PropIsType(AnObject, APropName, tkInteger) then
  begin
    OldValue := GetInt64Prop(AnObject, APropName);
    if OldValue <> NewValue then
    begin
      SetInt64Prop(AnObject, APropName, NewValue);  <----AV HERE
      ChangeLogInteger(Name, PropName, OldValue, NewValue);
    end;
  end;
end;

person Mike Sutton    schedule 27.09.2008    source источник


Ответы (2)


Margins.xyzzy — это все свойства Integer, а не свойства Int64, поэтому вам нужно использовать GetOrdProp/SetOrdProp для их чтения и изменения.

SetInt64Prop предполагает, что это 64-битное свойство, и пытается вызвать функцию установки свойства с 64-битным параметром. Поскольку установщик свойств ожидает 32-битный параметр, он не может правильно очистить стек и, таким образом, вызывает AV при возврате.

Вы можете указать, какие функции вызывать в соответствии с вызовом PropIsType.

  • tkInt64 : Получить/SetInt64Prop
  • tkInteger: Получить/SetOrdProp

Функции Get/SetOrdProp также можно использовать для свойств Char и WideChar, и я думаю, именно поэтому название не является очевидным на 100%.

person Roddy    schedule 27.09.2008

Вы пытались использовать GetOrdProp, SetOrdProp вместо GetInt64Prop, SetInt64Prop?

person Ondrej Kelle    schedule 27.09.2008