AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fenster dynamisch

Ein Thema von Willie1 · begonnen am 22. Feb 2021 · letzter Beitrag vom 24. Feb 2021
Antwort Antwort
Willie1

Registriert seit: 28. Mai 2008
515 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Fenster dynamisch

  Alt 22. Feb 2021, 19:16
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.144 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Fenster dynamisch

  Alt 23. Feb 2021, 07:34
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (23. Feb 2021 um 07:59 Uhr) Grund: Properties gleich benannt und Getter/Setter erweitert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
37.478 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Fenster dynamisch

  Alt 23. Feb 2021, 10:59
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (23. Feb 2021 um 11:02 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
515 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: Fenster dynamisch

  Alt 23. Feb 2021, 19:34
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.657 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Fenster dynamisch

  Alt 23. Feb 2021, 19:59
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.144 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Fenster dynamisch

  Alt 23. Feb 2021, 20:03
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (23. Feb 2021 um 20:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
37.478 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Fenster dynamisch

  Alt 23. Feb 2021, 21:05
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.144 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Fenster dynamisch

  Alt Gestern, 08:18
Tatsache, das habe ich irgendwie verpasst. Dann hat sich das ja erledigt, und die Sache wird um Längen einfacher.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
515 Beiträge
 
Delphi 10.1 Berlin Starter
 
#9

AW: Fenster dynamisch

  Alt Gestern, 18:58
CreateMessageDialog sehe ich mir an.
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf