이것은 생각보다 아주 간단한 방법으로 구현할 수 있다. 즉 임의의 셀에 포커스가 도달하면 현재 셀의 위치로 콤보박스의 위치를 재설정하는 것이다. 물론 콤보박스의 Visible 속성은 기본적으로 False이며,포커스에 따라 조정할 수 있다. 간단히 소스가 위치할 이벤트와 해당 코드는 다음과 같으며, 디자인 시에 단지 DBLookupComboBox 하나를 임의의 위치로 놓아 둔다.
if ( Column.FieldName = DBLookupComboBox1.DataField
) then begin
with DBLookupComboBox1 do begin
Left := Rect.Left + DBGrid1.Left;
Top := Rect.Top + DBGrid1.Top;
Width := Rect.Right - Rect.Left;
Visible := True;
end;
end;
end;
end;
다단계 룩업 콤보박스 구현
다단계 룩업 콤보박스를 쉽게 이해하기 위해 두 가지 예를 들어 보겠다.
먼저 우편번호의 입력 과정을 생각해 보면, 도/시를 선택하고, 선택된 도/시에 속하는 군/구만을 두번째 콤보박스로 구성하고, 다시 선택된 군/구에 속하는 읍/동만을 콤보박스로 구성하는 것이다.
둘째는 단지 우편번호 입력 뿐만 아니라 직업별 직급 선택 작업이다.
금융기관처럼 많은 고객을 관리하면서 세부적인 인적사항까지 관리하는 업체는 직급을 정확히 기록하기 위해 직업별(계층별)로 직급을 조사해 DB화하고 있기 때문에 입력 과정에서도 이 분류를 실제로 이용하려고 한다.
단적으로 두 가지 예만 들었지만, 이밖에도 다단계 룩업 콤보박스를 활용할 수 있는 부분은 많을 것이다. 참고로 다단계 룩업 콤보박스 외에 동적으로 생성시키는 방법으로 윈도우 95의 시작 메뉴 방식을 사용해도 좋을 것이다. 다음의 소스 코드와 <화면 3>은 우편번호를 콤보박스를 이용해 선택하는
> DbGrid상에 ComboBox를 넣어서 데이터를 바꾸어줄 수 있는지 알고싶습니다.
> 자료를 DbGrid상에서도 바꾸어 주고싶은데 방법을 잘 모르겠어요
> 어떻게 하면 좋은지 말씀해 주세요.
> 재아올림
제가 가지고 있는 자료를 보니 있더군요. 도움이 되시길....
출처: DSPF
이것은 생각보다 아주 간단한 방법으로 구현할 수 있다. 즉 임의의 셀에 포커스가 도달하면 현재 셀의 위치로 콤보박스의 위치를 재설정하는 것이다. 물론 콤보박스의 Visible 속성은 기본적으로 False이며,포커스에 따라 조정할 수 있다. 간단히 소스가 위치할 이벤트와 해당 코드는 다음과 같으며, 디자인 시에 단지 DBLookupComboBox 하나를 임의의 위치로 놓아 둔다.
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if ( gdFocused in State ) then begin
if ( Column.FieldName = DBLookupComboBox1.DataField
) then begin
with DBLookupComboBox1 do begin
Left := Rect.Left + DBGrid1.Left;
Top := Rect.Top + DBGrid1.Top;
Width := Rect.Right - Rect.Left;
Visible := True;
end;
end;
end;
end;
다단계 룩업 콤보박스 구현
다단계 룩업 콤보박스를 쉽게 이해하기 위해 두 가지 예를 들어 보겠다.
먼저 우편번호의 입력 과정을 생각해 보면, 도/시를 선택하고, 선택된 도/시에 속하는 군/구만을 두번째 콤보박스로 구성하고, 다시 선택된 군/구에 속하는 읍/동만을 콤보박스로 구성하는 것이다.
둘째는 단지 우편번호 입력 뿐만 아니라 직업별 직급 선택 작업이다.
금융기관처럼 많은 고객을 관리하면서 세부적인 인적사항까지 관리하는 업체는 직급을 정확히 기록하기 위해 직업별(계층별)로 직급을 조사해 DB화하고 있기 때문에 입력 과정에서도 이 분류를 실제로 이용하려고 한다.
단적으로 두 가지 예만 들었지만, 이밖에도 다단계 룩업 콤보박스를 활용할 수 있는 부분은 많을 것이다. 참고로 다단계 룩업 콤보박스 외에 동적으로 생성시키는 방법으로 윈도우 95의 시작 메뉴 방식을 사용해도 좋을 것이다. 다음의 소스 코드와 <화면 3>은 우편번호를 콤보박스를 이용해 선택하는
것을 보여준다.
procedure TForm1.DBLookupComboBox1CloseUp(Sender: TObject);
begin
Edit1.Text := DBLookupComboBox1.Text;
with Query2 do begin
Close;
SQL.Clear;
SQL.Add('SELECT SI FROM ZIP9509 WHERE DOU =
:DOU GROUP BY SI');
ParamByName('DOU').AsString := Query1.FieldByName(
'DOU').AsString;
DBLookupComboBox2.KeyField := 'SI';
DBLookupComboBox2.ListField := 'SI';
Open;
if RecordCount = 1 then begin
Close;
SQL.Clear;
SQL.Add('SELECT GU FROM ZIP9509 WHERE DOU
= :DOU GROUP BY GU');
ParamByName('DOU').AsString := Query1.FieldByName(
'DOU').AsString;
DBLookupComboBox2.KeyField := 'GU';
DBLookupComboBox2.ListField := 'GU';
Open;
end;
DataSource3.Enabled := False;
end;
end;
procedure TForm1.DBLookupComboBox2CloseUp(Sender: TObject);
begin
Edit1.Text := DBLookupComboBox1.Text + #32 +
DBLookupComboBox2.Text;
DataSource3.Enabled := True;
with Query3 do begin
Close;
SQL.Clear;
SQL.Add('SELECT DONG,ZIP FROM ZIP9509 WHERE DOU = :DOU ');
if DBLookupComboBox2.KeyField = 'GU'
then SQL.Add('AND GU = :GU')
else SQL.Add('AND SI = :SI');
ParamByName('DOU').AsString := Query1.FieldByName(
'DOU').AsString;
if DBLookupComboBox2.KeyField = 'GU'
then
ParamByName('GU').AsString := Query2.FieldByName(
'GU').AsString
else
ParamByName('SI').AsString := Query2.FieldByName(
'SI').AsString;
Open;
end;
end;
procedure TForm1.DBLookupComboBox3CloseUp(Sender: TObject);
begin
Edit1.Text := Edit1.Text + #32 +
DBLookupComboBox3.Text;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
with Query1 do begin
Close;
SQL.Clear;
SQL.Add('SELECT DOU FROM ZIP9509 GROUP BY DOU');
Open;
end;
Application.ProcessMessages;
end;