2011-08-11 8 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

완벽한 답변을 보내 주셔서 감사합니다. Marjan! 당신이 제공하는 방식은 처음에 구현할 생각이었습니다. 훨씬 쉬운 방법이 있다고 생각했지만 그런 식으로 확인했습니다. 다시 한 번 감사드립니다! – kseen

1

try this 런타임시 확인란을 만드는 것에 대한 예를 들어 위치를 동적으로 수정해야하는 경우 유용합니다. 편집과 함께 확인란을 포함하는 새 구성 요소를 만들거나 필요할 때 TEdit을 동적으로 만들 수 있습니다.

TCheckbox 배열과 TEdit 배열을 만들고 Edit 필드가 필요한 경우 조건을 코드화하는 IsEditNeeded 부울 함수와 같은 것을 사용하여 각 Edit의 visible 속성을 설정하는 것이 좋습니다.

+0

좋은 리소스이지만 링크 된 예제는 표준 창 대화 상자에 확인란을 추가하는 것입니다. 확신 할 수는 없겠지 만, kseen은 런타임에 컨트롤을 자신의 폼에서 만들고 싶어한다고 생각합니다. –

0

ExGridView와 같은 gridview를 사용하여 내 체크 박스를 그려보고 각 행에 대해 "편집"컨트롤을 사용하게하고 싶습니다. 그러나 실제로 격자 대신 편집 상자가 필요한 경우 컨트롤 그리드 접근 방식을 사용할 수도 있습니다 (컨트롤 그리드에서 1 개의 체크 박스 + 1 개의 편집 컨트롤).