라자루스에서 EhLib 사용시 버그해결 (v.9.5.018)

1. 디자인시 Column의 OnGetCellParams Event에 코드를 작성한 후 다시 폼을 열고 Column을 수정하려고보면 해당 Event가 지워진 상태로 나온다. 물론 코드가 지워진건 아니고 객체의 속성에서만 빠져있기때문에 폼 생성시 해당 Event를 체크한 후 없으면 강제로 등록해줘야 한다.
<pre class="brush:delphi">
  if DBGridEh1.Columns[0].OnGetCellParams = nil then
    DBGridEh1.Columns[0].OnGetCellParams := @DBGridEh1Columns0GetCellParams;
</pre>

2. 복사한 텍스트를 붙여넣기하면 두 번 붙여넣기 되는 버그가 있다. 한글이 입력되어있는 경우 복사되는 위치도 지정된 위치가 아니라 이상한데 복사가 되는데 이것을 해결하기 위해서는 KeyDown Event에서 직접적으로 처리 붙여넣기 처리를 하면 된다. 아래 코드는 KeyDown Event인 관계로 Enter Key로 Column 이동처리까지 넣어서 처리했음.
<pre class="brush:delphi">
uses
  ..., LCLType, Clipbrd;

procedure TForm1.DBGridEh1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  with TDBGridEh(Sender) do
  begin
    if Key = VK_RETURN then
    begin
      if not (Columns[SelectedIndex].Checkboxes or EditorMode) then Exit;
      if Shift = [] then
      begin
        if SelectedIndex < (FieldCount - 1) then SelectedIndex := SelectedIndex + 1
        else
        begin
          SelectedIndex := 0;
          DataSource.DataSet.Next;
          if DataSource.DataSet.Eof then DataSource.DataSet.Append;
        end;
      end
      else if ssShift in Shift then
      begin
        if SelectedIndex > 0 then SelectedIndex := SelectedIndex - 1
        else
        begin
          SelectedIndex := FieldCount - 1;
          DataSource.DataSet.Prior;
        end;
      end;
    end
    // Double Paste Bug Fix
    else if (ssCtrl in Shift) and (UpCase(Char(Key)) = 'V') then
    begin
      Key := 0;
      if EditorMode then
      begin
        if not (DataSource.State in [dsEdit, dsInsert]) then DataSource.Edit;
        InplaceEditor.SelText := Clipboard.AsText;
        SelectedField.AsString := InplaceEditor.Text;
      end;
    end;
  end;
end;
</pre>

3. Filter에 Like가 지원 안 되는데 사용자 설정 창에 해당 문구가 그대로 나타나는 문제가 있다. Like가 지원 안 된다기보다는 델파이의 DataSet의 Filter 처럼 '*'로 Like와 같은 처리가 가능하다. 따라서 DBGridEhSimpleFilterDlg.pas의 소스를 직접 고쳐서 문구만 변경해주면 자연스럽게 해결 된다.
<pre class="brush:delphi">
// DBGridEhSimpleFilterDlg.pas

procedure TDBGridEhSimpleFilterDialog.ResourceLanguageChanged;
// 2020.05.31 by K.I.S -- begin
{$IFDEF FPC}
var
  l_Gap: Integer;
{$ENDIF}
// 2020.05.31 by K.I.S -- end
begin
  Caption := EhLibLanguageConsts.DBGridEhSimpleFilterDialog_Caption; 
  Label1.Caption := EhLibLanguageConsts.DBGridEhSimpleFilterDialog_ShowRecordsWhere; 
// 2020.05.31 by K.I.S -- begin
{$IFDEF FPC}
  Label2.Visible := False;
  Label3.Caption := EhLibLanguageConsts.DBGridEhSimpleFilterDialog_SeveralCharsWildcardInfo;
  Label3.Caption := StringReplace(Label3.Caption, '%', '*', [rfReplaceAll]);
  l_Gap := Label3.Top - Label2.Top;
  Label3.Top := Label2.Top;
  bOk.Top := bOk.Top - l_Gap;
  bCancel.Top := bCancel.Top - l_Gap;
  Self.Height := Self.Height - l_Gap;
{$ELSE}
  Label2.Caption := EhLibLanguageConsts.DBGridEhSimpleFilterDialog_OneCharWildcardInfo;
  Label3.Caption := EhLibLanguageConsts.DBGridEhSimpleFilterDialog_SeveralCharsWildcardInfo; 
{$ENDIF}
// 2020.05.31 by K.I.S -- end

  rbOr.Caption := EhLibLanguageConsts.DBGridEhSimpleFilterDialog_Or_Caption;
  rbAnd.Caption := EhLibLanguageConsts.DBGridEhSimpleFilterDialog_And_Caption; 

  bOk.Caption := EhLibLanguageConsts.OKButtonEh;
  bCancel.Caption := EhLibLanguageConsts.CancelButtonEh;
end;
</pre>

4. 라자루스에는 Delphi의 AlignWithMargins와 Margins과 비슷한 처리를 할 수 있는 BorderSpacing이라는 속성이 있는데 EhLib에 있는 컴퍼넌트에는 모두 빠져있다.
BorderSpacing 속성을 각 컴퍼넌트의 published에 추가해주면 라자루스에서 BorderSpacing을 사용할 수 있다.
<pre class="brush:delphi">
// DBGridsEh.pas : TDBGridEh
// DBCtrlsEh.pas : TDBEditEh, TDBDateTimeEditEh, TDBComboBoxEh, TDBNumberEditEh, TDBCheckBoxEh, TDBMemoEh, TDBImageEh, TDBRadioGroupEh
// DBVertGridsEh.pas : TDBVertGridEh
// PlannerCalendarPickerEh.pas : TPlannerCalendarPickerEh
// PivotGridsEh.pas : TPivotGridEh
// PlannersEh.pas : TPlannerControlEh

  published
    :
    {$IFDEF FPC}
    property BorderSpacing; // 2020.05.31 by K.I.S
    {$ELSE}
</pre>

버그는 아니지만 DBGridEh Filter의 크기가 고정되어있어서 불편한데 Column 크기에 맞게 변경되게 하려면 DBGridsEh.pas에 아래 코드를 추가해주면 된다.
<pre class="brush:delphi">
// DBGridsEh.pas

procedure TCustomDBGridEh.InTitleFilterDropDownFormForRect(Column: TColumnEh; ForRect: TRect);
:
  ADropDownForm := DBGridFilterDropDownFormProc();
  ADropDownForm.Font.Assign(Font); // 2017.04.15 by K.I.S
  ADropDownForm.BiDiMode := BidiMode;
  ADropDownForm.Column := Column;
// 2020.05.31 by K.I.S -- begin
  if Column.Width < 200 then ADropDownForm.Width := 200
  else ADropDownForm.Width := Column.Width;
// 2020.05.31 by K.I.S -- end
</pre>
