![]() |
AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
Zitat:
Zitat:
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; |
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 |
AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
Zitat:
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: |
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 |
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:
|
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:
Aufruf:
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;
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; |
AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Schluß für heute! Und warum gibt's hier eigentlich keinen versöhnlichen "Prost-Smiley" :evil: Prost! |
AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
Zitat:
|
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: |
AW: Open- und SaveDialoge sollen nur Dateien (keine Ordner) anzeigen
Na dann laß es weg?
[edit] Oder mach bei dir dort ein
Delphi-Quellcode:
drumrum. [edit/]
{IFNDEF VER130}...{$ENDIF}
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: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 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