Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen (https://www.delphipraxis.net/166388-open-und-savedialoge-sollen-nur-dateien-keine-ordner-anzeigen.html)

Gustav.R 10. Feb 2012 21:52


Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Ich möchte verhindern, daß der Anwender beim Open- oder SaveDialog den Ordner wechseln kann (geht um ein portables Programm).

ofNoChangeDir := true

bringt's leider nicht.

Gibt's eine Möglichkeit, im Open- bzw. SaveDialog die Ordner auszublenden?

Delphi 5 :oops:

Danke!

GG

Habe gerade http://www.delphipraxis.net/128286-v...hindern-2.html gefunden. Muß wohl selber was basteln :cry:

himitsu 10. Feb 2012 22:56

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Prüf einfach das Verzeichnis, nachdem der Benutzer auf OK geklickt hat und gib eine entsprechende Fehlermeldung aus.

Popov 10. Feb 2012 22:59

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Bei OpenDialog gibt es die Möglichkeit nach dem Öffnen zurück zum Standardordner zurück zu kehren.

Ansonsten bietet sich an ein eigenes OpenDialog mit TShellListView zu erstellen. Hier kann man Folder abschalten.

Christian Seehase 10. Feb 2012 23:28

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Moin Gustav,

wenn das Verzeichnis sowieso festliegt, könntest Du ja auch auf TSaveDialog bzw. TOpenDialog verzichten, und Dir einfach einen einfachen Dialog für Dateinamen selber erstellen.

Gustav.R 10. Feb 2012 23:31

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Zitat:

Zitat von himitsu (Beitrag 1150410)
Prüf einfach das Verzeichnis, nachdem der Benutzer auf OK geklickt hat und gib eine entsprechende Fehlermeldung aus.

Der Anwender soll erst garnicht in einen anderen Ordner gehen dürfen, das ist das Problem - nicht die Fehlermeldung danach...

Trotzdem Danke fürs Lesen!

Gustav.R 10. Feb 2012 23:32

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Zitat:

Zitat von Popov (Beitrag 1150411)
Bei OpenDialog gibt es die Möglichkeit nach dem Öffnen zurück zum Standardordner zurück zu kehren.

Ansonsten bietet sich an ein eigenes OpenDialog mit TShellListView zu erstellen. Hier kann man Folder abschalten.

Schau ich mir gerade an, aber wo ist bei Delphi5 der TShellListView...

Danke für den Hinweis!

Gustav.R 10. Feb 2012 23:37

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Zitat:

Zitat von Christian Seehase (Beitrag 1150413)
Moin Gustav,

wenn das Verzeichnis sowieso festliegt, könntest Du ja auch auf TSaveDialog bzw. TOpenDialog verzichten, und Dir einfach einen einfachen Dialog für Dateinamen selber erstellen.

Jupp, mache ich gerade mehr oder weniger mit einer TFileListBox von den uralten "Win 3.1" Komponenten :thumb:

Also um's "Selbst ist der Mann" bei Delphi5 führt wohl kein bequemer Weg herum :cry:

Danke!

LG
Gustav

Popov 10. Feb 2012 23:46

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Wenn, dann im Reiter Beispiele.

Gustav.R 11. Feb 2012 00:03

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
#NV (Nicht Verfügbar (in Delphi5))

Wozu ist das

ofNoChangeDir := true

eigentlich gut, wenn es gerade nicht das verhindert, was man (ich halt) davon erwartet?

Verwirrte Grüße
G

Popov 11. Feb 2012 00:28

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Was ich oben gesagt habe:

Zitat:

Bei OpenDialog gibt es die Möglichkeit nach dem Öffnen zurück zum Standardordner zurück zu kehren.
Wenn du dich in OpenDialog in Ordnern bewegst, egal wo du bist, bei nächsten Start ist er wieder im eingestellten Ordner.

himitsu 11. Feb 2012 00:33

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Zitat:

Der Anwender soll erst garnicht in einen anderen Ordner gehen dürfen, das ist das Problem - nicht die Fehlermeldung danach...
Vielleicht seh ich die Anforderung auch etwas anders.

Zitat:

Der benutzer darf keine Datei in einem anderem Verzeichnis öffnen/speicherm.
Das beinhaltet für micht nicht, daß er nicht mal kurz dort nachsehn darf.

Spätestens nach der erster Fehlermeldung wird er freiwillig nicht mehr das Verzeichnis wechseln. :stupid:

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
  Dir: string;
begin
  OpenDialog1.Options   := [ofHideReadOnly,ofNoChangeDir,ofPathMustExist,ofFileMustExist,ofNoNetworkButton,ofNoDereferenceLinks,ofEnableSizing];
  OpenDialog1.OptionsEx := [ofExNoPlacesBar];

  Dir := ExtractFileDir(Application.ExeName);
  OpenDialog1.FileName  := '';
  OpenDialog1.InitialDir := Dir;
  while OpenDialog1.Execute do begin
    if AnsiSameText(ExtractFileDir(OpenDialog1.FileName), Dir) then begin

      // hier die Datei auslesen oder sich merken, das es nach diesem Code gemacht werden soll

      Break;
    end else begin
      if MessageDlg('Die Datei muß im vorgegebenen Verzeichnis liegen!', mtError, [mbRetry, mbCancel], 0) <> mrRetry then
        Break;
      OpenDialog1.FileName := Dir + PathDelim + ExtractFileName(OpenDialog1.FileName);
    end;
  end;

end;

Gustav.R 11. Feb 2012 00:36

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Und wie ich oben schon schrub:

"Der Anwender soll erst garnicht in einen anderen Ordner gehen dürfen, das ist das Problem - nicht die Fehlermeldung danach..." oder das Zurückwechseln in diesen Ordner.

Der Anwender soll und darf nur im festgelegten Ordner speichern oder öffnen dürfen, darum geht's mir...

GG

himitsu 11. Feb 2012 00:44

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Zitat:

Zitat von Gustav.R (Beitrag 1150424)
Der Anwender soll und darf nur im festgelegten Ordner speichern oder öffnen dürfen, darum geht's mir...

Und genau das kann man auch sicherstellen, selbst wenn der Benutzer im Dialog das Verzeichnis wechseln könnte. :zwinker:

Anderes Beispiel:
Bei einem Edit kann man auch erst im OnExit prüfen, ob die Eingabe gültig ist, anstatt im OnChange.
Wenn man das schon wärend der Eingabe prüft, könnte es einige Probleme geben.
z.B. prüfe mal, ob jemand eine gültige Zahl eingibt, wie z.B. "12,34".

"" = ungültig
"1" = gültig
"12" = gültig
"12," = ungültig
"12,3" = gültig
"12,34" = gültig

Und jetzt verrate mir mal einer, wie man dort jetzt diese Zahl eingeben soll?
"1234" und nachträglich das Komma rein?
Und was macht man, wenn schon "9" drinsteht? (rauslöschen und neu anfangen geht nicht)


Gut, hier hat nicht der Benutzer das Problem, sondern du, aber egal.
Man kann sich das Leben auch unnötig schwer machen. :angle:

Gustav.R 11. Feb 2012 00:47

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
@himitsu: Danke für den Qualtext (der unter D5 nicht kompilieren wird). Aber warum sollte ich dem Anwender in anderen Ordner nachschauen lassen, wenn er dort sowieso nicht speichern darf?

LG
Gustav

himitsu 11. Feb 2012 00:49

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Warum darf ich in WinNT (als nicht Administrator) z.B. im Speicherndialog Verzeichnisse wie C:\Programme oder C:\Windows auswählen, auch wenn ich dort nicht speichern darf?

Im Notfall gibt es noch TFileListBox :lol:

Zitat:

der unter D5 nicht kompilieren wird
Und warum nicht?

Popov 11. Feb 2012 00:51

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Ich habe auf die Schnelle etwas zusammengestellt. Du brauchst nur eine Listbox. Mit GetFiles werden die Dateien mit Pfad eingelesen. In DrawListBox wird es auf Dateinamen gekürzt und das passende Icon davorgezeichnet. Und siehe da, eine DateiListBox.
Delphi-Quellcode:
uses
  ShellApi;

//Liefert Datei-Liste ohne Unterordner
procedure GetFiles(Path, ExtMask: String; List: TStrings);
var
  Attrib, k: Integer;
  Search: TSearchRec;
begin
  if Path[Length(Path)] <> '\' then Path := Path + '\';

  Attrib := faArchive + faReadOnly + faHidden;

  while Copy(ExtMask, 1, 1) = '.' do
    Delete(ExtMask, 1, 1);

  if FindFirst(Path + '*.' + ExtMask, Attrib, Search) = 0 then
  repeat
    List.Add(Path + Search.Name);
  until FindNext(Search) <> 0;

  FindClose(Search);
end;

function GetIconFromFile(const szFilename: string;
  fSmall: boolean = false): TIcon; {uses ShellApi}
const
  dwIconFlags : array[boolean]of dword =
    (SHGFI_LARGEICON,SHGFI_SMALLICON);
var
  fi : TSHFileInfo;
begin
  Result := nil;

  // Symbol der Datei aus dem System ermitteln
  // Typ (= groß/klein) richtet sich nach dem
  // Funktionsparameter "fSmall" (default = false)
  ZeroMemory(@fi,sizeof(fi));
  SHGetFileInfo(pchar(szFilename),0,fi,sizeof(fi),
    SHGFI_ICON or dwIconFlags[fSmall]);

  // Symbol ermittelt
  if(fi.hIcon <> 0) then
  begin
    Result := TIcon.Create;
    if(Result <> nil) then
      Result.Handle := fi.hIcon;
  end;
end; {by MathiasSimmack}

procedure DrawListBox(Control: TWinControl; Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
const
  Col1: array [Boolean] of TColor = (clWindow, clWindow); //Zebra-Wunschfarben
  Col2: array [Boolean] of TColor = (clInactiveCaptionText, clWindowText);
var
  TopDifTxt, TopDifIco: Integer; // Gleicht die Höhendifferenz aus
  Icon: TIcon;
begin
  with (Control as TListbox) do
  begin
    if odSelected in State then Canvas.Font.Color := clCaptionText else begin
      Canvas.Brush.Color := Col1[Odd(Index)];
      Canvas.Font.Color := Col2[(Control as TListbox).Enabled];
    end;
    TopDifTxt := (ItemHeight div 2) - (Canvas.TextHeight(Items[Index]) div 2);
    TopDifIco := (ItemHeight div 2) - (16 div 2);

    Canvas.TextRect(Rect, Rect.Left + 20, Rect.Top + TopDifTxt,
      ExtractFileName(Items[Index]));

    Canvas.Draw(Rect.Left + 2, Rect.Top + TopDifIco,
      GetIconFromFile(Items[Index], True));
  end;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  DrawListBox(Control, Index, Rect, State);
end;
Aufruf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Style := lbOwnerDrawFixed; //kann bereits in Create eingestellt werden
  ListBox1.ItemHeight := 20; //kann bereits in Create eingestellt werden

  GetFiles('c:\windows', '*', ListBox1.Items);
end;

Gustav.R 11. Feb 2012 01:00

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Gut, hier hat nicht der Benutzer das Problem, sondern du, aber egal.
Man kann sich das Leben auch unnötig schwer machen. :angle:

Im Notfall gibt es noch TFileListBox :lol:
Schrub ich doch bereits in #7 :P

Schluß für heute! Und warum gibt's hier eigentlich keinen versöhnlichen "Prost-Smiley" :evil:

Prost!

Sir Rufo 11. Feb 2012 01:08

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Zitat:

Zitat von Gustav.R (Beitrag 1150430)
Schluß für heute! Und warum gibt's hier eigentlich keinen versöhnlichen "Prost-Smiley" :evil:

:cheers:

Gustav.R 11. Feb 2012 09:22

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin, sehr müdes Moin :-)

@himitsu: OpenDialog1.OptionsEx := [ofExNoPlacesBar]; kennt mein fünfer Oldtimer-Delphi nicht :-(

@Popov: Vielen Dank für Deinen Sourcecode, läuft auf eine TFileListBox mit den richtigen Icons darin hinaus.

@Sir Rufo: Den Smiley habe ich gemeint, aber nicht gefunden ;-)

Bastle mir gerade ein Formular mit TFileListBox zurecht, das halbwegs Ähnlichkeit mit einem Open-/SaveDialog hat.

@all: Die uralte "Win 3.1"-Komponente TFileListBox funktioniert sogar noch unter Win8DP, siehe Screenshot der unter Win8DP gestarteten, manifestlosen D5-Echse ;-)

Und nun gehe ich wieder zurück ins Bett.

Vielen Dank an Alle,
sonnige, aber arschkalte Grüße (-14° C)

Gustav

Edit: Habe das Hochladen des Screenshots vergessen :oops:

himitsu 11. Feb 2012 09:38

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Na dann laß es weg?
[edit] Oder mach bei dir dort ein
Delphi-Quellcode:
{IFNDEF VER130}...{$ENDIF}
drumrum. [edit/]

Ich hatte die maximalen Parameter verwendet und da kann es gut sein, daß früher noch nicht alles bekannt/vorhanden war.
ofExNoPlacesBar ist für die Auswahlliste (Icons) auf der linken Seite, also für die Schnellwahlliste bekannte und beliebter Plätze/Orte/Verzeichnisse.

Vielleicht möchte auch jemand mit einem neueren Delphi den Code mal verwenden ... der/die braucht dann nichts/weniger weglassen, was dessen Delphi nicht kennt. :angle:
Wobei man die ersten beiden Zeilen auch direkt im OI einstellen und im Code weglassen kann.

Wie gemerkt, funktioniert ofNoChangeDir aktuell nicht, aber es ist dennoch drin, falls es doch irgendwo/irgendwann funktioniert.
Und wie gesagt, ist es nicht unbedingt nötig das zu verhindern (schon in dem Dialog) ... die Parameter sind nur so gewählt, um es zu erschweren.


PS: ofFileMustExist muß z.B. bei einem Speicherdialog weg. :roll: (sonnt könnte man keine neuen Dateien erstellen, sondern nur Alte überschreiben :lol: )

Gustav.R 11. Feb 2012 10:30

AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
 
Hätte wohl doch keine Cola trinken sollen :-(

@himitsu: Vielen Dank für Deine Bemühungen, aber - soweit ich das bisher überblicke - lassen sich TOpen- und TSaveDialog nicht soweit kastrieren, daß kein Ordnerwechsel mehr möglich ist. Die beiden Dialoge kommen daher nicht mehr in Frage, sondern ein selbstgebautes Formular das auf einer TFileListBox basiert.

Der Anwender meines "portablen" Programms darf nur im "Installationsordner" des Programms Dateien öffnen oder speichern. Darum soll der Anwender auch nicht z.B. auf Laufwerk C: nachschauen dürfen, was es da so an Dateien gibt, weil er sowieso nur auf dem USB-Stick speichern oder öffnen kann.

Sorry, falls wir aneinander vorbeigeschrieben haben :oops:

Müde Grüße
Gustav


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