2010-10-25 7 views
5

Một nền tảng nhỏ của chương trình:
Chương trình sử dụng giao diện tab để làm việc trên nhiều tệp cùng một lúc.
Tôi đang cố gắng thay đổi thư mục OpenDialog nên mỗi lần tôi gọi mở tệp sẽ hiển thị thư mục của tệp tôi đang làm, nhưng ngay cả khi tôi đặt InitialDir vào đường dẫn của tệp, nó luôn hiển thị lần mở cuối cùng thư mục tệp, không phải thư mục tôi đang đặt.
tôi thử như sau:Thay đổi thư mục của Delphi OpenDialog

if Length(CurrentFileName) > 0 then 
begin 
    OpenFileDialog.InitialDir :=''; 
    SetCurrentDirectory(PChar(CurrentFileName)); 
    OpenFileDialog.InitialDir := ExtractFileDir(CurrentFileName); 
end; 
if OpenFileDialog.Execute then 
... 

đâu CurrentFileName có đường dẫn đầy đủ với tên tập tin của dòng tab đã mở tập tin. Nhưng không may mắn.

Có cách nào để đạt được điều này không?

Vì vậy, ví dụ:

tab1c:\mydir\file.txt mở
tab2d:\someotherdir\somefile.txt mở

Nếu tôi chuyển sang tab1 và gọi hàm mở tôi các OpenDialog nên chỉ cho tôi nội dung của c:\mydir\

Tôi đang sử dụng Delphi 7. Bất kỳ trợ giúp được đánh giá cao.

+0

Lạ lùng thay, mã của bạn ở trên hoạt động tốt đối với tôi (Delphi 2009, Win 7). –

+0

Tôi sử dụng borland C++ tương tự ... bạn quên thêm "\\" vào cuối InitialDir (đôi khi nó hoạt động mà không có nó nhưng không phải là allways), và đôi khi cũng giúp gọi OpenDialog.Update() – Spektre

Trả lời

5

Tôi nghĩ rằng

if Length(CurrentFileName) > 0 then 
    OpenFileDialog.FileName := ExtractFilePath(CurrentFileName); 

if OpenFileDialog.Execute 

là cách để đi, nhưng dường như tình hình hơi bị xáo trộn hơn tôi tưởng.

Nhưng dù sao, tôi nghiêm túc nghi ngờ rằng

OpenFileDialog.FileName := ExtractFilePath(CurrentFileName); 
    OpenFileDialog.InitialDir := OpenFileDialog.FileName; 
    SetCurrentDirectory(PChar(OpenFileDialog.FileName)); 

sẽ làm cho bạn thất vọng. Bây giờ ba cách chính để xác định đạo hàm nói cùng một điều! Một chút quá giết, nhưng nếu Windows đã thay đổi hành vi của nó, nó có thể là cần thiết.

Nhân tiện, có một lỗi trong mã của bạn. SetCurrentDirectory muốn có một thư mục làm đối số chứ không phải tên tệp.

+0

và không hoạt động! cảm ơn! –

+0

Tôi có nghĩa là 'now' và không phải 'không' –

0

Chỉ cần thử nghiệm và mã bên dưới hoạt động trong Delphi 2010. Hoặc là một lỗi trong Delphi 7 hoặc bạn cần phải kiểm tra lại rằng giá trị của CurrentFileName là những gì bạn dự định.

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    opendialog1.InitialDir := 'c:\temp'; 
    opendialog1.Execute; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    opendialog1.InitialDir := 'c:\temp\fpc'; 
    opendialog1.Execute; 
end; 
+0

Bạn có chọn 'OK' (hoặc' Mở') khi bạn mở hộp thoại lần đầu tiên? –

+0

Tôi đã cố gắng buộc một thư mục cụ thể, như bạn đã làm trong ví dụ này, và nó vẫn không hoạt động. Tôi nghi ngờ đó là một lỗi trên delphi 7 nhưng tôi không biết ... –

+0

@Andreas: Tôi vừa chọn tệp và nhấn enter. Tại sao? –

3

tài sản FileName nên được xóa, ví dụ:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    OpenDialog1.FileName:= ''; 
    OpenDialog1.InitialDir:= 'C:\'; 
    OpenDialog1.Execute; 
end; 
+1

Nó không hoạt động trên win 7 và giành chiến thắng xp ... –

8

Dưới đây là the rules cho Windows Vista và trước đó:

  1. Nếu lpstrFile chứa một con đường, đường dẫn đó là mục ban đầu.
  2. Nếu không, lpstrInitialDir chỉ định thư mục ban đầu.
  3. Nếu không, nếu ứng dụng đã sử dụng hộp thoại Mở hoặc Lưu dưới dạng trong quá khứ, đường dẫn được sử dụng gần đây nhất sẽ được chọn làm thư mục ban đầu. Tuy nhiên, nếu một ứng dụng không chạy trong một thời gian dài, đường dẫn đã chọn được lưu của nó sẽ bị hủy bỏ.
  4. Nếu lpstrInitialDir là NULL và thư mục hiện tại chứa bất kỳ tệp nào của các loại bộ lọc được chỉ định, thư mục ban đầu là thư mục hiện tại.
  5. Nếu không, thư mục ban đầu là thư mục tệp cá nhân của người dùng hiện tại.
  6. Nếu không, thư mục ban đầu sẽ là thư mục Desktop.

Vì vậy, nếu thuộc tính hiện tại FileName không trống, thì thuộc tính hiện tại của InitialDir bị bỏ qua, cũng như thư mục hiện tại của ứng dụng. Điều đó phù hợp với những gì bạn đã quan sát, vì vậy hãy đảm bảo bạn đang xóa thuộc tính FileName giữa các lần sử dụng hộp thoại của bạn.

(Các quy tắc khác với Windows 7 và chúng có thể làm hỏng kế hoạch của bạn.Nếu bạn mở tệp từ tab đầu tiên, hãy mở tệp từ tab thứ hai, một lần mở tệp khác trong khi tab đầu tiên được chọn có thể không hiển thị thư mục của tab đầu tiên nữa.)

+0

cảm ơn thông tin. –

+0

Tôi đã thử chạy các ứng dụng sau khi tôi làm sạch 'FileName' trên windows 7 và thực sự nó đã không thay đổi thư mục. Tôi vẫn còn trên thư mục tập tin mở cuối cùng. Sau đó, tôi đã thử nó trên một chiến thắng XP SP 3 và như vậy. Làm sạch 'FileName' không giúp được gì. –

1

Tôi gặp sự cố tương tự - sử dụng Opendialog1.InitialDir := GetCurrentDir - không hoạt động. Đã cố gắng hiển thị nó dưới dạng Opendialog1.Title := Opendialog1.InitialDir - hiển thị chuỗi chính xác. Sau đó tuyên bố chuỗi mới (dir) và sử dụng

dirr := GetCurrentDir; 
Opendialog1.InitialDir := dirr; 

Đó dường như làm việc tốt (không chắc chắn lý do tại sao, nhưng làm việc) hth