Discussion:
TEdit: Focus ohne Cursor
(zu alt für eine Antwort)
Burkhard Schneider
2008-11-25 10:03:07 UTC
Permalink
Hallo zusammen,

ich habe ein Form mit u.a. einem TEdit. Dieses TEdit soll beim Anzeigen des
Forms des Focus erhalten.

Das Edit nimmt jetzt zwar Tastatureingaben entgegen, aber der blinkende
Cursor ist nicht sichtbar. Ich habe schon einiges probiert:
- ActiveControl:=Myedit;
- MyEdit.SetFocus;
- MyEdit als erstes Control auf dem Form und sonst gar nichts

Immer der gleiche Effekt: Der Cursor ist unsichtbar, aber das Editfeld
erhält die Tastatureingaben. Ist halt nicht schon, weil der User nicht weiß,
dass er direkt losschreiben könnte.

Wenn ich allersings das gleiche Form in ein anderes (Test-)Projekt einbinde,
finktioniert alles wie gewünscht: Editfeld hat den Focus und der Cursor
blinkt.
Es muss also an irgendetwas in meiner Anwendung liegen. Hat jemand eine
Idee, wo ich da suchen kann.

Gruß
Burkhard
Georg Hübner
2008-11-25 12:33:36 UTC
Permalink
Post by Burkhard Schneider
Immer der gleiche Effekt: Der Cursor ist unsichtbar, aber das Editfeld
erhält die Tastatureingaben. Ist halt nicht schon, weil der User nicht weiß,
dass er direkt losschreiben könnte.
Hallo Burkhard,

an welcher Stelle im Programm steht MyEdit.SetFocus?

ich habe das mal an folgendem Stelle ausprobiert:

procedure TForm1.FormActivate(Sender: TObject);
begin
Edit1.SetFocus;
end;

Und es funktioniert immer mit sichtbaren, blinkenden Cursor.

Mfg

Georg Hübner
Stefan Koschke
2008-11-25 12:40:10 UTC
Permalink
Hallo Burkhard,
Post by Burkhard Schneider
Hallo zusammen,
ich habe ein Form mit u.a. einem TEdit. Dieses TEdit soll beim Anzeigen
des Forms des Focus erhalten.
Das Edit nimmt jetzt zwar Tastatureingaben entgegen, aber der blinkende
- ActiveControl:=Myedit;
- MyEdit.SetFocus;
- MyEdit als erstes Control auf dem Form und sonst gar nichts
Immer der gleiche Effekt: Der Cursor ist unsichtbar, aber das Editfeld
erhält die Tastatureingaben. Ist halt nicht schon, weil der User nicht
weiß, dass er direkt losschreiben könnte.
Wenn ich allersings das gleiche Form in ein anderes (Test-)Projekt
einbinde, finktioniert alles wie gewünscht: Editfeld hat den Focus und der
Cursor blinkt.
Es muss also an irgendetwas in meiner Anwendung liegen. Hat jemand eine
Idee, wo ich da suchen kann.
ich kann das nicht nachvollziehen:
- ein Form mit einem Edit, Cursor blinkt und nimmt Eingaben an.
- wird Tabstob = false gesetzt gibt es keinen Cursor und Zeichen kommen
nicht an
- bei Klick ins Edit wird der Cursor angezeigt und Zeichen kommen an
- wird im OnShow des Forms Edit.SetFocus ausgeführt ist der Cursor wieder
vorhanden und Tasten komen an
Ich bekomme es nicht hin, daß Zeichen ankommen aber kein Cursor blinkt!

Kannst Du mal ein paar Angaben machen was da sonst drumherum passiert?

Ciao
Stefan
Björn Schreiber
2008-11-25 15:13:58 UTC
Permalink
Post by Stefan Koschke
Ich bekomme es nicht hin, daß Zeichen ankommen aber kein Cursor blinkt!
In der Theorie geht das mit Hilfe von HideCaret/DestroyCaret (wurde
bei uns dazu verwendet, um das von Tabellen bekannte Verhalten -
Aktivierung mittels F2 - nachzubilden).
Aber der OP sollte ja wissen, ob diese API-Funktionen verwendet
werden. Oder kommen ggf. irgendwelche Fremdkomponenten oder Ableitungen
von TEdit zum Einsatz?


Grüße,
Björn
--
Björn Schreiber, DRIGUS GmbH
***@drigus.de
Bei Email NOSPAM in den Betreff aufnehmen.
Put NOSPAM in subject to reach me by email.
Burkhard Schneider
2008-11-25 21:20:30 UTC
Permalink
Post by Stefan Koschke
Ich bekomme es nicht hin, daß Zeichen ankommen aber kein Cursor blinkt!
Ich wußte bisher auch nicht, dass so was geht.
Post by Stefan Koschke
Kannst Du mal ein paar Angaben machen was da sonst drumherum passiert?
Gerne:
Das Form, um das es geht, ist ein Suchfenster in einer DB-Applikation. Der
User gibt einen Begriff ein, und passende Datensätze werden gesucht.
Es gibt verschiedene Fenster zur DB-Steuerung, die alle gleich aufgebaut
sind: Auf einer Seite eines TPageControls gibt es ein DBGrid und auf einer
weiteren Seite einzelne DB-Controls, die einen einzelnen Datensatz zeigen.
Das Suchfenster steuert dann die Suche im aktiven Fenster.

Jetzt gerade beim Herumprobieren habe ich eine interessante Entdeckung
gemacht.
Wenn die Seite mit dem DBGrid aktiv ist, und ich das Suchfenster öffne,
kommt es zu dem beschriebenen Verhalten (Tastatureingabe im Suchfeld
möglich, aber kein Cursor), Wenn jedoch die Seite mit den Einzelcontrols
aktiv ist, funktioniert alles wie gewohnt, mit Cursor.

Der Aufruf des Suchfensters aus dem DB-Fenster heraus sieht folgendermaßen
aus:

DlgSuchen.SuchQuery:=Query1;
DlgSuchen.ShowModal;

Query1 enthält die Daten des jeweiligen DB-Fensters. Die wird der Property
SuchQuery des Suchfensters zugewiesen, damit dieses weiß, wo es suchen soll.
Das Interessante ist, dass wenn ich diese Zuweisung weglasse, sehe ich immer
den Cursor. Mit der Zuweisung sehe ich ihn nicht, wenn die Seite mit dem
DBGrid aktiv ist. Direkt nach dem Anzeigen des DlgSuchen wird aber mit der
SuchQuery noch gar nichts gemacht, erst, wenn man auf Suchen klickt.

Sehr seltsam...

Gruß
Burkhard
Hans-Peter Diettrich
2008-11-25 23:57:14 UTC
Permalink
Post by Burkhard Schneider
Jetzt gerade beim Herumprobieren habe ich eine interessante Entdeckung
gemacht.
Wenn die Seite mit dem DBGrid aktiv ist, und ich das Suchfenster öffne,
kommt es zu dem beschriebenen Verhalten (Tastatureingabe im Suchfeld
möglich, aber kein Cursor), Wenn jedoch die Seite mit den Einzelcontrols
aktiv ist, funktioniert alles wie gewohnt, mit Cursor.
Was passiert denn, wenn Du per Tastatur einen Teil (oder alles) im
Edit-Fenster markierst? Der Cursor (Caret) ist ja nur eine minimierte
Version einer (leeren) Auswahl. Ich habe daher den Verdacht, daß
irgendwo das Caret zerstört oder nicht richtig erzeugt wird, und daß
dies durch Umschalten in den Auswahl-Modus korrigiert werden könnte. Auf
jeden Fall dürfte so ein Experiment die Ursachenforschung weiterbringen.
Vor allem, wenn Du das seltsame Verhalten jetzt reproduzieren kannst.

DoDi
Burkhard Schneider
2008-11-26 09:49:13 UTC
Permalink
Post by Hans-Peter Diettrich
Was passiert denn, wenn Du per Tastatur einen Teil (oder alles) im
Edit-Fenster markierst?
Beim ersten Tastendruck ist der Cursor sofort sichtbar.

Noch eine Feststellung:
Wenn sich das DBGrid im Edit-Modus befindet, also dort der Cursor sichtbar
ist, ist er auch im SuchFenster sichtbar.

Ich habe ein kleines Testprogramm gemacht, um den Fehler einzukreisen, aber
es lässt sich dabei nicht eindeutig reproduzieren. Wenn ich einen Teil des
Codes auskomentiere, funktioniert es bisweilen beim ersten Mal ordnungsgemäß
und ich denke: OK, das wars. Beim nächsten Programmstart (ohne Änderung)
funktioniert es dann wieder nicht. Sehr seltsam.
Daher muss ich auch meine Aussage von gestern abend widerrufen:
An der Zuweisung
DlgSuchen.SuchQuery:=Query1;
liegt es nicht.

Bei dem DBGrid handelt es sich übrigens um eine eigene, von TJVDBGrid
abgeleitete Komponente. Darin finde ich aber auch nichts verdächtiges, bzw.
weiß nicht wonach ich suchen soll.

Da es sich eh um ein eher kosmetischen Problem handelt, werde ich da auch
momentan nicht so viel Zeit reinstecken, es sei denn, jemand hat noch eine
spontane Idee, wo ich suchen könnte oder wie man einen Würgaround basten
könnte.

Gruß
Burkhard Schneider
Burkhard Schneider
2008-11-26 10:36:18 UTC
Permalink
Post by Burkhard Schneider
Da es sich eh um ein eher kosmetischen Problem handelt, werde ich da auch
momentan nicht so viel Zeit reinstecken, es sei denn, jemand hat noch eine
spontane Idee, wo ich suchen könnte oder wie man einen Würgaround basten
könnte.
Ich habe jetzt einen Workaround:

ac:=ActiveControl;
PageControl1.SetFocus;
DlgSuchen.ShowModal;
ActiveControl:=ac;

Nicht schön, funktioniert aber.

Gruß
Burkhard Schneider
Nicole
2008-11-26 10:46:57 UTC
Permalink
Da es sich eh um ein eher kosmetischen Problem handelt, werde ich da auch momentan nicht so viel Zeit reinstecken, es sei denn, jemand hat noch eine spontane Idee, wo ich suchen könnte oder wie man einen Würgaround basten könnte.
Der Workaround geht bei mir nicht.
Ich habe dasselbe Problem, will aber ebenfalls keine Zeit hineinstecken.

Solltest Du je eine "gute" Loesung haben, bitte poste sie, wann auch immer.

Danke.



Nicole
Björn Schreiber
2008-11-26 11:14:52 UTC
Permalink
Post by Burkhard Schneider
Bei dem DBGrid handelt es sich übrigens um eine eigene, von TJVDBGrid
abgeleitete Komponente. Darin finde ich aber auch nichts verdächtiges, bzw.
weiß nicht wonach ich suchen soll.
Ich würde in den Quellen von deiner Ableitung und von TJvDBGrid mal
nach DestroyCaret suchen. Die Funktion kommt nämlich ohne Parameter aus
und "zerstört" die Eingabemarke des aktuellen Steuerelements im gleichen
Thread.
Ich könnte mir vorstellen, dass die Komponente diese API-Funktion
dazu verwendet, um die bei DB-Komponenten übliche Steuerung zu
ermöglichen - Anzeige der Eingabemarke trotz Fokus erst durch Drücken
von F2. Wenn dem so ist, so wird die Komponente vermutlich
fälschlicherweise die genannte Funktion genau dann aufrufen, wenn dein
Suchfeld bereits den Fokus und damit die Eingabemarke hat.

Grüße,
Björn
--
Björn Schreiber, DRIGUS GmbH
***@drigus.de
Bei Email NOSPAM in den Betreff aufnehmen.
Put NOSPAM in subject to reach me by email.
Burkhard Schneider
2008-11-26 12:11:35 UTC
Permalink
Ich würde in den Quellen von deiner Ableitung und von TJvDBGrid mal nach
DestroyCaret suchen.
Das habe ich schon gemacht, nichts gefunden.

Burkhard
Stefan Koschke
2008-11-26 13:20:36 UTC
Permalink
Hallo zusammen,

ist schon witzig, vorhin habe ich dieses Problem nicht nachstellen können
und schon habe ich es selber!

Bei mir gibt es ein Hauptformular mit einem TStringaligngrid.
Wird in diesem der MouseDown gefeuert dann wird ein weiteres Fenster, was
nur ein TEdit enthält, modal geöffnet.
Wenn dieses Fenster nun aufgeht habe ich auch keinen Cursor aber die
Tasteneingaben kommen an.
Allerdings ist nach der ersten Taste der Cursor im TEdit wieder sichtbar!

Wenn in diesem TEdit schon Text steht, werden neue Tasenanschläge hinten
angehängt, der unsichtbare Cursor steht also am Ende des Textes.

Was kann denn das nun sein???

Ciao
Stefan
Stefan Koschke
2008-11-26 13:34:23 UTC
Permalink
Post by Burkhard Schneider
Hallo zusammen,
ist schon witzig, vorhin habe ich dieses Problem nicht nachstellen können
und schon habe ich es selber!
Bei mir gibt es ein Hauptformular mit einem TStringaligngrid.
Wird in diesem der MouseDown gefeuert dann wird ein weiteres Fenster, was
nur ein TEdit enthält, modal geöffnet.
Wenn dieses Fenster nun aufgeht habe ich auch keinen Cursor aber die
Tasteneingaben kommen an.
Allerdings ist nach der ersten Taste der Cursor im TEdit wieder sichtbar!
Wenn in diesem TEdit schon Text steht, werden neue Tasenanschläge hinten
angehängt, der unsichtbare Cursor steht also am Ende des Textes.
Was kann denn das nun sein???
übrigens : wenn ich mit einem Mousedown auf das Hauptformular selbst oder
ein anderes Control statt dem TStringaligngrid reagiere, ist der Cursor im
TEdit sichtbar.
Nun setze ich den Focus auf ein anderes Control, dann
Application.Processmessages und dann erst Form2.Showmodal und der Cursor im
TEdit wird angezeigt!!! :-)

Ciao
Stefan
Burkhard Schneider
2008-11-26 14:00:00 UTC
Permalink
Post by Stefan Koschke
Nun setze ich den Focus auf ein anderes Control, dann
Application.Processmessages und dann erst Form2.Showmodal und der Cursor
im TEdit wird angezeigt!!! :-)
Genau! Das entspricht ja auch meinem Workaround.

Gruß
Burkhard

Burkhard Schneider
2008-11-26 13:53:50 UTC
Permalink
Post by Stefan Koschke
Wenn dieses Fenster nun aufgeht habe ich auch keinen Cursor aber die
Tasteneingaben kommen an.
Allerdings ist nach der ersten Taste der Cursor im TEdit wieder sichtbar!
Genauso ist es bei mir ja auch.

Gruß
Burkhard
Hans-Peter Diettrich
2008-11-26 11:07:01 UTC
Permalink
Post by Burkhard Schneider
Post by Hans-Peter Diettrich
Was passiert denn, wenn Du per Tastatur einen Teil (oder alles) im
Edit-Fenster markierst?
Beim ersten Tastendruck ist der Cursor sofort sichtbar.
Wenn sich das DBGrid im Edit-Modus befindet, also dort der Cursor sichtbar
ist, ist er auch im SuchFenster sichtbar.
Das erhärtet meinen Verdacht, daß das Caret irgendwo zerstört oder nicht
richtig erzeugt wurde. Das Caret existiert nur 1 mal pro Anwendung, da
können also viele Komponenten dran rumfummeln. Früher[tm] mußte das
Caret bei jedem WM_ACTIVATE neu erzeugt werden, aber ob das heute noch
so ist, kann ich nicht sagen.
Post by Burkhard Schneider
Bei dem DBGrid handelt es sich übrigens um eine eigene, von TJVDBGrid
abgeleitete Komponente. Darin finde ich aber auch nichts verdächtiges, bzw.
weiß nicht wonach ich suchen soll.
Hauptverdächtige sind CreateCaret() und DestroyCaret() (o.ä.),
allerdings meist in einer ganzen Aufrufkette versteckt. Breakpoints auf
diesen Funktionen dürften der schnellste Weg sein, um die Aufrufer zu
ermitteln. Ich vermute einen Fehler im TJVDBGrid, in Verbindung mit der
Umschaltung einer Zelle zwischen View- und Edit-Modus.

DoDi
Loading...