Aannames zijn the mother of all fuckups

Als dat niet zo is, en je voert deze code uit, en er komt een ChangeFont-message (oid) langs, wordt het hele form ge-redrawd in het font van de TDBEdit.
(Je kan evt. het oorspronkelijke font opslaan en na de textwidth weer terugzetten, dan werkt het altijd.)
Dat is idd mogelijk, evenals het repainten van het form even uitzetten. Daarom noem ik het ook als nadeel, zodat de TS weet dat hij daar rekening mee moet houden. Eventueel is het ook mogelijk om bv. zelf een control aan te maken welke wel een canvas property heeft, en die misbruiken ipv. het form.
Dat valt echter een beetje buiten de vraag, maar goed, dan toch:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
oFont: TFont;
begin
If not Edit1.ParentFont then
begin
oFont:=Edit1.Font;
LockWindowUpdate(Form1.handle);
Form1.Font := Edit1.Font;
If (form1.Canvas.TextWidth(Edit1.Text + Key))+7 > Edit1.width then Key:=#0;
Form1.Font := oFont;
LockWindowUpdate(0);
end
else
If (form1.Canvas.TextWidth(Edit1.Text + Key))+7 > Edit1.width then Key:=#0;
end; |
Ik zou niet de aanname doen dat Parentfont altijd true is; zeker niet daar TS zelf al beschrijft dat e.e.a. moet overeenkomen met het font op een website. Stel nu dat iemand in de toekomst dat font veranderd, dan is erg waarschijnlijk dat dat font in de edit gewijzigd gaat worden, en niet in het form.
Andere optie (mooier imo):
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
oCanvas: TCanvas;
notUsed: HWND;
begin
oCanvas := TCanvas.Create;
oCanvas.Handle := GetDeviceContext(notUsed);
Try
oCanvas.Font:=Edit1.Font;
If (oCanvas.TextWidth(Edit1.Text + Key))+7 > Edit1.width then Key:=#0;
Finally
oCanvas.Free;
End;
end; |
[
Voor 21% gewijzigd door
Verwijderd op 14-12-2004 18:08
]