Announcement

Collapse
No announcement yet.

Insert eingeschaltet?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Insert eingeschaltet?

    Hallo<p>

    wie kann ich feststellen, ob die "INSERT" - Taste eingeschaltet ist oder nicht. Sämtliche Versuche über GestAsyncKeyState oder GetKeystate waren erfolglos<p>
    Danke<p>
    Uwe

  • #2
    Hi

    Für die INSERT (Einfg) Taste gibt es KEINEN ein/ausgeschalteten Status wie bei SCROLL,NUM oder CAPS. Der INSERT-Mode, den Du meinst, hängt vom Editor ab, ist also Anwendungsabhängig. Der Delphi Editor wertet also jeden INSERT Tastenanschlag aus und "toggelt" intern den Einfügen/Überschreiben Modus.

    Gruß Hage

    Comment


    • #3
      Hallo Hagen<p><p>
      danke für die prompte Antwort.<p>
      Problem ist, wie kann ich den Tastenanschlag als Schalter "Einfügen"/"Überschr." auswerten? Versuche mit boolschen Variablen sind bisher gescheitert.<p>
      nochmals merci<p>
      Uw

      Comment


      • #4
        <html>

        <head>
        <meta http-equiv="Content-Type"
        content="text/html; charset=iso-8859-1">
        <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
        <title>Normale Seite ohne Titel</title>
        </head>

        <body bgcolor="#FFFFFF">

        <pre>Hallo Uwe,</pre>

        <pre>den Tastenstatus von Insert würde ich in einer booleschen Variable vermerken.
        Im KeyDown-Ereignis Deines Texteditors &quot;schaltest&quot; Du dann bei Bedarf den Insert-Status um.</pre>

        <pre><font color="#008080">var
        status_insert_key: boolean; </font></pre>

        <p>. . . </p>

        <pre><font color="#008080">procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
        Shift: TShiftState);
        begin
        case key of
        vk_insert: status_insert_key := status_insert_key xor true;
        end;
        end;</font></pre>
        </body>
        </html&gt

        Comment


        • #5
          Hi

          Nice mit dem "a xor true".

          es geht auch mit eindeutiger

          <pre>

          Status := not Status;

          </pre>

          Gruß Hagen

          PS: mit LongBool's bekommste mit xor Problem

          Comment


          • #6
            Hallo Hagen,

            ich gebe gerne zu, daß Deine Lösung ein klein wenig eindeutiger ist, dafür erzeugt meine Lösung (zufälliger Weise) weniger Maschinencode (1 Befehl im Vergleich zu 3 Befehlen bei Deiner Lösung).

            Wenn eine Longbool-Variable verwendet wird gibt es bei mir keine Probleme, allerdings erzeugt dann meine Variante 8 Befehle im Vergleich zu 7 Befehlen bei Deiner Variante.

            Aber bei den heutigen leistungsstarken Rechnern spielt das ja kaum noch eine Rolle.

            Tschüß

            Torste

            Comment


            • #7
              Hi Torsten

              Du hast recht, der Compiler geht wieder mal seltsamme Wege in seiner Optimierung, um genauer zu sein ist das eine "De-Optimierung".

              Normalerweiser erwartet man als ASM-Programmierer folgendes:

              <pre>

              var
              B: Boolean;
              LB: LongBool;

              asm
              XOR B,1 // B := not B -> 0 zu 1 zu 0

              NOT LB // LB := not LB -> 0 zu $FFFFFFFF zu 0
              oder
              XOR LB,-1
              end;

              </pre>

              aber das was der Compiler generiert ist für mich absolut unverständlich:

              <pre>

              für LongBool := not LongBool

              asm
              MOV EAX,LongBoolVar
              CMP EAX,1 // vergleiche EAX mit 1, bei LongBools ???
              SBB EAX,EAX // subtr. EAX von EAX + CARRY falls EAX = 1
              NEG EAX // nun negiere EAX vorzeichenbehaftet
              NEG AL // negiere AL nochmals
              SBB EAX,EAX // Subtr. EAX von EAX + CARRY, CARRY := EAX and $8000000 <> 0
              MOV LongBoolVar,EAX
              end;

              </pre>

              Ähnlich sieht es mit Booleans aus, da ist ja ein TypCast besser:

              <pre>
              Integer(LB) := not Integer(LB);
              Byte(B) := Byte(B) xor 1;
              </pre>

              generiert dann doch:

              <pre>
              asm
              NOT LB
              und
              XOR B,1
              end;
              </pre>

              Gruß Hage

              Comment


              • #8
                Hallo Hagen,

                da kann ich Dir nur zustimmen!

                Tschüß

                Torste

                Comment


                • #9
                  Hallo Ihr Beiden,<p><p>
                  habe mit Eure Ratschläge zu Herzen genommen - und siehe da, es geht.<p>
                  Das Einzige, was ich ändern musste - die Key_Status-Variable habe ich unter TForm gesetzt.<p><p>
                  Danke nochmals<p><p>
                  Uw

                  Comment

                  Working...
                  X