Delphi - Componente dentro de un tchart

   
Vista:

Componente dentro de un tchart

Publicado por Diego Gutierrez (15 intervenciones) el 25/10/2007 20:10:01
hola, cree una funcioncilla que al darle click sobre un punto en un bdchart, me inserta una label dentro del grafico con el valor del punto donde hice click, de la sifuietne forma:

procedure TfrmTableroNominas.ClickEnSerie(Sender: TChartSeries;ValueIndex: Integer; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
etiqueta: tlabel;
begin
etiqueta:=Tlabel.Create(self);
etiqueta.Parent:=sender.ParentChart;
etiqueta.Color:=$0080ffff;
etiqueta.AutoSize:=true;
etiqueta.caption:=formatfloat(sender.ValueFormat,sender.YValues.Value[Valueindex]);
etiqueta.Top:=Y+5;
etiqueta.Transparent:=false;
etiqueta.Left:=X-Trunc(etiqueta.Width/2);
if (etiqueta.Left+etiqueta.Width)>sender.ParentChart.Width then
etiqueta.Left:=sender.ParentChart.Width-etiqueta.Width-5;
if etiqueta.left<5 then
etiqueta.left:=5;
etiqueta.Visible:=true;
end;

y funciona de maravilla, pero quize hacer otra funcioncilla que borre todos los tlabels que creé dentro del tchar y no se como, le cale con elgracfico.getcomponents blab bla bla, pero no me regresa los componentes que yo cree, o no se si lo estoy usando bien
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Componente dentro de un tchart

Publicado por E.T. (1108 intervenciones) el 25/10/2007 22:44:39
En primera, yo te rocomendaría que cambiaras un poco tu función:

Para crear un componente lo haría de la siguiente manera

TLabel.Create(Self).Name:='MiLabel'+IntToStr(nLabels);
with TLabel(FindComponent('MiLabel'+IntToStr(nLabels))) do begin
-- //Luego le doy sus valores
-- Parent:=sender.ParentChart;
-- Color:=$0080ffff;
-- AutoSize:=true;
-- caption:=formatfloat(sender.ValueFormat,sender.YValues.Value[Valueindex]);
-- Top:=Y+5;
-- Transparent:=false;
-- Left:=X-Trunc(etiqueta.Width/2);
-- if (Left+Width)>sender.ParentChart.Width then
-- Left:=sender.ParentChart.Width-Width-5;
-- if left<5 then
-- left:=5;
-- Visible:=true;
end;

Con lo anterior te ahorras la variable "etiqueta", y la variable "nLabels" (tipo integer) la declaras en el apartado "private" y le das valor de 1 al activarse la forma.

Ahora para borrarlas todas necesitas lo siguiente:

for i:=1 to nLabels do begin
-- if TLabel(FindComponent('MiLabel'+IntToStr(i)))<> nil then
---- TLabel(FindComponent('MiLabel'+IntToStr(i))).Destroy;
end;
nLabels:=1;

Los guinoes al inicio de las lineas no los tomes en cuenta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Componente dentro de un tchart

Publicado por Deigo Gutierrez (15 intervenciones) el 25/10/2007 22:52:13
hmm es bastante interesante el ejemplo que pones, no estoy nada acostumbrado a hacer uso del with ya que esoty mas familiarizado con java que con delphi

por otra parte, surge otro problema, tengo 6 ggraficos en vez de uno y si huzo el codigo que tu me sugieres borrarita las etiquetas de todos los graficos y no solamente de uno de ellos

tienes alguna recomendacion de como hacerlo independente para que se aplique a un grafico solamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Componente dentro de un tchart

Publicado por E.T. (1108 intervenciones) el 25/10/2007 23:39:36
Estoy intentando algo, pero voy a tardar un poco, si tienes messenger agregame y cuando termine te mando el programa para que veas el funcionamiento
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Componente dentro de un tchart

Publicado por Diego Gutierrez (15 intervenciones) el 26/10/2007 00:22:03
aqui en mi trabajo no puedo usar el messenger, pero estuy attento para ver que soluciones me tienes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Componente dentro de un tchart

Publicado por E.T. (1108 intervenciones) el 26/10/2007 00:21:50
Solucionado.

En private declaras el arreglo nLabels:array[1..6]of integer;

Luego a cada chart en su propiedad "tag" le das 1,2,3,4,5,6 a cada uno, es decir, 1 al primero, 2 al segundo, 3 al tercero, etc. para identificarlos en el procedimiento

luego en el evento on click de la serie1 pones lo siguiente

procedure TForm1.Series1Click(Sender: TChartSeries; ValueIndex: Integer;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inc(nLabels[sender.ParentChart.Tag]);

//Es una sola linea
TLabel.Create(Self).Name:='MiLabel_'+IntToStr(nLabels[sender.ParentChart.Tag])
+'_'+inttostr(sender.ParentChart.Tag);
//termina linea

//es una sola linea
with
TLabel(FindComponent('MiLabel_'+IntToStr(nLabels[sender.ParentChart.Tag])
+'_'+inttostr(sender.ParentChart.Tag))) do begin
//termina linea

Parent:=sender.ParentChart;
Color:=$0080ffff;
AutoSize:=true;
caption:=formatfloat(sender.ValueFormat,sender.YValues.Value[Valueindex]);
Top:=Y+5;
Transparent:=false;
Left:=X-Trunc(Width/2);
if (Left+Width)>sender.ParentChart.Width then
Left:=sender.ParentChart.Width-Width-5;
if left<5 then
left:=5;
Visible:=true;
end;
end;

Lo siguiente va al activarse la forma
for i:=1 to 6 do
nlabels[i]:=0;
-------------------------------------------------------------------------------------

Luego en el evento OnMouseDown del primer chart pones lo siguiente:

procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var i:integer;
begin
if Button=mbRight then

//Es una sola linea
if MessageDlg('Deseas eliminar las etiquetas?',mtWarning,[mbYes,mbNo],0)
=mrYes then begin
//termina linea

for i:=1 to nLabels[(Sender as TChart).Tag] do begin

// es una sola linea
if TLabel(FindComponent('MiLabel_'+IntToStr(i)+'_'+inttostr((sender as TChart).Tag)))<>nil then
//termina linea

//es una sola linea
TLabel(FindComponent('MiLabel_'+IntToStr(i)+'_'+inttostr((sender as TChart).Tag))).Destroy;
//termina linea
end;
nLabels[(sender as TChart).Tag]:=1;
end;
end;

Ahora selecciona la siguiente serie, la 2, y ve a el object inspector, y ve a los eventos, dirigete al evento on Click y despliega el menú y selecciona el evento de la serie1, y haces lo mismo con cada serie restante.

Ahora haces lo mismo para el evento on MouseDown del chart1, y lo agregas al evento On MouseDown de los demás charts.

Si tienes dudas o no te funciona mandame un mail y te envío el programa para que lo pruebes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Componente dentro de un tchart

Publicado por E.T. (1108 intervenciones) el 26/10/2007 00:29:28
Un pequeño error en la linea: nLabels[(sender as TChart).Tag]:=1; que te puse casi al final del anterior mensage deberia ser

nLabels[(sender as TChart).Tag]:=0;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Componente dentro de un tchart

Publicado por Diego Gutierrez (15 intervenciones) el 26/10/2007 00:33:42
Vaya bastante interesante tu metodo, me dio muchas ideas de como le podrias hechar a la imaginacion para ponerlo a cada uno de los reportes anteriores

Gracias, ya lo hice funcionar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Componente dentro de un tchart

Publicado por E.T. (1108 intervenciones) el 26/10/2007 00:40:04
Una ultima observaciónj, cuando das click derecho sobre el chart, te permite mover la gráfica, algo que no sabia hasta ahorita, por lo que al darle click derecho a un chart te sale el mensage de eliminar las etiquetas y si el mensaje está sobre el chart que diste click te moverá la gráfica, no se que propiedad es la que permite eso, si no la encuentras elige otro evento (como doble click), u otra forma de hacer que quite las etiquetas desde un botón o cualquier cosa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar