数据库怎么建,代码怎么写才能写出来树型目录来啊.!(主要是想能让TREEVIEW与数据 库结合)!另求代码!
解决方案 »
- 新人报道,指点一二!
- 请教CORBA在不同局域网(或internet)怎么互联 -- UP有分
- ado可不可以操纵ftp上的mdb数据库?
- 在线等待,立即给分:ActiveXForm中使用OpenDialog的问题?
- 这样的工作环境感觉如何,请发表看法!
- 关于拖动编程,如何实现外部对象经拖动被自己的程序所识别。?
- clientsocket的sendbuf怎么用呀?
- 不显示删除回复显示所有回复显示星级回复显示得分回复 懂编程的高手请进,进销存软件功能设置激活不了,配置设置内容如下,如何添加自动执行命令来激活设置?
- delphi中三层应用,应用程序服务器发布时,应当怎样发布。
- 大家新年好!2002的第一个问题。
- 如何制作游戏外挂例如(传奇外挂)
- 各位高手
// 1、建立ErrorTreeView与DataBase之间的关联关系;
// 2、ErrorTreeView的Editor方式的操作;unit ErrorTree;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls,Menus;type
TErrorTreeForm = class(TForm)
ErrorTreeView: TTreeView;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn4: TBitBtn;
BitBtn6: TBitBtn;
Image1: TImage;
Label1: TLabel;
LabeledEditName: TEdit;
Label2: TLabel;
EditCode: TEdit;
Label3: TLabel;
BitBtn7: TBitBtn;
BitBtn5: TBitBtn;
BitBtn3: TBitBtn;
Bevel1: TBevel;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure BitBtn5Click(Sender: TObject);
procedure LabeledEditNameKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ErrorTreeViewChange(Sender: TObject; Node: TTreeNode);
procedure BitBtn7Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure ErrorTreeViewExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
private
{ Private declarations }
public
NewNode: TTreeNode;
//新加Node
function SaveTreeViewListToDatabase: Integer;
//将树结构保存至数据库
function GetMaxCode(SendNode: TTreeNode): Integer;
//获得TreeView中当前同层的编号最大值
function GetMaxCodeStr(SendNode: TTreeNode): String;
//获得TreeView中当前同层的编号最新的字符型编号
function GetCodeStrList(var CodeStrList: TStringList): Boolean;
//获得索引编码列表
function CheckExistsBool(CodeStr: String; CodeStrList: TStringList): Boolean;
//检查数据库中是否已经存在该项
function DataBaseClear: Boolean;
//删除表中全部数据
function DrawErrorTreeView: Integer;
//从数据库中导入全部数据到TreeView
function GetParentNodeForWrite(TierLen: Integer;
ParentCodeStr: String; var ParentNode: TTreeNode): Integer;
//为数据的写入从TreeView中找出父层节点
{ Public declarations }
end;var
ErrorTreeForm: TErrorTreeForm;
function GetTreeViewMaxTierFromDatabase: Integer;
//从数据表中获得TreeView的最大层数
function GetParentCodeStr(CodeStr: String): string;
//获得父节点的编号implementationuses DataModF;
{$R *.dfm}procedure TErrorTreeForm.FormShow(Sender: TObject);
begin
NewNode:= TTreeNode.Create(Nil);
DrawErrorTreeView;
NewNode:= Nil; // 初始化NewNode
end;procedure TErrorTreeForm.BitBtn1Click(Sender: TObject); //建同级目录
var
CurNode: TTreeNode;
MaxCodeStr: String;
begin
LabeledEditName.Text:= '';
EditCode.Text:= '';
MaxCodeStr:= GetMaxCodeStr(NewNode);
if ErrorTreeView.Selected<> nil then
begin
CurNode:= ErrorTreeView.Selected;
NewNode:= ErrorTreeView.Items.AddChild(CurNode.Parent,MaxCodeStr);
end
else
NewNode:= ErrorTreeView.Items.AddChild(nil,MaxCodeStr);
NewNode.Selected:= True;
EditCode.Text:= MaxCodeStr;
LabeledEditName.SetFocus;
end;procedure TErrorTreeForm.BitBtn2Click(Sender: TObject); //建下级目录
var
CurNode: TTreeNode;
MaxCodeStr: String;
begin
LabeledEditName.Text:= '';
EditCode.Text:= '';
if ErrorTreeView.Selected= nil then Exit;
CurNode:= ErrorTreeView.Selected;
NewNode:= ErrorTreeView.Items.AddChild(CurNode,'');
CurNode.Expand(True);
NewNode.Selected:= True;
MaxCodeStr:= GetMaxCodeStr(NewNode);
MaxCodeStr:= Copy(MaxCodeStr,1,Length(MaxCodeStr)-1)+IntToStr(StrToInt(Copy(MaxCodeStr,Length(MaxCodeStr),1))-1);
//最后一位减一
NewNode.Text:= MaxCodeStr;
EditCode.Text:= MaxCodeStr;
LabeledEditName.SetFocus;
end;procedure TErrorTreeForm.BitBtn3Click(Sender: TObject);
begin
Close;
end;procedure TErrorTreeForm.BitBtn4Click(Sender: TObject);
var
CurNode,TempNode: TTreeNode;
begin
if Application.MessageBox('确认删除吗?','警告',MB_ICONWARNING+MB_YESNO)<>mrYES then Exit;
LabeledEditName.Text:= '';
if ErrorTreeView.Selected= nil then Exit;
CurNode:= ErrorTreeView.Selected;
if not CurNode.IsFirstNode then //删除前移动焦点,默认前移
TempNode:= CurNode.GetPrev
else
TempNode:= CurNode.GetNext;
CurNode.Delete;
NewNode:= TempNode;
end;procedure TErrorTreeForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
NewNode.Free; //关闭时释放资源
end;procedure TErrorTreeForm.BitBtn5Click(Sender: TObject);
begin
if SaveTreeViewListToDatabase = 0 then
Close
else
Application.MessageBox('数据保存时出错!','错误',MB_ICONWARNING+MB_OK);
end;procedure TErrorTreeForm.LabeledEditNameKeyUp(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if NewNode = nil then Exit;
NewNode.Text:= EditCode.Text + '_' + LabeledEditName.Text; //输入时TreeView同时更新
if key = 13 then //回车时TreeView设置焦点
begin
NewNode.Selected:= True;
ErrorTreeView.SetFocus;
end;
end;procedure TErrorTreeForm.ErrorTreeViewChange(Sender: TObject;
Node: TTreeNode);
begin
if ErrorTreeView.Selected= nil then Exit;
NewNode:= ErrorTreeView.Selected;
LabeledEditName.Text:= Copy(NewNode.Text,(NewNode.Level+1)*2+2,Length(NewNode.Text)-(NewNode.Level+1)*2+1);
EditCode.Text:= Copy(NewNode.Text,1,(NewNode.Level+1)*2);
LabeledEditName.SetFocus;
end;function TErrorTreeForm.SaveTreeViewListToDatabase: Integer;
var
CurNode: TTreeNode;
i,j: Integer;
NodeLevel: Integer;
CodeStr, ErrorName, NodeTxt,S: String;
CodeStrList: TStringList;
begin
Result:= 0;
CodeStrList:= TStringList.Create;
try
try
GetCodeStrList(CodeStrList);
with ErrorTreeView do
begin
CurNode:= Items.GetFirstNode;
DataBaseClear;
for i:= 0 to items.Count-1 do
begin
NodeLevel:= CurNode.Level;
NodeTxt:= CurNode.Text;
CodeStr:= Copy(NodeTxt,1,(NodeLevel+1)*2);
ErrorName:= Copy(NodeTxt,(NodeLevel+1)*2+2,Length(NodeTxt));
S:= 'insert ErrorName (故障名称id,故障名称) values('''+CodeStr+''','''+ErrorName+''')';
with DataMod.QryErrorName do
begin
Close;
SQL.Clear;
SQL.Add(s);
Prepare;
ExecSQL;
end;
CurNode:= CurNode.GetNext;
end;
end;
finally
CodeStrList.Free;
end;
except
Result:= 1;
end;
end;function TErrorTreeForm.GetMaxCode(SendNode: TTreeNode): Integer;
var
TempNode: TTreeNode;
i: integer;
begin
if SendNode = Nil then
begin
Result:= 0;
Exit;
end;
i:=0;
if SendNode.Parent<>nil then
TempNode:= SendNode.Parent.getFirstChild
else
TempNode:= ErrorTreeView.Items.GetFirstNode;
Repeat
TempNode:= TempNode.getNextSibling;
i:= i+1;
until
TempNode = nil;
Result:= i;
end;function TErrorTreeForm.GetMaxCodeStr(SendNode: TTreeNode): String;
var
MaxCode: Integer;
ParentCodeStr: String;
begin
MaxCode:= GetMaxCode(SendNode) + 1;
if (SendNode <> nil) and (SendNode.Parent <> Nil) then
ParentCodeStr:= Copy(SendNode.Parent.Text,1,(SendNode.Parent.Level+1)*2)
else
ParentCodeStr:='';
if MaxCode < 10 then
Result:= ParentCodeStr + '0'+IntToStr(MaxCode)
else
Result:= ParentCodeStr + IntToStr(MaxCode);
end;
var CodeStrList: TStringList): Boolean;
begin
Result:= True;
try
CodeStrList.Clear;
with DataMod.QryErrorName do
begin
Close;
SQL.Clear;
SQL.Add('select 故障名称id from errorname');
Prepare;
Open;
while not eof do
begin
CodeStrList.Add(FieldByName('故障名称id').AsString);
Next;
end;
end;
except
Result:= False;
end;
end;function TErrorTreeForm.CheckExistsBool(CodeStr: String;
CodeStrList: TStringList): Boolean;
var
i: Integer;
begin
Result:= False;
for i:= 0 to CodeStrList.Count-1 do
if CodeStrList[i]=CodeStr then
begin
Result:= True;
Break;
end;
end;procedure TErrorTreeForm.BitBtn7Click(Sender: TObject);
var
txtFileName: TFileName;
begin
SaveDialog1.Filter:= '文本文件(*.txt)|*.txt';
if SaveDialog1.Execute then
begin
txtFileName:= SaveDialog1.FileName;
try
if not FileExists(txtFileName) then
FileClose(FileCreate(txtFileName));
ErrorTreeView.SaveToFile(txtFileName);
except
Application.MessageBox(Pchar('保存失败,请确认路径是否正确?'+#13#10+txtFileName),'错误',MB_ICONWARNING+MB_OK);
Exit;
end;
Application.MessageBox(Pchar('文件保存成功!'+#13#10+txtFileName),'提示',MB_ICONWARNING+MB_OK);
end;
end;procedure TErrorTreeForm.BitBtn6Click(Sender: TObject);
var
txtFileName: TFileName;
begin
OpenDialog1.Filter:= '文本文件(*.txt)|*.txt';
if OpenDialog1.Execute then
begin
txtFileName:= OpenDialog1.FileName;
try
ErrorTreeView.Items.Clear;
ErrorTreeView.LoadFromFile(txtFileName);
except
Application.MessageBox(Pchar('导入错误,请确认该文件是否有效?'+#13#10+txtFileName),'错误',MB_ICONWARNING+MB_OK);
Exit;
end;
Application.MessageBox(Pchar('导入成功!'+#13#10+txtFileName),'提示',MB_ICONWARNING+MB_OK);
end;
end;function TErrorTreeForm.DataBaseClear: Boolean;
begin
try
with DataMod.QryErrorName do
begin
Close;
SQL.Clear;
SQL.Add('delete from errorname');
Prepare;
ExecSQL;
end;
except
Result:= False;
Exit;
end;
Result:= True;
end;function TErrorTreeForm.DrawErrorTreeView: Integer;
var
MaxCodeLen,TierLen: Integer;
CodeStr,ParentCodeStr: String;
ParentNode: TTreeNode;
begin
Result:= 0;
try
MaxCodeLen:= GetTreeViewMaxTierFromDatabase;
for TierLen:=1 to MaxCodeLen do
begin
with DataMod.QryErrorName do
begin
Close;
SQL.Clear;
SQL.Add('select 故障名称id,故障名称 from ErrorName ');
SQL.Add('where len(故障名称id)='+IntToStr(TierLen*2));
Prepare;
Open;
// showmessage(inttostr(recordcount));
while Not Eof do
begin
CodeStr:= FieldByName('故障名称id').AsString;
ParentCodeStr:= GetParentCodeStr(CodeStr);
GetParentNodeForWrite(TierLen,ParentCodeStr,ParentNode);
ErrorTreeView.Items.AddChild(ParentNode,CodeStr+'_'+FieldByName('故障名称').AsString);
Next;
end;
end;
end;
except
Result:= 1;
end;
end;procedure TErrorTreeForm.ErrorTreeViewExpanding(Sender: TObject;
Node: TTreeNode; var AllowExpansion: Boolean);
begin
// if Node=nil then Exit;
// TreeViewExpend(Node);
end;function TErrorTreeForm.GetParentNodeForWrite(TierLen: Integer;
ParentCodeStr: String; var ParentNode: TTreeNode): Integer;
var
TempNode: TTreeNode;
i: Integer;
begin
Result:= 0;
with ErrorTreeView do
begin
TempNode:= Items.GetFirstNode;
for i:= 0 to Items.Count-1 do
begin
if TempNode = nil then Break;
if Copy(TempNode.Text,1,(TierLen-1)*2)='' then Break; //检测是否为第一层
if Copy(TempNode.Text,1,(TierLen-1)*2)=ParentCodeStr then
begin
ParentNode:= TempNode;
Exit;
end;
TempNode:= TempNode.GetNext;
end;
ParentNode:= Nil;
end;
end;function GetTreeViewMaxTierFromDatabase: Integer;
begin
with DataMod.QryErrorName do
begin
Close;
SQL.Clear;
SQL.Add('select maxlen=max(len(故障名称id)) from errorname');
Prepare;
Open;
Result:= FieldByName('maxlen').AsInteger div 2;
end;
end;function GetParentCodeStr(CodeStr: String): string;
begin
Result:= Copy(CodeStr,1,Length(CodeStr)-2);
end;end.