| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 13 Ene, 2017 12:35 pm Asunto: Ayuda dinámica |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 13 Ene, 2017 1:27 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 13 Ene, 2017 1:34 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 13 Ene, 2017 1:41 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 13 Ene, 2017 2:13 pm Asunto: |
|
|
ok. No lo había pensado. Pues súmale el top del panel
Sigo sin entender el P2
Saludos |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 13 Ene, 2017 5:27 pm Asunto: |
|
|
| 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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 13 Ene, 2017 6:13 pm Asunto: ¡ENCONTRÉ LA SOLUCIÓN! |
|
|
La he tenido todo el tiempo delante y no me había dado cuenta
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 |
|
 |
|