AGB  ·  Datenschutz  ·  Impressum  







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

TStrings/TStringlist : funktioniert aber ...

Ein Thema von bernhard_LA · begonnen am 1. Aug 2024 · letzter Beitrag vom 1. Aug 2024
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

TStrings/TStringlist : funktioniert aber ...

  Alt 1. Aug 2024, 16:27
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);
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: TStrings/TStringlist : funktioniert aber ...

  Alt 1. Aug 2024, 16:56
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.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.605 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: TStrings/TStringlist : funktioniert aber ...

  Alt 1. Aug 2024, 17:02
ich will die Liste der ausgewählten Dateinamen weiterverarbeiten. Mein Code funktioniert (scheinbar),
warum brauche ich eigentlich den Typecast von TStrings nach TStringlist?
Darum:
procedure TForm.EvaluateSelectedFiles(SelectedFiles : TStringList);
Wenn Du dort den Parameter als TStrings deklarierst, brauchst Du den Typecast nicht.
Thomas Mueller
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#4

AW: TStrings/TStringlist : funktioniert aber ...

  Alt 1. Aug 2024, 17:06
Stimmt, wenn in EvaluateSelectedFiles keine Möglichkeiten von TStringList benötigt werden sondern nur die von TStrings geerbten.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.605 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: TStrings/TStringlist : funktioniert aber ...

  Alt 1. Aug 2024, 18:23
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

AW: TStrings/TStringlist : funktioniert aber ...

  Alt 1. Aug 2024, 23:10
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;
...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TStrings/TStringlist : funktioniert aber ...

  Alt 1. Aug 2024, 23:39
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. 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 EvaluateSelectedFiles(OpenDialog.Files as TStringList); ,
oder eben das EvaluateSelectedFiles mit TStrings deklarieren, falls möglich, wie bereits erwähnt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 1. Aug 2024 um 23:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:46 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