Autor Beitrag
delphijanka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151

WinXP
D 2009 Arc., Java, C
BeitragVerfasst: Do 22.10.09 15:35 
Hallo.

Bin an ein Problem gestossen, was ich net lösen kann bzw gar nicht verstehe, wo was falsch ist.

Zuerst deklariere ich eigene TXEdit-Klasse, abgeleitet von TEdit.

Diese besitzt überschriebene KeyPress: procedure KeyPress(var Key: Char); override;
In dieser fange ich für mich unbrauchbare Zeichen ab.

Dann erzeuge ich mehrere XEdit's dynamisch.
KeyPress funktioniert einwandfrei.

Drücke ich auf TAB-Taste, springt Cursor zum nächsten XEdit.

Nun möchte ich, dass auf die Enter-Taste dasselbe geschieht.

Beide Varianten:

SelectNext(Self, true, true) und
SendMessage(Self.Handle, WM_NEXTDLGCTL, 0, 0);

bringen mich nicht zu der gewünschten Funktionalität. Der Cursor bleibt im selben XEdit stehen, und es erfolgt ein Beep. Warum?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 22.10.2009 um 16:32
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Do 22.10.09 15:44 
Sende doch einfach ein Keydown von Tab an dein Fenster.
delphijanka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151

WinXP
D 2009 Arc., Java, C
BeitragVerfasst: Do 22.10.09 15:58 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Sende doch einfach ein Keydown von Tab an dein Fenster.

das habe ich auch ausprobiert. Es geht nicht. Ich habe außerdem versucht, Tabs abzufagen und zu sperren, was aber nicht geht.

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Do 22.10.09 15:59 
Versuch mal FindNextControl

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
delphijanka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151

WinXP
D 2009 Arc., Java, C
BeitragVerfasst: Do 22.10.09 16:04 
user profile iconHelgeLange hat folgendes geschrieben Zum zitierten Posting springen:
Versuch mal FindNextControl

Ok, wir kommen der Sache näher. Die Prozedur gibt mir nil. Komisch, warum denn? Bei der Erzeugung der Edits weise ich jedem den gleichen übergeordneten Parent zu.

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Do 22.10.09 16:26 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure Edit1OnKeyDown.....
begin
PostMessage((sender as TEdit).Handle, WM_KEYDOWN, vk_Tab, 0);
end;

Funktioniert :nixweiss:
delphijanka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151

WinXP
D 2009 Arc., Java, C
BeitragVerfasst: Do 22.10.09 16:35 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
PostMessage((sender as TEdit).Handle, WM_KEYDOWN, vk_Tab, 0);					
Funktioniert :nixweiss:

In der Tat. Danke. Doch der gibt ein Beep aus. Kann man diesen abschalten?

Btw, warum funktioniert denn ein "normaler" Weg nicht? Ein Bug in Delphi, oder programmiertechnisch was falsch bei mir?


PS (gelöst): Die Zeile "Abort" nach dem PostMessage verhindert ne Beep-Ausgabe.

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 22.10.09 16:57 
Alternativ Lösung:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  if (Key = #13then // #13 = return
  begin
    Key := #0;  // Avoids "beep"
    PostMessage(Parent.Handle, WM_NextDlgCtl, 00);  // Focus next control
  end;

Grüße,
Marc
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Do 22.10.09 18:09 
user profile icondelphijanka hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconHelgeLange hat folgendes geschrieben Zum zitierten Posting springen:
Versuch mal FindNextControl

Ok, wir kommen der Sache näher. Die Prozedur gibt mir nil. Komisch, warum denn? Bei der Erzeugung der Edits weise ich jedem den gleichen übergeordneten Parent zu.

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.


Hast Du denn das FindNextControl vom Form aufgerufen ? Also dem Owner deines Edits ? Der hat ja die Liste der TabStops. Und auch sonst alle parameter übergeben ? Delphi selbst arbeitet damit und es funktioniert, wäre seltsam, wenn es buggy ist :p

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw