Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Sera Posible esto (https://www.clubdelphi.com/foros/showthread.php?t=23746)

BetoAlonso 27-07-2005 16:02:35

Sera Posible esto
 
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 y este 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:

Código Delphi [-]
   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 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) 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:

Código Delphi [-]
 Application.CreateForm(TForm1, form1);

por ésta:
Código Delphi [-]
 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:
Código Delphi [-]
   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).
Código Delphi [-]
 Win32Check(CreateProcess(nil, 'c:\winnt\system32\cmd.exe', nil, nil, FALSE,
                            CREATE_NEW_CONSOLE, nil, nil, StartInfo, ProccesInfo));

y ésta:
Código Delphi [-]
 hNotepad := FindThreadWindow(ProccesInfo.dwThreadId, 0, nil, nil);
por éstas dos.
Código Delphi [-]
   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

Cita:

Empezado por islu
...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

Cita:

Empezado por delphi.com.ar
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

Cita:

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

Ahora lo veo.....

Cita:

Empezado por Neftali
Código Delphi [-]
 hNotepad := FindThreadWindow(ProccesInfo.dwThreadId, 0, nil, nil);
por éstas dos.
Código Delphi [-]
   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:
Código Delphi [-]
   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.


La franja horaria es GMT +2. Ahora son las 21:02:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi