Hallo an alle,
Ich programmiere gerade n ersatz für das Startmenü. D.h. das Prog hab ich schon vor ca. 2 Jahren programmiert, aber
dementsprechend sieht es auch aus: keine
OOP, schlechter Programmierstil...
Ich wollte das dann mal verbessern. Soweit hab ich das - im Groben - auch fertig, nur hab ich komischerweise Probleme
mit dem Free von den TabSheets:
So hab ich das ursprünglich gemacht:
Delphi-Quellcode:
procedure TUEAppBar.DeleteGroupSBClick(Sender: TObject);
var
GroupName: String;
MsgText: String;
List: TStringList;
i: Integer;
begin
GroupName := PageControl1.ActivePage.Caption;
MsgText := 'Soll die Gruppe "' + GroupName + '" wirklich gelöscht werden?';
if MessageDlg(MsgText, mtConfirmation, mbOKCancel, 0) = mrOK then
begin
if DeleteDir(ExtractFilePath(ParamStr(0)) + 'Links\' + PageControl1.ActivePage.Caption) then
begin
for i := 0 to PageControl1.ActivePage.ComponentCount -1 do // das hätte Probleme gegeben, wenn ComponentCount nicht 1 gewesen wäre ;-)
begin
PageControl1.ActivePage.Components[i].Free; // wäre eigentlich unnötig,
end;
PageControl1.ActivePage.Free; // weil heimit doch eigentlich alles freigeben wird
List := TStringList.Create;
try // zu der Zeit kannte ich scheinbar FindFirst/Next noch nicht, also hab ich die zu öffnenden Order in ner TextDatei gespeichert
List.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'UEAppBar.dat');
List.Delete(List.IndexOf(GroupName));
List.SaveToFile(ExtractFilePath(ParamStr(0)) + 'UEAppBar.dat');
finally
List.Free;
end;
end
else
begin
ShowMessage('Ein Fehler ist aufgetreten! Gruppe konnte nicht gelöscht werden.');
end;
end;
end;
Jetzt mach ich das so:
Delphi-Quellcode:
procedure TUEAppBar.DeleteGroupSBClick(Sender: TObject);
var
GroupName: String;
MsgText: String;
begin
GroupName := PageControl1.ActivePage.Caption;
MsgText := 'Soll die Gruppe "' + GroupName + '" wirklich gelöscht werden?';
if MessageDlg(MsgText, mtConfirmation, mbOKCancel, 0) = mrOK then
begin
if Groups.DeleteGroup(GroupName) then
MessageDlg('Die Gruppe "' + GroupName + '" wurde gelöscht!',
mtInformation, [mbOK], 0);
end;
end;
Das eigentliche Löschen passiert in der Klasse TGroups:
Delphi-Quellcode:
function TGroups.DeleteGroup(const AName: string): Boolean;
var i: Integer;
begin
Result := False;
if DeleteDir(ExtractFilePath(ParamStr(0)) + 'Links\' + AName) then
begin
FPageControl.ActivePage.Free; // FPageControl is n Pointer auf das PageContol auf der Form
Result := True;
end;
end;
Ich bekomme leider immer ne AccessViolation. Und zwar direkt nach dem Anzeigen des MessageDlg: "Die Gruppe wurde
gelöscht". Wenn ich mit [F8] duchsteppe, komme ich auch nicht weiter, die
AV kommt direkt nach der Message.
Ich hab schon versucht
- direkt im Click-Ereignis zu löschen(also ohne den Pointer) --> funktioniert auch nicht
- die Componenten auf dem TabSheet manuell freizugeben --> funktioniert auch nicht
- alle TabSheets zu löschen und dann neu anzuzeigen --> auch das funktioniert nicht
Teilweise - je nachdem, wie ich meinen Quelltext umbaue - erhalte ich auch ne
AV an der Adresse 0.
Weil ich auch in manchen Fällen die Meldung erhalte, dass das Objekt '' kein Parent hat, bin ich auf die Idee gekommen,
dass schon beim Erstellen der TabSheets was nicht stimmt:
Delphi-Quellcode:
function TGroups.CreateTab(AName: string): TShellListView;
var
Tab: TTabSheet;
ListView: TShellListView;
i: Integer;
begin
Tab := TTabSheet.Create(FPageControl);
Tab.PageControl := FPageControl;
Tab.Parent := FPageControl;
Tab.Caption := AName;
ListView := TShellListView.Create(Tab);
ListView.Parent := Tab;
ListView.Align := alClient;
ListView.BorderStyle := bsNone;
ListView.FlatScrollBars := True;
ListView.HotTrackStyles := [htHandPoint, htUnderlineHot];
ListView.MultiSelect := False;
ListView.ViewStyle := vsReport;
ListView.ShowColumnHeaders := False;
ListView.HideSelection := True;
ListView.Root := ExtractFilePath(ParamStr(0)) + 'Links\' + AName;
ListView.OnMouseDown := ShellListViewMouseDown;
ListView.AutoRefresh := True;
for i := ListView.Columns.Count -1 downto 1 do
begin
ListView.Columns.Items[i].Free;
end;
Result := ListView;
end;
Da find ich aber auch keinen Fehler. Der Leerstring in der Fehlermeldung kommt wahrscheinlich daher, dass ich den Tabs
keinen Namen verpasst habe. Wenn ich das ändere, bekomme ich aber wieder die
AV und nicht die Kein-Parent-Meldung,
ich kann also schlecht sagen, obs an den TabSheets, oder an den ShellListViews hängt.
Irgendwo muss ich was ganz dummes falsch geacht haben.
Ich hab nur keine Ahnung was!
mfg
Christian
P.S.: @Mods: bin mir nicht sicher, ob ich hier richtig bin, wenn nicht, einfach verschieben...
Anhang: Im Anhang is der komplette Quelltext, wenn den jemand 'braucht'...