Pregunta

Estoy tratando de crear con Delphi un componente heredado de TLabel, con algunos gráficos personalizados agregados en TLabel.Paint. Quiero que los gráficos estén en el lado izquierdo del texto, así que anulé GetClientRect:

function TMyComponent.GetClientRect: TRect;
begin
  result := inherited GetClientRect;
  result.Left := 20;
end;

Esta solución tiene un problema importante que me gustaría solucionar: no es posible hacer clic en la "área de gráficos". Del control, solo área de etiqueta. Si el título es una cadena vacía, no es posible seleccionar el componente en el diseñador haciendo clic en él. ¿Alguna idea?

¿Fue útil?

Solución

Al principio, perdóname por mi mal inglés.
Creo que no es una buena idea Cambiar el ClientRect del componente. Esta propiedad / información se utiliza para muchos métodos y procedimientos internos en el componente y puede cambiar la función / operación del componente.

Creo que puede cambiar el punto para escribir el texto (20 píxeles en el DoDrawText , en el ejemplo) y el componente puede responder a los eventos en el área gráfica.

procedure TGrlabel.DoDrawText(var Rect: TRect; Flags: Integer);
begin
  Rect.Left := 20;
  inherited;
end;

procedure TGrlabel.Paint;
begin
  inherited;

  Canvas.Brush.Color := clRed;
  Canvas.Pen.Color := clRed;
  Canvas.pen.Width := 3;
  Canvas.MoveTo(5,5);
  Canvas.LineTo(15,8);

end;

Otros consejos

¿Qué métodos / funcionalidad obtiene de TLabel para los que necesita este componente?

¿Tal vez sería mejor hacer un descendiente de (por ejemplo, TImage) y dibujar su texto como parte de su método de pintura?

Si realmente tiene que ser un descendiente de TLabel (con todo lo que esto conlleva), entonces creo que estarás estancado con este problema de tiempo de diseño, ¿no tiene este problema TLabel de todos modos cuando el título está vacío? / p>

¡Me interesarán las otras respuestas que obtengas! :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top