Autor Beitrag
SpaghettiCodix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: 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:
ausblenden volle Höhe 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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 26.10.07 22:11 
user profile iconSpaghettiCodix hat folgendes geschrieben:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Fr 26.10.07 23:00 
user profile iconJayEff 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Sa 27.10.07 00:06 
user profile iconJayEff hat folgendes geschrieben:

...b) Weise den Edits bereits zur Entwicklungszeit im Objekt Inspektor unter "Ereignisse" die neue Methode zu.

user profile iconSpaghettiCodix 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 27.10.07 15:24 
user profile iconSpaghettiCodix 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 ... :
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Mi 31.10.07 00:11 
user profile iconJayEff hat folgendes geschrieben:
user profile iconSpaghettiCodix 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 ... :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Edit1.onKeyDown:=EditKeyDownEvent;
end;
...
...
end;

...überflüssig und werden kein einziges mal wieder aufgerufen.... ;)


Danke JayEff. Aber Schade, daß das nicht so funzt. Sieht nämlich als Quellcode viel besser aus, als wenn ich bei jedem einzelnen Editfeld so viel code reinschreiben muß.
Es wird immer unübersichtlicher, wie immer. Daher auch mein Nickname, *hust*.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 31.10.07 01:07 
user profile iconSpaghettiCodix 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.
ausblenden 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); //meine Prozedur, siehe Bild
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Mi 31.10.07 15:03 
user profile iconJayEff 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.