Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TStrings/TStringlist : funktioniert aber ... (https://www.delphipraxis.net/215592-tstrings-tstringlist-funktioniert-aber.html)

bernhard_LA 1. Aug 2024 15:27

TStrings/TStringlist : funktioniert aber ...
 
ich will die Liste der ausgewählten Dateinamen weiterverarbeiten. Mein Code funktioniert (scheinbar),
warum brauche ich eigentlich den Typecast von TStrings nach TStringlist?
Ist dies die beste Code-Lösung meine ausgewählten Dateien weiterzubearebiten?


Delphi-Quellcode:
....

var
  OpenDialog: TOpenDialog;
  SelectedFiles: TStrings;
begin
  OpenDialog := TOpenDialog.Create(nil);
  try
    OpenDialog.Options := [TOpenOption.ofAllowMultiSelect];
    // Customize the filter as needed
    OpenDialog.Filter := 'All Files|*.*';
    if OpenDialog.Execute then
    begin
      SelectedFiles := OpenDialog.Files;
      // Process the selected files (e.g., display their names)
      ShowMessage('Selected files: ' + SelectedFiles.Text);

      lst_ImageList.clear;
      lst_ImageList.items.AddStrings(SelectedFiles) ;

      EvaluateSelectedFiles ( TStringList( SelectedFiles ) );

    end;
  finally
    OpenDialog.Free;
  end;
end;

procedure TForm.EvaluateSelectedFiles(SelectedFiles : TStringList);

Delphi.Narium 1. Aug 2024 15:56

AW: TStrings/TStringlist : funktioniert aber ...
 
Wofür brauchst Du SelectedFiles?
Delphi-Quellcode:
var
  OpenDialog: TOpenDialog;
begin
  OpenDialog := TOpenDialog.Create(nil);
  try
    OpenDialog.Options := [TOpenOption.ofAllowMultiSelect];
    // Customize the filter as needed
    OpenDialog.Filter := 'All Files|*.*';
    if OpenDialog.Execute then
    begin
      // Process the selected files (e.g., display their names)
      ShowMessage('Selected files: ' + OpenDialog.Files.Text);

      lst_ImageList.clear;
      lst_ImageList.items.AddStrings(OpenDialog.Files) ;

      EvaluateSelectedFiles(TStringList(OpenDialog.Files));
    end;
  finally
    OpenDialog.Free;
  end;
end;

procedure TForm.EvaluateSelectedFiles(SelectedFiles : TStringList);
Und damit sollte dann klar sein, warum der Typcast erforderlich ist, EvaluateSelectedFiles erwartet eine TStringList, OpenDialog.Files ist aber vom Typ TStrings.
Delphi-Quellcode:
var
  OpenDialog: TOpenDialog;
  SelectedFiles: TStringList;
begin
  OpenDialog := TOpenDialog.Create(nil);
  SelectedFiles := TStringList.Create;
  try
    OpenDialog.Options := [TOpenOption.ofAllowMultiSelect];
    // Customize the filter as needed
    OpenDialog.Filter := 'All Files|*.*';
    if OpenDialog.Execute then
    begin
      // Process the selected files (e.g., display their names)
      SelectedFiles.AddStrings(OpenDialog.Files);
      ShowMessage('Selected files: ' + SelectedFiles.Text);

      lst_ImageList.clear;
      lst_ImageList.items.AddStrings(OpenDialog.Files) ;

      EvaluateSelectedFiles(SelectedFiles);
    end;
  finally
    SelectedFiles.Free;
    OpenDialog.Free;
  end;
end;

procedure TForm.EvaluateSelectedFiles(SelectedFiles : TStringList);
Dann geht's auch ohne Typcast.

dummzeuch 1. Aug 2024 16:02

AW: TStrings/TStringlist : funktioniert aber ...
 
Zitat:

Zitat von bernhard_LA (Beitrag 1539459)
ich will die Liste der ausgewählten Dateinamen weiterverarbeiten. Mein Code funktioniert (scheinbar),
warum brauche ich eigentlich den Typecast von TStrings nach TStringlist?

Darum:
Zitat:

Zitat von bernhard_LA (Beitrag 1539459)
Delphi-Quellcode:
procedure TForm.EvaluateSelectedFiles(SelectedFiles : TStringList);

Wenn Du dort den Parameter als TStrings deklarierst, brauchst Du den Typecast nicht.

Delphi.Narium 1. Aug 2024 16:06

AW: TStrings/TStringlist : funktioniert aber ...
 
Stimmt, wenn in EvaluateSelectedFiles keine Möglichkeiten von TStringList benötigt werden sondern nur die von TStrings geerbten.

dummzeuch 1. Aug 2024 17:23

AW: TStrings/TStringlist : funktioniert aber ...
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1539464)
Stimmt, wenn in EvaluateSelectedFiles keine Möglichkeiten von TStringList benötigt werden sondern nur die von TStrings geerbten.

Naja, das Objekt, das da übergeben wird (OpenDialog.Files.Text), ist ja auch keine TStringList, insofern ist der Typecast sogar falsch.

Edit: Wie Du ja schon geschrieben hattest.

Uwe Raabe 1. Aug 2024 22:10

AW: TStrings/TStringlist : funktioniert aber ...
 
Zitat:

Zitat von dummzeuch (Beitrag 1539467)
Naja, das Objekt, das da übergeben wird (OpenDialog.Files.Text), ist ja auch keine TStringList, insofern ist der Typecast sogar falsch.

Wieso? OpenDialog.Files ist zwar als TStrings deklariert, aber:
Delphi-Quellcode:
SelectedFiles := OpenDialog.Files;

...

    property Files: TStrings read GetFiles;

...

function TOpenDialog.GetFiles: TStrings;
begin
  Result := FFiles;
end;

...

constructor TOpenDialog.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FHistoryList := TStringList.Create;
  FOptions := [ofHideReadOnly, ofEnableSizing];
  FFiles := TStringList.Create;
...

himitsu 1. Aug 2024 22:39

AW: TStrings/TStringlist : funktioniert aber ...
 
Dennoch ist nicht 100%ig sichergestellt, dass es wirklich ein TStringList ist.
z.B. falls die "fremde" Komponente mal unbemerkt umgebaut wird.

Außerdem, könnte irgendwann mal etwas Anderes verwendet werden, um in dieser Variable zu landen.

Oder z.B.
Delphi-Quellcode:
EvaluateSelectedFiles(TStringList(lst_ImageList.items));
,
was inhaltlich das Gleiche wäre, aber eben definitiv einen falschen Cast ergäbe, z.B. bei einer TListBox oder TComboBox, aber auch bei einem TMemo uvm.

So wäre es korrekt
Delphi-Quellcode:
EvaluateSelectedFiles(OpenDialog.Files as TStringList);
,
oder eben das EvaluateSelectedFiles mit TStrings deklarieren, falls möglich, wie bereits erwähnt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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