加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Delphi TDBGrid中修改单元格值

发布时间:2020-12-15 04:22:59 所属栏目:大数据 来源:网络整理
导读:我必须在VCL TDBGrid(Delphi XE2)中显示一些修改后的’masked’值,即:将’password’更改为’xxxxxxxx’或将大写’pass’更改为’PASS’或其他. 因为我的字段是动态创建的(但名称是编码所以我知道如何以及何时屏蔽它们,即:xxxx_PASSW用于密码字段)我不能使
我必须在VCL TDBGrid(Delphi XE2)中显示一些修改后的’masked’值,即:将’password’更改为’xxxxxxxx’或将大写’pass’更改为’PASS’或其他.
因为我的字段是动态创建的(但名称是编码所以我知道如何以及何时屏蔽它们,即:xxxx_PASSW用于密码字段)我不能使用(我认为)OnGetText事件.

那么最有效的方法是什么(因为我还使用OnDrawColumnCell进行一些演示修改,我会优先使用它)?

解决方法

至少有3种方法可以做到这一点,我将通过屏蔽数据库中的密码字段来说明.我正在使用sql server作为sql方言.

1.在sql字符串上定义计算字段.

select field1,field2,'********' as maskedPwd from table1;

然后,右键单击dbgrid,选择列编辑器.在dbgrid的列编辑器中,只需选择maskedPwd列而不是真实密码列.现在,dbgrid将显示屏蔽值而不是密码.

要么

2.在dbgrid使用的数据集上定义计算字段.

只需右键单击数据集,然后使用fields-editor创建一个新的计算字段(例如maskedPwd2).然后在数据集的onCalcField事件中,编写代码来设置maskedPwd2的值,即

procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('maskedPwd2').AsString := '********';
end;

确保在dbgrid的列编辑器中包含maskedPwd2.

要么

3.在dbgrid的onDrawColumnCell事件上编写自定义文本.

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  grid : TDBGrid;
  maskValue : String;
  aRect : TRect;
begin
  maskValue := '********';
  aRect := Rect;
  grid := sender as TDBGrid;

  if column.FieldName = 'password' then
  begin
    grid.Canvas.FillRect(Rect);
    DrawText(grid.Canvas.Handle,PChar(maskValue),Length(maskValue),aRect,DT_SINGLELINE or DT_LEFT or DT_VCENTER);
  end;
end;

请注意,上面的代码仅显示屏蔽值,但如果网格是可编辑的,则在对焦或编辑单元格时,将显示实际密码值.

要处理此问题,请在表单上删除TEdit,清除text属性,将PpasswordChar属性设置为’*’,并将其显示为false.现在它已准备好用作单元格的内置编辑器的替代品.现在,我们需要一些粘合逻辑,即

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  grid : TDBGrid;
  maskValue : String;
  aRect : TRect;
begin
  maskValue := '********';
  aRect := Rect;
  grid := sender as TDBGrid;

  if column.FieldName = 'password' then
    if gdfocused in State then
      begin
        Edit1.Left := Rect.Left + grid.Left + 1;
        Edit1.Top  := rect.Top + grid.Top + 1;
        Edit1.Width := Rect.Right - Rect.Left + 2;
        Edit1.Height := Rect.Bottom - Rect.Top + 2;
        Edit1.Clear;
        Edit1.Visible := True;
      end
    else
      begin
        grid.Canvas.FillRect(Rect);
        DrawText(grid.Canvas.Handle,DT_SINGLELINE or DT_LEFT or DT_VCENTER);
      end
  else
    grid.DefaultDrawColumnCell(Rect,DataCol,Column,state);
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  Edit1.Visible := False;
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Chr(9) then Exit;

  if (Sender as TDBGrid).SelectedField.FieldName = 'password' then
  begin
    Edit1.SetFocus;
    SendMessage(Edit1.Handle,WM_CHAR,word(Key),0);
  end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if DBGrid1.DataSource.State in [dsEdit,dsInsert] then
    DBGrid1.DataSource.DataSet.FieldByName('password').AsString := Edit1.Text;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  DBGrid1.DataSource.Edit;
end;

请注意,上面的代码并不完美,但实质上是存在的.我会留给你锻炼身体.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读