2011-05-12 2 views
1

에서 행을 선택한 코드에TBrowseForFolder는 옵션 델파이 XE에 초점

object actBrowseCommonData: TBrowseForFolder 
    Category = 'Base' 
    Caption = 'Browse...' 
    DialogCaption = 'Browse for Common data path' 
    BrowseOptions = [bifUseNewUI] 
    BeforeExecute = actBrowseCommonDataBeforeExecute 
    OnAccept = actBrowseCommonDataAccept 
end 

, BeforeExecute 다음과 같은 코드가있는 경우 :의 대부분

begin 
    actBrowseProjectPath.Folder := eProjectPath.Text; // "C:\test\" 
end; 

을 대화 상자는 선택한 경로에 초점을 맞추지 않고 맨 위의 목록 만 표시합니다. 선택한 행이 표시 되더라도 일정 시간 (무작위로?). 왜 폴더 찾아보기가 선택된 경로를 보여주지 않습니까?

+0

OS? - XP가 선택한 경로를 표시하는 것을 지원하지 않는다고 확신합니다. – daven11

+0

Microsoft Connect에서 다음을 찾았습니다 : "아래 코드에서 BFFM_SETSELECTION 및 BIF_NEWDIALOGSTYLE을 사용하는 경우 XP 및 Vista에서는 폴더를 선택하고 목록을 스크롤하여 선택한 폴더를 사용자에게 표시합니다. 그러나 Windows 7에서는 선택한 폴더를 표시하도록 목록이 스크롤되지 않습니다. " https://connect.microsoft.com/VisualStudio/feedback/details/518103/bffm-setselection-does-not-work-with-shbrowseforfolder-on-windows-7 관련성이 있거나 솔루션에 더 가까이 다가 갈 수 있습니까? – Tool

+0

------------ --- – Tool

답변

3

이 연결 Microsoft에서 예제와 함께 작동하도록 보인다

uses ShlObj; //BFFM_INITIALIZED... 

OnCallBack := actBrowseProjectPathCallback; 

procedure TSettingsDialogBase.actBrowseProjectPathCallback(
    Sender: TBrowseForFolder; Wnd: HWND; uMsg: Cardinal; lParam, lpData: Integer; 
    var Result: Integer); 
begin 
    inherited; 

    if uMsg = BFFM_INITIALIZED then 
    begin 
    SendMessage(Wnd, BFFM_SETSELECTION, 1, Integer(@Sender.Folder[1])); 
    Sleep(1000); 
    PostMessage(Wnd, BFFM_SETSELECTION, 1, Integer(@Sender.Folder[1])); 
    end; 
end; 

이 선택한 폴더에 초점을 제공합니다 - 그것은 트리에서, 전 가시 영역에서 아니었다 경우에도 마찬가지입니다. 내 문제가 해결 된 것 같습니다! 누군가가이 문제를 보게되면 - 응답하십시오!

여기 그 해결의 영업 이익에 말을했다 무엇 :
http://connect.microsoft.com/VisualStudio/feedback/details/518103/bffm-setselection-does-not-work-with-shbrowseforfolder-on-windows-7#

내가 해결 방법을 찾을 수 있었다. 문제는 BFFM_INITIALIZED 콜백이 발생하고 BFFM_SETSELECTION 메시지를 보내면 BFFM_SETSELECTION 메시지를 보내기 전에 트리를 열고 초기화해야한다는 것입니다. 즉, 트리가 완전히 열리고 실패하기 전에 scroll-to 코드가 실행되고 있다는 것입니다.

콜백에서 BFFM_SETSELECTION 메시지를 보내면 트리가 열리지 만 선택 항목은 스크롤되지 않습니다. 스크롤하려면, 동일한 지연 시간에 두 번째 동일한 BFFM_SETSELECTION 메시지를 전송해야합니다. 그런 다음 트리가 선택한 폴더로 스크롤됩니다. 트리를 열려면 BFFM_INITIALIZED 콜백의 첫 번째 메시지가 여전히 발생해야하며 두 번째로 지연된 메시지를 보내야합니다. 이 작업을 수행하는 몇 가지 방법. 하나는 BFFM_INITIALIZED가 발생할 때 플래그를 설정하고 그 후에는 콜백마다 에 대해 BFFM_SETSELECTION을 계속 전송하는 것입니다. 또는 코드에서 타이머를 설정하여 두 번째로 메시지를 발생시킬 수 있습니다 (예 : 500-1000 ms 후).

0

나는이 오래된 스레드 실현하지만, 좋은 솔루션을 찾을 수 noplace입니다 ...

이 C에, 나를 위해 일한은 ...

INT CALLBACK BFFHookProc(HWND Dlg, UINT Msg, LPARAM Lparam, LPARAM Data) 
    { 
    switch(Msg) 
     { 
     case BFFM_INITIALIZED : 
      PostMessage(Dlg, BFFM_SETSELECTION, 1, Data); 
      return 0; 
     case BFFM_SELCHANGED : 
     Sleep(20); 
     default : 
     return 0; 
     } 
    } 

그것은 타이밍 문제 그러나 그것의 정확한 본질은 신비의 무언가이다. SendMessage 대신 PostMessage를 사용하면 거의 작동합니다 ... BFFM_SELCHANGED에서 Sleep을 추가하면 매우 안정적으로 작동합니다.