Autor Beitrag
Kuesel
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 03.04.07 11:15 
Hallo Forum,

ich habe ein Problem bei der Verarbeitung von Events. Es lässt sich sehr leicht reproduzieren. Man nehme :
2 EditFields und schreibe in je in das OnEnter-Event

SendMessage('ENTER Edit 1 bzw. 2');

Wenn jetzt zwischen den beiden Feldern hin und her klickt, merkt man, dass nach dem Erscheinen der Meldung ein Feld 2 mal angeklickt werden muss damit die entsprechende Meldung erscheint. Belässt man es bei einem Klick und fährt mit der Maus über den Text des Edit-Feldes sieht man, dass sich das Feld im Markierungsmodus befindet.
Meine Vermutung ist, dass ShowMessage den Mausklick unterbricht und nach dem Anzeigen der Message nicht kein MouseUp für das Feld registriert wird. Leider bringt

SendMessage(Application.Mainform.Handle,WM_LBUTTONDOWN,0,0);

auch keinen Erfolg.

Hat jemand eine Idee zur Lösung des Problems?
Danke Kuesel
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.04.07 11:43 
Erstmal :welcome: hier im Forum!

Ja, warum das so ist: OnEnter wird vor OnMouseUp ausgelöst, wenn derweil aber die Maustaste losgelassen wird (wird sie ja normalerweise), dann wird das OnMouseUp nicht ausgelöst, weil dieses ja an das Dialog-Fenster geht.
Dass es tatsächlich so ist, lässt sich sehr einfach demonstrieren: Halt mal die Maustaste gedrückt, wenn du das Edit anklickst, dann bestätige den Dialog mit Return... Dann geht alles.

Ich frage mich allerdings, was es für einen Sinn hat in OnEnter eine Meldung auszugeben. Aber du wirst schon wissen was du tust. ;-)

Jedenfalls lässt sich das so lösen:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
const
  WM_SHOWEDITENTERMSG = WM_USER + 10;

type
  TForm63 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Edit1Enter(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ShowEditEnterMsg(var Msg: TMessage); message WM_SHOWEDITENTERMSG;
  end;

var
  Form63: TForm63;

implementation

{$R *.dfm}

procedure TForm63.ShowEditEnterMsg(var Msg: TMessage);
begin
  Application.MessageBox(PChar('Feld ' + IntToStr(Msg.WParam)), '', 0);
end;

procedure TForm63.Edit1Enter(Sender: TObject);
begin
  PostMessage(Handle, WM_SHOWEDITENTERMSG, TEdit(Sender).Tag, 0);
end;

PostMessage sendet ja einfach nur die Botschaft ab und kehrt sofort zurück, sodass dort keine Unterbrechung der normalen Abläufe gibt, denn das MouseUp wird abgearbeitet bevor die andere Message für den Dialog verarbeitet wird.