2016-11-14 5 views
1

これは私にナットを駆動している.... 私はcxComboBox1を移入するために私のデータベースの名前をフェッチ:不足している表名のプロパティ

procedure TForm1.FormShow(Sender: TObject); 
var 
    I: Integer; 
    DBList: TStringDynArray; 
begin 
    DBList := TDirectory.GetFiles(ExtractFilePath(ParamStr(0)), '*.abs', TSearchOption.soAllDirectories); 
    for I := 0 to Length(DBList) - 1 do 
    begin 
    cxCombobox1.Properties.Items.Add(DBList[I]); 
    end; 
end; 

これは私のデータベースのOK.Theリストの作品はcxCombobox1に表示。

2番目のcxComboboxには、データベースに属するテーブル名がcxCombobox1に表示されます。

procedure TForm1.cxComboBox1PropertiesChange(Sender: TObject); 
var 
    TABLES: TStringList; 
    i: integer; 
begin 
    if ABSTable1.Active = True then 
    ABSTable1.Close; 
    cxComboBox2.properties.Items.Clear; 
    TABLES := TStringList.Create; 
    ABSDatabase1.DatabaseFileName:=cxCombobox1.Text; 
    try 
    ABSDatabase1.Open; 
    ABSDatabase1.GetTablesList(TABLES); 
    for i:= 0 to TABLES.Count-1 do 
     cxComboBox2.properties.Items.Add(TABLES[i]); 
    finally 
    TABLES.free; 
    end; 
end; 

これは基本的に正常です。 cxComboBox1でデータベースを選択すると、cxComboBox2 に関連するテーブルが設定されます。

一般的な考え方は、cxComboBox2で選択するとテーブルを開くことです。 そして、私がやった:

procedure TForm1.ABSTable1BeforeOpen(DataSet: TDataSet); 
begin 
    ABSTable1.DatabaseName:= ABSDatabase1.DatabaseName; 
    ABSTable1.TableName := cxComboBox2.Text; 
end; 

そして、私がやったcombobox2変更イベントには:

procedure TForm1.cxComboBox2PropertiesChange(Sender: TObject); 
begin 
    cxGrid1DBTableView1.ClearItems; 
    ABSTable1.Open; 
    cxGrid1DBTableView1.DataController.CreateAllItems; 
end; 

これは、[OK]を動作します。しかし、私が選択したデータベース(combobox1) のテーブルをコンボボックス2に表示しているときに限ります。 テーブルを開いてから、コンボボックス1の別のデータベースを選択したとします。 「Missing ABSTable1.Tablename」というエラーが表示されます。

私はここで何が欠けていますか?テーブル名はどこで失われていますか? 私はボタンで変更イベントにcombobox2を交換する場合:

procedure TForm1.cxButton2Click(Sender: TObject); 
begin 
    if ABSTable1.Active = True then 
    ABSTable1.Close; 
    cxGrid1DBTableView1.ClearItems; 
    ABSTable1.Open; 
    cxGrid1DBTableView1.DataController.CreateAllItems; 
end; 

その後、すべての作品....

+1

'cxComboBox2.properties.Items.Clear;は、combobox2の変更イベントをトリガします。 combobox2の変更イベントでは、combobox2でテーブルが選択されたときにのみデータベースを開きます。 – NineBerry

答えて

1

あなたがリターン結果内のどの変更イベントを発生させたcxComboBox1PropertiesChangeItems.Clear()を呼び出すので、この問題が発生しましたcxComboBox2PropertiesChangeに電話してください。

更新する前にItems.BeginUpdate()を使用し、更新した各ステップ/アイテムでイベントを発生させないように更新を完了したら、Items.EndUpdate()を使用する必要があります。

+0

だから私はcxCombobox1で使うべきだと提案しています。変更イベント:cxComboBox2.Properties.Items.BeginUpdate(); cxComboBox2.properties.Items.Clear; ???エンドアップデートはどこで使用しますか? – user3351050

+0

'BeginUpdate()'と組み合わせて常に 'EndUpdate()'を呼び出してください。したがって、 'try'' finally'構造体を使用すると完全にここに収まりますが、' BeginUpdate() 'はtryの前に呼び出され、' EndUpate() 'はfinallyブロックで呼び出されます。 – ViRuSTriNiTy

関連する問題