Показать сообщение отдельно
  #2  
Старый 01.12.2008, 13:36
k@Z@k k@Z@k вне форума
Новичок
 
Регистрация: 31.07.2007
Сообщения: 55
Репутация: 12
По умолчанию

Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, ComCtrls, Grids, DBGrids, ExtCtrls, dbitypes,
  dbiprocs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    TreeView1: TTreeView;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOTable2: TADOTable;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    GroupBox1: TGroupBox;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure TreeView1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;

  TTableType = (ttTable, ttView, ttSynonym, ttSystemTable, ttAccessTable);
  TTableTypes = set of TTableType;
  TTableItem = record
    ItemName: string;
    ItemType: string;
  end;
  TTableItems = array of TTableItem;

var
  Form1: TForm1;
  output: ttableitems;

implementation
uses CommCtrl;

{$R *.dfm}

procedure SetNodeState(node: TTreeNode; Flags: Integer);
var
  tvi: TTVItem;
begin
  FillChar(tvi, Sizeof(tvi), 0);
  tvi.hItem := node.ItemID;
  tvi.mask := TVIF_STATE;
  tvi.stateMask := TVIS_BOLD or TVIS_CUT;
  tvi.state := Flags;
  TreeView_SetItem(node.Handle, tvi);
end;

function addFilter(string1, string2: string): string;
begin
  if string1 <> '' then
    Result := string1 + ' or ' + string2
  else
    Result := string2;
end;

function ADODbTables(ADOConnection: TADOConnection; types: TTableTypes):
  TTableItems;
var
  ADODataSet: TADODataSet;
  i: integer;
begin
  ADODataSet := TADODataSet.Create(nil);
  ADODataSet.Connection := ADOConnection;
  ADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, ADODataSet);
  if (ttTable in types) then
    ADODataSet.Filter := addFilter(ADODataSet.Filter,
      '(TABLE_TYPE = ''TABLE'')');
  if (ttView in types) then
    ADODataSet.Filter := addFilter(ADODataSet.Filter,
      '(TABLE_TYPE = ''VIEW'')');
  if (ttSynonym in types) then
    ADODataSet.Filter := addFilter(ADODataSet.Filter,
      '(TABLE_TYPE = ''SYNONYM'')');
  if (ttSystemTable in types) then
    ADODataSet.Filter := addFilter(ADODataSet.Filter,
      '(TABLE_TYPE = ''SYSTEM TABLE'')');
  if (ttAccessTable in types) then
    ADODataSet.Filter := addFilter(ADODataSet.Filter,
      '(TABLE_TYPE = ''ACCESS TABLE'')');
  ADODataSet.Filtered := True;
  SetLength(Result, ADODataSet.RecordCount);
  i := 0;
  with ADODataSet do
    begin
      First;
      while not EOF do
        begin
          with Result[i] do
            begin
              ItemName := FieldByName('TABLE_NAME').AsString;
              ItemType := FieldByName('TABLE_TYPE').AsString;
            end;
          Inc(i);
          Next;
        end;
    end;
  ADODataSet.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
  Node: TTreeNode;
begin
  output := ADODbTables(ADOConnection1, [ttTable, ttView, ttSynonym]);
  for i := Low(output) to High(output) do
    begin
      Node := TreeView1.Items.Add(TreeView1.Selected, output[i].ItemName);
      SetNodeState(Node, TVIS_BOLD or TVIS_CUT);
      ADOTable1.Connection := ADOConnection1;
      ADOTable1.TableName := output[i].ItemName;
      ADOTable1.Active := true;
      for j := 1 to ADOTable1.FieldCount do
        TreeView1.Items.AddChild(Node,
          ADOTable1.Fields.FieldByNumber(j).FieldName);
      ADOTable1.Active := false;
    end;
end;

procedure TForm1.TreeView1Click(Sender: TObject);
var
  i: integer;
begin
  for i := Low(output) to High(output) do
    if TreeView1.Selected.Text = output[i].ItemName then
      begin
        if ADOTable2.Active then
          ADOTable2.Active := false;
        ADOTable2.TableName := output[i].ItemName;
        ADOTable2.Active := true;
      end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  output := nil;
  ADOTable2.Active := false;
end;


end.

procedure TForm1.Button1Click(Sender: TObject); -строится дерево
procedure TForm1.TreeView1Click(Sender: TObject);- выводится вся таблица; (в твоем случае перепиши вывод в ListView)
Ответить с цитированием