![]() |
Vista OpenFileDialog
Hallo Leute,
bei dem Vista OpenFileDialog gibt es die Möglichkeit eine Datei nur zum Lesen zu öffnen. Diese Option vermisse ich bei der Delphi XE Komponente. Ich bin bei Delphi XE Neuling, übersehe ich da was? Gehört hier nicht hin: aber ich lese von einem Virus, der Delphi befallen soll? Ich habe Delphi XE Trial am Samstag installiert, könnte ich davon betroffen sein? MfG Willie |
AW: Vista OpenFileDialog
inzwischen kann ich mir die Antwort selbst geben. Ja, hier hat Borland geschlampt und etwas vergessen. Ich habe eine andere Lösung gefunden.
W. |
AW: Vista OpenFileDialog
Wäre schön, wenn du uns diese noch mitteilen würdest.
|
AW: Vista OpenFileDialog
Zitat:
Welche "andere Lösung gefunden"? Bitte belegen oder Guttenbergen! MfG |
AW: Vista OpenFileDialog
Hi, ich hatte gefragt, ob bei die Vista OpenFile Kompomente die Möglichkeit besteht, eine Datei als schreibgeschüzt zu öffnen. Diese Möglichkeit bietet der Vista OFD, Borland hat vergessen diese Option ein zu bauen.
Meine Lösung: Ich hatte für D-2005 nach einem Rezept des SwissDelphi Forum direkt comdlg32.dll angezapt. Die Umsetzung auf D-XE erweist sich als schwierig. U.a. löst (p: PAnsiChar, s: string) p:=PChar(s) eine Fehlermeldung des Compilers aus, auch p:=PAnsiChar(s) liefert nur das 1. Zeichen zurück! Kann jemand helfen? Wenn die Sache läuft, melde ich mich. W. |
AW: Vista OpenFileDialog
Wenn p PAnsiChar ist, dann sollte s auch AnsiString sein.
|
AW: Vista OpenFileDialog
also p:=PAnsiChar(AnsiString(s)) ?
Willie |
AW: Vista OpenFileDialog
Jepp.
|
AW: Vista OpenFileDialog
Zitat:
Zitat:
|
AW: Vista OpenFileDialog
Ich habe das mal schnell umgeschrieben und in eine Unit gepackt, falls jemand Fehler entdeckt, korrigiere man mich bitte.
Delphi-Quellcode:
unit uCustomFileDialog;
interface uses Windows; function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir, Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean; implementation uses ShlObj, SysUtils; type POpenFilenameA = ^TOpenFilenameA; tagOFNA = packed record lStructSize: DWORD; hWndOwner: HWND; hInstance: HINST; lpstrFilter: PAnsiChar; lpstrCustomFilter: PChar; nMaxCustFilter: DWORD; nFilterIndex: DWORD; lpstrFile: PAnsiChar; nMaxFile: DWORD; lpstrFileTitle: PAnsiChar; nMaxFileTitle: DWORD; lpstrInitialDir: PAnsiChar; lpstrTitle: PAnsiChar; Flags: DWORD; nFileOffset: Word; nFileExtension: Word; lpstrDefExt: PAnsiChar; lCustData: LPARAM; lpfnHook: function(Wnd: HWND; Msg: UINT; ParamW: WPARAM; ParamL: LPARAM): UINT stdcall; lpTemplateName: PAnsiChar; end; TOpenFilenameA = tagOFNA; POpenFilenameW = ^TOpenFilenameW; tagOFNW = packed record lStructSize: DWORD; hWndOwner: HWND; hInstance: HINST; lpstrFilter: PWideChar; lpstrCustomFilter: PChar; nMaxCustFilter: DWORD; nFilterIndex: DWORD; lpstrFile: PWideChar; nMaxFile: DWORD; lpstrFileTitle: PWideChar; nMaxFileTitle: DWORD; lpstrInitialDir: PWideChar; lpstrTitle: PWideChar; Flags: DWORD; nFileOffset: Word; nFileExtension: Word; lpstrDefExt: PWideChar; lCustData: LPARAM; lpfnHook: function(Wnd: HWND; Msg: UINT; ParamW: WPARAM; ParamL: LPARAM): UINT stdcall; lpTemplateName: PWideChar; end; TOpenFilenameW = tagOFNW; TOpenFilename = {$IFDEF UNICODE}TOpenFilenameW{$ELSE}TOpenFilenameA{$ENDIF}; function GetOpenFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name {$IFDEF UNICODE}'GetOpenFileNameW'{$ELSE}'GetOpenFileNameA'{$ENDIF}; function GetSaveFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name {$IFDEF UNICODE}'GetSaveFileNameW'{$ELSE}'GetSaveFileNameA'{$ENDIF}; const OFN_DONTADDTORECENT = $02000000; OFN_FILEMUSTEXIST = $00001000; OFN_HIDEREADONLY = $00000004; OFN_PATHMUSTEXIST = $00000800; function CharReplace(const Source: string; oldChar, newChar: Char): string; var i: Integer; begin Result := Source; for i := 1 to Length(Result) do if Result[i] = oldChar then Result[i] := newChar end; function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir, Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean; var ofn: TOpenFileName; szFile: array[0..MAX_PATH] of Char; begin Result := False; FillChar(ofn, SizeOf(TOpenFileName), 0); with ofn do begin lStructSize := SizeOf(TOpenFileName); hwndOwner := ParentHandle; lpstrFile := szFile; nMaxFile := SizeOf(szFile); if (Title <> '') then lpstrTitle := PChar(Title); if (InitialDir <> '') then lpstrInitialDir := PChar(InitialDir); StrPCopy(lpstrFile, FileName); lpstrFilter := PChar(CharReplace(Filter, '|', #0)+#0#0); if DefExt <> '' then lpstrDefExt := PChar(DefExt); end; if IsOpenDialog then begin if GetOpenFileName(ofn) then begin Result := True; FileName := StrPas(szFile); end; end else begin if GetSaveFileName(ofn) then begin Result := True; FileName := StrPas(szFile); end; end end; end. |
AW: Vista OpenFileDialog
vielen Dank für den Code.
Ich kann es leider nicht testen, weil plötzlich der Norton-Virenwächter Alarm schlägt und keine Exe-Datei mehr durchlässt!! (Auch ein leeres Formular nicht.) Willie |
AW: Vista OpenFileDialog
Wo kann ich das Flag für Unicode setzen ?
Hab mit deinem OpenFileDialog riesen Speicherleck gruss |
AW: Vista OpenFileDialog
Zitat:
Zitat:
|
AW: Vista OpenFileDialog
Zitat:
![]() EDIT: Noch ein Bild angehangen. gruss |
AW: Vista OpenFileDialog
irgenwie verträgt sich das nicht!
Delphi-Quellcode:
function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir, Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean;
mit
Delphi-Quellcode:
TOpenFilename = {$IFDEF UNICODE}TOpenFilenameW{$ELSE}TOpenFilenameA{$ENDIF};
wenn der FileName als string ausgelegt ist. Deshalb meine Frage nach dem Flag.. Funktioniert nur mit FileName als WideString! trotzdem bekomme ich dann nach dem beenden wieder jedemenge Speicherlecks. 34x dieser Block. Zitat:
gruss |
AW: Vista OpenFileDialog
Du hast ja auch noch Delphi2006, erst ab Delphi2009 ist String als WideString deklariert. Du musst also WideString nehmen.
|
AW: Vista OpenFileDialog
Zitat:
Ja tue ich ja. Aber das problem bleibt bestehen Speicherleck nach dem beenden der Anwendung. Aber erst dann nachdem eine Datei über diese Dialog Funktion eingeladen wurde. Bei der verwendung des Flags {$IFDEV UNICODE} sollte man meines erachtens dann auch eine Überladene function hinzufügen Oder ?
Delphi-Quellcode:
Jetzt mal ernsthaft soll man den ganzen Kram einfach ignorieren mit den Speicherlecks ?
function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir, Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean; overload;
function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir, Title: WideString; var FileName: WideString; IsOpenDialog: Boolean): Boolean; overload; Das ist ja ein Fass ohne Boden. EDIT: Auf jedenfall fehlen auch noch die Flags.
Delphi-Quellcode:
with ofn do
begin lStructSize := SizeOf(TOpenFileName); hwndOwner := ParentHandle; lpstrFile := szFile; nMaxFile := SizeOf(szFile); if IsOpenDialog then Flags := OFN_EXPLORER or OFN_ALLOWMULTISELECT or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST else Flags := OFN_LONGNAMES or OFN_PATHMUSTEXIST or OFN_OVERWRITEPROMPT; gruss |
AW: Vista OpenFileDialog
Hallo Emil,
Zitat:
Delphi-Quellcode:
lStructSize := Length(TOpenFileName) * SizeOf(Char);
|
AW: Vista OpenFileDialog
Delphi-Quellcode:
ist schon richtig.
SizeOf(TOpenFileName)
Und nein, es gibt kein Flag. (man kann höchsten hoffen, daß der Compilerschalter "UNICODE" gesetzt wurde) Aber Zitat:
Wobei: was ist szFile? Wenn das ein PChar ist, dann stimmt SizeOf sowieso nicht, denn das ist die Größe des Zeigers und nicht des Inhalts. Ab Delphi 2009 ist String, Char, PChar und die dynamische WinAPI immer auf Unicode eingestellt. (es sei denn jemand hat Mist gebaut oder von der API existiert nur eine der beiden Ansi/Unicode-Versionen) Tipp: Falls man nicht unbedingt viel Ahnung von der WinAPI hat, dann könnte man natürlich notfalls auch die entsprechenden VCL-Kapselungen verwenden, wie z.B. ![]() ![]() [edit] Wann wurde eigentlich der neue Vista-Dilaog TFileOpenDialog in Delphi eingeführt? |
AW: Vista OpenFileDialog
Zitat:
So wie ich gesehen habe has tdu diesen ja geschrieben bzw von der Schweizer Delphi Seite erweitert. Zitat:
Oder muss ich mich darum kümmern. Zitat:
Was nichts damit zu tun hat ob ich unter Delphi die richtigen Unicode Variablen Verwende oder nicht. Mein Frage wäre aber Wie kann ich die Speicherlecks beseitigen. Bei einigen kann man ja sehen wo unter umständen das Problem liegt solange man im Block irgendwelche Pfade angezeigt bekommt. Aber bei Unknow? Wie soll man das identifizieren um den Fehler zu beseitigen. Raten? Siehe ![]() Wie eingrenzen.. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz