Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Ayuda dinámica

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ayuda dinámica Responder citando

Tengo este formulario

El cuadro gris que se ve abajo a la derecha es un TListBox que sea crea de forma dinámica al pulsar el BitBtn que se ve a la izquierda. Par ello uso este código:
Código:
void __fastcall TfTablas::BotAyu(TObject *Sender)
{
     TBitBtn *Boton = dynamic_cast<TBitBtn>(Sender);
   TComponent *Source;
     POINT P1, P2;

   for (nItem = 0; nItem < this->ComponentCount; nItem ++)
     {
          Source = this->FindComponent("AyuLis");
          if (Source != NULL)
               return;
     }

   for (nItem = 0; nItem <this>ComponentCount; nItem ++)
     {
          Source = this->FindComponent(Boton->Name.SubString(2, Boton->Name.Length()));
          if (Source != NULL)
               if (Source->ClassNameIs("TEdit") || Source->ClassNameIs("TLabeledEdit"))
               {
                    AyuEdit = static_cast<TCustomEdit>(Source);
                    break;
               }
     }

     if (Source == NULL)
          return;

     P1.x = AyuEdit->Parent->Left + AyuEdit->Left;
     P1.y = AyuEdit->Parent->Top + AyuEdit->Top + AyuEdit->Height;
     P2   = ClientToScreen(P1);

     AyuLis              = new TListBox(this);
     AyuLis->Name        = "AyuLis";
     AyuLis->Parent      = this;
     AyuLis->BevelInner  = bvNone;
     AyuLis->BevelKind   = bkFlat;
     AyuLis->BevelOuter  = bvLowered;
     AyuLis->BorderStyle = bsNone;
     AyuLis->Color       = clSilver;
     AyuLis->Height      = 10 * AyuLis->ItemHeight;
     AyuLis->Left        = P2.x;
     AyuLis->Top         = P2.y;
     AyuLis->Width       = AyuEdit->Width + Boton->Width;
     AyuLis->OnClick     = AyuLisClick;
}

La idea, lógicamente, es que dicha ayuda aparezca justo debajo del TEdit correspondiente pero no sé como convertir esas coordenadas obtenidas con ClientToScreen de forma que se muestre como deseo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)


Ultima edición por Angel el Vie 13 Ene, 2017 1:38 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

No pillo como lo has hecho, pero es tan fácil como poner el AyuLis->Top en el Top del edit + Height cosa que haces perfecto pero
Código:
     AyuLis->Left        = P2.x;
     AyuLis->Top         = P2.y;
lo del P2.....
¿No será P1? si es P2 no pillo como va

saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias bosoft. El problema es que el botón está dentro de un panel y por lo tanto si hago lo que me sugieres quedaría arribva a la izquierda; me explico: Ese TEdit está DENTRO de un panel y sus valores Top y Left hacen referencia al mismo y no al formulario completo. Quedaría así.

He cogido la idea de una respuesta de _Leo en Desplegar menu flotante con el click IZQUIERDO, pero me falta bien cómo volver a convertir los píxeles a posición o bien cómo posicionar el TListBox con las coordenadas en píxeles.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)


Ultima edición por Angel el Vie 13 Ene, 2017 5:28 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Dicho de otra forma:
El TEdit Provincia tiene, por ejemplo, como valores:
Cita:
Left = 5;
Top = 73;
Height = 20;

Pero está en un TPanel y por lo tanto esas coordendas están referidas a dicho panel.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

ok. No lo había pensado. Pues súmale el top del panel
Sigo sin entender el P2

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

bosoft escribió:
Sigo sin entender el P2

Ya comentaba que la idea la cogí de una respuesta de _Leo:
Código:
POINT P1, P2;
P1.x = Button1->Left;
P1.y = Button1->Top + Button1->Height;
P2 = ClientToScreen(P1);
PopupMenu1->Popup(P2.x, P2.y);

pero claro, el Popup sí se hace con píxeles.
P2, de acuerdo con la ayuda de Builder, convierte esas coordendas relativas (5 y 73) al valor absoluto en píxeles referido al total de la pantalla de las mismas; así, según se muestra el formulario en pantalla esos 5 y 73 pasan a ser 383 y 274 respectivamente. Eso es lo que necesito: como posicionar el TListBox en base a esa coordenada absoluta.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: ¡ENCONTRÉ LA SOLUCIÓN! Responder citando

La he tenido todo el tiempo delante y no me había dado cuenta Embarassed

El código ha quedado así:
Código:
void __fastcall TfTablas::BotAyu(TObject *Sender)
{
     TBitBtn *Boton = dynamic_cast<TBitBtn>(Sender);
     TComponent *Source;
     POINT P1, P2;

   for (nItem = 0; nItem <this>ComponentCount; nItem ++)
     {
          Source = this->FindComponent("AyuLis");
          if (Source != NULL)
               return;
     }

   for (nItem = 0; nItem <this>ComponentCount; nItem ++)
     {
          Source = this->FindComponent(Boton->Name.SubString(2, Boton->Name.Length()));
          if (Source != NULL)
               if (Source->ClassNameIs("TEdit") || Source->ClassNameIs("TLabeledEdit"))
               {
                    AyuEdit = static_cast<TCustomEdit>(Source);
                    break;
               }
     }

     if (Source == NULL)
          return;

     P1.x = AyuEdit->Left;
     P1.y = AyuEdit->Top;
     P2 = this->ScreenToClient(AyuEdit->Parent->ClientToScreen(P1));

     AyuLis              = new TListBox(this);
     AyuLis->Name        = "AyuLis";
     AyuLis->Parent      = this;
     AyuLis->BevelInner  = bvNone;
     AyuLis->BevelKind   = bkFlat;
     AyuLis->BevelOuter  = bvLowered;
     AyuLis->BorderStyle = bsNone;
     AyuLis->Height      = 10 * AyuLis->ItemHeight;
     AyuLis->Left        = P2.x;
     AyuLis->Top         = P2.y + AyuEdit->Height;
     AyuLis->Width       = AyuEdit->Width + Boton->Width;
     AyuLis->OnClick     = AyuLisClick;
}

Hay que usar ClientToScreen para sacar la posición absoluta en píxeles del objeto y convertirla luego a posición relativa referida al formulario con ScreenToClient.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.