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