PDA

Ver la Versión Completa : Sera Posible esto


BetoAlonso
27-07-2005, 16:02:35
Saludos
Kiero saber si es posible hacer lo siguiente:
Tengo un formulario con una lista de documentos escaneados formato *.TIF
y un button al cual le asigno la siguiente instruccion

ExecuteFile(Nombre archivo Tif, '', Directorio, SW_SHOW)

el resultado de esto me permite visualizar el documento, pero con el visor de imagenes del windows.

Mi pregunta es si hay una manera de ke esto sea mostrada en un area del formulario ke yo defina?

gracias por su atencion, acepto sugerencias.

islu
27-07-2005, 16:09:44
Creo que lo que hace es que se abre el fichero con el programa que hayas predeterminado para abrir ese tipo de archivo desde Windows. Para cambiarlo solo has de pulsar el botón derecho sobre el archivo ( desde el explorador de WIndows o escritorio ) y decirle con que programa quieres que te lo abra por defecto.

Espero haberte ayudado.

islu
27-07-2005, 16:10:44
Si quieres que te lo abra en tú formulario, debes utilizar algún componente o activeX desde tú programa.

BetoAlonso
27-07-2005, 16:23:22
tu sugerencia es interesante, pero como?

dec
27-07-2005, 16:31:05
Hola,

Echa un vistazo a este (http://clubdelphi.com/foros/showthread.php?t=20132&highlight=tiff) y este (http://www.clubdelphi.com/foros/showthread.php?t=23656&highlight=tiff) otro Hilos de estos mismos Foros a ver si te dan alguna idea.

Neftali [Germán.Estévez]
27-07-2005, 17:34:21
Sí, para ello debes utilizar la API SetParent.
Basta con que busques la ventana de la aplicación que quieres incluir dentro de tu form (con FindWindow) y luego hacer lo siguiente:


Windows.SetParent(h, Self.Handle);

BetoAlonso
27-07-2005, 18:56:12
Disculpa mi ignorancia Neftali
pero cuales son los parametros ke solicita el findwindow
trabajo con D7
gracias

maeyanes
27-07-2005, 19:00:25
Lee la ayuda de FindWindow (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/findwindow.asp) desde el sitio de MSDN de Microsoft.


Saludos...

delphi.com.ar
27-07-2005, 20:18:41
Te subí un ejemplo (basado en un ejemplo anterior (http://www.delphi.com.ar/source/samples/callexternal.zip)) en mi página: http://www.delphi.com.ar/source/samples/chproc.zip

Este ejemplo crea un proceso y busca la ventana dentro de el proceso creado, y luego la muestra sobre un panel en la propia ventana. Tendrás que adaptarlo para que carge el editor de imágenes por defecto.

Saludos!

islu
28-07-2005, 09:23:38
Desconocia estas funciones ( como iotras tantas ... :rolleyes: ), podeis indicarme si funcionan en D4 y/o D6, pues he probado los 2 ejemplos, no no me funcionan.

Muchas gracias.

Neftali [Germán.Estévez]
28-07-2005, 09:43:05
Tiene un par de detalles, pero si funciona en Delphi6, simplemente, que al entrar hay que ignorar una propiedad (debe estar creado con D7 o superior) y en D6 no la encuentra y modificar una referencia a:


Application.CreateForm(TForm1, form1);


por ésta:

Application.CreateForm(TfrmMain, frmMain);


Ahí va el ejemplo corregido (que te debe funcionar en D6).

islu
28-07-2005, 09:56:14
Muchas gracias, ya me funciona perfectamente, estaba tonto... :rolleyes:

Sin abusar, sabes si se puede hacer algo similar con el CMD o con el COMMAND.COM, lo he intentado y no me funciona...

Muchas gracias.

Neftali [Germán.Estévez]
28-07-2005, 10:06:40
NOTA: Si utilizas la API SetWindowPos podrás conseguir que se ajuste a la posición (0,0).

Neftali [Germán.Estévez]
28-07-2005, 11:33:33
Cambia ésta línea:

Win32Check(CreateProcess(nil, 'NOTEPAD.EXE', nil, nil, FALSE,
CREATE_NEW_CONSOLE, nil, nil, StartInfo, ProccesInfo));

por ésta otra (tal vez tu path no sea WinNT sino Windows).

Win32Check(CreateProcess(nil, 'c:\winnt\system32\cmd.exe', nil, nil, FALSE,
CREATE_NEW_CONSOLE, nil, nil, StartInfo, ProccesInfo));


y ésta:

hNotepad := FindThreadWindow(ProccesInfo.dwThreadId, 0, nil, nil);

por éstas dos.

sleep(500);
hNotepad := FindWindow('ConsoleWindowClass', nil);

NOTA: el tema del Sleep no acaba de gustarme (aunque funciona); tal vez
alguien tenga alguna idea mejor, porque esta es un poco "chapuza", por
no decir "bastante chapuza".

islu
28-07-2005, 12:14:59
Muchas gracias, me has sido de gran ayuda!!!

islu
28-07-2005, 12:23:11
Una cosilla más, a ver si me puedes ayudar... :rolleyes:, te comento...

El querer ejecutar el CMD.EXE es porque desde mi aplicación he de llamar a un exe, realizado en C++ de Microsoft bajo MSDOS, y resulta que al ejecutarlo se me pone a pantalla completa ( solo en XP ), por supuesto he probado mil cosas, entre ellas crear un acceso directo minimizado, llamar con el ShellExcecute..., incluso probe un programa para colocarlo como un servicio, y siempre cuando se ejecuta, pega el pantallazo.

El problema no es el pantallazo, si fuese una sola vez, pero es que este proceso se utiliza bastante, con lo que el operador le estan dando pantallazos todo el día. No puedo sustituir el programa, pues sería excesivamente costoso. Si ya lo estas ejecutando desde Terminal Server, incluso te pregunta Ignorar u Omitir, algo de la configuración de la pantalla ( no lo recuerdo exactamente ).

Después de todo el rollo, sabes si puedo ejecutarlo pero sin que se muestre por pantalla, sería excepcional... :p

Muchas gracias, un saludo.

delphi.com.ar
28-07-2005, 14:49:22
...pues he probado los 2 ejemplos, no no me funcionan....
ChProc lo corregí, evidentemente había guardado el pas pero no el dpr :rolleyes:
Con CallExternal ¿cuál es el problema?

islu
28-07-2005, 15:06:38
Con CallExternal ¿cuál es el problema?

Disculpa, fue fallo mio, Neftali me indicó un cambio que debí ver yo :rolleyes: , y funcina perfectamente.

Gracias !!! :D

delphi.com.ar
28-07-2005, 15:13:45
Disculpa, fue fallo mio, Neftali me indicó un cambio que debí ver yo , y funcina perfectamente.
Ahora lo veo.....



hNotepad := FindThreadWindow(ProccesInfo.dwThreadId, 0, nil, nil);

por éstas dos.

sleep(500);
hNotepad := FindWindow('ConsoleWindowClass', nil);

NOTA: el tema del Sleep no acaba de gustarme (aunque funciona); tal vez
alguien tenga alguna idea mejor, porque esta es un poco "chapuza", por
no decir "bastante chapuza".

Para evitar utilizar un sleep, precisamente creé la función FindThreadWindow con el parámetro wTimeOut, donde se especifican en milisegundos el tiempo que espera, para que el proceso pueda crear la dichosa ventana, si se exede este tiempo, el resultado es 0.
En ese caso podrías utilizar:

hNotepad := FindThreadWindow(ProccesInfo.dwThreadId, 0, 'ConsoleWindowClass', nil);

Y solo buscarías la ventana del proceso creado y no de todos los procesos en ejecución en tu sistema. En el caso que exista otra consola abierta, con un simple FindWindow podrías encontrar la otra y eso no estaría nada bien.


Saludos!

BetoAlonso
03-08-2005, 15:59:29
:D Gracias a todos y cada uno de los participantes de este hilo, aunke no me da el resultado esperado, pero de veras agradesco por la buena intencion de todos.