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)
-   -   WM_DEVICECHANGE en un TComponent (https://www.clubdelphi.com/foros/showthread.php?t=10738)

NeWNeO 27-05-2004 15:34:34

WM_DEVICECHANGE en un TComponent
 
Wolaps:

Estoy construyendo un Componente no visual para poder controlar ciertos parámetros de los lectores.

Utilizo el siguiente código:

procedure WMDEVICECHANGE(var msg:tmessage);message WM_DEVICECHANGE;

procedure TWinCDControl.WMDEVICECHANGE(var msg:tmessage);
const
DBT_CONFIG_CHANGED = $0018;
DBT_DEVICE_ARRIVAL = $8000;
DBT_DEVICE_QUERY_REMOVE = $8001;
DBT_DEVICE_QUERY_REMOVE_FAILED = $8002;
DBT_DEVICE_REMOVE_PENDING = $8003;
DBT_DEVICE_REMOVE_COMPLETE = $8004;
DBT_DEVICE_TYPE_SPECIFIC = $8005;
begin
case msg.WParam of
DBT_DEVICE_REMOVE_COMPLETE: OnCDOpen(Self);// Acciones al abrir
DBT_DEVICE_ARRIVAL: OnCDClose(Self);// Evento al cerrar
end;
end;

OnCDOpen y OnCDClose son 2 TNotifyEvent declarados correctamente y funcionan si se les aplica cualquier otra función

Este código utilizado en cualquier aplicación normal funciona a la perfección, pero al introducirlo en mi componente no funciona. ¿Alguien me puede dar una solución para hacer que funcione?

delphi.com.ar 27-05-2004 15:48:57

Tené en cuenta que ese mensaje solo lo recibirán las controles que tengan un Handle, digamos los que tengan “Ventana”. Si desarrollas un control no-visual una práctica común es crear un handle y apuntar el procedimiento de entrada de mensajes (WndProc) a un método de tu clase.

Saludos!

NeWNeO 27-05-2004 16:01:58

¿Ejemplo?
 
¿Podrias poner algun ejemplo de como realizar esta tarea?

delphi.com.ar 27-05-2004 16:04:48

No te puedo poner un ejemplo, pero puedo decirte que puedes utilizar las apis: CreateWindowEx, SetWindowLong y DestroyWindow. O las funciones de la VCL: AllocateHWnd y DeallocateHWnd.

Saludos!

NeWNeO 28-05-2004 15:29:55

AllocateHWND
 
Bien, utilizo el AllocateHWND para crear un handle y recibir los mensajes
Código Delphi [-]

Constructor TWinCDControl.Create;
begin
 inherited Create(Self);
 fHWND := AllocateHWND(WMDEVICECHANGE); // Handle de la "Ventanta"
end;

Siendo WMDEVICECHANGE el proceso encargado de leer el mensaje (anotado en el primer mensaje)

en el destructor hago un DealloateHWND.

Al consultar el handle creado en el componente sale 0 ...¿Cual es la forma correcta de usar el AllocateHWND?

delphi.com.ar 28-05-2004 16:12:07

Tené en cuenta que en el método WMDEVICECHANGE, entrarán todos los mensajes de la ventana creada, si el mensaje no es del tipo WM_DEVICECHANGE tendrías que dejar que la ventana lo procese (DefWindowProc).
Por otro lado te recomiendo cambiarle el nombre al método por alguno mas estándar como WndProc.

Saludos!


La franja horaria es GMT +2. Ahora son las 14:30:07.

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