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 Delphi-Fehler im OnExit (Verlust der Tastatursteuerung) (https://www.delphipraxis.net/90746-delphi-fehler-im-onexit-verlust-der-tastatursteuerung.html)

daddy 23. Apr 2007 09:39


Delphi-Fehler im OnExit (Verlust der Tastatursteuerung)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin mal wieder auf ein merkwürdiges Problem gestoßen, zu dem ich hier in der Delphi-Praxis nichts finden kann. Vielleicht weiß ja jemand etwas darüber, bevor ich mich jetzt auf die mühsame Suche in der VCL begebe:

In Edit1 führe ich im OnExit eine Aktion durch, die den Cursor erhält (z.B. Aufruf eines Meldefensters). Alles funktioniert, solange ich einen Feldwechsel per Tabulatortaste durchführe. Wenn ich aber in Edit1 stehe und per Maus auf Edit2 wechsle, erscheint - wie geplant - mein Meldefenster, das ich per Mausklick oder Tastatur wieder schließe. Anschließend ist - wie ebenfalls geplant - Edit2 fokussiert aber die Tastatursteuerung des Programms komplett verloren gegangen. Das Programm nimmt keinerlei Tastatureingaben mehr entgegen. Erst wenn ich mit der Maus auf ein anderes Feld klicke funktioniert es wieder.

Kennt jemand dieses oder ein ähnliches Problem? Weiß jemand eine Lösung?

Zur Veranschaulichung habe ich ein Mini-Beispielprogramm angehängt, das 3 Editfelder enthält und eine einzige von mir zugefügte Codezeile.

Gruß Daddy

daddy 24. Apr 2007 08:16

Re: Delphi-Fehler im OnExit (Verlust der Tastatursteuerung)
 
* Push *

Hat niemand eine Idee hierzu? Handelt es sich um ein bekanntes Phänomen? Ich finde es etwas "erschreckend", dass ich im OnExit eines Feldes keine Meldung ausgeben kann. Das kann doch irgendwie nicht sein, dass eine solche Selbstverständlichkeit nicht funktioniert.

Bin dankbar für jeden Hinweis oder Kommentar!

uligerhardt 24. Apr 2007 09:06

Re: Delphi-Fehler im OnExit (Verlust der Tastatursteuerung)
 
Schau dir mal das hier an, besonders das Posting von Ralph Friedman.

HTH,
Uli.

Schubi 24. Apr 2007 09:28

Re: Delphi-Fehler im OnExit (Verlust der Tastatursteuerung)
 
Das wäre eine unelegante, aber funktionierende Lösung:
Delphi-Quellcode:
Procedure KlickPoint(x,y : Integer);
var
  mm : TPoint;
begin
  GetCursorPos(mm);
  SetCursorPos(x,y);
  mouse_event(MOUSEEVENTF_leftDOWN,x,y,0,0);
  mouse_event(MOUSEEVENTF_leftUP,x,y,0,0);
  SetCursorPos(mm.x,mm.y)
end;

procedure TForm1.Edit2Enter(Sender: TObject);
var
  p : TPoint;
begin
  p.X := (Sender as TControl).Left;
  p.Y := (Sender as TControl).Top;
  KlickPoint(ClientToScreen(p).X+(Sender as TControl).Width-2,ClientToScreen(p).Y+2);
end;

daddy 24. Apr 2007 10:45

Re: Delphi-Fehler im OnExit (Verlust der Tastatursteuerung)
 
Ich habe mir den Link von uligerhardt mal angesehen und festgestellt, dass es damit funktioniert. Habe das ganze noch ein wenig vereinfacht und jetzt am Ende folgende Lösung:

Delphi-Quellcode:
Own_ExitProc = WM_User + 42; // beliebiger noch verfügbarer Wert

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    CheckBox1: TCheckBox;
    procedure Edit1Exit(Sender: TObject);
  private
    procedure OwnExitProc(var Msg: TMessage); message Own_ExitProc;
  end;

procedure TForm1.OwnExitProc(var Msg: TMessage);
begin
  if csLButtonDown in ActiveControl.ControlState then
    PostMessage(ActiveControl.Handle, WM_LBUTTONUP, 0, 0);
  if Checkbox1.Checked then Messagedlg('Testmeldung', mtInformation, [mbok], 0);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  PostMessage(Handle, Own_ExitProc, 0, 0);
end;
Wenn man dann noch das "PostMessage(Handle, Own_ExitProc, 0, 0);" direkt in CONTROLS.PAS ins "DoExit" einbindet, kann man sich zumindest sparen, für alle Felder ein "OnExit" mit diesem Aufruf zu hinterlegen und muss nur noch eine "OwnExitProc" für jedes Formular hinterlegen.

Vielen Dank für die Hinweise!

Hansa 24. Apr 2007 10:53

Re: Delphi-Fehler im OnExit (Verlust der Tastatursteuerung)
 
Müsste einfacher gehen. Setze mal von Hand SetFocus auf das gewünschte Edit. Geht das immer noch nicht, dann bestücke das Edit notfalls so : Edit1.Text := ''; Und wenn es dann immer noch nicht geht, dann muss ich die Stelle in meinem Source suchen. Kenne diese Effekte. 8)

daddy 24. Apr 2007 11:00

Re: Delphi-Fehler im OnExit (Verlust der Tastatursteuerung)
 
Hallo Hansa,

also damit funktioniert es definitiv nicht. Wenn Du in Deinem Quelltext was Einfacheres findest, bin ich daran natürlich sehr interessiert. Du kannst ja selber mal mein Mini-Programm aus Beitrag #1 runterladen und es ausprobieren.

Gruß, Daddy


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr.

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