Omschrijving
De standaard TEdit heeft een PasswordChar property waarmee je de tekens kan verbergen. Ondanks pogingen van Microsoft om deze beter te beveiligen tegen standaardtechnieken is dit niet gelukt, en ook vrijwel onmogelijk vanwege de manier waarom windows componenten werken. TProtectedEdit beveiligd TEdit zodat externe applicaties het paswoord niet kunnen bekijken. Hiervoor vangt het een aantal berichten af, geeft foutieve waarden terug, en slaat in plaats daarvan de tekst lokaal op.
Opmerkingen
Deze code wijkt enigzins af van de versie die ik hier gepost heb, de vorige versie gaf namelijk problemen als de gebruiker eenmaal de tekst had gewijzigd. Deze versie is volledige getest, alle data wordt binnen het component gehouden, Windows denkt dat de tekst in de edit daadwerkelijk '****' is, dus hiermee voorkom je effectief dat andere applicaties bij je data kunnen via standaard-methoden...
Er kunnen misschien nog kleine fouten in zitten, heb nog niet zorgvuldig getest hoe het component zich gedraagd buiten de standaard functionaliteit in de applicatie zelf, maar mochten er problemen zijn hoor ik het wel
Code
Code:
uses
Messages,
Classes,
StdCtrls;
type
TProtectedEdit = class(TEdit)
private
FText: String;
procedure SetText(const Value: String);
protected
procedure KeyPress(var Key: Char); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure WMCopy(var Msg: TWMCopy); message WM_COPY;
procedure WMCut(var Msg: TWMCut); message WM_CUT;
procedure WMPaste(var Msg: TWMPaste); message WM_PASTE;
published
property Text: String read FText write SetText;
end;
implementation
{ TProtectedEdit }
procedure TProtectedEdit.KeyDown(var Key: Word; Shift: TShiftState);
var
iLength: Integer;
begin
inherited;
if PasswordChar <> #0 then
if Shift = [] then
case Key of
VK_DELETE:
begin
if SelLength = 0 then
iLength := 1
else
iLength := SelLength;
Delete(FText, SelStart + 1, iLength);
end;
end
else
FText := inherited Text;
end;
procedure TProtectedEdit.KeyPress(var Key: Char);
var
iPos: Integer;
begin
inherited;
if PasswordChar <> #0 then
case Ord(Key) of
VK_BACK: SetLength(FText, Length(FText) - 1);
VK_DELETE: Delete(FText, SelStart, SelLength);
else
iPos := SelStart;
if SelLength > 0 then
Delete(FText, iPos + 1, SelLength);
FText := Copy(FText, 1, iPos) + Key + Copy(FText, iPos + 1, MaxInt);
end
else
FText := inherited Text;
end;
procedure TProtectedEdit.SetText(const Value: String);
begin
FText := Value;
if Self.PasswordChar <> #0 then
inherited Text := StringOfChar(Self.PasswordChar, Length(Value))
else
inherited Text := Value;
end;
procedure TProtectedEdit.WMCopy(var Msg: TWMCopy);
begin
if PasswordChar = #0 then
inherited;
end;
procedure TProtectedEdit.WMCut(var Msg: TWMCut);
begin
if PasswordChar = #0 then
inherited;
end;
procedure TProtectedEdit.WMPaste(var Msg: TWMPaste);
begin
if PasswordChar = #0 then
inherited;
end;
Bookmarks