EditFeld = ActiveControl

Antworten
angross
Beiträge: 10
Registriert: So 29. Dez 2019, 17:13
OS, Lazarus, FPC: Fedora 36, WinX, Lazarus 2.2.2/2.2.2
CPU-Target: x86_64
Wohnort: Berlin

EditFeld = ActiveControl

Beitrag von angross »

Beim Wechsel von Lazarus 2.0.12 auf Lazarus 2.2.0 unter Linux gab es in einem alten Programm, das schon lange läuft, ein unerwartetes Problem.

Kurz zur Schilderung des Vorhabens:

In dem Programm rufe ich einen Suchdialog auf, in dem ein Editfeld das aktive Control ist, damit man gleich einen Suchbegriff eingeben kann. Die Return-Taste startet die Suche in einer Datenbank, das Ergebnis wird im Suchdialog in einer Tabelle präsentiert. Dort wählt man einen Datensatz aus, der bei Beenden dann im Hauptfenster angezeigt wird. Falls man nun gleich noch einmal suchen will, startet man erneut den Suchdialog, kann durch Eingabefeld = ActiveControl gleich wieder den Suchbegriff eingeben und mit Return die Suche starten.

Das Programm funktionierte noch mit Lazarus 2.0.12 und auf dieselbe Weise unter Linux und WinX.

Mit Lazarus 2.2.0 auf Fedora aber war das vorbei: Beim ersten Aufruf des Suchdialogs ist alles wie erwartet, ab dem zweiten Start des Suchdialogs passiert jedoch Folgendes: Sobald man im Editfeld Return drückt, wird zwar die Suche ausgelöst, aber dann der Suchdialog sofort beendet. Das passiert aber nur unter Linux; unter WinX mit Laz 2.2.0 ist alles wie immer.

Ich habe mal ein kleines Linux-Testprogramm geschrieben, das das Phänomen auch zeigt. Also im Hauptfenster auf Testen drücken, im zweiten Fenster etwas eingeben und Return drücken -- funktioniert, dann auf Zurück. Bei 2.0.12 bleibt das auch bei jedem weiteren Testen so. Bei 2.2.0 funktioniert das nur beim ersten Mal. Das ist in diesem Testprogramm natürlich nicht schlimm, aber bei einer Datenbanksuche will man ja aus mehreren Sätzen erst einen auswählen, bevor der Suchdialog beendet wird ...

Ich hab schon einige Sachen ausprobiert, z.B. SetFocus statt ActiveControl, TabStop-Reihenfolge, mit Defocus und Default experimentiert (was man eben so im www findet), aber bisher keinen Erfolg gehabt. Ich hab auch schon überlegt, OnCloseQuery zu verwenden oder mit KeyPreview zu experimentieren -- aber das kann es ja eigentlich nicht sein.

Das einzige, was richtig hilft, ist, den Beenden-Button zu disable'n ;-) und das Fenster über das Kreuz rechts oben zu schließen.

Aber vielleicht habe ich ja auch irgend eine Einstellung übersehen oder falsch gesetzt. Was meint ihr?
Dateianhänge
testenter.7z
(59.25 KiB) 75-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: EditFeld = ActiveControl

Beitrag von theo »

Was genau vor sich geht, wäre zu untersuchen, aber Key:=0 sollte schon schon mal Abhilfe schaffen.

Code: Alles auswählen

procedure TenterForm.enterTestKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then
  begin
   erg_Label.Caption := enterTest.Text;
   Key:=0;
  end;
end;   

angross
Beiträge: 10
Registriert: So 29. Dez 2019, 17:13
OS, Lazarus, FPC: Fedora 36, WinX, Lazarus 2.2.2/2.2.2
CPU-Target: x86_64
Wohnort: Berlin

Re: EditFeld = ActiveControl

Beitrag von angross »

Hallo, Theo,

Irgendwie bin ich mir aber sicher, auch das probiert zu haben ... ebenfalls ohne Erfolg.
Jetzt funktioniert es wirklich :-)

Danke erstmal soweit!!!

Antworten