2012-02-23 14 views
5

He intentado usar la infraestructura FutureWindows de tomazy (ver su respuesta en Delphi GUI Testing and Modal Forms o la página de inicio de la herramienta en https://github.com/tomazy/DelphiUtils), pero me gustaría saber si se puede usar y cómo se puede usar con los diálogos abiertos de archivos estándar de Windows. No parecen estar heredando de TControl, que parece que asume la infraestructura de FutureWindows (a menos que lo haya malinterpretado).(cómo) ¿Puedo usar FutureWindows con diálogos de archivo abiertos estándar?

Lo que me gustaría hacer es básicamente seleccionar un archivo en un OpenFileDialog que se abre de forma modal mediante un comando dentro de mis pruebas, pero todavía no he podido averiguar cómo hacerlo.

Respuesta

4

Utilice una herramienta como Spy++ para averiguar cuál es el nombre de la clase de ventana. Por ejemplo, en mi máquina con Windows 7, el nombre de la clase de ventana para un diálogo de abrir archivo del sistema es #32770 (Dialog).

+0

Gracias, de hecho noté que FutureWindows tiene esto como un const (MESSAGE_BOX_WINDOW_CLASS) y así obtuve acceso al diálogo como una IWindow (interfaz de FutureWindows). Ahora mi problema es hacer que esta interfaz se oponga, porque la interfaz solo proporciona un método AsControl, lo que dudo que funcione, ya que el diálogo no es un TControl. Sin él, no sé (todavía) cómo establecer la propiedad FileName del diálogo ... – DelphiUser

+0

Está en lo cierto, 'AsControl' no puede funcionar. Puede usar 'EnumChildWindows' para buscar la ventana de destino, pero puede haber una manera más fácil. ¿No puedes burlarte de esto? –

+0

Busqué en Google un poco y terminé con esto, que parece funcionar: Windows.SetDlgItemText (DlgHandle, 1148, PChar (FileName)); Utilizando esto: http://social.msdn.microsoft.com/forums/en-US/winforms/thread/62d5db14-5497-4ceb-8af0-d7f81732e937/ Así que, básicamente, envío un mensaje para configurar el nombre de archivo para el control correcto (ID 1148 funciona al menos en mi Windows 7 :)) – DelphiUser

3

Mi solución actual es el siguiente:

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); 

Así que básicamente el envío de un mensaje a través de la API de Windows. Las ideas (y la ID 1148) se encontraron desde aquí: http://social.msdn.microsoft.com/forums/en-US/winforms/thread/62d5db14-5497-4ceb-8af0-d7f81732e937/

Posibles soluciones mejores son bienvenidas, pero esto parece lo suficientemente bueno para mí, al menos por ahora. ¡Gracias por los comentarios hasta ahora!

+0

No veo que obtenga una mejor solución que esta. –

+0

Este es un resumen de la solución real final (actualmente), pero marqué la respuesta de @DavidHeffernan anterior como una respuesta para otorgar el reconocimiento de ayudar a señalar una dirección útil. – DelphiUser

Cuestiones relacionadas