Sie sind auf Seite 1von 4

unit tree_db_u;

interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
RadioGroup1: TRadioGroup;
Table2: TTable;
procedure Button1Click(Sender: TObject);
procedure TreeView1Deletion(Sender: TObject; Node: TTreeNode);
procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Type
PNodeInfo = ^TNodeInfo;
TNodeInfo = Record
UniqueID : String[30];
FieldName : String[30];
end;
var PNI : PNodeInfo;
procedure TForm1.Button1Click(Sender: TObject);
var count1, count2 : integer;
node, node2 : TTreeNode;
begin
Treeview1.items.Clear;
TreeView1.items.BeginUpDate;
Table1.First;
While Not(Table1.EOF) do
begin
node := TreeView1.Items.Add(nil,Table1.Fields[1].AsString);
New(PNI);
PNI^.UniqueID := Table1.Fields[0].AsString;
PNI^.FieldName := Table1.Fields[1].FieldName;
Node.Data := PNI;
For Count2 := 1 to Table1.FieldCount-1 do
begin
Node2 := TreeView1.Items.AddChild(node,Table1.Fields[count2].AsString +' <
-- '+
Table1.Fields[count2].FieldName);
New(PNI);
PNI^.UniqueID := Table1.Fields[0].AsString;
PNI^.FieldName := Table1.Fields[Count2].FieldName;
Node2.Data := PNI;
end;
table1.Next;
end;
Treeview1.Items.EndUpDate;
end;
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
PNI := Node.Data;
if PNI <> Nil then
Dispose(PNI);
Node.Data := Nil;
end;
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var Node : TTreeNode;
begin
accept := False; //First do not accept
if sender = Source then //Same Control ?
begin
Node := TreeView1.GetNodeAt(X,Y);
If Node <> Nil then //Over a Node ?
If Node <> TreeView1.Selected then //Not the Same Node ?
If (Node.Parent = Nil) and (TreeView1.Selected.Parent = Nil) then //Bot
h Root Node ?
Accept := True
else
If (Node.Parent = Nil) and Not(Node.Expanded) then //Expand the Root,
if a Field dragged
Node.Expand(False)
else
If PNodeInfo(Node.Data)^.FieldName =
PNodeInfo(TreeView1.Selected.Data)^.FieldName then //Same Field
?
Accept := True;
end;
end;
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
Node, Node2 : TTreeNode;
S : String;
I : Integer;
begin
Node := TreeView1.GetNodeAt(X,Y);
Table2.Locate('ID',PNodeInfo(TreeView1.Selected.Data)^.UniqueID,[]); //Synchr
onize Tables
Table1.Locate('ID',PNodeInfo(Node.Data)^.UniqueID,[]);
if Node.Parent = Nil then //Apply to whole Record
begin
Case RadioGroup1.ItemIndex of
0 : Begin //Copy
Table1.Edit; //First apply to Table
For I := 1 to Table1.FieldCount - 1 do
Table1.Fields[I].Assign(Table2.Fields[I]);
Table1.Post;
Node.Text := Table1.Fields[1].AsString; //Second Apply to Tree
Node2 := Node.GetFirstChild;
while node2 <> Nil do
begin
node2.Text := Table1.FieldbyName(PNodeInfo(Node2.Data)^.FieldName)
.AsString +
' <-- '+Table1.FieldbyName(PNodeInfo(Node2.Data)^.FieldName)
.FieldName;
Node2 := Node.GetNextChild(Node2);
end;
end;
1 : Begin //Swap
Table1.Edit;
Table2.Edit;
For I := 1 to Table1.FieldCount - 1 do
begin
S := Table1.Fields[I].AsString;
Table1.Fields[I].Assign(Table2.Fields[I]);
Table2.Fields[I].Value := S;
end;
Table1.Post;
Table2.Post;
Table1.Refresh;
Node.Text := Table1.Fields[1].AsString;
Node2 := Node.GetFirstChild;
while node2 <> Nil do
begin
node2.Text := Table1.FieldbyName(PNodeInfo(Node2.Data)^.FieldName)
.AsString +
' <-- '+Table1.FieldbyName(PNodeInfo(Node2.Data)^.FieldName)
.FieldName;
Node2 := Node.GetNextChild(Node2);
end;
Node := Treeview1.Selected;
Node.Text := Table2.Fields[1].AsString;
Node2 := Node.GetFirstChild;
while node2 <> Nil do
begin
node2.Text := Table2.FieldbyName(PNodeInfo(Node2.Data)^.FieldName)
.AsString +
' <-- '+Table2.FieldbyName(PNodeInfo(Node2.Data)^.FieldName)
.FieldName;
Node2 := Node.GetNextChild(Node2);
end;
end;
end;
end
else
begin //Apply One Field
Case RadioGroup1.ItemIndex of
0 : Begin //Copy
Table1.Edit;
Table1.FieldByName(PNodeInfo(Node.Data)^.FieldName).Assign(Table2.Fi
eldByName(PNodeInfo(Node.Data)^.FieldName));
Table1.Post;
node.Text := Table1.FieldbyName(PNodeInfo(Node.Data)^.FieldName).AsS
tring +
' <-- '+Table1.FieldbyName(PNodeInfo(Node.Data)^.FieldName).F
ieldName;
end;
1 : Begin
Table1.Edit;
Table2.Edit;
S := Table1.FieldByName(PNodeInfo(Node.Data)^.FieldName).AsString;
Table1.FieldByName(PNodeInfo(Node.Data)^.FieldName).Assign(Table2.Fi
eldByName(PNodeInfo(Node.Data)^.FieldName));
Table2.FieldByName(PNodeInfo(Node.Data)^.FieldName).Value := S;
Table1.Post;
Table2.Post;
node.Text := Table1.FieldbyName(PNodeInfo(Node.Data)^.FieldName).AsS
tring +
' <-- '+Table1.FieldbyName(PNodeInfo(Node.Data)^.FieldName).F
ieldName;
Node := Treeview1.Selected;
node.Text := Table2.FieldbyName(PNodeInfo(Node.Data)^.FieldName).AsS
tring +
' <-- '+Table2.FieldbyName(PNodeInfo(Node.Data)^.FieldName).F
ieldName;
end;
end;
end;
end;
procedure TForm1.TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var Node : TTreeNode;
begin
Node := TreeView1.GetNodeAt(X,Y);
If Node <> Nil then
Table1.Locate('ID',PNodeInfo(Node.Data)^.UniqueID,[]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.DatabaseName := ExtractFilePath(Application.ExeName);
Table2.DatabaseName := ExtractFilePath(Application.ExeName);
Table1.Open;
Table2.Open;
end;
end.

Das könnte Ihnen auch gefallen