Existen al menos 3 formas de hacerlo, lo ilustrare enmascarando un campo de contraseña de una base de datos. Estoy usando el servidor sql para el dialecto sql.
1. Defina un campo calculado en la cadena sql.
select field1, field2, '********' as maskedPwd from table1;
A continuación, haga clic en el DBGrid, elija el editor de columnas. Dentro del editor de columnas de dbgrid, simplemente seleccione la columna maskedPwd en lugar de la columna de contraseña real. Ahora el dbgrid mostrará el valor enmascarado en lugar de la contraseña.
o
2. Definir un campo calculado en el conjunto de datos utilizado por el DBGrid.
Simplemente haga clic con el botón derecho en el conjunto de datos y use el editor de campos para crear un nuevo campo calculado (por ejemplo, maskedPwd2). Entonces onCalcField caso del conjunto de datos, escribir código para establecer el valor de maskedPwd2, es decir
procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('maskedPwd2').AsString := '********';
end;
Asegúrese de incluir maskedPwd2 en el editor de columnas del DBGrid.
o
3. Escribir texto personalizado en el caso OnDrawColumnCell del DBGrid.
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;
Tenga en cuenta que el código anterior sólo muestra el valor enmascarado, pero si la red es editable, el valor real de la contraseña será visible cuando la célula se centra/editado.
Para solucionar esto, coloque un TEdit en el formulario, borre la propiedad de texto, establezca la propiedad PpasswordChar en '*' y visible en falso. Ahora está listo para usarse como reemplazo del editor incorporado para la celda. Ahora, necesitamos algo de lógica encolado, es decir
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, PChar(maskValue), Length(maskValue), aRect,
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;
Tenga en cuenta que el código anterior no es perfecto, sin embargo, pero la esencia está ahí. Te lo dejo para hacer ejercicio.
Hay 3 formas de hacerlo. 1. Cree un campo calculado para la contraseña en el conjunto de datos utilizado por dbgrid. 2. Cree un campo calculado para la contraseña en la declaración de selección sql. o 3. use el evento onDrawColumCell/Data de dbgrid, como usted indicó anteriormente. Pero personalmente me gusta NO almacenar la contraseña en la base de datos, sino la versión codificada con hash de la contraseña. Como el código hash es una función unidireccional (es decir, no se puede obtener la contraseña original del código hash), y solo la contraseña correcta puede producir el mismo código hash, es más seguro usarlo.] – Hendra
@Hendra Claro, la contraseña era un ejemplo, mis necesidades son demasiado complicadas para explicar con claridad. Pero sé cómo cambiar la presentación de una celda, con onDrawColumCell, pero no el contenido de texto, ningún ejemplo o tuto? – philnext