안녕하십니까?
이제 델파이에 입문한 하수 이경원입니다.
요즘 스트링그리드 땜시 골머리를 섞고 잇습니다.
한델에서 스트링그리드를 조회해서 다 봐도 올린 글은 잇는데,
시원한 답변이 없길래, 이렇게 글을 올립니다.
제가 원하는건 스트링그리드에 콤보박스를 올리는 겁니다.
제가 한 방법은 해당 셀에 포커스가 갔을때 combobox의 top과 visible property를 이용해서 해결했는데,
데이타가 많아서 스크롤바가 생기면 계산된 값과 실제 값이 틀려져 화면에 뿌려주는 위치와 맞지 않습니다.
고수님들....
이번달까지 일을 마무리 해야 하는데, 이놈의 스트링그리드와 콤보 박스 관계때문에 일이 진전이 되지 않아 사장의 구박을 한 몸에 받고 있습니다.
시간이 자꾸 가고 답은 나오지 않고 이 하수의 고통을 들어 주시길 바랍니다.
고수님들의 내공을 부탁드립니다.
즐코/즐프 하시길.....
> 안녕하십니까?
> 이제 델파이에 입문한 하수 이경원입니다.
>
> 요즘 스트링그리드 땜시 골머리를 섞고 잇습니다.
>
> 한델에서 스트링그리드를 조회해서 다 봐도 올린 글은 잇는데,
> 시원한 답변이 없길래, 이렇게 글을 올립니다.
>
> 제가 원하는건 스트링그리드에 콤보박스를 올리는 겁니다.
> 제가 한 방법은 해당 셀에 포커스가 갔을때 combobox의 top과 visible property를 이용해서 해결했는데,
> 데이타가 많아서 스크롤바가 생기면 계산된 값과 실제 값이 틀려져 화면에 뿌려주는 위치와 맞지 않습니다.
>
> 고수님들....
> 이번달까지 일을 마무리 해야 하는데, 이놈의 스트링그리드와 콤보 박스 관계때문에 일이 진전이 되지 않아 사장의 구박을 한 몸에 받고 있습니다.
>
> 시간이 자꾸 가고 답은 나오지 않고 이 하수의 고통을 들어 주시길 바랍니다.
>
> 고수님들의 내공을 부탁드립니다.
>
> 즐코/즐프 하시길.....
[답변]
스트링그리드에서 스크롤이 발생시 델파이에서 스트링그리드의 셀들을 동적으로 관리하기 때문에 위치가 마구 바뀌게 됩니다. 그래서 저는 스트링그리드에 마우스를 누르면 DBLookupComboBox를 생성시키고 DBLookupComboBox에서 Item을 선택되면 선택된 내용을 셀에 입력시킨후 바로 DBLookupComboBox를 파괴시키는 방법을 사용합니다. 참고로 키값으로도 가능합니다. 그러나 저의 경우는 고정칼럼에 필요한 부분이라서 마우스로 해결하였습니다. 님에 상황에 정확히 맞는 대답인지는 모르겠으나 많은 도움이 되리라 생각됩니다. 아래에 주요 골자 소스를 보냅니다(저는 취미생활로 프로그래밍을 해서 실력이 부족하여 나머지 부분에 복잡한 코딩을... ^^;)
// NameCol, DBLCBRow은 칼럼고정 Const값과 이전 마우스클릭 열값임.
procedure TReciViewForm.RVStringGridMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ClickCol, ClickRow : Integer; // 현재 클릭한 칼럼과 열
begin
만약 기존에 생성된 것이 있으면 디비룩업콤보박스 파괴
TDBLookupComboBox(Objects[NameCol,DBLCBRow]).Free
그렇지 않으면 현재 선택된 위치파악
MouseToCell(X,Y,ClickCol,ClickRow);
파악된 위치에 디비룩업콤보박스 생성
Objects[ClickCol,ClickRow] := TDBLookupComboBox.Create(Self);
With TDBLookupComboBox(RVStringGrid.Objects[ClickCol,ClickRow]) do
begin
// 생성된 디비룩업콤보박스에 마우스를 누르면 처리해야할 작업
OnClick := DBMateComboBoxClick;
Parent := RVStringGrid;
BoundsRect := CellRect(ClickCol,ClickRow);
Width := ColWidths[ClickCol];
Height := RowHeights[ClickRow];
// 콤보박스에는 필요없는 부분...
ListSource := MateDataModule.MateDataSource;
KeyField := MateDataModule.MateTable.Fields[0].FieldName;
end;
procedure TReciViewForm.DBMateComboBoxClick(Sender: TObject);
begin
만약 디비룩업콤보박스에 선택된 내용이 있으면
Cells[현칼럼,현열] := 선택된 Item값
디비룩업콤보박스 파괴
end;
혹시 이해가 되지 않으시면 다시 질문을 하시고 즐거운 시간이 되시기를 바랍니다.