AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Warten bis Event OnKeyDown abgearbeitet ist

Ein Thema von concept2015 · begonnen am 5. Jan 2017 · letzter Beitrag vom 8. Jan 2017
Thema geschlossen
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 5. Jan 2017, 13:35
@Baumina
Ich vermute das:
Zitat:
Für dieses Programm habe ich eine optische Leseeinheit (Auswertung von Belegen in denen Zahlen markiert sind) eingebunden.
Hier werden jetzt mehrere Zahlen bereitgestellt.
steckt dahinter. Und da viele Benutzer/Chefs nicht in der Lage sind zu sagen was sie wollen/benötigen kommen dann solche Durchdiebrustinsaugekonstrukte heraus.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
 
concept2015

Registriert seit: 22. Dez 2015
Ort: Nähe Dortmund
44 Beiträge
 
Delphi 7 Professional
 
#2

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 5. Jan 2017, 15:17
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

Habt Ihr eine Idee ?
 
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 5. Jan 2017, 16:42
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?
 
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 5. Jan 2017, 17:00
Die letzte Zahl z.B 118,50 (das ist die einzige Zahl mit Dezimalstellen)
wird nicht richtig übernommen ! das Komma fehlt !

Eingetragen wird 11850
Wie sieht der Übertragungs-Source-Code aus?
gibt es da einen Filter der nur Ziffern durch lässt?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
 
concept2015

Registriert seit: 22. Dez 2015
Ort: Nähe Dortmund
44 Beiträge
 
Delphi 7 Professional
 
#5

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 6. Jan 2017, 06:42
Ja, es wird zeichenweise befüllt.
Ja, dass Komma ist in der Zahl.

Hier der Link, in dem hier schon etwas besprochen wurde.

http://www.delphipraxis.net/110482-a...nd-delphi.html

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.
 
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.375 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 6. Jan 2017, 07:15
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.
Peter
 
concept2015

Registriert seit: 22. Dez 2015
Ort: Nähe Dortmund
44 Beiträge
 
Delphi 7 Professional
 
#7

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 6. Jan 2017, 07:59
Ich kenne mich in Foren leider noch nicht so gut aus, was das Schreiben betrifft
Codeformatierung ? über Code einfügen ? sieht alles gleich aus
Ahh ... hat geklappt !

Umsetzung für Sonderzeichen ????
Hier ?

Code:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    // Tasteneingabe nur Numerisch
      if not (key in [#8,#13,#48..#57]) then key := #0;
end;

Geändert von concept2015 ( 6. Jan 2017 um 08:00 Uhr) Grund: Fehler erkannt
 
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 6. Jan 2017, 08:04
Zitat:
Ich kenne mich in Foren leider noch nicht so gut aus, was das Schreiben betrifft
Dann mache ich das mal für dich.
Und schon ist es lesbar

Delphi-Quellcode:
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
  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;

  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.
 
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.375 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 6. Jan 2017, 08:11
Umsetzung für Sonderzeichen ????
Hier ?
Code:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  // Tasteneingabe nur Numerisch
  if not (key in [#8,#13,#48..#57]) then key := #0;
end;
Nein, hier:

Inp.ki.wVk := Ord(UpCase(Str2[i])); Wenn du an dieser Stelle auf ein Komma triffst, wird der Ordinal-Wert (44) vom Komma übergeben. Du musst aber VK_SEPARATOR (108) übergeben.
Peter
 
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Warten bis Event OnKeyDown abgearbeitet ist

  Alt 6. Jan 2017, 07:17
Es wäre schön wenn du die Code Formatierung verwenden würdest.
Dein Beitrag ist leider nicht lesbar.

gruss

Geändert von TBx (24. Jul 2019 um 06:25 Uhr) Grund: Anhang auf Wunsch von EWeiss gelöscht
 
Thema geschlossen

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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