![]() |
Delphi-Version: 7
Warten bis Event OnKeyDown abgearbeitet ist
Problem gelöst !!!
Ich habe in meiner Routine den Focus auf Edit26 gesetzt ! Das war der Fehler Der Focus geht automatisch weiter.:shock: :oops: ************************************************** ************** Hallo Spezialisten, ich habe ein Problem, welches ich auch nach längerem suchen nicht gelöst bekomme. (kann sein, dass ich auch nicht nach dem richtigen Begiff gesucht habe) Ursprünglich habe ich meine Programme mit Visual Dbase programmiert. Seit dem Tod des Mitarbeiters, in der Firma meines Freundes, der die Programme in dieser Firma entwickelt hat, beschäftige ich mich mit Delphi (freiwillig und kostenlos) Jetzt zu meinem Problem: In dem bestehenden Programm werden Zahlen von Hand, in mehrere Edit Felder eingetragen und ausgewertet. Für dieses Programm habe ich eine optische Leseeinheit (Auswertung von Belegen in denen Zahlen markiert sind) eingebunden. Hier werden jetzt mehrere Zahlen bereitgestellt. Mein Problem ist: an Edit1 (bestehendes Prog.) wird eine Zahl gesendet und mit Keybd_Event(VK_RETURN,0,0,0); Keybd_Event(VK_RETURN,0,KEYEVENTF_KEYUP,0); übergeben. Jetzt wird das Event TForm1.Edit1KeyDown ausgelöst und eine Folge abgearbeitet. In meiner Prozedur muss jetzt gewaret werden bis das Event TForm1.Edit1KeyDown abgearbeitet ist bevor ich in das nächste Feld(Edti26) die nächste Zahl eintragen kann. Das bekomme ich nicht hin :cry: Kurzfassung: Mehrere Editfelder werden automatisch ausgefüllt. Ich sende (aus meiner Procedure) Zahl 1 an Edit1 in der gleichen Form. Bevor ich Zahl2 an Edit26 sende, muss das Event von Edit1 fertig sein. Bitte dringend um HILFE :roll: |
AW: Warten bis Event OnKeyDown abgearbeitet ist
Mir ist jetzt nicht ganz klar geworden, ob das alles im selben Programm stattfindet, oder ob das Programm mit den Edits von einem externen Programm gesteuert/gefüllt wird?
|
AW: Warten bis Event OnKeyDown abgearbeitet ist
Tut mir leid ... habe es hinbekommen.
Alles in einem Programm (6000 Zeilen) :cry: |
AW: Warten bis Event OnKeyDown abgearbeitet ist
Wenn alles innerhalb des Delphiprogramms läuft, würde ich statt irgendwelche Tasten auszulösen (z.B. VK_RETURN) lieber die Edits direkt füllen (Edit1.Text := 'blabla').
|
AW: Warten bis Event OnKeyDown abgearbeitet ist
@Baumina
Ich vermute das: Zitat:
Gruß K-H |
AW: Warten bis Event OnKeyDown abgearbeitet ist
Hallo,
meine Routine hat 6 Zahlen gelesen und soll sie nun in dem Hauptprogramm in die vorhandenen Felder eintragen. Es geht darum, ca 300 Belege werden täglich eingegeben (von Hand) Um diese Arbeit zu vereinfachen, werde ich die Belege umstellen. Es werden keine Zahlen auf den Beleg geschrieben sondern Zahlen markiert. Diese Markierungen werden von einem anderen Programm gelesen und in die entsprechenden Zahlen umgewandelt. Klappt alles ! Jetzt sollen diese Zahlen im eigentlichen Programm per Button übertragen werden ... Klappt auch alles ... bis auf einen Fehler, der sich erst jetzt herausgestellt hat. Die letzte Zahl z.B 118,50 (das ist die einzige Zahl mit Dezimalstellen) wird nicht richtig übernommen ! das Komma fehlt ! Eingetragen wird 11850 Zum übertragen nutze ich die PostKeyExHWND Prozedur die hier im Forum schon mehrfach besprochen wurde. Alles klappt wunderbar ! nur dieses Komma oder Punkt wird in der Procedure gelöscht oder übergangen :cry: Habt Ihr eine Idee ? |
AW: Warten bis Event OnKeyDown abgearbeitet ist
Wenn ich das recht sehe, werden die Edits doch zeichenweise befüllt.
Die Frage, die sich für mich stellt ist nun: Wird das Komma vom Leseeinheit denn geliefert? |
AW: Warten bis Event OnKeyDown abgearbeitet ist
Zitat:
gibt es da einen Filter der nur Ziffern durch lässt? Gruß K-H |
AW: Warten bis Event OnKeyDown abgearbeitet ist
Ja, es wird zeichenweise befüllt.
Ja, dass Komma ist in der Zahl. Hier der Link, in dem hier schon etwas besprochen wurde. ![]() Wie gesagt, alles klappt wunderbar, bis auf das Komma. Da blicke ich nicht durch. Der Str5:string sieht z.B. so aus 118,65 Im Editfeld wird aber das eingetragen 11865 Von Hand kann die Zahl aber selbstverständlich mit , eingegeben werden. Es liegt eindeutig an der Routine. Hab ein kleines Prog. geschrieben, nur mit dieser Routine und einem Editfeld ... kein Komma. ************************************** Testcode unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Timer1: TTimer; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState; specialkey: Boolean); type TBuffers = array [0..1] of TKeyboardState; var pKeyBuffers: ^TBuffers; lParam: LongInt; begin (* check if the target window exists *) if IsWindow(hWindow) then begin (* set local variables to default values *) pKeyBuffers := nil; lParam := MakeLong(0, MapVirtualKey(key, 0)); (* modify lparam if special key requested *) if specialkey then lParam := lParam or $1000000; (* allocate space for the key state buffers *) New(pKeyBuffers); try (* Fill buffer 1 with current state so we can later restore it. Null out buffer 0 to get a "no key pressed" state. *) GetKeyboardState(pKeyBuffers^[1]); FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0); (* set the requested modifier keys to "down" state in the buffer*) if ssShift in shift then pKeyBuffers^[0][VK_SHIFT] := $80; if ssAlt in shift then begin (* Alt needs special treatment since a bit in lparam needs also be set *) pKeyBuffers^[0][VK_MENU] := $80; lParam := lParam or $20000000; end; if ssCtrl in shift then pKeyBuffers^[0][VK_CONTROL] := $80; if ssLeft in shift then pKeyBuffers^[0][VK_LBUTTON] := $80; if ssRight in shift then pKeyBuffers^[0][VK_RBUTTON] := $80; if ssMiddle in shift then pKeyBuffers^[0][VK_MBUTTON] := $80; (* make out new key state array the active key state map *) SetKeyboardState(pKeyBuffers^[0]); (* post the key messages *) if ssAlt in Shift then begin PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam); PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000); end else begin PostMessage(hWindow, WM_KEYDOWN, key, lParam); PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000); end; (* process the messages *) Application.ProcessMessages; (* restore the old key state map *) SetKeyboardState(pKeyBuffers^[1]); finally (* free the memory for the key state buffers *) if pKeyBuffers <> nil then Dispose(pKeyBuffers); end; { If } end; end; { PostKeyEx } procedure TForm1.Button1Click(Sender: TObject); const Str1: string = '2340'; Str2: string = '118,65'; var Inp: TInput; I: Integer; begin //*************************************** 1 Edit1.SetFocus; for I := 1 to Length(Str1) do begin // press Inp.Itype := INPUT_KEYBOARD; Inp.ki.wVk := Ord(UpCase(Str1[i])); Inp.ki.dwFlags := 0; SendInput(1, Inp, SizeOf(Inp)); // release Inp.Itype := INPUT_KEYBOARD; Inp.ki.wVk := Ord(UpCase(Str1[i])); Inp.ki.dwFlags := KEYEVENTF_KEYUP; SendInput(1, Inp, SizeOf(Inp)); Application.ProcessMessages; Sleep(120); end; //*************************************** 2 Edit2.SetFocus; for I := 1 to Length(Str2) do begin // press Inp.Itype := INPUT_KEYBOARD; Inp.ki.wVk := Ord(UpCase(Str2[i])); Inp.ki.dwFlags := 0; SendInput(1, Inp, SizeOf(Inp)); // release Inp.Itype := INPUT_KEYBOARD; Inp.ki.wVk := Ord(UpCase(Str2[i])); Inp.ki.dwFlags := KEYEVENTF_KEYUP; SendInput(1, Inp, SizeOf(Inp)); Application.ProcessMessages; Sleep(120); end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin // Bei Taste + befehl ausführen if GetAsyncKeyState(VK_ADD) < 0 then Button1Click(Button1); end; end. ************************************** Danke für euer Interesse. |
AW: Warten bis Event OnKeyDown abgearbeitet ist
Der Ordinal-Wert von "," ist nicht gleich dem virtuellen Tasten-Code.
Das betrifft nicht nur Sonderzeichen, sondern zum Beispiel auch Buchstaben. Die Ordinal-Werte für "A" und "a" sind unterschiedlich. der virtuelle Tasten-Code aber gleich. Da musst du dir eine Umsetzung für Sonderzeichen basteln. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz