'스트링 그리드 콤보 박스' 검색해도 많이 나오는데요....자료실에 제가 예전에 올린 테스트 소스도 있습니다
방법에 따라 여러가질 생각해볼수 있습니다
1. 여러줄에 동시에 콤보객체를 생성해서 그려 넣기
2. 선택시에만 해당 셀에만 콤보객체를 생성해서 그려 넣기
3. 실제 콤보박스하나가 있고, 선택시에만 해당 셀에 살짝 올려 놓기
...등등입니다
조금 수정했습니다
1. 한번만 생성되도록
2. 동적 콤보박스 생성시 부모가 윈도우 클래스냐에 따라 이벤트가 되고 안되고 하므로 폼을 부모로함
3. 스트링그리드에 넣기위해 체인지 이벤트 사용
procedure TForm1.test_gridClick(Sender: TObject);
var
Rect: TRect;
i : integer;
gridOriginXY: TPoint;
begin
//나머지는 안보이게함
for i := 1 to test_grid.RowCount-1 do
if (test_grid.Objects[1,i] is TComboBox) then
TComboBox(test_grid.Objects[1,i]).Visible := False;
if test_grid.Col = 1 then begin
//한번만 생성하도록합니다
if (test_grid.Objects[1,test_grid.Row] is TComboBox = False) then begin
//test_grid.Parent가 윈도우상속인걸 선택 여기선 메임폼으로함
//(동적 생성 콤보박스의 OnChange이벤트를 위하여)
test_grid.Objects[1,test_grid.Row] := Tcombobox.Create(Form1);
with Tcombobox(test_grid.objects[1,test_grid.Row]) do
begin
OnChange := MyComboBoxChange;
parent := Form1;
Style := csDropDownList;
//=====================================================================
items.add('첫번째 자료');
items.add('두번째 자료');
end;
end;
if (test_grid.Objects[1,test_grid.Row] is TComboBox = True) then begin
with Tcombobox(test_grid.objects[1,test_grid.Row]) do
begin
Rect:=test_grid.cellrect(1,test_grid.Row);
if parent <> test_grid then begin
gridOriginXY := test_grid.ClientToParent( Point(Rect.Left, Rect.Top) );
Left := gridOriginXY.X + GetSystemMetrics(SM_CXEDGE);
Top := gridOriginXY.Y + GetSystemMetrics(SM_CYEDGE);
end
else begin
boundsrect := Rect;
end;
width := test_grid.colwidths[2]; //CBpart_state.//
height := test_grid.rowheights[2];
ClientHeight:=100;
//먼저 선택된 텍스트를 선택하게함
ItemIndex := Items.IndexOf(test_grid.Cells[test_grid.Col, test_grid.Row]);
if (Rect.Top<=0)then
Visible := False
else
Visible := True;
end;
end;
end;
end;
//동적 생성 콤보박스의 OnChange이벤트
//메인폼 class에 설정을 하세요
procedure TForm1.MyComboBoxChange(Sender: TObject);
begin
test_grid.Cells[test_grid.Col, test_grid.Row] := TComboBox(Sender).Items[TComboBox(Sender).ItemIndex];
TComboBox(Sender).Visible := false;
end;
답변 감사합니다.
procedure TForm1.MyComboBoxChange(Sender: TObject);
begin
test_grid.Cells[test_grid.Col, test_grid.Row] := TComboBox(Sender).Items[TComboBox(Sender).ItemIndex];
TComboBox(Sender).Visible := false;
end;
위와 같이 코딩을 하고 하니 되내요. 그런데 콤보박스 사라지지 않고, 다음 행으로 가니 그재서야 사라지내요.
스트링 그리드의 OnClick에서 처리하신다고 하지 않나요. OnClick이라면 MyComboBoxChange 이후 사라질거고, 마약 마우스 MOVE시 사라지게 할려면 MOVE이벤트에서 자동으로 Visible := False 하도록 하시면 됩니다.
OnDrawCell이라면 포커스가 있는 동안 계속 그리니 Visible := True를 별도 니벤트에서 처리하던가 MyComboBoxChange 이후 다른 셀로 이동시키는 소스를 추가 해보세요.
제 말이 맞는거 같은데요. 스트링 그리드의 OnDrawCell에도 2중 코딩이 되어 있네요....
Rate_GridDrawCell에서 Tcombobox에 관한 불필요(OnClick과 중복된) 소스는 정리하시면 됩니다. 특히 다시 보인다는 건 Tcombobox(Rate_grid.objects[0 ,Rate_grid.Row]).Visible := True; 부분의 소스를 제거 하시면 됩니다.
스트링 그리드의 OnClick은 말 그대로 클릭시만 발생하지만, OnDrawCell는 열과 컬럼, 그리고 계속 변환를 다시 그릴때 계속 반복해서 도는겁니다. 즉 콤보에서 OnChange후 자신이 보이지 않게하고 잘 끝냈는데 그리드의 OnDrawCell는 계속 다시 표시하는거네요...
방법에 따라 여러가질 생각해볼수 있습니다
1. 여러줄에 동시에 콤보객체를 생성해서 그려 넣기
2. 선택시에만 해당 셀에만 콤보객체를 생성해서 그려 넣기
3. 실제 콤보박스하나가 있고, 선택시에만 해당 셀에 살짝 올려 놓기
...등등입니다