Pergunta

Eu estou escrevendo um especialista em Delphi. Eu preciso ser capaz de escrever um valor para uma propriedade em uma propriedade que é um objeto. Por exemplo. Eu tenho um GroupBox no formulário e eu quero editar a propriedade Margins.Left. Eu estou usando o seguinte procedimento para fazê-lo, mas se dá uma AV na linha marcada.

O procedimento leva um componente do (editor de propriedade) o nome da propriedade (por exemplo, 'Margins.Left') eo novo valor, analisa-o nome da propriedade, vai buscar o objeto, lê o valor atual e tentativas de alterá-lo se diferente. Em seguida, chama um método para registrar quaisquer alterações.

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;
Foi útil?

Solução

Margins.xyzzy são todas as propriedades Integer, não Int64 propriedades, então você precisa usar GetOrdProp / SetOrdProp de ler e modificá-los.

SetInt64Prop assume que é uma propriedade de 64 bits, e tenta chamar a função de propriedade setter com um parâmetro de 64 bits. Como a propriedade setter está esperando um parâmetro de 32 bits, ele não consegue limpar a pilha corretamente e, portanto, faz com que o AV no retorno.

Você pode dizer que funciona para chamar de acordo com a chamada PropIsType.

  • tkInt64: Get / SetInt64Prop
  • tkInteger: Get / SetOrdProp

Obter / SetOrdProp funções também pode ser usado para Char e widechar propriedades, que eu acho que é por isso que o nome não é 100% óbvio.

Outras dicas

Você tentou usando GetOrdProp, SetOrdProp vez de GetInt64Prop, SetInt64Prop?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top