Są co najmniej 3 sposoby, aby to zrobić, zilustruję poprzez maskowanie pola hasła z bazy danych. Używam serwera sql dla sql dialekt.
1. Zdefiniuj obliczone pole w ciągu znaków sql.
Następnie kliknij prawym przyciskiem myszy na dbgrid, wybierz edytor kolumn. W edytorze kolumn dla dbgrid wystarczy wybrać kolumnę maskedPwd zamiast kolumny prawdziwego hasła. Teraz dbgrid wyświetli zamaskowaną wartość zamiast hasła.
lub
2. Zdefiniuj pole obliczona na zbiorze danych używanej przez DBGrid.
Po prostu kliknij prawym przyciskiem myszy na zestaw danych i użyj edytora pól, aby utworzyć nowe pole obliczeniowe (np. MaskedPwd2). Następnie onCalcField wydarzeniem zbioru danych, napisać kod, aby ustawić wartość maskedPwd2, tj
procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('maskedPwd2').AsString := '********';
end;
Upewnij się m.in. maskedPwd2 w edytorze kolumny w DBGrid.
lub
3. Zapis własny tekst na razie onDrawColumnCell w 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;
Zauważ, że powyższy kod tylko wyświetlanie wartości zamaskowany, ale jeśli siatka jest edytowalny, rzeczywista wartość hasło będzie widoczne, gdy komórka skupia/edytowany.
Aby uporać się z tym, upuść TEdit na formularzu, wyczyść właściwość text, ustaw właściwość PpasswordChar na "*", a widoczną na false. Teraz jest gotowy do użycia jako zamiennik wbudowanego edytora dla komórki. Teraz musimy trochę logiki klejenie, tj
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;
Zauważ, że powyższy kod nie jest doskonały, ale, ale istota istnieje. Zostawię to dla ciebie do ćwiczeń.
Istnieją 3 sposoby, aby to zrobić. 1. Utwórz pole obliczeniowe dla hasła w zestawie danych używanym przez dbgrid. 2. Utwórz pole obliczeniowe dla hasła w instrukcji SQL select. lub 3. użyj zdarzenia onDrawColumCell/Data dla dbgrid, jak to podano powyżej. Ale ja osobiście nie lubię przechowywania hasła w bazie danych, ale hash-kodowanej wersji hasła. Ponieważ kod skrótu jest funkcją jednokierunkową (tzn. Nie może uzyskać oryginalnego hasła z kodu skrótu), a tylko poprawne hasło może wygenerować ten sam kod skrótu, jest bezpieczniejsze w użyciu.] – Hendra
@Hendra Sure, hasło było przykład, moje potrzeby są zbyt skomplikowane, aby jednoznacznie wyjaśnić. Ale wiem, jak zmienić prezentację komórki za pomocą onDrawColumCell, ale nie treści tekstowej, żadnego przykładu czy tuto? – philnext