Pues esto es lo que yo tengo hasta ahora, pero la seleccion no me funciona bien, y lo de guardar las posiciones lo resolvere con el TSaveComps
Código Delphi
[-]procedure TfrmPrincipal.CrearNodo(Sender: TObject);
begin
Randomize;
imgDisp:=TsImage.Create(tshMapaRed);
with imgDisp do
begin
Parent:=tshMapaRed;
Top:=80;
Left:=140;
AutoSize:=True;
Images:=imgListDisp;
if TipoMapa = 'Redes' then ImageIndex:=1
else ImageIndex:=DataMod.fdtDispositIDTIPODISP.Value;
OnMouseDown:=ControlMouseDown;
OnMouseMove:=ControlMouseMove;
OnMouseUp:=ControlMouseUp;
OnClick:=ControlClick;
lblDisp:=CrearLabelAsociada(imgDisp, TitDisp);
imgDisp.Hint:=lblDisp.Name;
end;
end;
La etiqueta la creo de esta forma:
Código Delphi
[-]function TfrmPrincipal.CrearLabelAsociada(AImage: TImage; Titulo: string):TLabel;
var
lbl :TLabel;
begin
lbl:=TLabel.Create(Self);
with lbl do
begin
Name:='lblRed'+IntToStr(DataMod.fdtRedesIdRed.Value);
Parent:=AImage.Parent;
Left:=AImage.Left;
Top:=AImage.Top + AImage.Height + 2;
Caption:=Titulo;
Alignment:=taCenter;
end;
Result:=lbl;
end;
Para moverlo, lo hago con estos procedimientos
Código Delphi
[-]procedure TfrmPrincipal.ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
begin
CompCorX:=X;
CompCorY:=Y;
CompMoviendo:=True;
TMovible(Sender).MouseCapture:=True;
end;
procedure TfrmPrincipal.ControlMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
begin
if CompMoviendo then
begin
TImage(Sender).Left:=TImage(Sender).Left - (MouseDownSpot.x - x) - 24;
TImage(Sender).Top:=TImage(Sender).Top - (MouseDownSpot.y - y) - 24;
lblDisp:=TLabel(FindComponent(TImage(Sender).Hint));
lblDisp.Left:=TImage(Sender).Left ;
lblDisp.Top:=TImage(Sender).Top ;
lblDisp.Top:=TImage(Sender).Top + TImage(Sender).Height + 2;
end;
end;
procedure TfrmPrincipal.ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
begin
if CompMoviendo then
begin
CompMoviendo:=False;
TMovible(Sender).MouseCapture:=False;
end;
if (Sender is TImage) then imgSelect:=TImage(Sender);
end;
Lo elimino asi
Código Delphi
[-]procedure TfrmPrincipal.btn2Click(Sender: TObject);
var
i :Integer;
begin
if Assigned (imgSelect) then
begin
for i:=ComponentCount - 1 downto 0 do
begin
if Components[i] is TLabel then
if Components[i].Name = imgSelect.hint then
begin
Components[i].Free;
Break;
end;
end;
FreeAndNil(imgSelect);
end;
end;
Y para seleccionarlo parece que algo me falta o no es el metodo adecuado, lo que intento es ponerle un TShape transparente para que quede alrededor del control, pero no funciona del todo bien.
Código Delphi
[-]procedure TfrmPrincipal.ControlClick(Sender: TObject);
begin
if Assigned (imgSelect) then
with shpSelect do
begin
Visible:=True;
Top:=PosCur.X-1;
Left:=PosCur.Y-1;
end;
end;
Lo que sucede es que tengo que dar clic dos veces para que me muestre el TShape en el Nodo seleccionado, por ejemplo:
1ra situación:
Doy un clic y no sucede nada, doy otro clic y me muestra el TShape correctamente
2da situación:
Doy un clic en un nodo y no sucede nada, doy un clic en otro nodo y el TShape se me ubica en el nodo anterior
Al dar un clic parece que el nodo se asigna bien, porque al darle eliminar se elimina al que le di un clic, pero no sucede nada con la ubicacion del TShape
Alguna idea de lo que estoy haciendo mal?
Como podria arreglar eso?
Cita:
Empezado por neftali
No es por no hacerlo, pero creo que se "rompe" con la idea del componente.
De todas formas, no se si una solución podría ser crear un Frame con una imagen y un Label (por ejemplo) y seleccionar el frame para moverlo, cosa que no te debería dar ningún problema.
|
Aunque no lo he probado, no se si me sirva con un Frame, pues necesito que las imagenes tengan fondo transparente, y si el nombre de la etiqueta fuese mas largo que el ancho del frame, quizas ma la trunque