nit Base_Sele_Unit;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Base_Unit, BusinessSkinForm, dxExEdtr, bsSkinCtrls, ExtCtrls, dxCntner, dxTL, dxDBCtrl, dxDBTL, kbmMemTable, DB, ADODB, Grids, DBGrids;type TBase_Sele_Frm = class(Tbase_Frm) bsSkinPanel1: TbsSkinPanel; bsSkinPanel2: TbsSkinPanel; LeftTV: TdxDBTreeList; RightTV: TdxDBTreeList; CenterTV: TdxDBTreeList; Splitter1: TSplitter; Splitter2: TSplitter; bsSkinButton2: TbsSkinButton; leftADS: TADODataSet; RightADS: TADODataSet; bsSkinPanel3: TbsSkinPanel; bsSkinButton3: TbsSkinButton; bsSkinButton4: TbsSkinButton; CenterADS: TADODataSet; DataSource1: TDataSource; DataSource2: TDataSource; DataSource3: TDataSource; bsSkinButton1: TbsSkinButton; procedure bsSkinButton4Click(Sender: TObject); procedure leftADSAfterScroll(DataSet: TDataSet); procedure bsSkinButton3Click(Sender: TObject); procedure bsSkinButton2Click(Sender: TObject); procedure bsSkinButton1Click(Sender: TObject); procedure Splitter1Moved(Sender: TObject); procedure Splitter2Moved(Sender: TObject); procedure FormResize(Sender: TObject); procedure LeftTVGetImageIndex(Sender: TObject; Node: TdxTreeListNode; var Index: Integer); procedure LeftTVGetSelectedIndex(Sender: TObject; Node: TdxTreeListNode; var Index: Integer); procedure CenterTVDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure FormClose(Sender: TObject; var Action: TCloseAction); private LeftFld , RightFld,CenterTab : string; SQLLeft, SQLCenter, SQLRight : string; SaveFld : string; //改变GRID的宽度 procedure ChangeColWidth; procedure OpenData; procedure loadGrid; procedure AddSelNode(node : TDXTreeListNode); procedure RemoveSelNode; procedure SaveDB; procedure SaveCenterDB; protected procedure ListData(SQLLeft1, SQLCenter1, SQLRight1 ,LeftFld1,RightFld1,CenterTab1: string); procedure ListCenterGrid(fld ,fldCaption,fldWidth : string); procedure SetSaveFld(SaveFld1 : string); public { Public declarations } end;var Base_Sele_Frm: TBase_Sele_Frm;implementationuses SysPublic, DM_Unit;{$R *.dfm}{ TBase_Sele_Frm }procedure TBase_Sele_Frm.AddSelNode(node : TDXTreeListNode); var bm : TBookMark; procedure AddToCenterTV; begin CenterADS.Append; CenterADS.FieldByName(LeftFld).AsInteger := LeftADS.FieldByName('id').asInteger; CenterADS.FieldByName(RightFld).AsInteger := RightADS.FieldByName('id').asInteger; CenterADS.fieldbyName('ID').AsInteger := getTabID(CenterTab); CenterADS.FieldByName('RName').AsString := RightADS.fieldbyName('name').asString; CenterADS.Post; end; function LoateFilter(iID : integer ) : boolean; var bm : TBookMark; begin result := False; CenterADS.First; bm := CenterADS.GetBook; CenterADS.DisableControls; while not CenterADS.Eof do begin if CenterADS.FieldByName(RightFld).AsInteger = RightADS.fieldByName('id').asInteger then begin result := True; CenterADS.GotoBook(bm); break; end; CenterADS.Next; end; CenterADS.EnableControls; CenterADS.FreeBook(bm); end; begin if LeftTV.FocusedNode.HasChildren then begin ShowMsg('请选中左边树的子节点!'); exit; end; if node <> nil then begin if not node.HasChildren then begin if CenterADS.IsEmpty then AddToCenterTV else begin if not LoateFilter(RightADS.fieldByName('id').asInteger) then //if not CenterADS.Locate((leftFld+';'+RightFld), vararrayof([LeftADS.FieldByName('id').AsInteger,RightADS.FieldByName('id').AsInteger]),[loCaseInsensitive]) then //if not CenterADS.Locate(LeftFld,RightADS.FieldByName('id').asInteger,[loCaseInsensitive]) then // if not CenterADS.Locate(LeftFld,RightADS.FieldByName('id').asInteger,[loCaseInsensitive]) then AddToCenterTV else ShowMsg('已选择此节点!'); end; end else begin ShowMsg('请选择右边树的明细节点!'); {RightADS.DisableControls; bm := RightADS.GetBook; RightADS.GotoBook(bm); RightADS.EnableControls;} end; end;end;procedure TBase_Sele_Frm.ListData(SQLLeft1, SQLCenter1, SQLRight1 ,LeftFld1,RightFld1,CenterTab1: string); begin SQLLeft := SQLLeft1; SQLCenter := SQLCenter1; SQLRight := SQLRight1; LeftFld := LeftFld1; RightFld := RightFld1; CenterTab := CenterTab1; OpenData; LoadGrid; end;
procedure TBase_Sele_Frm.OpenData; begin OpenDataSet(LeftADS ,SQLLeft); OpenDataSet(RightADS ,SQLRight); OpenDataSet(CenterADS ,SQLCenter); end;procedure TBase_Sele_Frm.RemoveSelNode; beginend;procedure TBase_Sele_Frm.bsSkinButton4Click(Sender: TObject);begin inherited; if CenterADS.IsEmpty then exit; if ShowAskMsg('确认删除此项记录吗?') = idOK then CenterADS.Delete;end;procedure TBase_Sele_Frm.leftADSAfterScroll(DataSet: TDataSet); begin inherited; { if CenterADS.State <> dsBrowse then begin if ShowASKMsg('数据已经修改,是否保存?') = idOk then SaveCenterDB; end;} if CenterADS.Filtered then CenterADS.Filtered := False; CenterADS.Filter := LeftFld + ' = '+ LeftADS.fieldbyName('id').asString; CenterADS.Filtered := True;end;procedure TBase_Sele_Frm.SaveCenterDB; beginend;procedure TBase_Sele_Frm.loadGrid; begin //读取左边的树 StrToTreeField(LeftTV,'name','名称','100'); LeftTv.KeyField := 'ID'; if LeftADS.FieldByName('parent') <> nil then LeftTV.ParentField := 'parent'; //读取右边的树 StrToTreeField(RightTV,'name','名称','100'); RightTv.KeyField := 'ID'; if RightADS.FieldByName('parent') <> nil then RightTV.ParentField := 'parent'; ChangeColWidth; end;procedure TBase_Sele_Frm.ListCenterGrid(fld, fldCaption,fldWidth: string); begin StrToTreeField(CenterTV,fld,fldCaption,'100'); CenterTV.KeyField := 'ID'; CenterTV.ParentField := 'ID'; CenterADS.Recordset.Properties.Item['Unique Table'].Value := CenterTab; ChangeColWidth; end;procedure TBase_Sele_Frm.bsSkinButton3Click(Sender: TObject); begin inherited; AddSelNode(RightTV.FocusedNode); end;procedure TBase_Sele_Frm.bsSkinButton2Click(Sender: TObject); begin inherited; close; end;procedure TBase_Sele_Frm.SaveDB; var i : integer; iFldCount : integer; tmpADS : TAdoDataSet; sFldName : string; begin CenterADS.First; iFldCount := GetCommaStrCount(SaveFld); tmpADS := TAdoDataSet.Create(nil); OpenDataSet(tmpADS, 'select * from ' + CenterTab); //如果有这个编号,则修改,否则新增 while not CenterADS.Eof do begin if tmpADS.Locate('id', CenterADS.FieldByName('id').asInteger,[]) then tmpADS.Edit else tmpADS.Append; for i := 1 to iFldCount do begin sFldName := GetCommaStr(SaveFld,i); tmpADS.FieldByName(sFldName).Value := CenterADS.FieldByName(sFldName).Value; end; tmpADS.Post; CenterADS.Next; end; end;procedure TBase_Sele_Frm.SetSaveFld(SaveFld1: string); begin SaveFld := SaveFld1; end;procedure TBase_Sele_Frm.bsSkinButton1Click(Sender: TObject); begin inherited; SaveDB; end;procedure TBase_Sele_Frm.ChangeColWidth; var i, iWid : integer; begin LeftTV.ColumnByFieldName('name').Width := LeftTV.Width - 5; RightTV.ColumnByFieldName('name').Width := RightTV.Width - 5; iWid := 0; if CenterTV.ColumnCount < 1 then exit; for i := 0 to CenterTV.ColumnCount - 1 do begin iWid := iWid + CenterTV.Columns[i].Width; end; //if iWid < CenterTV.Width - 5 then CenterTV.columns[CenterTV.ColumnCount - 1].Width := CenterTV.columns[CenterTV.ColumnCount - 1].Width + (CenterTV.Width - 5 - iWid) //else end;procedure TBase_Sele_Frm.Splitter1Moved(Sender: TObject); begin inherited; ChangeColWidth; end;procedure TBase_Sele_Frm.Splitter2Moved(Sender: TObject); begin inherited; ChangeColWidth; end;procedure TBase_Sele_Frm.FormResize(Sender: TObject); begin inherited; ChangeColWidth; end;procedure TBase_Sele_Frm.LeftTVGetImageIndex(Sender: TObject; Node: TdxTreeListNode; var Index: Integer); const ImagesIndex: array[Boolean] of Integer = (16, 17); begin inherited; if Node.HasChildren then Index := ImagesIndex[Node.Expanded] else Index := 16; end;procedure TBase_Sele_Frm.LeftTVGetSelectedIndex(Sender: TObject; Node: TdxTreeListNode; var Index: Integer); const ImagesIndex: array[Boolean] of Integer = (16, 17); begin inherited; if Node.HasChildren then Index := ImagesIndex[Node.Expanded] else Index := 16; end;procedure TBase_Sele_Frm.CenterTVDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin inherited; // exit; if Source.ClassType = TdxDBTreeList then begin if not TdxDBTreeList(Source).DragNode.HasChildren then begin AddSelNode(RightTV.DragNode); Accept := True; end; end; end;procedure TBase_Sele_Frm.FormClose(Sender: TObject; var Action: TCloseAction); begin inherited; leftADS.Active := False; RightADS.Active := False; CenterADS.Active := False; end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Base_Unit, BusinessSkinForm, dxExEdtr, bsSkinCtrls, ExtCtrls,
dxCntner, dxTL, dxDBCtrl, dxDBTL, kbmMemTable, DB, ADODB, Grids, DBGrids;type
TBase_Sele_Frm = class(Tbase_Frm)
bsSkinPanel1: TbsSkinPanel;
bsSkinPanel2: TbsSkinPanel;
LeftTV: TdxDBTreeList;
RightTV: TdxDBTreeList;
CenterTV: TdxDBTreeList;
Splitter1: TSplitter;
Splitter2: TSplitter;
bsSkinButton2: TbsSkinButton;
leftADS: TADODataSet;
RightADS: TADODataSet;
bsSkinPanel3: TbsSkinPanel;
bsSkinButton3: TbsSkinButton;
bsSkinButton4: TbsSkinButton;
CenterADS: TADODataSet;
DataSource1: TDataSource;
DataSource2: TDataSource;
DataSource3: TDataSource;
bsSkinButton1: TbsSkinButton;
procedure bsSkinButton4Click(Sender: TObject);
procedure leftADSAfterScroll(DataSet: TDataSet);
procedure bsSkinButton3Click(Sender: TObject);
procedure bsSkinButton2Click(Sender: TObject);
procedure bsSkinButton1Click(Sender: TObject);
procedure Splitter1Moved(Sender: TObject);
procedure Splitter2Moved(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure LeftTVGetImageIndex(Sender: TObject; Node: TdxTreeListNode;
var Index: Integer);
procedure LeftTVGetSelectedIndex(Sender: TObject;
Node: TdxTreeListNode; var Index: Integer);
procedure CenterTVDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
LeftFld , RightFld,CenterTab : string;
SQLLeft, SQLCenter, SQLRight : string;
SaveFld : string;
//改变GRID的宽度
procedure ChangeColWidth; procedure OpenData;
procedure loadGrid;
procedure AddSelNode(node : TDXTreeListNode);
procedure RemoveSelNode;
procedure SaveDB;
procedure SaveCenterDB;
protected procedure ListData(SQLLeft1, SQLCenter1, SQLRight1 ,LeftFld1,RightFld1,CenterTab1: string);
procedure ListCenterGrid(fld ,fldCaption,fldWidth : string);
procedure SetSaveFld(SaveFld1 : string);
public
{ Public declarations }
end;var
Base_Sele_Frm: TBase_Sele_Frm;implementationuses SysPublic, DM_Unit;{$R *.dfm}{ TBase_Sele_Frm }procedure TBase_Sele_Frm.AddSelNode(node : TDXTreeListNode);
var
bm : TBookMark;
procedure AddToCenterTV;
begin
CenterADS.Append;
CenterADS.FieldByName(LeftFld).AsInteger := LeftADS.FieldByName('id').asInteger;
CenterADS.FieldByName(RightFld).AsInteger := RightADS.FieldByName('id').asInteger;
CenterADS.fieldbyName('ID').AsInteger := getTabID(CenterTab);
CenterADS.FieldByName('RName').AsString := RightADS.fieldbyName('name').asString;
CenterADS.Post;
end;
function LoateFilter(iID : integer ) : boolean;
var
bm : TBookMark;
begin
result := False;
CenterADS.First;
bm := CenterADS.GetBook;
CenterADS.DisableControls;
while not CenterADS.Eof do
begin
if CenterADS.FieldByName(RightFld).AsInteger = RightADS.fieldByName('id').asInteger then
begin
result := True;
CenterADS.GotoBook(bm);
break;
end;
CenterADS.Next;
end;
CenterADS.EnableControls;
CenterADS.FreeBook(bm); end;
begin
if LeftTV.FocusedNode.HasChildren then
begin
ShowMsg('请选中左边树的子节点!');
exit;
end; if node <> nil then
begin
if not node.HasChildren then
begin
if CenterADS.IsEmpty then
AddToCenterTV
else
begin
if not LoateFilter(RightADS.fieldByName('id').asInteger) then
//if not CenterADS.Locate((leftFld+';'+RightFld), vararrayof([LeftADS.FieldByName('id').AsInteger,RightADS.FieldByName('id').AsInteger]),[loCaseInsensitive]) then
//if not CenterADS.Locate(LeftFld,RightADS.FieldByName('id').asInteger,[loCaseInsensitive]) then
// if not CenterADS.Locate(LeftFld,RightADS.FieldByName('id').asInteger,[loCaseInsensitive]) then
AddToCenterTV
else
ShowMsg('已选择此节点!');
end;
end
else
begin
ShowMsg('请选择右边树的明细节点!');
{RightADS.DisableControls;
bm := RightADS.GetBook; RightADS.GotoBook(bm);
RightADS.EnableControls;}
end;
end;end;procedure TBase_Sele_Frm.ListData(SQLLeft1, SQLCenter1, SQLRight1 ,LeftFld1,RightFld1,CenterTab1: string);
begin
SQLLeft := SQLLeft1;
SQLCenter := SQLCenter1;
SQLRight := SQLRight1;
LeftFld := LeftFld1;
RightFld := RightFld1;
CenterTab := CenterTab1;
OpenData;
LoadGrid;
end;
begin
OpenDataSet(LeftADS ,SQLLeft);
OpenDataSet(RightADS ,SQLRight);
OpenDataSet(CenterADS ,SQLCenter);
end;procedure TBase_Sele_Frm.RemoveSelNode;
beginend;procedure TBase_Sele_Frm.bsSkinButton4Click(Sender: TObject);begin
inherited;
if CenterADS.IsEmpty then exit;
if ShowAskMsg('确认删除此项记录吗?') = idOK then
CenterADS.Delete;end;procedure TBase_Sele_Frm.leftADSAfterScroll(DataSet: TDataSet);
begin
inherited;
{ if CenterADS.State <> dsBrowse then
begin
if ShowASKMsg('数据已经修改,是否保存?') = idOk then
SaveCenterDB;
end;} if CenterADS.Filtered then
CenterADS.Filtered := False;
CenterADS.Filter := LeftFld + ' = '+ LeftADS.fieldbyName('id').asString;
CenterADS.Filtered := True;end;procedure TBase_Sele_Frm.SaveCenterDB;
beginend;procedure TBase_Sele_Frm.loadGrid;
begin
//读取左边的树
StrToTreeField(LeftTV,'name','名称','100'); LeftTv.KeyField := 'ID'; if LeftADS.FieldByName('parent') <> nil then
LeftTV.ParentField := 'parent'; //读取右边的树
StrToTreeField(RightTV,'name','名称','100'); RightTv.KeyField := 'ID';
if RightADS.FieldByName('parent') <> nil then
RightTV.ParentField := 'parent';
ChangeColWidth;
end;procedure TBase_Sele_Frm.ListCenterGrid(fld, fldCaption,fldWidth: string);
begin
StrToTreeField(CenterTV,fld,fldCaption,'100');
CenterTV.KeyField := 'ID';
CenterTV.ParentField := 'ID';
CenterADS.Recordset.Properties.Item['Unique Table'].Value := CenterTab;
ChangeColWidth;
end;procedure TBase_Sele_Frm.bsSkinButton3Click(Sender: TObject);
begin
inherited;
AddSelNode(RightTV.FocusedNode);
end;procedure TBase_Sele_Frm.bsSkinButton2Click(Sender: TObject);
begin
inherited;
close;
end;procedure TBase_Sele_Frm.SaveDB;
var
i : integer;
iFldCount : integer;
tmpADS : TAdoDataSet;
sFldName : string;
begin
CenterADS.First;
iFldCount := GetCommaStrCount(SaveFld);
tmpADS := TAdoDataSet.Create(nil);
OpenDataSet(tmpADS, 'select * from ' + CenterTab);
//如果有这个编号,则修改,否则新增
while not CenterADS.Eof do
begin
if tmpADS.Locate('id', CenterADS.FieldByName('id').asInteger,[]) then
tmpADS.Edit
else
tmpADS.Append;
for i := 1 to iFldCount do
begin
sFldName := GetCommaStr(SaveFld,i);
tmpADS.FieldByName(sFldName).Value := CenterADS.FieldByName(sFldName).Value;
end;
tmpADS.Post;
CenterADS.Next;
end;
end;procedure TBase_Sele_Frm.SetSaveFld(SaveFld1: string);
begin
SaveFld := SaveFld1;
end;procedure TBase_Sele_Frm.bsSkinButton1Click(Sender: TObject);
begin
inherited;
SaveDB;
end;procedure TBase_Sele_Frm.ChangeColWidth;
var
i, iWid : integer;
begin
LeftTV.ColumnByFieldName('name').Width := LeftTV.Width - 5;
RightTV.ColumnByFieldName('name').Width := RightTV.Width - 5; iWid := 0;
if CenterTV.ColumnCount < 1 then exit;
for i := 0 to CenterTV.ColumnCount - 1 do
begin
iWid := iWid + CenterTV.Columns[i].Width;
end; //if iWid < CenterTV.Width - 5 then
CenterTV.columns[CenterTV.ColumnCount - 1].Width := CenterTV.columns[CenterTV.ColumnCount - 1].Width + (CenterTV.Width - 5 - iWid)
//else
end;procedure TBase_Sele_Frm.Splitter1Moved(Sender: TObject);
begin
inherited;
ChangeColWidth;
end;procedure TBase_Sele_Frm.Splitter2Moved(Sender: TObject);
begin
inherited;
ChangeColWidth;
end;procedure TBase_Sele_Frm.FormResize(Sender: TObject);
begin
inherited;
ChangeColWidth;
end;procedure TBase_Sele_Frm.LeftTVGetImageIndex(Sender: TObject;
Node: TdxTreeListNode; var Index: Integer);
const
ImagesIndex: array[Boolean] of Integer = (16, 17);
begin
inherited;
if Node.HasChildren then
Index := ImagesIndex[Node.Expanded]
else
Index := 16;
end;procedure TBase_Sele_Frm.LeftTVGetSelectedIndex(Sender: TObject;
Node: TdxTreeListNode; var Index: Integer);
const
ImagesIndex: array[Boolean] of Integer = (16, 17);
begin
inherited;
if Node.HasChildren then
Index := ImagesIndex[Node.Expanded]
else
Index := 16;
end;procedure TBase_Sele_Frm.CenterTVDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
inherited;
// exit;
if Source.ClassType = TdxDBTreeList then
begin
if not TdxDBTreeList(Source).DragNode.HasChildren then
begin
AddSelNode(RightTV.DragNode);
Accept := True;
end;
end;
end;procedure TBase_Sele_Frm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
inherited;
leftADS.Active := False;
RightADS.Active := False;
CenterADS.Active := False;
end;end.