2016-10-03 3 views
1

DBGrid가있는 mainForm이 있고 사용자가 선택할 수있는 모든 DBGrid 열을 보여주는 CheckListBox가있는 두 번째 폼이 있습니다. Form2에서 MainForm에있는 DBGrid를 참조해야합니다. 이 두 번째 형식은 dbdgrid 열에 연결된 모든 프로 시저를 처리하므로 쉽게 다시 사용할 수 있습니다. 그건 생각했지만 DBGrid 참조를 전달하는 방법은 찾지 못했습니다. 가능합니까?다른 폼에서 DBGrid를 다시 작성하는 방법

답변

2

, Form2를에 그냥 그런

Form2.Grid := MainForm.DBGrid1; 

을, 그리고 속성

TForm2 

[...] 
private 
    FGrid : TDBGrid 
public 
    property Grid : TDBGrid read FGrid write FGrid; 

을 정의, Grid을 변경하고자하는 모든 작업을 수행 할 수 있으며 MainForm.DBGrid1에 변경 사항이 적용됩니다.

+0

제안 해 주셔서 감사합니다. 나는 노력했다. 그리고 그것은 그것이 일하는 것처럼 본다. 이제 form2에서 주 양식의 DBGrid 열을 이동할 때 뭔가해야합니다. MainForm에서 OnColumnMoved를 사용했을 것입니다 ... – Stark

+0

글쎄, 당신의 원래 질문에 답했습니다. 그래서 당신이 녹색 "틱"아이콘을 클릭하여 그것을 받아들이면 좋을 것입니다. OnColumMoved 이벤트의 경우 Form2에 동일한 매개 변수 시그니처가있는 프로 시저를 제공하고 코드를 작성한 다음 MainForm.DBGrid1의 OnColumnMoved를 해당 매개 변수에 지정합니다. – MartynA

1

가능합니까?

질문은 오히려 이되어야합니다. 원하는 것을 얻는 더 좋은 방법이 있습니까? Form2 다른 형태의 제어와 기본적으로 일을하는 경우

  • 그것은 유지 보수가 있을까? 다른 양식에서도 다른 양식의 구성 요소에 대한 참조를 보유해야하는 경우 어떻게해야합니까?
  • 컨트롤이 다른 형태로 사용되면 버그를 찾는 것이 얼마나 힘들겠습니까?
  • 그런 해결책이 SOLID principles과 일치합니까?

이러한 질문에 답하는 것은 다른 접근법을 찾는 데 도움이됩니다.

separate UI and business logic을 고려해야합니다. A TDBGrid은 데이터베이스에서 응용 프로그램으로 데이터를 가져 오는 편리한 방법 인 것처럼 보이지만 동시에 데이터를로드하고 표시하기 때문에 Single Responsibility Principle을 위반합니다. 응용 프로그램 내에서 기본 데이터 공급자로 사용하지 마십시오. 소프트웨어의 더 깊은 UI 독립 계층에서 SQL 쿼리를 수행하십시오. 컨테이너에 결과를 저장하고 다른 양식에서 원하는 모든 방식으로 결과를 표시하십시오. 당신이 TForm2의 인스턴스를 생성 한 후

당신이 당신을 Form2에, 질문 한 질문에 대답
+0

나는 원칙적으로 당신이 옳다고 생각하지만, 더 좋은 방법을 찾기 시작할 곳을 모르겠다. 또한 이것은 DBGrid 열 레이아웃을 표시하는 보조 양식이 항상 DBGrid와 함께 이동하는 경우입니다. – Stark