![]() |
Fenster dynamisch
Hallo Delphianer*innen,
ich will der TZipFile-class noch eine Methode hinzufügen. Der Anwender wählt ein Archiv aus, dann öffnet sich ein kleines Fenster mit einer ListBox, welches die im Archiv enthaltenen Dateien anzeigt. Der Anwender kann eine Datei auswählen. Das habe ich fertig und in der Test-Umgebung läuft es gut. Aber sicher ist sicher. Ich habe noch kein dynamisches Fenster ohne Parent gebaut.
Delphi-Quellcode:
Kann ich das in die class TZipFile einbauen, ohne das mir da was um die Ohren fliegt. Ich will die Datei anschließend im Temp-Ordner auspacken. Das direkte Übernehmen krieg ich nicht hin, war hier lange Thema. Den TypeCast von TByte zu einer komplizierten Record-Struktur schaffe ich nicht.
procedure AuswahlDlg(Filelist: TStringList; out Filename: string);
var dlgAuswahl: TForm; LB: TListBox; btnOk, btnCancel: TButton; Lbl: TLabel; begin dlgAuswahl := TForm.Create(nil); dlgAuswahl.SetBounds(100,100,300,150); dlgAuswahl.Caption := 'aus Archiv auswählen'; dlgAuswahl.BorderStyle := bsDialog; dlgAuswahl.BorderIcons := [biSystemMenu]; dlgAuswahl.Position := poScreenCenter; dlgAuswahl.Color := clMoneyGreen; LB := TListBox.Create(dlgAuswahl); LB.Parent := dlgAuswahl; LB.Items.Assign(FileList); LB.ItemIndex := 0; LB.SetBounds(20, 20, 120, 58); btnOk := TButton.Create(dlgAuswahl); btnCancel := TButton.Create(dlgAuswahl);; btnOk.Parent := dlgAuswahl; btnCancel.Parent := dlgAuswahl; btnOk.Left := 150; btnOk.Top := 20; btnCancel.Left := 150; btnCancel.Top := 55; btnCancel.Cancel := true; btnOk.ModalResult := mrOk; btnCancel.ModalResult := mrCancel; Lbl := TLabel.Create(dlgAuswahl); Lbl.Parent := dlgAuswahl; Lbl.Left := 20; Lbl.Top := 90; Lbl.Caption := FileList.Count.ToString; btnOk.Caption := 'Übernehmen'; btnCancel.Caption :='Verwerfen'; Filename := ''; if dlgAuswahl.ShowModal = mrOK then begin Filename := FileList[LB.ItemIndex]; end; LB.Destroy; Lbl.Destroy; btnOk.Destroy; btnCancel.Destroy; dlgAuswahl.Destroy; end; Danke und Gruß Willie. |
AW: Fenster dynamisch
Warum so kompliziert? Du kannst Dein Fenster wie andere auch bequem in der IDE zusammenstöpseln, zur Verwendung brauchst Du dann die *.pas und die *.dfm. Das könnte dann etwa so aussehen:
Delphi-Quellcode:
Zu den Properties in TAuswahlDialogForm:
...
uses AuswahlDialog (* Unit mit dem entworfenen Fenster *); procedure AuswahlDlg(Filelist: TStringList; out Filename: string); var frm: TAuswahlDialogForm; begin frm := TAuswahlDialogForm.Create(nil); try frm.FileList := FileList; // Files soll als Property von TAuswahlDialogForm deklariert sein if frm.ShowModal = mrOK then Filename := frm.Filename; //ebenso wie Filename finally frm.Free; end; end;
Delphi-Quellcode:
type
TAuswahlDialogForm = class(TForm) LB: TListBox; btnOK: TButton; btnCancel: TButton; ... private function GetFileList: TStrings; procedure SetFileList(const Value: TStrings); function GetFilename: string; ... public property FileList: TStrings read GetFileList write SetFileList; property Filename: string read GetFilename; ... end; ... function TAuswahlDialogForm.GetFileList: TStrings; begin Result := LB.Items; end; procedure TAuswahlDialogForm.SetFileList(const Value: TStrings); begin LB.Items.Assign(Value); end; function TAuswahlDialogForm.GetFilename: string; begin if LB.ItemIndex > -1 then Result := LB.Items[LB.ItemIndex] else Result := ''; end; |
AW: Fenster dynamisch
Klar, man könnte es so machen, ABER
Und da bei den Komponenten der Owner angegeben wurde, reicht es nur die Form freizugeben. |
AW: Fenster dynamisch
Hallo Leute,
bei mir klappt selten etwas auf Anhieb, diesmal schon! Danke Ich muss also nur die Unit AuswahlDialog mit in die Erweiterung TZipFile einbinden Richtig? Dann fällt mir noch etwas auf, TStrings und TStringList sind zuweisungskompatibel aber TStrings und TArray<string> nicht. Ich frage, weil TZipFile Filenames letzteres verlangt. TDirectory GetFiles wiederum verlangt TStringDynArray. Das finde ich inkonsequent. Gruß Willie. |
AW: Fenster dynamisch
CreateMessageDialog() gibt es auch noch.
Das nutze ich jedenfalls immer. Ein direktes einbinden in original Quelltext halte ich für nicht sehr durchdacht. Lieber eine helper unit mit Deinen Änderungen, so ist nach einem Update der quelle deine Änderung noch vorhanden. |
AW: Fenster dynamisch
Wenn Du statt TStrings TList<string> nimmst, kannst Du deren Methode ToArray verwenden, um ein TArray<string> zu erhalten. Das sollte von TZipFile akzeptiert werden.
[edit] Das hat aber dann den Nachteil, dass Du die Liste nicht mehr direkt den Items einer Listbox oder Combobox zuweisen kannst. [/edit] |
AW: Fenster dynamisch
TStrings/TStringList hat auch ein "ToStrings", bzw. ein ToStringArray,
und AddStrings nimmt alternativ ebenfalls ein Array entgegen. (nur ein "NameArray" fehlt der Komponente noch, bzw. ein TPair<String,String> für Name+Value) |
AW: Fenster dynamisch
Tatsache, das habe ich irgendwie verpasst. Dann hat sich das ja erledigt, und die Sache wird um Längen einfacher.
|
AW: Fenster dynamisch
CreateMessageDialog sehe ich mir an.
Zitat:
TStringList lässt sich einfach (ein) sortieren und Duplikate aussortieren, deshalb benutze ich gerne TStringList. Ich denke, ich komme jetzt klar. Willie. |
AW: Fenster dynamisch
Er meint, dass sich die TStringList dann doch verwenden lässt, anstatt z.B. TList<String>,
da er jetzt mitbekommen hat, dass die StringList doch ein "ToStringArray" besitzt, um direkt aus der StringList ein TArray<String> rauszubekommen und dann damit was machen zu können. ABER, auch wenn man eine TStringList nutzt, sollte man dennoch für Parameter den Typ TStrings verwenden, denn bei
Delphi-Quellcode:
kannst dann z.B. auch Memo.Lines, ListBox.Items, ComboBox.Items oder FileListBox.Items reingeben, also "alle" TStrings-Nachfahren.
AuswahlDlg(Filelist: TStrings; out Filename: string);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz