表名:dept_staff
结构:guid/id/kind/UPguid/role/staff/dept
==========================================具体以后再说=============
连接数据库代码:
===================================================================={*******************************************************}
{* }
{* Unit Name: TreeDataU }
{* Purpose : }
{* Author :桂双林 }
{* History : }
{* Copyright(c) 2004-2004 SinoSoftwareGroup Corporation }
{* }
{*******************************************************}unit TreeDataU;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, ADODB;type
TForm2 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
ComboBox1: TComboBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ADOConnection1: TADOConnection;
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Edit3Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ThisStr,ThisProvider:WideString;
Function Table_connt(sender: TADOTable):boolean;
end;
var
Form2: TForm2;
s:Array[0..5] of string;
implementationuses TreeU;{$R *.dfm}
//============================================
//把表连接数据源
//--------------------------------------------
Function TForm2.Table_connt(sender: TADOTable):boolean;
begin
Result := False;
if (Sender <> nil) and (not sender.Active)and ADOConnection1.Connected then
begin
sender.Connection.ConnectionString:=Form2.ThisStr;
sender.Connection.Provider:=Form2.ThisProvider;
//showmessage(sender.Connection.ConnectionString+'//'+sender.Connection.Provider);
Result := True;
end
else
begin
if (Sender <> nil) and (sender.Active) then
sender.Active :=False;
sender.Close;
end;
end;//============================================
//把新连接写入配置文件
//--------------------------------------------
Procedure WriteF();
Var
VarFile:TextFile;
begin
Try
AssignFile(VarFile,'DBCfg.ini');
ReWrite(VarFile);
writeln(VarFile,'DataBase:',S[0]);
writeln(VarFile,'ServerName:',S[1]);
writeln(VarFile,'DataNmae:',S[2]);
writeln(VarFile,'UserName:',S[3]);
writeln(VarFile,'UserPass:',S[4]);
CloseFile(VarFile);
Except
End;
end;
//================================
//读配置文件
//-------------------------------
Procedure ReadF();
Var
i:integer;
IniFile: TextFile;
begin
if FileExists('DBCfg.ini')then
Begin
i:=0;
AssignFile(IniFile,'DBCfg.ini');
Reset(IniFile);
while not Eof(IniFile) do
begin
ReadLn(IniFile,S[i]);
I:=I+1;
end;
closeFile(IniFile);
end
else
begin
ReWrite(IniFile);
end;
end;
//============================================
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
form2.Close;
end;procedure TForm2.FormCreate(Sender: TObject);
begin
ReadF();
ComboBox1.Text:= Copy(S[0],10,Length(S[0])-9);
Edit2.Text:= Copy(S[1],12,Length(S[1])-11);
Edit3.Text:= Copy(S[2],10,Length(S[2])-9);
Edit4.Text:= Copy(S[3],10,Length(S[3])-9);
Edit5.Text:= Copy(S[4],10,Length(S[4])-9);
//Label6.Color := clGreen;
end;
procedure Save_Cofig();
begin
s[0]:= form2.ComboBox1.Text;
s[1]:= Trim(form2.Edit2.Text);
s[2]:= Trim(form2.Edit3.Text);
s[3]:= Trim(form2.Edit4.Text);
s[4]:= Trim(form2.Edit5.Text);
end;
//=============================================
//配置数据源连接
//--------------------------------------------
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
ThisProvider:='SQLOLEDB.1';
ThisStr:= 'Provider=SQLOLEDB.1;Password='+Trim(Edit5.Text)+';Persist Security Info=True;User ID='+Trim(Edit4.Text)+';Initial Catalog='+Trim(Edit3.Text)+';Data Source='+Trim(Edit2.Text)+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID='+Trim(Edit2.Text)+';Use Encryption for Data=False;Tag with column collation when';
//Showmessage(ThisStr);
if ADOConnection1.Connected then
begin
ADOConnection1.Close;
//ADOConnection1.Destroy;
Label6.Color:= clred;
BitBtn1.Enabled:= True;
end
else
begin
ADOConnection1 := TADOConnection.Create(nil);
ADOConnection1.ConnectionString:=ThisStr;
try
ADOConnection1.LoginPrompt:=false;
ADOConnection1.Provider:=ThisProvider;
ADOConnection1.Open;
Label6.Color:= clGreen;
//Showmessage('数据库连接成功');
Save_Cofig();
WriteF();
form2.Close;
BitBtn1.Enabled:= false;
Except
ADOConnection1.close;
ADOConnection1.Destroy;
Showmessage('数据库连接失败');
Label6.Color:= clred;
BitBtn1.Enabled:= true;
Raise;
end;
end;
end;procedure TForm2.Edit3Change(Sender: TObject);
begin
BitBtn1.Enabled:= True;
end;end.
==============================================================
结构:guid/id/kind/UPguid/role/staff/dept
==========================================具体以后再说=============
连接数据库代码:
===================================================================={*******************************************************}
{* }
{* Unit Name: TreeDataU }
{* Purpose : }
{* Author :桂双林 }
{* History : }
{* Copyright(c) 2004-2004 SinoSoftwareGroup Corporation }
{* }
{*******************************************************}unit TreeDataU;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, ADODB;type
TForm2 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
ComboBox1: TComboBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ADOConnection1: TADOConnection;
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Edit3Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ThisStr,ThisProvider:WideString;
Function Table_connt(sender: TADOTable):boolean;
end;
var
Form2: TForm2;
s:Array[0..5] of string;
implementationuses TreeU;{$R *.dfm}
//============================================
//把表连接数据源
//--------------------------------------------
Function TForm2.Table_connt(sender: TADOTable):boolean;
begin
Result := False;
if (Sender <> nil) and (not sender.Active)and ADOConnection1.Connected then
begin
sender.Connection.ConnectionString:=Form2.ThisStr;
sender.Connection.Provider:=Form2.ThisProvider;
//showmessage(sender.Connection.ConnectionString+'//'+sender.Connection.Provider);
Result := True;
end
else
begin
if (Sender <> nil) and (sender.Active) then
sender.Active :=False;
sender.Close;
end;
end;//============================================
//把新连接写入配置文件
//--------------------------------------------
Procedure WriteF();
Var
VarFile:TextFile;
begin
Try
AssignFile(VarFile,'DBCfg.ini');
ReWrite(VarFile);
writeln(VarFile,'DataBase:',S[0]);
writeln(VarFile,'ServerName:',S[1]);
writeln(VarFile,'DataNmae:',S[2]);
writeln(VarFile,'UserName:',S[3]);
writeln(VarFile,'UserPass:',S[4]);
CloseFile(VarFile);
Except
End;
end;
//================================
//读配置文件
//-------------------------------
Procedure ReadF();
Var
i:integer;
IniFile: TextFile;
begin
if FileExists('DBCfg.ini')then
Begin
i:=0;
AssignFile(IniFile,'DBCfg.ini');
Reset(IniFile);
while not Eof(IniFile) do
begin
ReadLn(IniFile,S[i]);
I:=I+1;
end;
closeFile(IniFile);
end
else
begin
ReWrite(IniFile);
end;
end;
//============================================
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
form2.Close;
end;procedure TForm2.FormCreate(Sender: TObject);
begin
ReadF();
ComboBox1.Text:= Copy(S[0],10,Length(S[0])-9);
Edit2.Text:= Copy(S[1],12,Length(S[1])-11);
Edit3.Text:= Copy(S[2],10,Length(S[2])-9);
Edit4.Text:= Copy(S[3],10,Length(S[3])-9);
Edit5.Text:= Copy(S[4],10,Length(S[4])-9);
//Label6.Color := clGreen;
end;
procedure Save_Cofig();
begin
s[0]:= form2.ComboBox1.Text;
s[1]:= Trim(form2.Edit2.Text);
s[2]:= Trim(form2.Edit3.Text);
s[3]:= Trim(form2.Edit4.Text);
s[4]:= Trim(form2.Edit5.Text);
end;
//=============================================
//配置数据源连接
//--------------------------------------------
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
ThisProvider:='SQLOLEDB.1';
ThisStr:= 'Provider=SQLOLEDB.1;Password='+Trim(Edit5.Text)+';Persist Security Info=True;User ID='+Trim(Edit4.Text)+';Initial Catalog='+Trim(Edit3.Text)+';Data Source='+Trim(Edit2.Text)+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID='+Trim(Edit2.Text)+';Use Encryption for Data=False;Tag with column collation when';
//Showmessage(ThisStr);
if ADOConnection1.Connected then
begin
ADOConnection1.Close;
//ADOConnection1.Destroy;
Label6.Color:= clred;
BitBtn1.Enabled:= True;
end
else
begin
ADOConnection1 := TADOConnection.Create(nil);
ADOConnection1.ConnectionString:=ThisStr;
try
ADOConnection1.LoginPrompt:=false;
ADOConnection1.Provider:=ThisProvider;
ADOConnection1.Open;
Label6.Color:= clGreen;
//Showmessage('数据库连接成功');
Save_Cofig();
WriteF();
form2.Close;
BitBtn1.Enabled:= false;
Except
ADOConnection1.close;
ADOConnection1.Destroy;
Showmessage('数据库连接失败');
Label6.Color:= clred;
BitBtn1.Enabled:= true;
Raise;
end;
end;
end;procedure TForm2.Edit3Change(Sender: TObject);
begin
BitBtn1.Enabled:= True;
end;end.
==============================================================
解决方案 »
- delphi tquery 不能add all field 不能显示数据库里表的全部字段!
- delphi中调用其它程序,被调用的Exe文件结束后才能获取焦点,类似showmod效果
- access下datediff() 函数 delphi 编译报错问题 在线等 ~~
- 如何在delphi7下动态设置IP,网关和dns
- KeyDown 响应2位数字
- 注意:Tlist内存释放的方法问题
- 回车代替tab的小问题!
- 这行代码是什么意思?
- missing connection of connection string 得错
- 连接DCOM服务器总提示“可用的存储空间不足,无法完成操作”?是何原因?
- 关于fastreport 如果导出数据的问题
- 请大家为小弟推荐几本好书,拜托了...
//主窗体代码
//============================================================{*******************************************************}
{* }
{* Unit Name: TreeU }
{* Purpose : }
{* Author :桂双林 }
{* History : }
{* Copyright(c) 2004-2004 SinoSoftwareGroup Corporation }
{* }
{*******************************************************}unit TreeU;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, DBCtrls, ComCtrls, Grids, ValEdit, Buttons, DB,
ADODB, DBGrids, ImgList, StdCtrls;type
TForm1 = class(TForm)
ControlBar1: TControlBar;
DBNavigator1: TDBNavigator;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
StatusBar1: TStatusBar;
Panel1: TPanel;
Splitter1: TSplitter;
Panel2: TPanel;
Panel4: TPanel;
TreeView1: TTreeView;
Panel5: TPanel;
SpeedButton1: TSpeedButton;
DataSource1: TDataSource;
ADOTable1: TADOTable;
Panel6: TPanel;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
ImageList1: TImageList;
DBGrid1: TDBGrid;
N5: TMenuItem;
PopupMenu1: TPopupMenu;
EXCEL1: TMenuItem;
ValueListEditor1: TValueListEditor;
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure AddChildTree();
procedure N4Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
TreeSelect: TTreeNode;
TreeItemXY:String;
function SFilter:boolean;
Function UpTree(memberid: String):String;
Function AddValueList(k,v:string):boolean;
end;var
Form1: TForm1;implementationuses TreeDataU, Data_TableU;{$R *.dfm}
//==========================================
//到ValueListEditor1中查到父接点的id
//------------------------------------------
Function TForm1.UpTree(memberid: String):String;
var
UpTree:string;
begin
UpTree:='not';
UpTree:=Form1.ValueListEditor1.Values[memberid];
Result := UpTree;
end;//==========================================
//在加子树的同时
//把显示名(k)和id(v)存到ValueListEditor1中
//------------------------------------------
Function TForm1.AddValueList(k,v:string):boolean;
begin
Result := false;
if Form1.ValueListEditor1.Values[k]=''then
begin
Form1.ValueListEditor1.InsertRow(k,v,true);
Result := true;
end;
end;
//============================================
// 'BORLAND' { BORLAND }
// 'You''ll see' { You'll see }
// '''' { ' }
// '' { null string }
// ' ' { a space }
//用本接点的ID过滤数据源,找到要做儿子的数据
//----------------------------------------------
function Tform1.SFilter:boolean;
var
aFilter,ParentTree:string;
begin
Result := false;
if TreeView1.Selected<>nil then
begin
TreeItemXY:=inttostr(Treeview1.Selected.StateIndex);
ParentTree:=Uptree(TreeItemXY);
ADOTable1.Filtered:= false;
aFilter:= 'PARENTGUID = ';
afilter:=afilter + ''''+ ParentTree + '''';
ADOTable1.Filter := aFilter;
ADOTable1.Filtered:= true;
end;
end;
//==============================================
//从过滤后的数据源中的数据一个个他添置到本节点下
//成为子点
//--------------------------------------------
procedure Tform1.AddChildTree();
var
index:integer;
TreeChild: TTreeNode;
k,v,ChildTree:string;
begin
if ADOTable1.RecordCount >0 then
begin
ADOTable1.First;
for index:=0 to ADOTable1.RecordCount-1 do
begin
try
if ADOTable1.Fields[2].Value = 'omRole' then
ChildTree:=ADOTable1.Fields[5].Value
else if ADOTable1.Fields[2].Value = 'omStaff' then
ChildTree:=ADOTable1.Fields[6].Value
else if ADOTable1.Fields[2].Value = 'omDept' then
ChildTree:=ADOTable1.Fields[7].Value;
except
showmessage('数据列值为NULL错误');
end;
v:=ADOTable1.Fields[0].Value;
TreeChild:= TreeView1.Items.AddChild(TreeView1.Selected,ChildTree);
TreeChild.StateIndex:= TreeView1.Items.Count;
k:=inttostr(TreeChild.StateIndex);
AddValueList(k,v);
ADOTable1.Next;
end;
end;
StatusBar1.Panels.Items[0].Text:=' ['+Form3.Table_name+']表过滤后: 共 '+IntToStr((ADOTable1.RecordCount))+' 条数据';
end;//============================================
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Form3.ShowModal;
if Form3.Table_name ='Dept_Staff' then TreeView1.Enabled:=True
else
TreeView1.Enabled:=false; //渐时这样写,以后可以写成通用程式
if Form3.Table_name <>'' then
if Form2.ADOConnection1.Connected then
try
AdoTable1.Active:=false;
ADOTable1.TableName:=Form3.Table_name;
AdoTable1.Open;
SpeedButton4.Enabled:= true;
StatusBar1.Panels.Items[0].Text:=' ['+Form3.Table_name+']表: 共 '+IntToStr((ADOTable1.RecordCount))+' 条数据';
except
AdoTable1.Close;
//showmessage('fdfds');
end
end;procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
try
if Form2.Table_connt(ADOTable1) then
begin
SpeedButton3.Enabled:=false;
SpeedButton2.Enabled:=true;
end
else
showmessage('数据源没找到');
except
Adotable1.Close;
showmessage('连接数据源出错')
end;
end;
//=======================接下楼.....
//首先加一个准备好的根节点
//---------------------------------------------
procedure TForm1.SpeedButton4Click(Sender: TObject);
var
STree:TTreeNode;
//index:integer;
k,v,SFilter:string;
begin
Stree:=TreeView1.GetNodeAt(0,0);
if (not Stree.HasChildren) and (Form3.Table_name ='Dept_Staff') then
begin
ADOTable1.Filtered:= false;
SFilter:= '(PARENTGUID = ''-1'')';
ADOTable1.Filter := SFilter;
ADOTable1.Filtered:= true;
ADOTable1.First;
Stree.Text:= '组织机构';
Stree.StateIndex:=Treeview1.Items.Count;
k:=inttostr(Stree.StateIndex);
v:='-0';
AddValueList(k,v);
try
Form1.SFilter;
AddChildTree;
except
showmessage('初始树出错');
end;
end;
//showmessage(inttostr(ADOTable1.RecordCount));
end;//=====================================================
//当点对节点时,如果没有子节点就去想法找数据添加
//-----------------------------------------------------
procedure TForm1.TreeView1Click(Sender: TObject);
begin
StatusBar1.Panels.Items[1].Text:=' 第['+inttostr(TreeView1.Selected.Level)+']层第['+inttostr(TreeView1.Selected.Index)+ ']列'+ inttostr(Treeview1.Selected.StateIndex);
if (not TreeView1.Selected.HasChildren) and (TreeSelect<> TreeView1.Selected)then
begin
TreeSelect:= TreeView1.Selected ;
TreeItemXY:=inttostr(Treeview1.Selected.StateIndex);
if Form1.ValueListEditor1.Values[TreeItemXY]<>'' then
begin
Form1.SFilter;
AddChildTree;
end;
end;
end;procedure TForm1.N2Click(Sender: TObject);
begin
form2.show;
end;procedure TForm1.N4Click(Sender: TObject);
begin
form1.ADOTable1.Close;
form2.ADOConnection1.Close;
form2.ADOConnection1.Destroy;
form1.Close;
end;procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if panel1.Visible then
begin
panel1.Visible:= false;
Splitter1.Visible:=false;
end
else
begin
Splitter1.Visible:=true;
panel1.Visible:= true;
end;
end;end.
//选表窗口
//============================================={*******************************************************}
{* }
{* Unit Name: Data_TableU }
{* Purpose : }
{* Author :桂双林 }
{* History : }
{* Copyright(c) 2004-2004 SinoSoftwareGroup Corporation }
{* }
{*******************************************************}
unit Data_TableU;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, CheckLst, DB, ADODB, ComCtrls,
ImgList;type
TForm3 = class(TForm)
GroupBox1: TGroupBox;
Panel1: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ListView1: TListView;
Label1: TLabel;
ImageList1: TImageList;
procedure FormShow(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Table_name :string;
end;var
Form3: TForm3;implementationuses TreeDataU;{$R *.dfm}{***********************************************************}
{* }
{*从数据库取得表,如果表太多,用8倍MOD算法优化While语句的 }
{*执行次数,本来可以用ListBox组件一行就可以解决: }
{*Form2.ADOConnection1.GetTableNames(ListBox1.Items,False); }
{*跟本不用几十行,但是LISTBox当数据太多选择表时显示太慢 }
{* }
{***********************************************************}procedure TForm3.FormShow(Sender: TObject);
var
SL: TStrings;
item: TListItem;
j:integer;
index: Integer;
begin
if Form2.ADOConnection1.Connected then
begin
SL := TStringList.Create;
Form2.ADOConnection1.GetTableNames(SL, False);
ListView1.Clear;
j:=SL.Count mod 8;
index:=0;
if (j= 0) and (SL.Count>8)then
while index <=(SL.Count - 1) do
begin
item:= ListView1.Items.Add;
item.Caption := SL[index];
item:= ListView1.Items.Add;
item.Caption := SL[index+1];
item:= ListView1.Items.Add;
item.Caption := SL[index+2];
item:= ListView1.Items.Add;
item.Caption := SL[index+3];
item:= ListView1.Items.Add;
item.Caption := SL[index+4];
item:= ListView1.Items.Add;
item.Caption := SL[index+5];
item:= ListView1.Items.Add;
item.Caption := SL[index+6];
item:= ListView1.Items.Add;
item.Caption := SL[index+7];
index:= index+8;
//item.SubItems.Add('数据表');
//item.SubItems.Add('ff');
end
else if (j <> 0) and (SL.Count>8) then
begin
while index <=(SL.Count - 1-j) do
begin
item:= ListView1.Items.Add;
item.Caption := SL[index];
item:= ListView1.Items.Add;
item.Caption := SL[index+1];
item:= ListView1.Items.Add;
item.Caption := SL[index+2];
item:= ListView1.Items.Add;
item.Caption := SL[index+3];
item:= ListView1.Items.Add;
item.Caption := SL[index+4];
item:= ListView1.Items.Add;
item.Caption := SL[index+5];
item:= ListView1.Items.Add;
item.Caption := SL[index+6];
item:= ListView1.Items.Add;
item.Caption := SL[index+7];
index:= index+8;
//item.SubItems.Add('数据表');
//item.SubItems.Add('ff');
end;
for index:=(SL.Count -j) to (SL.Count - 1) do
begin
item:= ListView1.Items.Add;
item.Caption := SL[index];
end;
end
else if SL.Count<=8 then
for index := 0 to (SL.Count - 1) do
begin
item:= ListView1.Items.Add;
item.Caption := SL[index];
end;
Label1.Caption := '共有 ' + intTostr(ListView1.Items.Count)+ ' 张表';
end
else
ShowMessage('没有配置数据库连接');
end;procedure TForm3.BitBtn2Click(Sender: TObject);
begin
form3.Close;
Table_name:='';
end;procedure TForm3.BitBtn1Click(Sender: TObject);
begin
Table_name:= ListView1.Selected.Caption;
form3.Close;
end;end.
//===============================================
//============================================
//把表连接数据源
//--------------------------------------------
Function TForm2.Table_connt(sender: TADOTable):boolean;
begin
Result := False;
if (Sender <> nil) and (not sender.Active)and ADOConnection1.Connected then
begin
sender.Connection.ConnectionString:=Form2.ThisStr;
sender.Connection.Provider:=Form2.ThisProvider;
//showmessage(sender.Connection.ConnectionString+'//'+sender.Connection.Provider);
Result := True;
end
else
begin
if (Sender <> nil) and (sender.Active) then
sender.Active :=False;
sender.Close;
end;
end;
===========================================
这是因要改动ado的表数据源连接所以单独写了个函数
来重新配置连接字符串
TForm2.FormCreate启动窗本时,把上次连接文件读出来。。
ReadF();读配置文件
WriteF();写配置文件
//配置数据源连接
//--------------------------------------------
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
end;
//
这个是用来连数据库的,这里是sqlserver2000我现这个
type
PMyRecord = ^MyRecord;
MyRecord = record
ID : integer;
Name:string;
ParentID : integer;
end;//end of record//要据SQL 语句生成树型目录
procedure pCreateTreeView(Node:TTreeNode;ParentID:integer;
AtvnViewNode:TTreeView;AadoConnection:TADOConnection;AstrSQL:String;
AImageIndex,ASelectedIndex:Integer;AstrFieldName:String);
var
tmpNode : TTreeNode;
ADOTree : TADOQuery;
p : PMyRecord;
begin
ADOTree := TADOQuery.Create(application);
ADOTree.Connection := AadoConnection;
ADOTree.close;
ADOTree.SQL.clear;
//SELECT lx_bh, lx_mc,lx_parentID FROM ESMDqxlx_1 ADOTree.SQL.Text := AstrSQL+' where '+AstrFieldName +' ='+inttostr(ParentID);
ADOTree.open;
if ADOTree.recordcount > 0 then
begin
ADOTree.First;
while not ADOTree.Eof do
begin
new(p);
p.ID := ADOTree.Fields[0].AsInteger;
p.name :=ADOTree.Fields[1].AsString;
p.ParentID := ADOTree.Fields[2].AsInteger;
tmpNode := AtvnViewNode.Items.AddChildObject(Node,p.name,p); if AtvnViewNode.Images<>nil then //有图标时设置图标
begin
tmpNode.SelectedIndex := ASelectedIndex; //选中时图标
tmpNode.ImageIndex := AImageIndex; //没选中时图标
end; {== End If ==} pCreateTreeView(tmpNode,ADOTree.Fields[0].AsInteger,AtvnViewNode,AadoConnection,AstrSQL,AImageIndex,ASelectedIndex,AstrFieldName);
ADOTree.next;
//dispose(p);//一定要去掉这条语句,不然的话,Treeview中的Data也被dispose掉了。
end;
end;
ADOTree.Free;
end;例:
FstrSql:='SELECT SYS_BM_ID, SYS_BM_BMMC, SYS_BM_ParentID FROM SYS_BM';
//格式为
SYS_BM_ID ID 唯一编号 Integer 类型
SYS_BM_BMMC 名称 Varchar 类型
SYS_BM_ParentID 父节点ID Integer 类型 // 以上是SQL 语句的格式
//调用方式介绍 {
Node:TTreeNode 父节点
ParentID:integer 数据库中父节点ID
AtvnViewNode:TTreeView 要初始化的TTreeView 控件名
AadoConnection:TADOConnection TADOConnection 控件名
AstrSQL:String SQL 语句
AImageIndex:Integer ; 未选中时的图标索引号
ASelectedIndex:Integer; 选中时的图标索引号
AstrFieldName:String 父节点字段名
}pCreateTreeView(Node:TTreeNode;ParentID:integer;
AtvnViewNode:TTreeView;AadoConnection:TADOConnection;AstrSQL:String;
AImageIndex,ASelectedIndex:Integer;AstrFieldName:String);
pCreateTreeView(Nil,0,self.tvwBm,self.ado_CreateTree.Connection,FstrSql,17,16,'SYS_BM_ParentID');
{数据库存的表结构如下:}
ID : Int 自增
MC : Varchar 名称
ParentID : Int 父节点ID
我上面有这样的,
但你有几个问题没有解决:
1,那就是我用树显示 汉字 ,而你这样做只是生成树,显示 ID ,谁都不知道ID是代表什么啊
2,树上没有数据库用的ID,你的ID在点树时在那里找到?而且用来生成子树?不完整
3,如果你把树显用的文本加上ID,那不好看,象补丁:)我的树完全是显示汉字不会有什么ID,我是通过另一个途径找到ID的。
===============================1表结构=========================================
表结构:guid/id /kind /UPguid/role/staff/dept
对应名: 主键/模块ID/关系类型/父ID /角色/员工/部门 //所有都是字符类型解释:实际上我这个表是一个由部门表,岗位角色表,员工表,和功能模块表,他们之间的关系统生成的权限树
如: 一个部门有多个岗位,多位员工,一个岗位能在多个门里等关系。
而我这个树实现模块在部门,公司,人员,岗位之间的灵活分配!!!想分给谁就分给谁,想给岗位授权就给岗位授权!!!!(关于权限继续由自己去想,还不是一样的:)呵呵)作用:这个功能树实际上是用来代替菜单的!!,树会变他是活的,而菜单是死的,难于控制.
重点:我这个表用了数据结构里的"连表"是用数组实现的,数组是这里的表!!!一行就是节点
==================================2============================================
//这是个完整的例子不是单是树代码
步骤如下:
0,打开窗时提出原来的正确数据库配置 //就是读文件那里,我不说了.
1,连接数据库:procedure TForm2.BitBtn1Click(Sender: TObject);
2, 把adotable连接数据 :Function TForm2.Table_connt(sender: TADOTable):boolean;
3, 选择数据库表(当然一定要有父子结构)procedure TForm1.SpeedButton2Click(Sender: TObject);
从数据里得到表:procedure TForm3.FormShow(Sender: TObject);
4, 得到表名:procedure TForm3.BitBtn1Click(Sender: TObject);
5,初始化树:procedure Tform1.AddChildTree();
6, 只要向树中加节点,同时把 节点ID/K 对应 数据库ID/V 在ValueListEditor1 加一行.
为什么用ValueListEditor1 作为节点ID与数据库ID对应???这就是显示汉字又能找到ID
的原因:呵呵,再一个用这个东东好找KEY :)
7, 如果有人点树,我加子节点:procedure TForm1.TreeView1Click(Sender: TObject);
到ValueListEditor1中找到父ID: Function TForm1.UpTree(memberid: String):String;
用父ID过滤数据源: function Tform1.SFilter:boolean;
把过滤后的数据加到树啊: procedure Tform1.AddChildTree();
--加节点的同时记得存好节点id 和父ID的对应关系:AddValueList(k,v);
8,思路就这样啦。。得到一个显示汉字的树哦。
9,如果那个没有这个模块权限,我就删除他在这个表的那行啊(在权限分配里自己搞吧)
这个下次把开树他看不到那个节点了。。看不到啦,当然打不开窗口啊。没权限啊。
如果那个有好的方法,把ID存在树的某个地方请告诉我。
中科软件集团:桂双林
电子邮箱:
[email protected]
不容易看
可以发个具体的文档吗?
[email protected]
谢谢了~~
代码很长
不容易看
可以发个具体的文档吗?
[email protected]
谢谢了~~=======================================================
源码已发送........
这么多代码,有点昏啊
id存在data里不行吗
---------------------------
我以前用java所以不喜欢用指针,你那个想法当然可以啊
表名: dept_staff
guid: 就是主键
memberid: 岗位ID/人员ID/部门ID 是与memberkind三种类型对应的
omRole/omStaff/omDept
parentguid: 是父ID,他一般是guid,就是上面的主键,
只有一个不同(也可以是多个)就是最上层的公司名,他没有父ID
se: 是在树中的顺号,有些人权力大他在排前面啊,实际也是没办法:)
Expr2: 是岗位
Expr3: 是人员
Expr1: 是部门(包括公司)
可以发个具体的文档吗?
[email protected]
谢谢了~~
源程序和文档已发送