Announcement

Collapse
No announcement yet.

GetKeyState, Delphi-Bug ?

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

  • GetKeyState, Delphi-Bug ?

    Hallo,

    ich habe neulich ein kurioses Verhalten eines meiner eigenen Tool's gehabt. Die unten aufgezeigt Procedure durchsucht alle Dateien, die in
    ListboxDateien aufgeführt sind mittels der Procedure SucheTextInDateien. Da dies unter Umständen länger dauert, habe ich nach jeder
    hundersten Datei eine Abfrage auf ESC eingebaut, über GetKeyState. Das funktionierte, wie unten dargestellt, bis ich die Optimierung von
    Delphi einschaltete. Dann griff praktisch bei erster möglicher Gelegenheit GetKeyState(VK_ESCAPE) = 1 (ohne, daß ich ESC gedrückt habe) und
    die Suche brach wie gewünscht (?!) ab. Nam ich die Abfrage auf jede hunderste Datei raus, und prüfte bei jeder Datei ESC, so gings mit und
    ohne Optimierung..

    Ist mein Ansatz von GetKeyState falsch? Wie kann ich alternativ ESC abfragen?

    Eingesetztes System: Win2000Prof deutsch, D5 C/S SP1 deutsch.
    Hier die Proceduren:

    <pre>procedure DurchsucheAlleDateien;
    VAR i: Integer;
    begin
    ProgressBar1.Max := ListBoxDateien.Items.Count;
    FOR i := 0 TO ListBoxDateien.Items.Count - 1 DO
    BEGIN
    SucheTextInDatei(ListBoxDateien.Items[i], EditTextInhalt.Text);
    IF (i MOD 100) = 0
    THEN
    BEGIN
    Application.ProcessMessages;
    //---fehlerhafte Procedure ???---------------------------------------
    IF GetKeyState(VK_ESCAPE) = 1
    //-------------------------------------------------------------------
    THEN
    BEGIN
    ModalResult := mrNone;
    ProgressBar1.Position := 0;
    Exit;
    END; // IF Key = ESC
    END; // if i = 100
    ProgressBar1.StepIt;
    END;
    ProgressBar1.Position := 0;
    end;</pre>
    <br><br><pre>
    procedure SucheTextInDatei(Datei, Text: String);
    VAR T,i:integer;
    SelPos: Integer;
    begin
    TRY
    Arbeit.Clear; // Arbeit ist ein Memo
    Arbeit.Lines.LoadFromFile(Datei);
    SelPos := Pos(Uppercase(Text), Uppercase(Arbeit.Lines.Text));
    IF SelPos > 0 THEN ListBoxErgebnis.Items.Add(Datei);
    EXCEPT
    END;
    end;</pre>

    Vielen Dank, Mario
    Schöne Grüße, Mario

  • #2
    Hi

    Probier mal "GetAsyncKeyState", wichtig !! am Anfang Deiner Funktion sollte einmal "GetAsyncKeyState" aufgerufen werden, da diese Funktion in Abhängigkeit vom nächsten/vorherigen Aufruf der Funktion reagiert.

    Gruß Hage

    Comment


    • #3
      Wieso denn IF GetKeyState(VK_ESCAPE) = 1 ? Gleich Eins? Hast Du mal in der API-Hilfe gelesen? Da steht "If the function succeeds, the return value specifies the status of the given virtual key.<b> If the high-order bit is 1, the key is down;</b>"<br>
      Du mußt also das hochwertige Bit des Rückgabewertes prüfen.<br>
      <b> IF (GetKeyStat(VK_ESCAPE) and $80) = $80 then ...</b><br>
      Funktioniert

      Comment


      • #4
        Ja, stimmt. Aber GetAsyncKeyState eignet sich besser
        Schöne Grüße, Mario

        Comment


        • #5
          sag ich doch :-)

          Gruß Hage

          Comment

          Working...
          X