Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Focus mit Enter wechseln funktioniert nicht. (https://www.delphipraxis.net/133777-focus-mit-enter-wechseln-funktioniert-nicht.html)

RaSoWa1 8. Mai 2009 14:56


Focus mit Enter wechseln funktioniert nicht.
 
Hallo,

um dem Nutzer die Datumseingabe zu erleichtern, habe ich von TEdit eine TDateEdit-Komponente abgeleitet. Es funktioniert alles so wie es soll, nur der Focus wechselt nicht zur nächsten Komponente, wenn die ENTER-Taste betätigt wird. Mit der TAB-Taste funktioniert es.
SendMessage(Handle, WM_NEXTDLGCTL, 0, 0) und Self.Perform(WM_NEXTDLGCTL, 0, 0); funktionieren nicht.

Was mache ich falsch.

Ihr könnt die Glaskugel im Schrank lassen. Hier ist der Code:
Delphi-Quellcode:
unit DateEdit;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, DateUtils, SysConst;

type
  TGetDatumFunc     = function(var Datum: TDateTime): boolean of Object;

  TDateEdit = class(TEdit)
  private     { Private declarations }
    FDateMask   : String;
    FGetDatum,
    FTestDatum  : TGetDatumFunc;
    procedure SetDateMask(value: String);
    procedure SetNextDate(t: Integer);
    procedure Exit(Sender: TObject);
  protected   { Protected declarations }
  public      { Public declarations }
    constructor Create(Owner: TComponent); override;
    procedure DblClick; override;
    procedure KeyPress(var Key: Char); override;
  published   { Published declarations }
    property DateMask: string read FDateMask write SetDateMask;
    property DatumGetFunc: TGetDatumFunc read FGetDatum write FGetDatum;
    property DatumTestFunc: TGetDatumFunc read FTestDatum write FTestDatum;
  end;

procedure Register;

implementation


procedure Register;
begin
  RegisterComponents('RaSoWa', [TDateEdit]);
end;

constructor TDateEdit.Create(Owner: TComponent);
begin
  inherited Create(Owner);
  FDateMask  := ShortDateFormat;
  FGetDatum  := nil;
  FTestDatum := nil;
  OnExit     := Exit;
end;

procedure TDateEdit.SetDateMask(value: String);
begin
  if FDateMask <> Value
  then FDateMask := Value;
end;

procedure TDateEdit.SetNextDate(t: Integer);
var  d : TDateTime;
begin
  if TryStrToDate(Text, d)
  then d := IncDay(d, t)
  else d := Date;
  Text := FormatDateTime(FDateMask, d);
end;

procedure TDateEdit.KeyPress(var Key: Char);
begin
  case Key of
    '+' : begin
          SetNextDate(1);
          end;
    '-' : begin
          SetNextDate(-1);
          end;
    ',' : Key := DateSeparator;
    #13 : begin
          Key := #0;
          SendMessage(Handle, WM_NEXTDLGCTL, 0, 0);        // ????????
//          Self.Perform(WM_NEXTDLGCTL, 0, 0);             // ???????
          end;
    end;
  if not(Key in [#1..#31,'0'..'9','.'])
  then Key := #0;
  inherited;
end;

procedure TDateEdit.Exit(Sender: TObject);
var d : TDateTime;
begin
  if TryStrToDate(Text, d)
  then Text := FormatDateTime(FDateMask, d)
  else raise EConvertError.CreateResFmt(@SInvalidDate, [Text]);
  inherited;
end;

procedure TDateEdit.DblClick;
var   d : TDateTime;
       ok : Boolean;
begin
  if Assigned(FGetDatum)
  then begin
    if not TryStrToDate(Text, d)
    then d := Date;
    if FGetDatum(d)
    then begin
      ok := True;
      if Assigned(FTestDatum)
      then ok := FTestDatum(d);
      if ok
      then Text := FormatDateTime(FDateMask, d);
      end;
    end;
  inherited;
end;


end.
Gruß Klaus

himitsu 8. Mai 2009 15:07

Re: Focus mit Enter wechseln funktioniert nicht.
 
hast du schonmal versucht diesen Befehl an die übergeordneten Komponenten (an Parent bzw. die Form) zu senden?

PS:
Delphi-Quellcode:
.  #13 : begin
          Key := #0;
          Parent.Perform(WM_NEXTDLGCTL, 0, 0);
          end;
    #8, '0'..'9', '.': ;
    else Key := #0;
    end;
  inherited;
end;

RaSoWa1 8. Mai 2009 15:33

Re: Focus mit Enter wechseln funktioniert nicht.
 
habe ich soebend. Und siehe da, es funktioniert.

Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz