Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Componente TShape con Label? (https://www.clubdelphi.com/foros/showthread.php?t=54410)

Jorge Rojas M. 18-03-2008 01:41:15

Componente TShape con Label?
 
Hola, es primera vez que ingreso a este foro y he podido dar respuesta a muchas de mis preguntas por medio de las dudas que plantean los demás usuarios, por lo tanto decidí inscribirme para exponerles mi problema talvéz alguno de ustedes me pueda ayudar o brindar alguna otra solución.

Estoy creando una aplicación con componentes TShape que se generan en tiempo de ejecución, lo cual ya lo logré (MiComponente:=TShape.create(self)) sin embargo es necesario que cada componte que se crea tenga una etiqueta para identificarlo, pero por las características del componente TShape este no cuenta con una propiedad para agregarle Texto y no sé si esto es posible. Qué puedo hacer?. Les comento que para mi es importante poder dibujar un TShape pues la idea de la aplicación es representar un Diagrama de Flujo.

Gracias de antemando por su colaboración.

jcarteagaf 18-03-2008 15:46:37

Diagrama de Flujo
 
Hace tiempo tuve que hacer una aplicación similar (no diagrama de flujo, sino un Organigrama), inicialmente estuve construyendo un componente por mi propia cuenta, hasta que encontre en Devexpress el FlowChart y el OrgChart, dos componentes muy buenos que hacen lo que tu necesitas.

Si no me equivoco creo que TMS Software tambien tiene algo parecido.

Espero que te sirva.

Saludos

Crandel 19-03-2008 21:36:32

Una forma facil es crear un label arriba del componete TShape.

Otra es crear una clase descendiente de TShape y agregar la propiedad text. Luego en su evento Pain lo escribis.

Algo asi:
Código Delphi [-]
  TMiShape = class (TShape)
  private
    FText: string;
    procedure SetText(value: string);
  protected
    procedure Paint; override;
  public
    property Text: string read FText write SetText;
  end;

...

procedure TMiShape.Paint;
begin
  inherited Paint;
  Canvas.TextOut(10,10, FText);
end;

procedure TMiShape.SetText(value: string);
begin
  FText := value;
  Invalidate;
end;

puede contener errores el codigo pero es la idea.

Jorge Rojas M. 20-03-2008 01:26:29

Muchas gracias a ambos por las respuestas y si efectivamente el componente FlowChart es demasiado poderoso para lo que yo quiero desarrollar sin embargo me da un panorama más amplio para eventualmente pensar en algo más elaborado, por otra parte la solución que plantea Crandel me es mucho más económica y cumple con lo que yo quiero en un principio, sólo tengo una duda dado que no he podido probar el código pues estoy en Exámenes de la U, el procedimiento Paint en el momento de ejecutar la línea Canvas.TextOut(10,10,ftext), va escribir en la posición 10,10 del Shape no del Form?

Gracias....

Crandel 20-03-2008 09:00:17

Cita:

Empezado por Jorge Rojas M. (Mensaje 274271)
... el procedimiento Paint en el momento de ejecutar la línea Canvas.TextOut(10,10,ftext), va escribir en la posición 10,10 del Shape no del Form?

si, lo deje asi para no complicar mas el ejemplo.

Puedes agregarle propiedades al componente para asignarle el lugar donde escribir o calcular de forma automatica la posicion, segun te guste

Jorge Rojas M. 25-03-2008 01:32:36

Cita:

Empezado por Crandel (Mensaje 274323)
si, lo deje asi para no complicar mas el ejemplo.

Puedes agregarle propiedades al componente para asignarle el lugar donde escribir o calcular de forma automatica la posicion, segun te guste

Muchísimas Gracias Crandel, ya lo pude programar y funciona perfectamente, en cuanto a la posición si estoy tratando de que éste calcule la misma de forma automática, si tienes algo por ahí me puedes ayudar muchísimo. De todos modos muchas Gracias.

keyboy 25-03-2008 07:39:26

Un ejemplo, centrando el texo en el shape:

Código Delphi [-]
procedure TMiShape.Paint;
begin
  inherited;
  Canvas.TextOut(
    (Width - Canvas.TextWidth(FText)) div 2,
    (Height - Canvas.TextHeight(FText)) div 2, FText);
end;

Por otra parte, dado que mencionas que quieres hacer un diagrama de flujo, te puede interesar el componente TSimpleGraph, que es gratuito y del que además, puedes estudiar su código. Hay varias referencias al componente en los foros.

Bye

santus 25-03-2008 16:08:38

Muy bueno el ejemplo de Crandel. Estaba buscando algo asi, y me parecio genial la idea. No sabia que con el canvas podias hacer tanto.

En cuanto a Jorge, te comento que puedes sacar la posición en la que se encuentra el puntero del mouse con algún evento como OnMouseDown que se activa cuando haces un click sobre el componente, o algo parecido relacionado al Mouse. Así pues se me ocurre que puedes hacer algo como esto:

suponiendo que tu componente tiene dos propiedades de tipo Integer llamados X e Y con sus respectivos seters...

Código Delphi [-]
 
procedure TfMain.TShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ComponenteDeJorge.ValorX := X;
  ComponenteDeJorge.ValorY := Y;
end;

y ya lo tenemos. Despues esta en vos ver que utilidad le quieres dar al shape. Investiga los eventos relacionados con el mouse, que seguro ahí tienes la solución a tu caso particular.
Espero haberte sido de ayuda.

Jorge Rojas M. 26-03-2008 01:11:33

Cita:

Empezado por keyboy (Mensaje 275056)
Un ejemplo, centrando el texo en el shape:


Código Delphi [-]
procedure TMiShape.Paint;
begin
inherited;
Canvas.TextOut(
(Width - Canvas.TextWidth(FText)) div 2,
(Height - Canvas.TextHeight(FText)) div 2, FText);
end;





Por otra parte, dado que mencionas que quieres hacer un diagrama de flujo, te puede interesar el componente TSimpleGraph, que es gratuito y del que además, puedes estudiar su código. Hay varias referencias al componente en los foros.

Bye


Muy Bueno KeyBoy tanto el procedimiento de Centrado en el Shape así como el TSimpleGraph este ultimo esta excelente voy a revisarlo.


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

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi