2012-02-23 31 views
5

Tôi đã cố gắng sử dụng cơ sở hạ tầng FutureWindows của Tomazy (xem câu trả lời của mình tại Delphi GUI Testing and Modal Forms hoặc trang chủ của công cụ tại https://github.com/tomazy/DelphiUtils), nhưng muốn biết liệu nó có thể được sử dụng với hộp thoại mở tệp chuẩn của Windows không? Họ dường như không được thừa hưởng từ TControl, mà Infra FutureWindows dường như giả định (trừ khi tôi đã hiểu lầm nó). Những gì tôi muốn làm là về cơ bản chỉ cần chọn một tập tin trong một OpenFileDialog được mở ra một cách khiêm tốn bởi một lệnh trong thử nghiệm của tôi, nhưng vẫn chưa thể tìm ra cách để làm điều này.(Làm cách nào) Tôi có thể sử dụng FutureWindows với các hộp thoại mở tập tin chuẩn không?

Trả lời

4

Sử dụng công cụ như Spy++ để tìm hiểu tên cửa sổ là gì. Ví dụ, trên máy tính Windows 7 của tôi, tên lớp cửa sổ cho hộp thoại mở tệp hệ thống là #32770 (Dialog).

+0

Cảm ơn, tôi thực sự lưu ý rằng FutureWindows có điều này như một const (MESSAGE_BOX_WINDOW_CLASS) và do đó tôi có quyền truy cập vào hộp thoại dưới dạng giao diện IWindow (FutureWindows). Bây giờ vấn đề của tôi là để có được giao diện này để đối tượng, bởi vì giao diện chỉ cung cấp một phương pháp AsControl, mà tôi nghi ngờ sẽ làm việc kể từ khi hộp thoại không phải là một TControl. Nếu không có nó, tôi không biết (chưa) làm thế nào để thiết lập các tài sản FileName của hộp thoại ... – DelphiUser

+0

Bạn là chính xác, 'AsControl' không thể làm việc. Bạn có thể sử dụng 'EnumChildWindows' để truy tìm cửa sổ mục tiêu, nhưng có thể có cách dễ dàng hơn. Bạn không thể chế nhạo cái này? –

+0

Tôi googled xung quanh một chút và kết thúc với điều này, mà dường như làm việc: Windows.SetDlgItemText (DlgHandle, 1148, PChar (FileName)); Sử dụng điều này: http://social.msdn.microsoft.com/forums/en-US/winforms/thread/62d5db14-5497-4ceb-8af0-d7f81732e937/ Vì vậy, về cơ bản tôi gửi một thông báo để đặt tên tệp thành điều khiển chính xác (ID 1148 hoạt động ít nhất trên Windows 7 của tôi :)) – DelphiUser

3

giải pháp hiện tại của tôi là dưới đây:

TFutureWindows.Expect(MESSAGE_BOX_WINDOW_CLASS) 
    .ExecProc(
    procedure (const AWindow: IWindow) 
    var 
     DlgHandle: HWND; 
     FileName: string; 
    begin 
     FileName := ExpandFileName('myFileToUse.txt'); 
     DlgHandle := AWindow.GetHandle; 
     Windows.SetDlgItemText(DlgHandle, 1148, PChar(FileName)); 
    end 
    ) 
    .ExecSendKey(VK_RETURN); 

Vì vậy, về cơ bản gửi một thông điệp sử dụng Windows API. Ý tưởng (và ID 1148) được tìm thấy tại đây: http://social.msdn.microsoft.com/forums/en-US/winforms/thread/62d5db14-5497-4ceb-8af0-d7f81732e937/

Có thể có các giải pháp tốt hơn, nhưng điều này có vẻ tốt cho tôi ít nhất là bây giờ. Cảm ơn các ý kiến ​​cho đến nay!

+0

Tôi không thể thấy rằng bạn sẽ nhận được giải pháp tốt hơn điều này. –

+0

Đây là một bản tóm tắt của giải pháp thực tế cuối cùng (hiện tại), nhưng tôi đã đánh dấu câu trả lời của @DavidHeffernan ở trên làm câu trả lời để cấp cho sự công nhận giúp đỡ trong việc trỏ đến một hướng hữu ích. – DelphiUser

Các vấn đề liên quan