DBCtrlGrid с DBLookupComboBox - PullRequest
       20

DBCtrlGrid с DBLookupComboBox

1 голос
/ 21 сентября 2009

Кому-нибудь удалось заставить DBLookupComboBox работать с DBCtrlGrid?

Предварительно заполненный DBComboBox работает нормально, но не очень хорошо подходит для справочных таблиц.

Ответы [ 4 ]

1 голос
/ 13 декабря 2009

Ну, я не понимаю, почему в Delphi это запрещенное действие, но мне удалось создать свой собственный компонент комбинированного списка с флагом csReplicatable в ComponentStyle, и он работает!

Он не был тщательно протестирован, но в моем приложении он работает без проблем.

Вот источник , проверьте его.

0 голосов
/ 26 апреля 2012

Я нашел этот обходной путь в Embarcadero Developer Network :

Я понял, как обойти эту проблему. Вот образец. Это предполагает, что выпадающий список размещается на сетке во время разработки, а не во время выполнения. Итак, в данный момент выполняется обработчик событий, элементы управления успешно транслировались из DFM и ссылки уже установлено. Хотя в реальном проекте нужно тестировать.

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  MyDataLink: TDataLink;
begin
  for I := 0 to DBLookupComboBox1.ControlCount - 1 do
    if DBLookupComboBox1.Controls[I] is TPopupDataList then
    begin
      MyDataLink := TDataLink(DBLookupComboBox1.Controls[I].Perform(CM_GETDATALINK, 0, 0));
      if MyDataLink <> nil then begin
        MyDataLink.DataSourceFixed := False;
        MyDataLink.DataSource := nil;
      end;
    end;
end;

Андрей Фомин.


Если у вас есть TDBLookupComboBox на вашем TDBGrid, вы можете использовать этот фрагмент:

procedure TForm1.FormCreate(Sender: TObject);
var
  I, C: Integer; 
  curCombo: TDBLookupComboBox; curDL: TDataLink;
begin
  for C := 0 to ComponentCount - 1 do begin
    if Components[C] is TDBLookupComboBox then begin
      curCombo:= (Components[C] as TDBLookupComboBox);

      for I := 0 to curCombo.ControlCount - 1 do
        if curCombo.Controls[I] is TPopupDataList then
        begin
          curDL := TDataLink(curCombo.Controls[I].Perform(CM_GETDATALINK, 0, 0));
          if curDL <> nil then begin
            curDL.DataSourceFixed := False;
            curDL.DataSource := nil;
          end;
        end;
    end;
  end;
end;
0 голосов
/ 02 июня 2010

Будучи довольно сдержанным, чтобы изменять / поддерживать измененный код VCL / RTL, я нашел другой способ. Объявите следующее в интерфейсе вашего устройства:

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 голосов
/ 23 октября 2009

Я только что добавил TDBLookupCombo к TDBCtrlGrid. Когда я попытался установить ListSource, я получил ошибку:

Операция не разрешена в DBCtrlGrid.

Поэтому кажется, что это явно запрещено в Delphi, и поэтому вы не сможете это сделать.

...