2011-08-11 17 views
2

私はDBにいくつかの商品に関する情報を持つテーブルを持っています。商品は塗りつぶし可能なので、テキストを追加することができます。だから私はテーブルの情報に関連するチェックボックスのリストを動的に生成したいし、このアイテムにテキストを追加する可能性を出すためにチェックボックスもTEditコンポーネントでなければならない。それでどうすればいい?どのコンポーネントを使用しますか?私はTTreeViewがほぼ十分であることを知っていますが、チェックボックスの近くでTEditを "描画"することはできません。私はDelphi 2010を使用しています。事前に感謝します!あなたの助けを願って!フォームにチェックボックスを動的に入力してください

+4

'編集:= TEdit.Create(自己); Edit.Parent:= Self; Edit.Top:= NextTop; inc(NextTop、Spacing); ' –

答えて

6

質問を正しく読んだ場合は、表の内容に基づいてフォームにいくつかのコントロールを作成したいと考えています。次の例では、TDBGridの現在のレコードの内容に基づいてこれを行うことを前提としていますので、必要に応じて変更する必要があります。

この例では、実行時に作成されたコントロールを保持するTDBGridとTPanel(Panel1)を持つフォームを想定しています。

TDBGridはTDataSourceコンポーネントに接続され、その情報を持つテーブル/クエリのTDataSetの子孫に接続されます。 TDataSourceにはOnDataChangedイベントがあります。このイベントは、フィールド内のデータが変更されたとき、またはデータセット内の現在のレコードが変更されたときにトリガされます。したがって、現在のレコードの変更に合わせてコントロールを変更することができます。

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); 
var 
    i: Integer; 
    Chk: TCheckBox; 
    Edit: TEdit; 
begin 
    // When the Field is assigned, the call is the result of a change in the field. 
    // When the Field is unassigned, the call is the result of changing the current record. 
    if Assigned(Field) then 
    Exit; 

    // Remove controls on panel 
    for i := Panel1.ControlCount - 1 downto 0 do 
    Panel1.Controls[i].Free; 

    // Add controls on panel for current record 
    if True then  // Replace this with condition based on contents of current record (if any!) 
    begin 
    Chk := TCheckBox.Create(Self); // Set Owner, so it is freed when form is closed. 
    Chk.Parent := Panel1;   // Set Parent, so the control is shown. 
    Chk.Left := FLeftIndent;  // Create FLeftIndent as a member field of the form, set value in OnCreate. 
    Chk.Top := FNextTop;   // Create FNextTop as a member field of the form. 
    Inc(FNextTop, FSpacing);  // Create FSpacing as a member field of the form, set value in OnCreate. 

    if True then // Replace this with condition that dictates creation of Edit 
    begin 
     Edit := TEdit.Create(Self); 
     Edit.Parent := Panel1; 
     Edit.Left := Chk.Left + Chk.Width + FSpacing; 
     Edit.Top := Chk.Top;   // Add offset as needed for proper alignment of CheckBox and Edit. 
    end; 
    end; 
end; 

フォーム上の他のチェックボックスや編集を持っていない場合、あなたは適切なVCLユニットを自分で含める必要がありますのでご注意ください。これを行う最も簡単な方法は、フォームにドロップしてフォームを保存し、コントロールを再度削除することです。

+0

+1おそらく、動的に作成された編集ボックスをDBフィールドで識別して、エディットボックス内のユーザーの変更にコードが対応できるようにする必要があります。 –

+0

@David:はい、それは私が追加したいと思うこの最初の追加されます... –

+0

あなたの完全な答え、マージャンありがとう!あなたが提供する方法は、私が最初に実装すると考えた方法です。私はもっ​​と簡単な方法があると思ったが、あなたはその方法を確認する。再度、感謝します! – kseen

1

try this実行時にチェックボックスを作成する例は、動的に位置を変更する必要があります。編集を含むチェックボックスを含む新しいコンポーネントを作成するか、必要な場所で動的にTEditを作成することができます。

TCheckboxの配列とTEditの配列を作成し、Editフィールドが必要な場合に条件をコード化するIsEditNeededブール関数のようなものを使用して、各Editのvisibleプロパティを設定することを検討してください。

+0

いいリソースですが、リンクした例は、標準のウィンドウダイアログにチェックボックスを追加することです。確かに、質問から、しかし私は推測するだけで、自分のフォームで実行時にコントロールを作成したいと思います。 –

0

ExGridViewのようなグリッドビューを使用してチェックボックスを描画し、各行の「編集」コントロールを私に任せてみたいです。しかし、実際にグリッドの代わりにエディットボックスが必要な場合は、コントロールグリッドのアプローチ(1つのチェックボックス+ 1つのエディットコントロール、コントロールグリッド)を試すこともできます。

関連する問題