| Autor |
Beitrag |
svern
      
Beiträge: 20
|
Verfasst: Do 21.10.04 15:55
Hey,
wenn ich in meinem Editfeld 1 eine (korrekte) Eingabe mache, dann soll das Programm ein weiteres Formular öffnen und anschließend wieder in Editfeld 2 zurückkehren.
Macht das Programm.... so halbwegs jedenfalls.
Es öffnet das 2te Formular, und springt dann auch ins 2te Editfeld, aber ohne dieses zu Markieren (wie sonst auch mit Tab). Stattdessen ist der Cursor zwar drin, aber irgendwie checkt es das Programm nicht. Denn wenn ich dann ne Funktion unter Edit2.exit aufrufe macht es überhaupt nichts. Woran liegt das? Ist mit Sicherheit ein einfaches Problem...
Der Quelltext zu Edit1.exit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| ANZ_KN:=strtoint(Edit1.Text); if (ANZ_KN < 2) or (ANZ_KN > 10 ) then showmessage('Wert nicht erwartet!') else begin Form2.Show; Form2.FormShow(Sender); KN_ANZ_W := False; end; Form1.show; Edit2.Color:=clInactiveCaptionText; Edit1.Color:=clWindow; Form1.show; |
Hoffe auf eure Hilfe,
Svern
Moderiert von Christian S.: Delphi-Tags hinzugefügt.
|
|
Bruce
      
Beiträge: 80
|
Verfasst: Do 21.10.04 18:03
Hi Svern,
ich verstehe den ganzen Kontext jetzt natürlich nicht, in dem Du das ganze machst, aber Du änderst mit Deiner Anweisung die Hintergrund-Farbe des Edit2, und zwar in ein Himmelblau oder so ähnlich.
Du willst aber doch Edit2 markieren, als würdest Du einfach mit Tab reinspringen?!
Dann langt ein 'Edit2.SetFocus;'. Du mußt die Farben der beiden Edit-Felder nicht per Hand ändern und die Farbe alleine heißt nicht daß sich Dein Programm im gerade "farbigen" Edit befindet.
Und nur zum Verständnis: Warum rufst Du 'Form1.Show' am Ende noch mal auf?
Hoffe ich lieg hier halbwegs richtig...
Gruß, Bruce
|
|
svern 
      
Beiträge: 20
|
Verfasst: Do 21.10.04 18:14
Hey Bruce,
hatte das Form1.show mehrfach in der HOffnung, dass das Programm dadurch den markierten Cursor in das Editfeld packt.... was natürlich nicht wirklich geklappt hat.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| begin ANZ_KN:=strtoint(Edit1.Text); if (ANZ_KN < 2) or (ANZ_KN > 10 ) then showmessage('Wert nicht erwartet!') else begin Form2.Show; KN_ANZ_W := False; form2.bringtofront; form1.bringtofront; end; Edit2.Color:=clInactiveCaptionText; Edit1.Color:=clWindow; Form1.Edit2.setfocus; |
Die Farben sind nur zum deutlich machen des aktuellen Editfeldes gedacht, also nicht weiter wichtig.
Leider habe ich aber mit dem setfocus noch immer nicht die Markierung im Edit2-Feld.
Es ist, als ob Delphi nach der Anzeige (gibts da ALternativen als show?), nicht mehr wüsste, in welches Editfeld es zu gehen hat... trotz das expliziten setfocus.
Vielleicht geht es ja irgendwie anders, der Aufruf des 2ten Formulars (nur nach edit1 verlassen) und dann automatisch der Cursor in edit2...
|
|
Luzzifus
      
Beiträge: 200
Win2K
D6 Prof
|
Verfasst: Do 21.10.04 18:21
Hmm ist schon irgendwie merkwürdig was du da geschreibselt hast.
also an dieser stelle:
Delphi-Quelltext 1: 2:
| Form2.Show; Form2.FormShow(Sender); |
Dir ist schon klar, dass Form2.FormShow zweimal aufgerufen wird ja? Ausser natürlich du hast sie nicht als OnShow-Event der Form2 eingetragen. Und wenn du darin Dinge tust, die unbedingt NACH dem Anzeigen der Form2 getan werden müssen, würde ich die in ne eigene Prozedur schreiben anstatt FormShow zweimal aufzurufen.
und hier:
Delphi-Quelltext 1: 2: 3: 4:
| Form1.show; Edit2.Color:=clInactiveCaptionText; Edit1.Color:=clWindow; Form1.show; |
Mir ist völlig schleierhaft, was die beiden Form1.Show-Aufrufe sollen. Ich gehe mal davon aus, dass Form1 deine MainForm ist und somit eh angezeigt wird. Wenn du einfach neuzeichnen möchtest, mach das mit Repaint, aber auch das ist nicht notwendig.
Mein Tipp ist: Rufe die Form2 mit Form2.ShowModal auf, dann sollte er beim Beenden den Focus automatisch auf die Komponente setzen, die vorher aktiv war, in diesem Fall dein Edit-Feld. Falls doch nicht, machst du einfach zum Schluss noch ein Edit2.SetFocus, wie Bruce schon sagte.
** edit: Dein zweiter Post war doch eben noch nicht da.. x_X
| Zitat: | Es ist, als ob Delphi nach der Anzeige (gibts da ALternativen als show?), nicht mehr wüsste, in welches Editfeld es zu gehen hat... trotz das expliziten setfocus.
|
ShowModal als Alternative hält die Form1 quasi an, du kannst auf Form1 nicht mehr zugreifen, solange Form2 als Modal angezeigt wird. Da du mit Show arbeitest, wird die Prozedur weiter abgearbeitet und wartet nicht auf das Schließen von Form2. Ergo kommt das SetFocus zu früh und wird wahrscheinlich wieder woanders hingesetzt, wärend Form2 noch läuft. Deswegen empfehle ich ShowModal.
|
|
svern 
      
Beiträge: 20
|
Verfasst: Do 21.10.04 18:36
Hey Luzzifus,
showmodal war ne gute Idee, nur leider will ich das Fenster ja nicht schließen.
Das Formular2 soll einfach nur geöffnet und dann in den Hintergrund geschickt werden.
Kann ich das Setfocus denn vielleicht irgendwie "hinauszögern". So, dass es nach formular2.show; ausgeführt wird???
|
|
Bruce
      
Beiträge: 80
|
Verfasst: Do 21.10.04 18:41
Mensch, egal ob Du das Problem schon gelöst hast oder nicht, ich will jetzt wissen was Du da eigentlich machst
Der User gibt einen Wert in Edit1 auf Form1 an, dann wird der Wert geprüft und wenn er innerhalb der Toleranz liegt dann wird Form2 aufgerufen und direkt danach wieder Form1 und er soll in Edit2 springen (Form2 würde in dem Fall nur einmal kurz aufzucken, was passiert da eigentlich auf Form2?).
Wenn Du Form1.Show und dann Edit2.SetFocus aufrufst, dann ist der Focus auch auf Edit2. Sollte Edit2 keinen Inhalt haben, dann Siehst Du auch nicht den blauen Markierungsbalken, sondern nur den Cursor darin.
Und dann sollte auch EIne OnExit funktionieren, wenn Du Edit2 verläßt.

|
|
Luzzifus
      
Beiträge: 200
Win2K
D6 Prof
|
Verfasst: Do 21.10.04 18:42
| Zitat: | | Kann ich das Setfocus denn vielleicht irgendwie "hinauszögern". So, dass es nach formular2.show; ausgeführt wird??? |
Ja z.b. indem du das Edit2.SetFocus in den Eventhandler OnActivate der Form1 schreibst.
| Zitat: | | Sollte Edit2 keinen Inhalt haben, dann Siehst Du auch nicht den blauen Markierungsbalken, sondern nur den Cursor darin. |
man kann diesen "blauen Markierungsbalken" übrigens auch deaktivieren indem man die Eigenschaft AutoSelect auf false setzt. 
|
|
Bruce
      
Beiträge: 80
|
Verfasst: Do 21.10.04 18:48
Jo , kann man aber den will er doch, oder?
Oh man, mein Hirn schwillt an 
|
|
Luzzifus
      
Beiträge: 200
Win2K
D6 Prof
|
Verfasst: Do 21.10.04 18:50
er will den Focus, aber nicht die Markierung. Bzw. über die Markierungswünsche gibt's eigentlich gar keine Info.. naja war eh nur ne Bemerkung am Rande 
|
|
Bruce
      
Beiträge: 80
|
Verfasst: Do 21.10.04 19:01
| Zitat: | | Es öffnet das 2te Formular, und springt dann auch ins 2te Editfeld, aber ohne dieses zu Markieren (wie sonst auch mit Tab). |
Er will die Markierung, ich spür´s.
Na ja egal.
Das was ich verstanden habe würde ich so machen:
Delphi-Quelltext 1: 2: 3:
| Form2.Show; Form1.Show; Form1.Edit2.SetFocus; |
Ob Form2 dann im Hintergrund noch sichtbar sein muss oder nicht, hab ich ja noch nicht verstanden. Vielleicht wird ja ein Bild angezeigt oder so was, aber das ist ja ne ganz andere Sache. Entweder steh ich hier neben mir oder wir verkomplizieren ne ganz simple Sache 
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 21.10.04 19:22
Und wenn er eine Verzögerung haben möchte, kann er auch noch sleep benutzen
|
|
Luzzifus
      
Beiträge: 200
Win2K
D6 Prof
|
Verfasst: Fr 22.10.04 10:36
Und er könnte auch nochmal antworten, ob's denn nun funktioniert.. 
|
|
svern 
      
Beiträge: 20
|
Verfasst: Fr 22.10.04 17:09
loool, echt nett von euch, so ohne mich weiter zu spekulieren
Aber das Ding ist ja, Ihr habt Recht:
- Bruce, ich will es so machen wie du es geschrieben hast:
| Zitat: | Der User gibt einen Wert in Edit1 auf Form1 an, dann wird der Wert geprüft und wenn er innerhalb der Toleranz liegt dann wird Form2 aufgerufen und direkt danach wieder Form1 und er soll in Edit2 springen (Form2 würde in dem Fall nur einmal kurz aufzucken, was passiert da eigentlich auf Form2?).
|
--> Form 2 ist nur zu grafischen Ansicht da (soll ein Netzablaufplan werden...)
- Luzzifus, der Tipp mit dem OnActivate war auch recht nett, allerdings habe ich dann immer Edit2 als Standard, wenn er in das Form1 reinspring... ist also noch nicht optimal.
--> Die Markierung find ich übrigens ganz nett, will die also haben
- Bruce, das | Zitat: | Form2.Show;
Form1.Show;
Form1.Edit2.SetFocus;
|
hab ich nun schon mehrfach versucht, aber irgendwie will mein Prog das nicht machen (warum und weshalb, das weiss ich nicht)
Aber ihr seid prima Jungs, nur nicht aufgeben ... (...bitte  )
|
|
Luzzifus
      
Beiträge: 200
Win2K
D6 Prof
|
Verfasst: Fr 22.10.04 17:19
| Zitat: | | - Luzzifus, der Tipp mit dem OnActivate war auch recht nett, allerdings habe ich dann immer Edit2 |
Dann lass dir was einfallen!! ^^
Ich hab eben mit Sender bisserl rumprobiert, das ist aber in jedem Falle Form1.
Also könntest du es z.b. mit ner globalen Variable lösen die in Form2 bei OnShow auf true gesetzt wird.
dann könntest du in das OnActivate-Ereignis der Form1 folgendes schreiben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.FormActivate(Sender: TObject); begin if x then begin Edit2.SetFocus; x:=false; end; end; |
mit x als globale Boolean-Variable.
Ist zwar nicht sonderlich elegant gelöst, aber funktionieren sollte es. 
|
|
svern 
      
Beiträge: 20
|
Verfasst: Fr 22.10.04 22:12
Das schaut nach ner ganz geeigneten Lösung aus, werde das wohl so umsetzen.
Thx
|
|
|