Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fenster dynamisch (https://www.delphipraxis.net/207074-fenster-dynamisch.html)

Willie1 22. Feb 2021 18:16

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:
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;
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.
Danke und Gruß
Willie.

DeddyH 23. Feb 2021 06:34

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:
...
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;
Zu den Properties in TAuswahlDialogForm:
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;

himitsu 23. Feb 2021 09:59

AW: Fenster dynamisch
 
Klar, man könnte es so machen, ABER
  • man ruft NIEMALS Destroy direkt auf! (Free)
  • und warum kein Ressourcenschutzblock? (Try-Finally)

Und da bei den Komponenten der Owner angegeben wurde, reicht es nur die Form freizugeben.

Willie1 23. Feb 2021 18:34

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.

KodeZwerg 23. Feb 2021 18:59

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.

DeddyH 23. Feb 2021 19:03

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]

himitsu 23. Feb 2021 20:05

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)

DeddyH 24. Feb 2021 07:18

AW: Fenster dynamisch
 
Tatsache, das habe ich irgendwie verpasst. Dann hat sich das ja erledigt, und die Sache wird um Längen einfacher.

Willie1 24. Feb 2021 17:58

AW: Fenster dynamisch
 
CreateMessageDialog sehe ich mir an.
Zitat:

Zitat von DeddyH (Beitrag 1483659)
Tatsache, das habe ich irgendwie verpasst. Dann hat sich das ja erledigt, und die Sache wird um Längen einfacher.

Wie meinst du das?
TStringList lässt sich einfach (ein) sortieren und Duplikate aussortieren, deshalb benutze ich gerne TStringList. Ich denke, ich komme jetzt klar.
Willie.

himitsu 25. Feb 2021 10:21

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:
AuswahlDlg(Filelist: TStrings; out Filename: string);
kannst dann z.B. auch Memo.Lines, ListBox.Items, ComboBox.Items oder FileListBox.Items reingeben, also "alle" TStrings-Nachfahren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz