Autor |
Beitrag |
SpaghettiCodix
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Fr 26.10.07 22:02
Habe auf der Form 3 TEdits die bei einem VK_Return den Focus per 'SetFocus' an das nächste Editfeld weitergeben.
Beim ersten Durchgang muß ich aber zweimal die Entertaste drücken, damit der Focus ans nächste Edit geht. Kann sich das jemand erklären?
Im Formular habe ich Edit1 als ActiveControl gesetzt, so daß der Cursor schon im Edit1 ist.
hier mal ein Ausschnitt: 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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| procedure TForm1.EditKeyDownEvent(Sender:TObject; var Key: Word; Shift: TShiftState); begin if (Sender is TEdit)and(Key=VK_Return) then begin LblColorSwap; Label9.Top:=TEdit(Sender).Top; if (Sender =Edit1) then Try Label9.Caption:= '<- Focus'; TagArray[LblTmp-1].abwBegin:=Timetostr(strtotime(Edit1.Text)); Edit2.SetFocus; except Edit1.SetFocus; end; if (Sender =Edit2) then Try Label9.Caption:= '<- Focus'; TagArray[LblTmp-1].abwEnde:=Timetostr(strtotime(Edit2.Text)); Tagarray[LblTmp-1].abwZeit:= Inttostr(MinutesBetween(strtoTime(TagArray[LblTmp-1].abwBegin),strtoTime(TagArray[LblTmp-1].abwEnde))); Edit3.Text:= TagArray[LblTmp-1].abwZeit; Edit3.SetFocus; except Edit2.SetFocus; end; if (Sender =Edit3) then begin Label9.Caption:= '<- Focus'; Edit3.Text:= TagArray[LblTmp-1].abwZeit; end; Label1.Caption:= inttostr(TagArray[LblTmp-1].TNum); Label2.caption:='TagArray.Anw: '+ TagArray[LblTmp-1].Anw; Label3.Caption:='TagArray.abwBegin: '+ TagArray[LblTmp-1].abwBegin; Label4.Caption:='TagArray.abwEnde: '+ TagArray[LblTmp-1].abwEnde; Label5.Caption:='TagArray.TgName: '+ TagArray[LblTmp-1].TgName; end; end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit1.onKeyDown:=EditKeyDownEvent; end;
procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit2.onKeyDown:=EditKeyDownEvent; end;
procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit3.onKeyDown:=EditKeyDownEvent; end; |
Was könnte das Problem sein?
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 26.10.07 22:11
SpaghettiCodix hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit1.onKeyDown:=EditKeyDownEvent; end;
procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit2.onKeyDown:=EditKeyDownEvent; end;
procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit3.onKeyDown:=EditKeyDownEvent; end; |
Was könnte das Problem sein? |
Mein Tipp: Daran.
Beim ersten mal "Enter" wird dem Edit lediglich die neue onKeyDown Methode zugewiesen, erst nach der Zuweisung, beim zweiten mal Enter, wird sie auch ausgeführt.
Lösungsvorschläge:
a) WENN du schon 3 getrennte Events für die Edits hast, dann rufe gleich die neue Methode auf, anstatt sie erst zu zuweisen. Diese Zuweisung ist dann natürlich hinfällig.
b) Weise den Edits bereits zur Entwicklungszeit im Objekt Inspektor unter "Ereignisse" die neue Methode zu.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
SpaghettiCodix 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Fr 26.10.07 23:00
JayEff hat folgendes geschrieben: |
....Beim ersten mal "Enter" wird dem Edit lediglich die neue onKeyDown Methode zugewiesen, erst nach der Zuweisung, beim zweiten mal Enter, wird sie auch ausgeführt.
|
Das klingt erstmal einleuchtend. Nur, wenn ich alle Edits mit Enter durch bin, und ich von vorne anfange ->Edit1 ->Return->Edit2->Return... dann muß ich nur noch einmal pro Edit entern...?!!? Das mit den zwei klicks pro Editfeld ist nur beim ersten Durchgang
Das bedeutet also, daß nach dem ersten Durchlauf der Edits, diese die zugewiesene Methode behalten bis zum Schließen der Anwendung.
Zitat: |
Lösungsvorschläge:
a) WENN du schon 3 getrennte Events für die Edits hast, dann rufe gleich die neue Methode auf, anstatt sie erst zu zuweisen. Diese Zuweisung ist dann natürlich hinfällig.
b) Weise den Edits bereits zur Entwicklungszeit im Objekt Inspektor unter "Ereignisse" die neue Methode zu |
Werde ich mal probieren. bin mal gespannt, ob es dann gleich funzt. Danke erstmal, JayEff:-)
|
|
SpaghettiCodix 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Sa 27.10.07 00:06
JayEff hat folgendes geschrieben: |
...b) Weise den Edits bereits zur Entwicklungszeit im Objekt Inspektor unter "Ereignisse" die neue Methode zu. |
SpaghettiCodix hat folgendes geschrieben: |
Werde ich mal probieren. bin mal gespannt, ob es dann gleich funzt. Danke erstmal, JayEff:-) |
Es funktioniert jetzt. Habe die Methoden in die jeweilige 'OnKeyDown' Ereignisprozedur in der Entwicklungszeit geschrieben. Jetzt reicht ein Return pro Editfeld aus.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Sa 27.10.07 15:24
SpaghettiCodix hat folgendes geschrieben: | Nur, wenn ich alle Edits mit Enter durch bin, und ich von vorne anfange ->Edit1 ->Return->Edit2->Return... dann muß ich nur noch einmal pro Edit entern...? |
Selbstverständlich musst du dann nur noch einmal, denn sobald der Handler auf die neue Methode gesetzt wurde, sind diese Zeilen hier ... : Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit1.onKeyDown:=EditKeyDownEvent; end;
procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit2.onKeyDown:=EditKeyDownEvent; end;
procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Edit3.onKeyDown:=EditKeyDownEvent; end; |
...überflüssig und werden kein einziges mal wieder aufgerufen. Stell dir das so vor:
Bei KeyDown wird Prozedur1 aufgerufen. Diese Prozedur sagt: "Für alle weiteren KeyDowns bitte Prozedur2 aufrufen, nicht mehr Prozedur1!" Und schon ergibt sich der Grund, warum es klappt, sobald alle Edits die richtige Prozedur aufrufen und nicht mehr die Prozedur, die dafür sorgt, dass nächstes mal die richtige aufgerufen wird 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
SpaghettiCodix 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Mi 31.10.07 00:11
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 31.10.07 01:07
SpaghettiCodix hat folgendes geschrieben: | Habe die Methoden in die jeweilige 'OnKeyDown' Ereignisprozedur in der Entwicklungszeit geschrieben. Jetzt reicht ein Return pro Editfeld aus. |
So meinte ich das nicht.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TForm1 = class(TForm) Edit1: TEdit; procedure EditOnKeyDownEvent(Sender: TObject; var Key: Word; Shift: TShiftState); private public end; |
Sieh dir mal den Anhang an, dann weißt du, wie ich das gemeint habe  Dann musst du auch nicht für jedes Editfeld den Code reinkopieren.
Einloggen, um Attachments anzusehen!
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
SpaghettiCodix 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Mi 31.10.07 15:03
JayEff hat folgendes geschrieben: | ...Sieh dir mal den Anhang an, dann weißt du, wie ich das gemeint habe Dann musst du auch nicht für jedes Editfeld den Code reinkopieren. |
Ups. Danke JayEff  Jetzt hab ichs verstanden. Das ist ja super. Ich kann den Edits in Keydown nun ganz einfach per Klick die Procedure zuweisen. Da wäre ich nicht drauf gekommen.
|
|