Browse Source

* fix empty string in readln when not at end of string
* fix alt-xyz in readkey

peter 22 years ago
parent
commit
6e14067b99
1 changed files with 54 additions and 24 deletions
  1. 54 24
      rtl/win32/crt.pp

+ 54 - 24
rtl/win32/crt.pp

@@ -356,16 +356,9 @@ begin
   CtrlKey := ((CtrlKeyState AND
             (RIGHT_CTRL_PRESSED OR LEFT_CTRL_PRESSED)) > 0);
   ShiftKey := ((CtrlKeyState AND SHIFT_PRESSED) > 0);
-  if AltKey then begin
-    Case KeyCode of
-      VK_NUMPAD0 ..
-      VK_NUMPAD9    : begin
-                       DoingNumChars := true;
-                       DoingNumCode := Byte((DoingNumCode * 10) + (KeyCode - VK_NUMPAD0));
-                      end;
-    end; { case }
-
 
+  if AltKey then
+   begin
     case ScanCode of
     // Digits, -, =
     $02..$0D: inc(ScanCode, $76);
@@ -412,6 +405,7 @@ var
   nevents,nread : dword;
   buf : TINPUTRECORD;
   AltKey: Boolean;
+  c : longint;
 begin
   KeyPressed := FALSE;
   if ScanCode <> #0 then
@@ -436,8 +430,8 @@ begin
                    begin
                       keypressed:=true;
 
-                      if (ord(buf.Event.KeyEvent.AsciiChar) = 0) or                         (buf.Event.KeyEvent.dwControlKeyState and
-                         (LEFT_ALT_PRESSED or ENHANCED_KEY) > 0) then
+                      if (ord(buf.Event.KeyEvent.AsciiChar) = 0) or
+                         (buf.Event.KeyEvent.dwControlKeyState and (LEFT_ALT_PRESSED or ENHANCED_KEY) > 0) then
                         begin
                            SpecialKey := TRUE;
                            ScanCode := Chr(RemapScanCode(Buf.Event.KeyEvent.wVirtualScanCode, Buf.Event.KeyEvent.dwControlKeyState,
@@ -445,21 +439,49 @@ begin
                         end
                       else
                         begin
-                           SpecialKey := FALSE;
-                           ScanCode := Chr(Ord(buf.Event.KeyEvent.AsciiChar));
+                           { Map shift-tab }
+                           if (buf.Event.KeyEvent.AsciiChar=#9) and
+                              (buf.Event.KeyEvent.dwControlKeyState and SHIFT_PRESSED > 0) then
+                            begin
+                              SpecialKey := TRUE;
+                              ScanCode := #15;
+                            end
+                           else
+                            begin
+                              SpecialKey := FALSE;
+                              ScanCode := Chr(Ord(buf.Event.KeyEvent.AsciiChar));
+                            end;
                         end;
 
-                      if Buf.Event.KeyEvent.wVirtualKeyCode in [VK_NUMPAD0..VK_NUMPAD9] then
-                        if AltKey then
-                          begin
-                             Keypressed := false;
-                             Specialkey := false;
-                             ScanCode := #0;
-                          end
-                        else break;
+                      if AltKey then
+                        begin
+                           case Buf.Event.KeyEvent.wVirtualScanCode of
+                             71 : c:=7;
+                             72 : c:=8;
+                             73 : c:=9;
+                             75 : c:=4;
+                             76 : c:=5;
+                             77 : c:=6;
+                             79 : c:=1;
+                             80 : c:=2;
+                             81 : c:=3;
+                             82 : c:=0;
+                           else
+                             break;
+                           end;
+                           DoingNumChars := true;
+                           DoingNumCode := Byte((DoingNumCode * 10) + c);
+                           Keypressed := false;
+                           Specialkey := false;
+                           ScanCode := #0;
+                        end
+                      else
+                        break;
                    end;
               end
-             else if (Buf.Event.KeyEvent.wVirtualKeyCode in [VK_MENU]) then
+             else
+              begin
+                if (Buf.Event.KeyEvent.wVirtualKeyCode in [VK_MENU]) then
                if DoingNumChars then
                  if DoingNumCode > 0 then
                    begin
@@ -470,6 +492,7 @@ begin
                       DoingNumCode := 0;
                       break
                    end; { if }
+              end;
           { if we got a key then we can exit }
           if keypressed then
             exit;
@@ -724,7 +747,10 @@ Begin
       #8 : BackSpace;
       ^Y,
       #27 : begin
-        f.bufpos:=f.bufend;
+        while f.bufpos<f.bufend do begin
+         WriteChar(f.bufptr^[f.bufpos]);
+         inc(f.bufpos);
+        end;
         while f.bufend>0 do
           BackSpace;
       end;
@@ -835,7 +861,11 @@ end. { unit Crt }
 
 {
   $Log$
-  Revision 1.18  2002-10-06 20:00:22  peter
+  Revision 1.19  2002-12-15 20:23:30  peter
+    * fix empty string in readln when not at end of string
+    * fix alt-xyz in readkey
+
+  Revision 1.18  2002/10/06 20:00:22  peter
     * Use Widechar in the Windows unit
 
   Revision 1.17  2002/09/07 16:01:28  peter