AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fenster dynamisch

Ein Thema von Willie1 · begonnen am 22. Feb 2021 · letzter Beitrag vom 26. Feb 2021
Antwort Antwort
Seite 1 von 2  1 2      
Willie1

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

Fenster dynamisch

  Alt 22. Feb 2021, 18: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.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Fenster dynamisch

  Alt 23. Feb 2021, 06: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 06: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
43.136 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fenster dynamisch

  Alt 23. Feb 2021, 09: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.
my Delphi wish list : BugReports/FeatureRequests

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

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

AW: Fenster dynamisch

  Alt 23. Feb 2021, 18: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
3.685 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Fenster dynamisch

  Alt 23. Feb 2021, 18: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.540 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Fenster dynamisch

  Alt 23. Feb 2021, 19: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 19:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#7

AW: Fenster dynamisch

  Alt 23. Feb 2021, 20: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.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Fenster dynamisch

  Alt 24. Feb 2021, 07: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
618 Beiträge
 
Delphi 10.1 Berlin Starter
 
#9

AW: Fenster dynamisch

  Alt 24. Feb 2021, 17: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#10

AW: Fenster dynamisch

  Alt 25. Feb 2021, 10:21
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 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Feb 2021 um 10:27 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:19 Uhr.
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