ich möchte in einer tScrollbox mehrere tFrames untereinander auflisten. Jedes tFrame besitzt einen eigenen DELETE-Button, über den es selbst gelöscht werden kann. Klicke ich auf den DELETE-Button, nachdem ich mehrere tFrames erzeugt habe, bedankt sich das Programm mit einem SIGSEGV !? Ich vermute, dass ich irgendwelche oop-Regeln verletzte, weiss aber nicht, wie ich das korrekt lösen muss.
das grundsätzliche Löschen eines tFrames funktioniert. Ich habe das ausprobiert mit:
Code: Alles auswählen
sbJobs     ist die tScrollBox
aJobFrame  ist meine tFrame-Klasse (tFrameJobDetail)
 
  if (sbJobs.Components[0] is tFrameJobDetail) then begin
    aJobFrame := (sbJobs.Components[0] as tFrameJobDetail);
    aJobFrame.Free;
  end;Da die tFrame-Klasse später mehr können muss, als sich selbst löschen, habe ich ein fOnDeleteJob-NotifyEvent eingebaut. Im MainForm (tMainForm.DoDeleteJob) bearbeite ich dann den DELETE-Button-Click.
das ist meine abgeleitete tFrame-Klasse:
Code: Alles auswählen
TFrameJobDetail = class(TFrame)
    btnDelete: TButton;
    cbSubDir: TCheckBox;
    lblJobID: TLabel;
    lblPath: TLabel;
    lblTimeStamp: TLabel;
    memoDesc: TMemo;
    pnl: TPanel;
    procedure btnDeleteClick(Sender: TObject);
    procedure FrameResize(Sender: TObject);
  private
    fJobID         : integer;
    fOnDeleteJob   : tNotifyEvent;
 
    procedure DoSetJobID(newJobID: integer);
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
  published
    property JobID: integer read fJobID write DoSetJobID;
    property OnDeleteJob: tNotifyEvent read fOnDeleteJob write fOnDeleteJob;
  end;das wird beim DELETE-Button ausgeführt:
Code: Alles auswählen
procedure TFrameJobDetail.btnDeleteClick(Sender: TObject);
begin
  if assigned(fOnDeleteJob) then
    fOnDeleteJob(self);
end;durch eine Action - ausgelöst durch einen Button auf dem Hauptformular - erzeuge ich neue tFrames:
Code: Alles auswählen
procedure tMainForm.actCreateJobExecute(Sender: TObject);
var
  newJobFrame : tFrameJobDetail;
 
begin
  newJobFrame := tFrameJobDetail.Create(sbJobs);
  newJobFrame.Name := 'JobDetail_' + IntToStr(sbJobs.ControlCount);
  newJobFrame.Parent := sbJobs;
  newJobFrame.JobID:=sbJobs.ControlCount;
  newJobFrame.Align := alTop;                                  // muss gesetzt sein, sonst gibt's keinen Scrollbalken
  newJobFrame.OnDeleteJob := @DoDeleteJob;
end;Code: Alles auswählen
procedure tMainForm.DoDeleteJob(Sender: tObject);
var
  JobFrame    : tFrameJobDetail;
 
begin
  if not(Sender is tFrameJobDetail) then exit;
  JobFrame := Sender as tFrameJobDetail;
  JobFrame.Free;
end;Ich wäre froh, wenn mir jemand einen Tipp geben könnte. Vielen Dank,
Gruss Frank