Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   TreeView Drag and Drop en Delphi.net (https://www.clubdelphi.com/foros/showthread.php?t=32477)

XaRz 07-06-2006 10:04:29

TreeView Drag and Drop en Delphi.net
 
Hola a todos,

Estoy intentando hacer funcionar un drag and drop para un treeview programado con TTreeView que funcione para un control TreeView de .NEt.

Lo he intentado de varias formas...la última a través del código de Marco Cantu del libro Mastering Delphi 2005 que va como sigue:
Código:

procedure EquipCom.TreeView1_DragDrop(sender,source: System.Object; e: System.Windows.Forms.DragEventArgs;
        point:System.Drawing.point);
var
 TargetNode,SourceNode:TTreeNode;
begin
    TargetNode:=treeView1.GetNodeAt(point);
    if TargetNode <> nil then
    begin
      SourceNode:=TreeView1.SelectedNode;
      SourceNode.MoveTo(targetNode,naAddChildFirst);
      TargetNode.Expand(False);
      treeView1.SelectedNode:=TargetNode;
    end;

end;

procedure EquipCom.TreeView1_DragOver(sender,source: System.Object;point:System.Drawing.point;
      state:TDragState;var Accept:boolean; e: System.Windows.Forms.DragEventArgs);
var
TargetNode,SourceNode:TTreeNode;
begin
      TargetNode:=TreeView1.GetNodeAt(Point);
      if ((source=Sender) AND(targetNode <> nil)) then
      begin
        Accept:=True;
        SourceNode:=TreeView1.SelectedNode;
        while (targetNode.Parent<> nil) and (targetNode<> SourceNode) do
        begin
          targetNode:=TargetNode.Parent;
        end;
        if TargetNode = SourceNode then
        Accept:=False;
      end
      else Accept:=False;
end;

Pero claro, hay cosas que de calle no están bien para .NET, por ejemplo en
Código:

SourceNode:=TreeView1.SelectedNode;
nos darà un problema de tipos ya que: en
Código:

var
TargetNode,SourceNode:TTreeNode;

le estamos definiendo un TTreeNode que no es lo mismo que un TreeNode en .NET
Aparte el compilador se queja cuando le assigno al drag&drop cabeceras diferentes de:
Código:

procedure EquipCom.TreeView1_DragOver(sender: System.Object;
e: System.Windows.Forms.DragEventArgs);

En mi caso la cabecera que intento assignarle al DragOver es:
Código:

procedure EquipCom.TreeView1_DragOver(sender,source: System.Object;point:System.Drawing.point;
      state:TDragState;var Accept:boolean; e: System.Windows.Forms.DragEventArgs);

.

En fin, si alguna lumbrera me puede orientar..yo lo único que desearia són acciones de drag&drop en un treeview. Pero estoy encallado.

Ala,saludos y gracias por adelantado.

XaRz 08-06-2006 18:43:22

Resuelto
 
Dios cuanta incultura que trajino por ahi...

En resumen, he incorporado tal cual el Formulario que viene con el ejemplo de Marco Cantú a mi proyecto .NET y tachánnn! sorpresa porque ningun problema de mezclar classes TTreeView con proyectos.net. Es mas, no hay problema con mezclar units .NET i win32!
Esto es la leche!
Se me ha abierto un mundo de clases que tenia por desaprovechadas por una falta de conocimiento al respecto...que inculto soy...

Si alguien necesita implementar algo parecido le pasteo el codigo que ya advierto que es de marco cantú..(espero que no incumpla ningún copyright chungo por pastear esto...y si lo incumplo no me lo tengáis en cuenta :)
Código:

unit TreeForm;

interface

{$WARN UNIT_PLATFORM OFF}

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, Menus;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    MainMenu1: TMainMenu;
    Options1: TMenuItem;
    File1: TMenuItem;
    Exit1: TMenuItem;
    Help1: TMenuItem;
    About1: TMenuItem;
    Root1: TMenuItem;
    Buttons1: TMenuItem;
    Lines1: TMenuItem;
    N1: TMenuItem;
    Font1: TMenuItem;
    FontDialog1: TFontDialog;
    ExpandAll1: TMenuItem;
    N2: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure About1Click(Sender: TObject);
    procedure Root1Click(Sender: TObject);
    procedure Buttons1Click(Sender: TObject);
    procedure Lines1Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure Font1Click(Sender: TObject);
    procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ExpandAll1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  TreeView1.LoadFromFile (
    ExtractFilePath (Application.ExeName) + 'TreeText.txt');
end;

procedure TForm1.About1Click(Sender: TObject);
begin
  MessageDlg ('DragTree Example'#13'by Marco Cantù',
    mtInformation, [mbOk], 0);
end;

procedure TForm1.Root1Click(Sender: TObject);
begin
  TreeView1.ShowRoot := not TreeView1.ShowRoot;
  Root1.Checked := TreeView1.ShowRoot;
end;

procedure TForm1.Buttons1Click(Sender: TObject);
begin
  TreeView1.ShowButtons := not TreeView1.ShowButtons;
  Buttons1.Checked := TreeView1.ShowButtons;
end;

procedure TForm1.Lines1Click(Sender: TObject);
begin
  TreeView1.ShowLines := not TreeView1.ShowLines;
  Lines1.Checked := TreeView1.ShowLines;
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Font1Click(Sender: TObject);
begin
  if FontDialog1.Execute then
    TreeView1.Font := FontDialog1.Font;
end;

procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  TargetNode, SourceNode: TTreeNode;
begin
  TargetNode := TreeView1.GetNodeAt (X, Y);
  // accept dragging from itself
  if (Source = Sender) and (TargetNode <> nil) then
  begin
    Accept := True;
    // determines source and target
    SourceNode := TreeView1.Selected;
    // look up the target parent chain
    while (TargetNode.Parent <> nil) and
        (TargetNode <> SourceNode) do
      TargetNode := TargetNode.Parent;
    // if source is found
    if TargetNode = SourceNode then
      // do not allow dragging over a child
      Accept := False;
  end
  else
    Accept := False;
end;

procedure TForm1.TreeView1DragDrop(Sender, Source: TObject;
  X, Y: Integer);
var
  TargetNode, SourceNode: TTreeNode;
begin
  TargetNode := TreeView1.GetNodeAt (X, Y);
  if TargetNode <> nil then
  begin
    SourceNode := TreeView1.Selected;
    SourceNode.MoveTo (TargetNode, naAddChildFirst);
    TargetNode.Expand (False);
    TreeView1.Selected := TargetNode;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TreeView1.SaveToFile (
    ExtractFilePath (Application.ExeName) + 'TreeText.txt');
end;

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  TreeView1.BeginDrag (False);
end;

procedure TForm1.ExpandAll1Click(Sender: TObject);
begin
  // either:
  TreeView1.FullExpand;
  // or:
  // TreeView1.Items [0].Expand(True);
end;

end.

Ale grácias de todos modos.

XaRz 08-06-2006 18:50:39

Rectificando conceptos....
 
A ver..he releido las tonterias que he escrito anteriormente y la verdad me explico mal y con mala leche.

No es verdad que mezcle librerias win32 con .Net, lo que passa es que no utilizo controles estrictos del .Net frameWork sino de la vcl.net de borland que contiene los controles anteriores al movimiento .Net Osease Win32.

Con lo qual si programas con BDS2006 puedes acceder a todas las clases de Borland que exisitan en DelphiWin32 (y que esten programadas en .NET) que ahora veo el gran quid de usar Delphi.NEt en vez de VB.NET.

Que rollazo tengo..en fin. Monólogos aparte se haceptan correcciones, insultos educados con el fin de mejorar mi cultura de programador.

Saludos y nos leemos.

dec 08-06-2006 19:36:53

Hola,

Cita:

Que rollazo tengo..en fin. Monólogos aparte se haceptan correcciones, insultos educados con el fin de mejorar mi cultura de programador.
¡Saludos! :)


La franja horaria es GMT +2. Ahora son las 09:34:22.

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