Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   OpenDialog Mehrfachauswahl, Filename (https://www.delphipraxis.net/189767-opendialog-mehrfachauswahl-filename.html)

Freyr77 19. Jul 2016 09:15

Delphi-Version: 10 Seattle

OpenDialog Mehrfachauswahl, Filename
 
Ich würde gerne mit einem OpenDialog folgendes realisieren:

Mehrere Dateien einer bestimmten Art auswählen, die einzelnen Filenames auslesen und anschließend untereinander in einem StringGrid darstellen.

Ich hab das jetzt erstmal Testweise so gelöst:

Delphi-Quellcode:
OpenDialog1.Options := [ofAllowMultiSelect];
OpenDialog1.Execute();
ShowMessage(OpenDialog1.FileName);
um zu sehen, was der eigentlich ausließt wenn man mehrere Dateien auswählt.

Mir ist bekannt wie man die Daten in das StringGrid einträgt.

Was ich wissen wollte ist:

Ich habe dem OpenDialog gesagt er soll nach .dproj - Dateien filtern. Für den Multiselect wäre es hilfreich wenn die Ordner in denen sich die Dateien befinden nicht mit angezeigt werden. Geht das irgendwie?

Wie lese ich die gewählten Dateinamen einzeln aus um sie dem StringGrid zuzuweisen?

Klaus01 19. Jul 2016 09:23

AW: OpenDialog Mehrfachauswahl, Filename
 
.. sollte so funktionieren:
Delphi-Quellcode:
ShowMessage(extractFilename(OpenDialog1.FileName));
Wenn Du allerdings mit Multiselselect arbeitetest solltest Du dir OpenDialog1.Files anschauen.

Grüße
Klaus

Freyr77 19. Jul 2016 09:26

AW: OpenDialog Mehrfachauswahl, Filename
 
Zitat:

Zitat von Klaus01 (Beitrag 1342957)
.. sollte so funktionieren:
Delphi-Quellcode:
ShowMessage(extractFilename(OpenDialog1.FileName));
Grüße
Klaus

Ja, Danke, damit sieht das ganze schon ordentlicher aus.
Ich wollte allerdings mehrere Dateien auf einmal anwählen und deren "Filenames" dann einzeln anzeigen lassen.

Klaus01 19. Jul 2016 09:28

AW: OpenDialog Mehrfachauswahl, Filename
 
.. habe ich oben bereits ergänzt.
OpenDialog1.Files
Dies ist eine Liste mit den Dateinamen.

Grüße
Klaus

Freyr77 19. Jul 2016 09:31

AW: OpenDialog Mehrfachauswahl, Filename
 
Super, Danke!

himitsu 19. Jul 2016 13:51

AW: OpenDialog Mehrfachauswahl, Filename
 
Und nimm besser den TFileOpenDialog (VistaDialoge), statt dem TOpenDialog.

Emba war zwar auf die saudämliche geniale Idee gekommen den neuen Dialog intern zu verwenden, wenn man TOpenDialog verwendet und Windows diese API unterstützt/aktiviert hat,
aber ein paar neue Features wurden vergessen durchzureichen.

Freyr77 20. Jul 2016 08:57

AW: OpenDialog Mehrfachauswahl, Filename
 
Irgendwie komm ich trotzdem nicht weiter.

Ich brauche dringend irgendeine Möglichkeit mehrere .dprojs auswählen und verarbeiten zu können. Ob durch Mehrfachauswahl auf einmal oder mehrere einzelne Auswahlen nacheinander.

Die ganze Prozedur mit der Auslesung und der Eintragung sieht (unfertig) so aus:

Delphi-Quellcode:
procedure TVersionNumberViewer.Button2Click(Sender: TObject);
var
  ProgrammName: string;
  iNummer, iName: integer;
  Abfrage: string;
  MaxAnzahl: integer;
begin
  MaxAnzahl := 8;
  OpenDialog1.Execute();

  // Programmname auslesen
  ProgrammName := (extractfilename(OpenDialog1.FileName));
  EditNameAuswahl.Text := (extractfilename(OpenDialog1.FileName));

  // XML-Dokument laden
  CurrentXML := NewXMLDocument;
  CurrentXML.LoadFromFile(String(OpenDialog1.FileName));
  CurrentXML.Active := True;

  // Versionsnummer auslesen
  for iNummer := 1 to MaxAnzahl do
  begin
    VersionsNummern[iNummer] := '0.0';
  end;

  // Eintragungen StringGrid
  for iNummer := 1 to MaxAnzahl do
  begin
    StringGrid1.Cells[0, 1] := ProgrammName;
    StringGrid1.Cells[1, iNummer] := inttostr(VersionsNummer);
  end;
Damit wird aber nur eins eingetragen. Weil dieses Programm aber unbedingt effizient werden muss, bräuchte ich hier dringend einen Lösungsansatz. :?

uligerhardt 20. Jul 2016 09:05

AW: OpenDialog Mehrfachauswahl, Filename
 
Zitat:

Zitat von Freyr77 (Beitrag 1343033)
Damit wird aber nur eins eingetragen.

Weil du immer noch FileName und nicht Files benutzt?

BTW: Das
Zitat:

Zitat von Freyr77 (Beitrag 1343033)
Delphi-Quellcode:
OpenDialog1.Execute();
...

schreibt man besser so:
Delphi-Quellcode:
if OpenDialog1.Execute then
begin
  ...
end;

Freyr77 20. Jul 2016 09:09

AW: OpenDialog Mehrfachauswahl, Filename
 
Zitat:

Zitat von uligerhardt (Beitrag 1343034)
Zitat:

Zitat von Freyr77 (Beitrag 1343033)
Damit wird aber nur eins eingetragen.

Weil du immer noch FileName und nicht Files benutzt?

Das mit Files hat nicht so funktioniert wie ich mir das vorgestellt hatte ;) Er zeigt mir trotz Mehrfachselektierung nur einen Programmnamen an. Damit komm ich nicht weiter.

uligerhardt 20. Jul 2016 09:16

AW: OpenDialog Mehrfachauswahl, Filename
 
Dann machst du was falsch. :mrgreen:
Das funktioniert bei mir:
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
  FileName: string;
begin
  ListBox1.Clear;
  if OpenDialog1.Execute(Handle) then
  begin
    for FileName in OpenDialog1.Files do
      ListBox1.Items.Add(FileName);
  end;
end;

ConnorMcLeod 20. Jul 2016 09:41

AW: OpenDialog Mehrfachauswahl, Filename
 
Muss man dem StringGrid nicht noch vorher sagen, wieviele Rows es hat?
Delphi-Quellcode:
 
  StringGrid1.RowCount := StringGrid.FixedRows + OpenDialog1.Files.Count;
  // Eintragungen StringGrid
  for iNummer := 0 to OpenDialog1.Files.Count-1 do
  begin
    StringGrid1.Cells[0, StringGrid.FixedRows + iNummer + 1] := OpenDialog1.Files[iNummer]; //  <= !!
    StringGrid1.Cells[1, StringGrid.FixedRows + iNummer + 1] := inttostr(VersionsNummer);
  end;

Freyr77 20. Jul 2016 10:24

AW: OpenDialog Mehrfachauswahl, Filename
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1343037)
Muss man dem StringGrid nicht noch vorher sagen, wieviele Rows es hat?
Delphi-Quellcode:
 
  StringGrid1.RowCount := StringGrid.FixedRows + OpenDialog1.Files.Count;
  // Eintragungen StringGrid
  for iNummer := 0 to OpenDialog1.Files.Count-1 do
  begin
    StringGrid1.Cells[0, StringGrid.FixedRows + iNummer + 1] := OpenDialog1.Files[iNummer]; //  <= !!
    StringGrid1.Cells[1, StringGrid.FixedRows + iNummer + 1] := inttostr(VersionsNummer);
  end;

Das hab ich in den Eigenschaften manuell gemacht mit den Rows. Vielen Dank, auf genau das bin ich nicht gekommen!:thumb:

Freyr77 26. Jul 2016 15:19

AW: OpenDialog Mehrfachauswahl, Filename
 
Nochmal gleiches Thema:

Ich habe jetzt folgende Prozedur um die XML-Datei rekursiv zu durchsuchen:

Delphi-Quellcode:
var
  i: integer;

begin
  if pParentNode.NodeName = 'VerInfo_Keys' then
  begin
    fVersionInfo := pParentNode;

  end
  else
  begin
    for i := 0 to pParentNode.ChildNodes.Count - 1 do
    begin
      GetVersionInfo(pParentNode.ChildNodes[i]);
    end;
  end;
Damit möchte ich jetzt bei Button-Klick auslesen lassen, das sieht so aus:
Delphi-Quellcode:
var
  lFileName: string;
  iZaehler: integer;

begin
  OpenDialog1.Execute();
  // InternalName = FileName


  for iZaehler := 0 to MaxAnzahl -1 do
  begin

    // XML-Dokument laden

    CurrentXML := NewXMLDocument;
    CurrentXML.LoadFromFile(String(OpenDialog1.FileName));
    CurrentXML.Active := True;

    // XML-Dokument auslesen
    GetVersionInfo(CurrentXML.DocumentElement);
    GetFileName(CurrentXML.DocumentElement);

    if fVersionInfo <> nil then
    begin

    end;

    if fFileInfo <> nil then
    begin

    end;

    // Überschriften StringGrid
    StringGrid1.Cells[0, 0] := 'Projekt';
    StringGrid1.Cells[1, 0] := 'Version';

    // Eintragungen StringGrid
    begin
      StringGrid1.Cells[0, iZaehler] := '';
      StringGrid1.Cells[1, iZaehler] := '';
    end;

    // Aktualisieren sichtbar
    Button1.Visible := True;
  end;
... funktioniert aber nicht. Mir ist auch bewusst das die Eintragungen ins StringGrid gerade leere Strings sind. Weiß einer von euch wie ich die Prozedur jetzt richtig aufrufe?

DeddyH 26. Jul 2016 15:35

AW: OpenDialog Mehrfachauswahl, Filename
 
Du liest MaxAnzahl mal dieselbe Datei ein, wozu soll das gut sein?

Freyr77 26. Jul 2016 15:40

AW: OpenDialog Mehrfachauswahl, Filename
 
Zitat:

Zitat von DeddyH (Beitrag 1343499)
Du liest MaxAnzahl mal dieselbe Datei ein, wozu soll das gut sein?

Das ganze Ding ist etwas wirr. Mir geht es eigentlich nur um den korrekten Aufruf der Prozedur damit der Teil aus dem XML-Dokument in den StringGrid kommt.
Die Prozedur hab ich vor kurzem erst geschrieben und steh jetzt extrem auf dem Schlauch. Das Auslesen hatte sogar schon funktioniert.:lol:

ConnorMcLeod 26. Jul 2016 15:42

AW: OpenDialog Mehrfachauswahl, Filename
 
OpenDialog1.Files[iZaehler]...
Der Kreis schließt sich ;-)

HolgerX 26. Jul 2016 15:49

AW: OpenDialog Mehrfachauswahl, Filename
 
Und immer schön

Delphi-Quellcode:
if OpenDialog1.Execute then begin

..

end;
Denn wo der Benutzer keine Datei ausgewählt hat, steht in Files / Filename auch nichts drinnen ;)

Freyr77 26. Jul 2016 15:51

AW: OpenDialog Mehrfachauswahl, Filename
 
Zitat:

Zitat von HolgerX (Beitrag 1343504)
Und immer schön

Delphi-Quellcode:
if OpenDialog1.Execute then begin

..

end;
Denn wo der Benutzer keine Datei ausgewählt hat, steht in Files / Filename auch nichts drinnen ;)

Das ist eine Button-Click Prozedur, deswegen bleibt dem Nutzer nichts anderes übrig außer etwas auszuwählen oder das Programm zu beenden :wink:
Hat jemand eine Lösung zu meiner eigentlichen Frage? Der Rest wird nachher überarbeitet, versprochen :lol:

ConnorMcLeod 26. Jul 2016 15:58

AW: OpenDialog Mehrfachauswahl, Filename
 
Zeig mal, was Du bisher hast (simples aber komplettes Beispielprojekt), damit ich verstehen kann, was Du nicht verstehst.
Weil nämlich - wenn das Ganze in einer Prozedur ist, dann hat die einen Namen. Und mittels dem Namen kann man sie dann auch aufrufen.
Sollte daran etwas nicht klar sein oder nicht funktionieren, dann seh ich lieber das ganze Bild als nur einen Ausschnitt.

Aviator 26. Jul 2016 22:47

AW: OpenDialog Mehrfachauswahl, Filename
 
Zitat:

Zitat von Freyr77 (Beitrag 1343505)
Zitat:

Zitat von HolgerX (Beitrag 1343504)
Und immer schön

Delphi-Quellcode:
if OpenDialog1.Execute then begin

..

end;
Denn wo der Benutzer keine Datei ausgewählt hat, steht in Files / Filename auch nichts drinnen ;)

Das ist eine Button-Click Prozedur, deswegen bleibt dem Nutzer nichts anderes übrig außer etwas auszuwählen oder das Programm zu beenden :wink:

Der Benutzer kann dann aber immer noch das X oder Abbrechen im OpenDialog anklicken. Und schon läuft deine Funktion ins Leere. Wieso sträubst du dich so davor es richtig zu machen? :shock: Es sind nur zwei Zeilen die du zu deinem Code hinzufügen müsstest und schon hättest du eine mögliche Fehlerquelle entfernt. :roll:

DeddyH 27. Jul 2016 06:55

AW: OpenDialog Mehrfachauswahl, Filename
 
So schwer ist das doch gar nicht:
Delphi-Quellcode:
if OpenDialog1.Execute then
  for i := 0 to OpenDialog1.Files.Count - 1 do
    DateiAuswerten(OpenDialog1.Files[i]);
Dabei wird DateiAuswerten eine eigene Routine mit einem String-Parameter für den Dateinamen, feddich is die Laube.

uligerhardt 27. Jul 2016 07:19

AW: OpenDialog Mehrfachauswahl, Filename
 
Zitat:

Zitat von HolgerX (Beitrag 1343504)
Und immer schön

Delphi-Quellcode:
if OpenDialog1.Execute then begin

..

end;
Denn wo der Benutzer keine Datei ausgewählt hat, steht in Files / Filename auch nichts drinnen ;)

http://www.delphipraxis.net/1343034-post8.html :mrgreen:


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