用树来表示ID 当前类 PID 父类标记 Name.... ID PIA Name 0 -1 抛光砖 1 0 大堂类 2 0 地面类
根据数据库原理的范式规则设计,应该是把这个表设置成(类别,产品名)操作的时候 with adoquery do begin close;sql.clear; sql.add('select 类别,产品名 from 表 where 产品名='+quotedstr(产品名)); open; end; 这样不就OK了
//参考如下代码~~ object Form1: TForm1 Left = 192 Top = 107 Width = 696 Height = 480 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object TreeView1: TTreeView Left = 24 Top = 16 Width = 121 Height = 97 Indent = 19 TabOrder = 0 end object BitBtnItemEdit: TBitBtn Left = 3 Top = 137 Width = 75 Height = 25 Caption = '修改类别' TabOrder = 1 OnClick = BitBtnItemEditClick end object BitBtnItemDelete: TBitBtn Left = 75 Top = 137 Width = 75 Height = 25 Caption = '删除类别' TabOrder = 2 OnClick = BitBtnItemDeleteClick end object BitBtnItemPlue: TBitBtn Left = 147 Top = 137 Width = 75 Height = 25 Caption = '添加类别' TabOrder = 3 OnClick = BitBtnItemPlueClick end object BitBtnItemAppend: TBitBtn Left = 219 Top = 137 Width = 75 Height = 25 Caption = '加子类别' TabOrder = 4 OnClick = BitBtnItemAppendClick end object BitBtnSave: TBitBtn Left = 288 Top = 137 Width = 75 Height = 25 Caption = '保存(&S)' TabOrder = 5 OnClick = BitBtnSaveClick end object ADOQuery1: TADOQuery AfterOpen = ADOQuery1AfterOpen Parameters = <> Left = 184 Top = 24 end endunit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, ComCtrls, StdCtrls, Buttons;type TForm1 = class(TForm) ADOQuery1: TADOQuery; TreeView1: TTreeView; BitBtnItemEdit: TBitBtn; BitBtnItemDelete: TBitBtn; BitBtnItemPlue: TBitBtn; BitBtnItemAppend: TBitBtn; BitBtnSave: TBitBtn; procedure FormCreate(Sender: TObject); procedure ADOQuery1AfterOpen(DataSet: TDataSet); procedure BitBtnItemEditClick(Sender: TObject); procedure BitBtnItemDeleteClick(Sender: TObject); procedure BitBtnItemPlueClick(Sender: TObject); procedure BitBtnItemAppendClick(Sender: TObject); procedure BitBtnSaveClick(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}uses ComObj;function CreateDatabase(mDatabaseName: string): Boolean; var CreateAccess: OLEVariant; begin Result := False; try CreateAccess := CreateOleObject('ADOX.Catalog'); try CreateAccess.Create(Format( 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s', [mDatabaseName])); finally CreateAccess := Unassigned; end; except Exit; end; Result := True; end;procedure TForm1.FormCreate(Sender: TObject); var vDatabaseName: string; begin vDatabaseName := ExtractFilePath(Application.ExeName) + 'test.mdb'; ADOQuery1.ConnectionString := Format( 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="%s"', [vDatabaseName]); ///////Begin 创建模拟数据 if not FileExists(vDatabaseName) then begin if not CreateDatabase(vDatabaseName) then Application.Terminate; try ADOQuery1.Close; ADOQuery1.SQL.Text := 'CREATE TABLE TableTree (id int, TreeText text)'; ADOQuery1.ExecSQL; ADOQuery1.SQL.Text := Format('insert into TableTree (id, TreeText) values (0, %s)', [QuotedStr( '1'#13#10 + #9'1a'#13#10 + #9'1b'#13#10 + '2'#13#10 + #9'2a'#13#10 + #9'2b'#13#10 + #9#9'2b-A'#13#10)]); ADOQuery1.ExecSQL; except Exit; end; end; ///////End 创建模拟数据 ADOQuery1.SQL.Text := 'select * from TableTree'; ADOQuery1.Open; end;procedure TreeViewLoadFromString(mTreeView: TTreeView; mString: string); var vStringStream: TStringStream; begin vStringStream := TStringStream.Create(mString); try vStringStream.Position := 0; mTreeView.LoadFromStream(vStringStream); finally vStringStream.Free; end; end; { TreeViewLoadFromString }function TreeViewSaveToString(mTreeView: TTreeView): string; var vStringStream: TStringStream; begin vStringStream := TStringStream.Create(''); try mTreeView.SaveToStream(vStringStream); Result := vStringStream.DataString; finally vStringStream.Free; end; end; { TreeViewSaveToString }procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet); begin TreeViewLoadFromString(TreeView1, DataSet.FieldByName('TreeText').AsString); end;procedure TForm1.BitBtnItemEditClick(Sender: TObject); var S: string; begin if not Assigned(TreeView1.Selected) then Exit; S := TreeView1.Selected.Text; if not InputQuery('修改类别', '', S) then Exit; TreeView1.Selected.Text := S; if TreeView1.CanFocus then TreeView1.SetFocus; end;procedure TForm1.BitBtnItemDeleteClick(Sender: TObject); begin if MessageDlg('确定删除?', mtWarning, [mbYes, mbNo], 0) = mrYes then TreeView1.Selected.Delete; if TreeView1.CanFocus then TreeView1.SetFocus; end;procedure TForm1.BitBtnItemPlueClick(Sender: TObject); var S: string; begin if not Assigned(TreeView1.Selected) then Exit; S := '新类别'; if not InputQuery('添加类别', '', S) then Exit; TreeView1.Selected := TreeView1.Items.Add(TreeView1.Selected, S); if TreeView1.CanFocus then TreeView1.SetFocus; end;procedure TForm1.BitBtnItemAppendClick(Sender: TObject); var S: string; begin if not Assigned(TreeView1.Selected) then Exit; S := '新子类别'; if not InputQuery('添加子类别', '', S) then Exit; TreeView1.Selected := TreeView1.Items.AddChild(TreeView1.Selected, S); if TreeView1.CanFocus then TreeView1.SetFocus; end;procedure TForm1.BitBtnSaveClick(Sender: TObject); begin ADOQuery1.First; if ADOQuery1.RecordCount <= 0 then ADOQuery1.Append else ADOQuery1.Edit; ADOQuery1.FieldByName('TreeText').AsString := TreeViewSaveToString(TreeView1); ADOQuery1.Post; end;end.
PID 父类标记
Name....
ID PIA Name
0 -1 抛光砖
1 0 大堂类
2 0 地面类
with adoquery do
begin
close;sql.clear;
sql.add('select 类别,产品名 from 表 where 产品名='+quotedstr(产品名));
open;
end;
这样不就OK了
object Form1: TForm1
Left = 192
Top = 107
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object TreeView1: TTreeView
Left = 24
Top = 16
Width = 121
Height = 97
Indent = 19
TabOrder = 0
end
object BitBtnItemEdit: TBitBtn
Left = 3
Top = 137
Width = 75
Height = 25
Caption = '修改类别'
TabOrder = 1
OnClick = BitBtnItemEditClick
end
object BitBtnItemDelete: TBitBtn
Left = 75
Top = 137
Width = 75
Height = 25
Caption = '删除类别'
TabOrder = 2
OnClick = BitBtnItemDeleteClick
end
object BitBtnItemPlue: TBitBtn
Left = 147
Top = 137
Width = 75
Height = 25
Caption = '添加类别'
TabOrder = 3
OnClick = BitBtnItemPlueClick
end
object BitBtnItemAppend: TBitBtn
Left = 219
Top = 137
Width = 75
Height = 25
Caption = '加子类别'
TabOrder = 4
OnClick = BitBtnItemAppendClick
end
object BitBtnSave: TBitBtn
Left = 288
Top = 137
Width = 75
Height = 25
Caption = '保存(&S)'
TabOrder = 5
OnClick = BitBtnSaveClick
end
object ADOQuery1: TADOQuery
AfterOpen = ADOQuery1AfterOpen
Parameters = <>
Left = 184
Top = 24
end
endunit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, ComCtrls, StdCtrls, Buttons;type
TForm1 = class(TForm)
ADOQuery1: TADOQuery;
TreeView1: TTreeView;
BitBtnItemEdit: TBitBtn;
BitBtnItemDelete: TBitBtn;
BitBtnItemPlue: TBitBtn;
BitBtnItemAppend: TBitBtn;
BitBtnSave: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure ADOQuery1AfterOpen(DataSet: TDataSet);
procedure BitBtnItemEditClick(Sender: TObject);
procedure BitBtnItemDeleteClick(Sender: TObject);
procedure BitBtnItemPlueClick(Sender: TObject);
procedure BitBtnItemAppendClick(Sender: TObject);
procedure BitBtnSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}uses ComObj;function CreateDatabase(mDatabaseName: string): Boolean;
var
CreateAccess: OLEVariant;
begin
Result := False;
try
CreateAccess := CreateOleObject('ADOX.Catalog');
try
CreateAccess.Create(Format(
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s',
[mDatabaseName]));
finally
CreateAccess := Unassigned;
end;
except
Exit;
end;
Result := True;
end;procedure TForm1.FormCreate(Sender: TObject);
var
vDatabaseName: string;
begin vDatabaseName := ExtractFilePath(Application.ExeName) + 'test.mdb';
ADOQuery1.ConnectionString := Format(
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="%s"', [vDatabaseName]);
///////Begin 创建模拟数据
if not FileExists(vDatabaseName) then
begin
if not CreateDatabase(vDatabaseName) then Application.Terminate;
try
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'CREATE TABLE TableTree (id int, TreeText text)';
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Text := Format('insert into TableTree (id, TreeText) values (0, %s)',
[QuotedStr(
'1'#13#10 +
#9'1a'#13#10 +
#9'1b'#13#10 +
'2'#13#10 +
#9'2a'#13#10 +
#9'2b'#13#10 +
#9#9'2b-A'#13#10)]);
ADOQuery1.ExecSQL;
except
Exit;
end;
end;
///////End 创建模拟数据
ADOQuery1.SQL.Text := 'select * from TableTree';
ADOQuery1.Open;
end;procedure TreeViewLoadFromString(mTreeView: TTreeView; mString: string);
var
vStringStream: TStringStream;
begin
vStringStream := TStringStream.Create(mString);
try
vStringStream.Position := 0;
mTreeView.LoadFromStream(vStringStream);
finally
vStringStream.Free;
end;
end; { TreeViewLoadFromString }function TreeViewSaveToString(mTreeView: TTreeView): string;
var
vStringStream: TStringStream;
begin
vStringStream := TStringStream.Create('');
try
mTreeView.SaveToStream(vStringStream);
Result := vStringStream.DataString;
finally
vStringStream.Free;
end;
end; { TreeViewSaveToString }procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
begin
TreeViewLoadFromString(TreeView1,
DataSet.FieldByName('TreeText').AsString);
end;procedure TForm1.BitBtnItemEditClick(Sender: TObject);
var
S: string;
begin
if not Assigned(TreeView1.Selected) then Exit;
S := TreeView1.Selected.Text;
if not InputQuery('修改类别', '', S) then Exit;
TreeView1.Selected.Text := S;
if TreeView1.CanFocus then TreeView1.SetFocus;
end;procedure TForm1.BitBtnItemDeleteClick(Sender: TObject);
begin
if MessageDlg('确定删除?', mtWarning, [mbYes, mbNo], 0) = mrYes then
TreeView1.Selected.Delete;
if TreeView1.CanFocus then TreeView1.SetFocus;
end;procedure TForm1.BitBtnItemPlueClick(Sender: TObject);
var
S: string;
begin
if not Assigned(TreeView1.Selected) then Exit;
S := '新类别';
if not InputQuery('添加类别', '', S) then Exit;
TreeView1.Selected := TreeView1.Items.Add(TreeView1.Selected, S);
if TreeView1.CanFocus then TreeView1.SetFocus;
end;procedure TForm1.BitBtnItemAppendClick(Sender: TObject);
var
S: string;
begin
if not Assigned(TreeView1.Selected) then Exit;
S := '新子类别';
if not InputQuery('添加子类别', '', S) then Exit;
TreeView1.Selected := TreeView1.Items.AddChild(TreeView1.Selected, S);
if TreeView1.CanFocus then TreeView1.SetFocus;
end;procedure TForm1.BitBtnSaveClick(Sender: TObject);
begin
ADOQuery1.First;
if ADOQuery1.RecordCount <= 0 then
ADOQuery1.Append
else ADOQuery1.Edit;
ADOQuery1.FieldByName('TreeText').AsString := TreeViewSaveToString(TreeView1);
ADOQuery1.Post;
end;end.