Autor Beitrag
chall_de
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

WIN 2000, WIN XP

BeitragVerfasst: Mo 07.02.05 13:34 
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:

ausblenden Quelltext
1:
2:
Edit1.SetFocus;
Edit1.SelectAll;


Das funktioniert aber nicht! Es funktioniert nur, wenn ich zwischenzeitlich ein anderes Steuerelement fokussiere, wie z.B.:

ausblenden Quelltext
1:
2:
3:
Listbox1.SetFocus;
Edit1.SetFocus;
Edit1.SelectAll;


Warum ist das so ?


Gruß,

chall_de
matze.de
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: 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:
ausblenden 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

_________________
si tacuisses, philosophus mansisses.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
2:
Form1.SetFocus;
Edit1.SetFocus;

Sollte das Fenster nicht mehr aktiv sein dann genügt ein aufruf von.
ausblenden Delphi-Quelltext
1:
Form1.BringToFront;					


Das anschließende SelectAll kannst du dir sparen, da das Edit das automatisch macht sobald du es selektierst.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
chall_de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

WIN 2000, WIN XP

BeitragVerfasst: 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
ausblenden Quelltext
1:
Edit1.Setfocus;					


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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?

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
chall_de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

WIN 2000, WIN XP

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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?

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
chall_de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

WIN 2000, WIN XP

BeitragVerfasst: Di 08.02.05 13:10 
Hallo Lossy eX,

anbei der Code:

ausblenden 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);
  // Warum ist mir unverständlich !!!
  Listbox1.SetFocus;
  Edit1.SetFocus;
  Edit1.SelectAll;
end;
...



Gruß,

call_de
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 08.02.05 21:13 
Da muss ich ehrlich auch passen. Sorry.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.