Frage

Ich schreibe einen Delphi-Experten. Ich muss in der Lage, ein Wert einer Eigenschaft auf einem Grundstück zu schreiben, die ein Objekt ist. Z.B. Ich habe eine GroupBox auf dem Formular und ich mag die Margins.Left Eigenschaft bearbeiten. Ich bin mit dem folgenden Verfahren, es zu tun, aber wenn gibt einen AV auf der markierten Linie.

Das Verfahren dauert eine Komponente aus dem (Eigenschaftseditor) die Eigenschaftsnamen (zB ‚Margins.Left‘) und den neuen Wert, analysiert die Eigenschaftsnamen aus, holt das Objekt, liest den aktuellen Wert und versucht, es zu ändern, wenn anders. Anschließend ruft sie ein Verfahren Änderungen zu protokollieren.

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;
War es hilfreich?

Lösung

Margins.xyzzy sind alle Eigenschaften Integer, nicht Int64 Eigenschaften, so dass Sie GetOrdProp / SetOrdProp verwenden müssen, um sie zu lesen und zu ändern.

SetInt64Prop geht davon aus, es ist ein 64-Bit-Eigenschaft, und versucht, die Eigenschaft Setter-Funktion mit einem 64-Bit-Parameter aufrufen. Da die Eigenschaft Setter ist ein 32-Bit-Parameter erwartet, schlägt er den Stapel richtig aufzuräumen und somit bewirkt, dass die AV auf Rückkehr.

Sie können sagen, welche nach dem PropIsType Aufruf Anruffunktionen.

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

Get / SetOrdProp Funktionen können auch für Char und WideChar Eigenschaften verwendet werden, was ich denke, ist, warum der Name nicht zu 100% liegt auf der Hand.

Andere Tipps

Haben Sie versucht, mit GetOrdProp, SetOrdProp statt GetInt64Prop, SetInt64Prop?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top