Вопрос

Я пишу эксперт по Delphi.Мне нужно иметь возможность записать значение свойства в свойство, которое является объектом.Например.У меня есть групповое поле в форме, и я хочу отредактировать поля.Свойство Left.Я использую следующую процедуру, чтобы сделать это, но if выдает 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;
Это было полезно?

Решение

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

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

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

  • tkInt64 :Get/SetInt64Prop Получить/SetInt64Prop
  • Интегратор:Get/SetOrdProp Получить/setordpropprop

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top