자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi [마이그레이션][델파이4>2007] DBCtrlGrid에 DBLookupCombo를 올린 후 콤보를 선택하면 ""Operation not allowed in DBCtrlGrid"" 오류가 발생하고 목록이 표시되지 않습니다. 어떻게 해결해야하나요?
2015.05.30 01:28
Q.
DBCtrlGrid에 DBLookupCombo를 올린 후 콤보를 선택하면 ""Operation not allowed in DBCtrlGrid"" 오류가 발생하고 목록이 표시되지 않습니다. 어떻게 해결해야하나요?
델파이 4에서 델파이 2007로 마이그레이션 시 중입니다.
A.
아래와 같이 FormCreate 시 FixDBLookupDataLinks 메소드를 호출해 보세요.
http://stackoverflow.com/questions/1453041/dbctrlgrid-with-a-dblookupcombobox
interface
uses
...
;
type Tdbp = class(TDBCtrlGrid);
type tdbl = class(TDBLookupControl);
type
TForm4 = class(TForm)
...
DBCtrlGrid1: TDBCtrlGrid;
...
private
...
function FindLCB(DataFieldName: String): TDBLookupComboBox;
procedure FixDBLookupDataLinks;
public
...
end;
...and in your implementation:
----------
implementation
procedure TForm4.FormCreate(Sender: TObject);
begin
...
DBCtrlGrid1.DataSource := DataSource1;
FixDBLookupDataLinks;
end;
procedure TForm4.FixDBLookupDataLinks;
var
lcb: TDBLookupComboBox;
I,n: Integer;
MyDataLink: TDataLink;
ctl: TControl;
dbp: Tdbctrlpanel;
begin
dbp := Tdbp(DBControlGrid1).Panel;
for n := 0 to Pred(dbp.ControlCount) do
begin
ctl := dbp.Controls[n];
if ctl.ClassType = TDBLookupComboBox then
begin
lcb := TDBLookupComboBox(ctl);
lcb.ControlStyle := lcb.ControlStyle + [csReplicatable];
TDBL(lcb).ListLink.DataSourceFixed := False;
for I := 0 to Pred(lcb.ControlCount) do
begin
if lcb.Controls[I] is TPopupDataList then
begin
TDBL(lcb).ListLink.DataSourceFixed := False;
TDBL(lcb).DataLink.DataSourceFixed := False;
MyDataLink := TDataLink(lcb.Controls[I].Perform(CM_GETDATALINK, 0, 0));
if MyDataLink <> nil then
MyDataLink.DataSourceFixed := False;
MyDataLink.DataSource := nil;
end;
end;
end;
end;
end;
function TForm4.FindLCB(DataFieldName: String): TDBLookupComboBox;
var
i: Integer;
begin
Result := Nil;
for i := 0 to Pred(ControlCount) do
if Controls[i].ClassType = TDBLookupComboBox then
if TDBLookupComboBox(Controls[i]).DataField = DataFieldName then
begin
Result := TDBLookupComboBox(Controls[i]);
Break;
end;
end;
댓글 0
Delphi [마이그레이션][델파이4>2007] DBCtrlGrid에 DBLookupCombo를 올린 후 콤보를 선택하면 ""Operation not allowed in DBCtrlGrid"" 오류가 발생하고 목록이 표시되지 않습니다. 어떻게 해결해야하나요?
2015.05.30 01:28
Q.
DBCtrlGrid에 DBLookupCombo를 올린 후 콤보를 선택하면 ""Operation not allowed in DBCtrlGrid"" 오류가 발생하고 목록이 표시되지 않습니다. 어떻게 해결해야하나요?
델파이 4에서 델파이 2007로 마이그레이션 시 중입니다.
A.
아래와 같이 FormCreate 시 FixDBLookupDataLinks 메소드를 호출해 보세요.
http://stackoverflow.com/questions/1453041/dbctrlgrid-with-a-dblookupcombobox
interface
uses
...
;
type Tdbp = class(TDBCtrlGrid);
type tdbl = class(TDBLookupControl);
type
TForm4 = class(TForm)
...
DBCtrlGrid1: TDBCtrlGrid;
...
private
...
function FindLCB(DataFieldName: String): TDBLookupComboBox;
procedure FixDBLookupDataLinks;
public
...
end;
...and in your implementation:
----------
implementation
procedure TForm4.FormCreate(Sender: TObject);
begin
...
DBCtrlGrid1.DataSource := DataSource1;
FixDBLookupDataLinks;
end;
procedure TForm4.FixDBLookupDataLinks;
var
lcb: TDBLookupComboBox;
I,n: Integer;
MyDataLink: TDataLink;
ctl: TControl;
dbp: Tdbctrlpanel;
begin
dbp := Tdbp(DBControlGrid1).Panel;
for n := 0 to Pred(dbp.ControlCount) do
begin
ctl := dbp.Controls[n];
if ctl.ClassType = TDBLookupComboBox then
begin
lcb := TDBLookupComboBox(ctl);
lcb.ControlStyle := lcb.ControlStyle + [csReplicatable];
TDBL(lcb).ListLink.DataSourceFixed := False;
for I := 0 to Pred(lcb.ControlCount) do
begin
if lcb.Controls[I] is TPopupDataList then
begin
TDBL(lcb).ListLink.DataSourceFixed := False;
TDBL(lcb).DataLink.DataSourceFixed := False;
MyDataLink := TDataLink(lcb.Controls[I].Perform(CM_GETDATALINK, 0, 0));
if MyDataLink <> nil then
MyDataLink.DataSourceFixed := False;
MyDataLink.DataSource := nil;
end;
end;
end;
end;
end;
function TForm4.FindLCB(DataFieldName: String): TDBLookupComboBox;
var
i: Integer;
begin
Result := Nil;
for i := 0 to Pred(ControlCount) do
if Controls[i].ClassType = TDBLookupComboBox then
if TDBLookupComboBox(Controls[i]).DataField = DataFieldName then
begin
Result := TDBLookupComboBox(Controls[i]);
Break;
end;
end;