HistoryList 已经没什么用了 是以前老版本delphi 可以这样吗? var OldStr:STRING; dlgOpen1FolderChange 里做对比 如果超过范围则返回到 你指定的目录。
uses FileCtrl procedure TchmForm.Button1Click(Sender: TObject); var dir:string; begin SelectDirectory('test','c:\', dir); end; 这是限制选择文件夹位置.限制选择文件要绕个弯子(我目前所能找到的办法) 定义两个全局变量: var OpenDialog:TOpenDialog; dir:string;procedure TchmForm.Button1Click(Sender: TObject); begin dir:='c:\'; OpenDialog:=TOpenDialog.Create(nil); OpenDialog.InitialDir := dir; OpenDialog.OnSelectionChange := mytest; OpenDialog.Execute; end;procedure TchmForm.mytest(Sender: TObject); begin if Pos(dir,LowerCase(OpenDialog.FileName))=0 then begin OpenDialog.Free; Button1.Click; end; end;结果是用户可以切换驱动器,但切换后,一旦他选择某个文件或文件夹,即切换到初始状态(无闪烁)
type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); procedure OpenDialog1FolderChange(Sender: TObject); private { Private declarations } Busy: boolean; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure SetOpenDialogDir(hWnd: HWND; Path: string;var Busy:Boolean); const ID_FILENAME_98 = 1152; ID_FILENAME_WIN2K=1148; ID_OK = 1; var hFileName: THandle; hOK: THandle; Buff:string[255]; begin if Busy then exit; Busy:=True; if Win32MajorVersion >= 5 then begin hFileName:= GetDlgItem(GetParent(hWnd), ID_FILENAME_WIN2K); hFileName:=FindWindowEx(hFileName,0,'ComboBox',nil); hFileName:=FindWindowEx(hFileName,0,'Edit',nil); end else hFileName := GetDlgItem(GetParent(hWnd), ID_FILENAME_98); hOK := GetDlgItem(GetParent(hWnd), ID_OK); GetWindowText(hFileName,@Buff[1],Length(Buff)); if LowerCase(Buff)=LowerCase(Path) then exit; SetWindowText(hFileName, pchar(Path)); SendMessage(hOK, WM_LBUTTONDOWN, MK_LBUTTON, MAKEWORD(0, 0)); SendMessage(hOK, WM_LBUTTONUP, MK_LBUTTON, MAKEWORD(0, 0)); Busy :=False; end; procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Execute; end;procedure TForm1.OpenDialog1FolderChange(Sender: TObject); begin SetOpenDialogDir(OpenDialog1.Handle, 'D:\Programs\Delphi',Busy); end;
我看了 FolderChange 這個事件,但似乎FolderChange是在Folder在改變後才觸發的,這樣的話判斷當前目錄還有用嗎?怎樣控制?
-----------
改变前纪录一下当前位置 在foloderchange事件里 如果超过你限制范围 返回纪录的位置
OldStr:STRING; dlgOpen1FolderChange 里做对比 如果超过范围则返回到 你指定的目录。
procedure TchmForm.Button1Click(Sender: TObject);
var dir:string;
begin
SelectDirectory('test','c:\', dir);
end;
这是限制选择文件夹位置.限制选择文件要绕个弯子(我目前所能找到的办法)
定义两个全局变量:
var OpenDialog:TOpenDialog;
dir:string;procedure TchmForm.Button1Click(Sender: TObject);
begin
dir:='c:\';
OpenDialog:=TOpenDialog.Create(nil);
OpenDialog.InitialDir := dir;
OpenDialog.OnSelectionChange := mytest;
OpenDialog.Execute;
end;procedure TchmForm.mytest(Sender: TObject);
begin
if Pos(dir,LowerCase(OpenDialog.FileName))=0 then
begin
OpenDialog.Free;
Button1.Click;
end;
end;结果是用户可以切换驱动器,但切换后,一旦他选择某个文件或文件夹,即切换到初始状态(无闪烁)
type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure OpenDialog1FolderChange(Sender: TObject);
private
{ Private declarations }
Busy: boolean;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure SetOpenDialogDir(hWnd: HWND; Path: string;var Busy:Boolean);
const
ID_FILENAME_98 = 1152;
ID_FILENAME_WIN2K=1148;
ID_OK = 1;
var
hFileName: THandle;
hOK: THandle;
Buff:string[255];
begin
if Busy then exit;
Busy:=True;
if Win32MajorVersion >= 5 then
begin
hFileName:= GetDlgItem(GetParent(hWnd), ID_FILENAME_WIN2K);
hFileName:=FindWindowEx(hFileName,0,'ComboBox',nil);
hFileName:=FindWindowEx(hFileName,0,'Edit',nil);
end else hFileName := GetDlgItem(GetParent(hWnd), ID_FILENAME_98);
hOK := GetDlgItem(GetParent(hWnd), ID_OK);
GetWindowText(hFileName,@Buff[1],Length(Buff));
if LowerCase(Buff)=LowerCase(Path) then exit;
SetWindowText(hFileName, pchar(Path));
SendMessage(hOK, WM_LBUTTONDOWN, MK_LBUTTON, MAKEWORD(0, 0));
SendMessage(hOK, WM_LBUTTONUP, MK_LBUTTON, MAKEWORD(0, 0));
Busy :=False;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Execute;
end;procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
begin
SetOpenDialogDir(OpenDialog1.Handle, 'D:\Programs\Delphi',Busy);
end;
我查了查 win32 API,似乎有個DlgDirSelectComboBoxEx,但是它的第四個參數要求combolist的ID,我衹知道這個combolist的handle,怎樣取得它的ID?