Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Problemas con checkado en checkbox de otra aplicacion

hola amigos, estoy viendo como puedo hacer para, desde mi proceso, marcar un checkbox de otro proceso. 
Lo primero que hago es usar FindWindow para obtener el hwnd de la ventana. 
Luego uso EnumChildWindow para recorrer todos los elementos de la ventana. 
En el callback busco que la clase sea TCheckBox y si es asi retorno en LParam el hwnd del TCheckBox.
Luego uso la siguiente macro para activar/desactivar el checkbox: 
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx 

Todo funciona correctamente ¿Donde está el problema? El problema es que, aunque aparezca checkado, si pongo una comprobacion en la "victima" tipo if(CheckBox1->Checked == true)... La comprobacion da como resultado que no está checkado y al pulsar sobre el se vuelve a marcar como si no lo estuviese antes. 
¿Alguna idea de como arreglarlo?

Responder Con Cita
  #2  
Antiguo 30-09-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
En teoría no vas mal encaminado, debería funcionar, si no lo hace se debe a la gestión de la VCL. Puedes ir un paso más allá y simular un click del ratón

Saludos.
Responder Con Cita
  #3  
Antiguo 30-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Como las dos aplicaciones son mias ¿que tal si cambio el wndproc del checkbox por uno mio y dentro gestiono el evento BM_SETCHECK?
Responder Con Cita
  #4  
Antiguo 30-09-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
En ese caso usa un mensaje de usuario y lo gestionas como quieras.

Saludos.
Responder Con Cita
  #5  
Antiguo 30-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
escafandra no se ni que es eso de un mensaje de usuario pero supongo será un mensaje inventado por mi ¿no?
Ya lo he conseguido así pero mandando el mensaje original. ¿es mejor usar uno propio para no pisar la funcion original o algo asi?

Te pongo el link con los fuentes de los dos procesos que son clones pero solo cambia que uno busca a Proceso A y el otro a Proceso B, y en todas las partes que uno hace referencia a Proceso B, el otro hace referencia a Proceso A.
Link: Aqui

Me gustaria que le echaras un vistazo y me comentaras que cambiarias. Es el proyecto que uso en el tema de procesos que charlan entre si pero para hacerlos sincronicos o asincronicos uso un checkbox que al marcarlo en un proceso tambien se marca en el otro y, dependiendo del estado de ese checkbox, se desactiva el boton de enviar mensaje al enviar y se activa al recibir para hacerlo sincronico o nunca se desactiva para hacerlo asincronico.

Última edición por aguml fecha: 30-09-2014 a las 20:52:54.
Responder Con Cita
  #6  
Antiguo 01-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Los mensajes de usuario comienzan a partir del WM_USER, sirven para crear tus propios mensajes.

Cuando tenga un rato miro ese código.


Saludos.
Responder Con Cita
  #7  
Antiguo 01-10-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

Creo que lo complicas usando WndProc para capturar el mensaje, es mas simple:

Emisor:
codigo
Código PHP:
...
void wmCopyData(charWndClasscharWndTitlecharmsg
{
  
HANDLE hRecept;
  
COPYDATASTRUCT cds;

  
hRecept FindWindow(WndClassWndTitle);
  if (
hRecept != 0) {
    
cds.dwData 0;
    
cds.cbData strlen(msg)+1;
    
cds.lpData = (char*)msg;
    
SetForegroundWindow(hRecept);
    
SendMessage(hReceptWM_COPYDATA0, (LPARAM)& cds);
  } else
    
MessageBox(0,"Receptor no encontrado",""MB_ICONERROR);
}

// ej. envio 
void __fastcall TfrmSender::Button1Click(TObject *Sender)
{
 
wmCopyData("TfrmReceiver""Receiver"Edit1->Text.c_str());

Receptor:
header
Código PHP:
...
class 
TfrmReceiver : public TForm
{
__published:

private:
  
void __fastcall OnWMCopyData(TWMCopyDatamsg);

protected:
  
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER
(WM_COPYDATATWMCopyDataOnWMCopyData)
  
END_MESSAGE_MAP(TForm)

public:
  
__fastcall TfrmReceiver(TComponentOwner);
};
... 
codigo
Código PHP:
...
void __fastcall TfrmReceiver::OnWMCopyData(TWMCopyDatamsg)
{
  
ShowMessage("Mensaje recibido: " String((char*)msg.CopyDataStruct->lpData));
}
... 
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 01-10-2014 a las 02:13:09.
Responder Con Cita
  #8  
Antiguo 01-10-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Ok, cambiado.
Con respecto a lo que hago para gestionar lo del CheckBox ¿como lo ves? ¿como lo mejorarías? Es que acabo de aprender lo de cambiar el WndProc y lo aplico a todo jejeje
Responder Con Cita
  #9  
Antiguo 01-10-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

No estoy diciendo que esté mal usar WndProc, lo que sucede es que Builder ya tiene definido ese mensaje y te evitas la comprobación de si el mensaje fué otro.

A ver si este ejemplo te dá otra idea... En el form emisor pone un TButton y un TCheckBox y en el receptor tres TCheckBox (CheckBox1, CheckBox2 y CheckBox3) .

Emisor:
Código PHP:
...
struct data_struct {
  
char className[255];
  
char caption[255];
  
int xy;
  
TColor color;
  
bool state;
ds;

void __fastcall TfrmSender::Button1Click(TObject *Sender)
{
  
HANDLE hRecept FindWindow("TfrmReceiver""Receiver");
  if (
hRecept != 0) {
    
COPYDATASTRUCT cds;
    
strcpy(ds.className"TCheckBox");  
    
strcpy(ds.caption,"CheckBox2");     
    
ds.50;
    
ds.30;
    
ds.color clYellow;
    
ds.state CheckBox1->Checked;
    
cds.dwData 0;
    
cds.cbData sizeof(ds);
    
cds.lpData = &ds;
    
ShowWindow(hReceptSW_SHOW);
    
SetForegroundWindow(hRecept);
    
SendMessage(hReceptWM_COPYDATA0, (LPARAM)& cds);
  } else
    
MessageBox(0,"Receptor no encontrado",""MB_ICONERROR);

Receptor:

header
Código PHP:
class TfrmReceiver : public TForm
{
__published:
  
TCheckBox *CheckBox1;
  
TCheckBox *CheckBox2;
  
TCheckBox *CheckBox3;

private:
  
void __fastcall OnWMCopyData(TWMCopyDatamsg);

protected:
  
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER
(WM_COPYDATATWMCopyDataOnWMCopyData)
  
END_MESSAGE_MAP(TForm)

public:
  
__fastcall TfrmReceiver(TComponentOwner);
}; 
code
Código PHP:
struct data_struct {
  
char className[255];
  
char caption[255];
  
int xy;
  
TColor color;
  
bool state;
ds;

void __fastcall TfrmReceiver::OnWMCopyData(TWMCopyDatamsg)
{
  
memcpy(&dsmsg.CopyDataStruct->lpDatasizeof(data_struct));

  for(
int i 0ComponentCounti++) {
    
TCheckBox *cb static_cast<TCheckBox*>(Components[i]);
    if (
cb->ClassNameIs(ds.className) && cb->Caption == ds.caption) {
      
cb->Left    ds.x;
      
cb->Top     ds.y;
      
cb->Color   ds.color;
      
cb->Checked ds.state;
    }
  }

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 01-10-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Guauuu pues si que es potente este método.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Se Pierde la Selección del CheckBox al Cerrar la Aplicación Luis.Lapuente Varios 3 11-09-2014 22:42:24
Cómo hago una aplicación que oculte otra aplicación en ejecución? DSK25 C++ Builder 3 11-01-2014 18:24:53
Cómo cerrar otra aplicacion desde mi aplicacion en Delphi 7 Gaby123 API de Windows 5 04-01-2007 22:44:51
problemas al integrar una aplicación dentro de otra aranel Varios 1 23-10-2005 01:40:00
Problemas guardar cambios en dbgrid con checkbox toorbye Conexión con bases de datos 0 22-09-2005 14:09:13


La franja horaria es GMT +2. Ahora son las 04:08:24.


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
Copyright 1996-2007 Club Delphi