내가 해결하고 싶은 문제는 TDBEdit에 입력 할 때 필드에 남은 문자를 사용자에게 표시하는 것입니다. TDBEdit에서 남은 문자 표시하기
은 현재 내가 완벽하게 정상적으로 작동 TDBEdit와 대한 OnChange 이벤트에 레이블을 업데이트lCharRemaining.Caption := Field.Size - length(dbedit.text);
즉의 라인을 따라 뭔가를하고 있어요. 그러나 나는 TDBEdits의 번호에 대해이 작업을 수행하고 오른쪽에있는 편집 상자 내에 남아있는 길이를 표시하는 사용자 지정 구성 요소를 작성하려고했습니다. 그러나 편집을 방해합니다. 누군가가 입력란에 남아있는 공간을 나타내는 동안 어떤 힌트를 표시 할 수 있다고 생각했을 것입니다 - 어떤 제안입니까?
다음은 내 구성 요소의 코드입니다 (누군가가 개선을 제안 할 수있는 경우).
unit DBEditWithLenghtCountdown;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Mask, DBCtrls, messages, Graphics;
type
TDBEditWithLenghtCountdown = class(TDBEdit)
private
{ Private declarations }
FCanvas: TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
{ Protected declarations }
property Canvas: TCanvas read FCanvas;
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
function CharactersRemaining : integer;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
end;
procedure Register;
implementation
uses
db, Types;
procedure Register;
begin
RegisterComponents('Samples', [TDBEditWithLenghtCountdown]);
end;
{ TDBEditWithLenghtCountdown }
function TDBEditWithLenghtCountdown.CharactersRemaining: integer;
begin
result := -1;
if Assigned(Field)then
begin
result := Field.Size - Length(Text);
end;
end;
constructor TDBEditWithLenghtCountdown.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;
destructor TDBEditWithLenghtCountdown.Destroy;
begin
FCanvas.Free;
inherited;
end;
procedure TDBEditWithLenghtCountdown.WMPaint(var Message: TWMPaint);
var
R: TRect;
Remaining : string;
WidthOfText: Integer;
x: Integer;
begin
inherited;
if not focused then
exit;
Remaining := IntToStr(CharactersRemaining);
R := ClientRect;
Inc(R.Left, 1);
Inc(R.Top, 1);
Canvas.Brush.Assign(Self.Brush);
Canvas.Brush.Style := bsClear;
Canvas.Font.Assign(Self.Font);
Canvas.Font.Color := clRed;
WidthOfText := Canvas.TextWidth(Remaining);
x := R.right - WidthOfText - 4;
Canvas.TextOut(x,2, Remaining);
end;
procedure TDBEditWithLenghtCountdown.WndProc(var Message: TMessage);
begin
inherited WndProc(Message);
with Message do
case Msg of
CM_MOUSEENTER, CM_MOUSELEAVE, WM_LBUTTONUP, WM_LBUTTONDOWN,
WM_KEYDOWN, WM_KEYUP,
WM_SETFOCUS, WM_KILLFOCUS,
CM_FONTCHANGED, CM_TEXTCHANGED:
begin
Invalidate;
end;
end; // case
end;
end.
"편집을 방해합니까?" 근본적으로 "작동하지 않습니다"라고 말하면 디버깅의 역사에서 가장 쓸모없는 구절입니다. 네가 그것을하려고 할 때 무엇이 잘못 될까? –
@MasonWheeler 나머지 길이의 텍스트는 편집 상자의 끝에 접근함에 따라 현재 입력 된 내용을 덮어 씁니다. – Alister
하지만 왜 새 구성 요소를 갖고 싶어합니까? TCustomEdit에서 파생 된 모든 클래스에 대해 일반화 될 수 있습니다. –