Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Steuerelement-Fokus
chall_de - Mo 07.02.05 13:34
Titel: Steuerelement-Fokus
Hallo,
als absoluter Delphineuling habe ich folgendes Problem bzw. Phänomen, das ich nicht verstehe:
Ich habe ein Editierfeld (Edit1) in das ein Integer-Zahle eingegeben werden soll. Nach der Eingabe prüfe ich ob es sich um eine Integer-Zahl handelt. Wenn nicht, wird eine MessageBox mit einem Fehlerhinweis ausgegeben. Anschließend möchte ich den eingegeben Text in Edit1 markieren. Da Edit1 nach der Messagebox nicht mehr den Fokus hat, habe ich folgende
Anweisungen eingefügt:
Quelltext
1: 2:
| Edit1.SetFocus; Edit1.SelectAll; |
Das funktioniert aber nicht! Es funktioniert nur, wenn ich zwischenzeitlich ein anderes Steuerelement fokussiere, wie z.B.:
Quelltext
1: 2: 3:
| Listbox1.SetFocus; Edit1.SetFocus; Edit1.SelectAll; |
Warum ist das so ?
Gruß,
chall_de
matze.de - Mo 07.02.05 13:48
Hi, und :welcome: im DF.
das kommt daher, wenn ein TEdit den focus von einer anderen kompo bekommt markiert er automatisch den ganzen text. bei dir müsstest du das so machen:
Delphi-Quelltext
1: 2: 3: 4:
| Edit1.SetFocus; Edit1.SelStart := 0; Edit1.SelLength := Length(Edit1.Text); Edit1.SelectAll; |
Als erstes setzt du den fokus dann setzt du SelStart und SelLength und mit SelectAll selektierst du.
//Edit: Es kann auch sein, nein ich glaube sogar, dass ich grade viel *mist*e gesagt hab ;D
mfg matze
Lossy eX - Mo 07.02.05 14:04
@Matze: Nicht ganz.
SelectAll selektiert alles. Dabei wird das vorher selektierte überselektiert. ;-)
SelectStart setzt den Cursor an die entsprechende Stelle im Edit.
SelectEnd selektiert X zeichen. Angefangen wird bei
SelectStart
chall_de. Ich denke mal, dass dein Feld vermeindlich noch selektiert ist. War das Fenster zu dem Zeitpunkt aktiviert? Wenn ja, dann solltest du einmal den Fokus expliziert auf etwas anderes setzen und dann wieder zurück auf das Edit.
Delphi-Quelltext
1: 2:
| Form1.SetFocus; Edit1.SetFocus; |
Sollte das Fenster nicht mehr aktiv sein dann genügt ein aufruf von.
Das anschließende
SelectAll kannst du dir sparen, da das Edit das automatisch macht sobald du es selektierst.
chall_de - Mo 07.02.05 14:51
Hallo,
@Matze:
Die Verwendung von SelStart und SelLength bringt das gleiche Ergebnis. Wenn ich nicht zuerst den Fokus auf eine andere Komponente setze, wird gar nichts markiert !!!
@Lossy eX
Wenn ich direkt nach der Messagebox abfrage ob Edit1 den Fokus hat (Edit1.focused), dann erhalte ich ein False, nach dem Befehl
erhalte ich bei der Abfrage wieder ein False. Edit1 erhält erst wieder den Fokus, wenn ich zwischendurch eine andere Komponente fokussiert habe !
Warum ist mir absolut unverständlich!
Gruß,
chall_de
Lossy eX - Mo 07.02.05 15:04
Deswegen meinte ich ja auch, dass du vor Edit1.SetFocus einmal Form1.SetFocus aufrufen sollst. So wird erst noch einmal expliziet eine andere Komponente fokusiert. Hattest du das mal probiert?
chall_de - Mo 07.02.05 15:39
Hallo,
mit Form1.SetFocus vorher funktioniert es nicht, wohl aber mit Listbox1.SetFocus oder Button1.SetFocus! Das ist es, was ich nicht verstehe !
Gruß,
chall_de
Lossy eX - Mo 07.02.05 16:05
Das wundert mich allerdings auch ein bisschen. Das habe ich nämlich schon 1-2 Mal verwendet. Also wenn mich meine restlichen Gehirnzellen nicht vollkommen verlassen haben. Aber okay. Wäre ja keine SoftwareEntwicklung wenn es nicht mehrere Lösungen dafür geben würde.
Wenn du ein Panel auf deinem Formular hast dann kannst du Panel1.SetFocus machen. Dadurch, dass das normal keinen Focus darstellt ist natürlich auch keiner zu sehen.
Die andere alternative wäre Windows.SetFocus(0). Damit kannst du den aktuellen Fokus löschen. Das sollte in etwas genau so gut gehen wie woanders hinsetzen.
Und zu guter letzt halt wieder den Fokus auf dein Eingabefeld setzen. Allerdings verstehe ich nicht warum der da überhaupt verschwindet. Kannst du bitte mal den Code posten wo du das prüfst ob es sich um eine sinnvolle Zahl handelt?
chall_de - Di 08.02.05 13:10
Hallo Lossy eX,
anbei der Code:
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:
| function isInteger(value : String): Boolean; } begin try StrToInt(value); result := true; except result := false; end; end;
... if IsInteger(Edit1.Text) then begin ... Edit1.Text:=''; end else begin Application.MessageBox ('Keine Integer-Zahl!','Fehler',16); Listbox1.SetFocus; Edit1.SetFocus; Edit1.SelectAll; end; ... |
Gruß,
call_de
Lossy eX - Di 08.02.05 21:13
Da muss ich ehrlich auch passen. Sorry.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!