Einzelnen Beitrag anzeigen

Ralf Meyer

Registriert seit: 24. Mär 2008
36 Beiträge
 
#1

Vis.-Komponente verschwindet beim Ändern einer Objekteigens.

  Alt 3. Feb 2010, 18:39
Hi,

ich erstelle mir eine simple Komponente an das ich über
. Property Container mein Datenobjekt und über
. Property Feldname das Feld des Objekts
anbinden kann.

Ich platziere die Komponente auf einem Formular.
Ich weise der Eigenschaft "Container" mein Objekt zu => wunderbar.
Ich leere die Eigenschaft "Container" wieder und das Eingabefeld verschwindet vom Bildschirm.

Das Auswählen des Eingabefelds aus der Auswahlliste des Objekt-Inspektors wird mit einer Schutzverletzung quittiert.

Wo ist mein Problem?


Delphi-Quellcode:
unit uSftTestEdit ;

interface

uses
  SysUtils, Classes, Controls,
  , uSftInterface
  , uSftDataContainer
  , uCustomOBJ
  , Variants
  , StdCtrls ;

type
  TSftTestEdit = class(TEdit, ISftEditInterface )
  private
    { Private-Deklarationen }
    fFieldName: String;
    fContainer: tSftDataContainer;
    procedure SetContainer(const Value: tSftDataContainer);
  public
    { Public-Deklarationen }
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;

  published
    { Published-Deklarationen }
    Property FieldName : String Read fFieldName Write fFieldName ;
    Property Container : tSftDataContainer Read fContainer Write SetContainer ;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('UserEdit', [TSftTestEdit]);
end;

{ TSftTestEdit }

procedure TSftTestEdit.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited;
  if (AComponent = fContainer) and (Operation = opRemove) then
    fContainer := nil;
end;


procedure TSftTestEdit.SetContainer(const Value: tSftDataContainer);
begin
  if Assigned(fContainer) then
  begin
    fContainer.UnRegister(Self);
    fContainer.RemoveFreeNotification(Self);
  end;

  fContainer := Value;

  if Assigned(fContainer) then
  begin
    fContainer.FreeNotification(Self);
    fContainer.Register(Self);
  end;
end;


end.
  Mit Zitat antworten Zitat