tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
785
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    pape pape ist offline Mitglied
    Registriert seit
    Apr 2004
    Beiträge
    22
    Ist es in Pascal möglich zu speichern, wie lange ein Key gedrückt wurde?
    repeat until not keypressed usw. hat alles net geklappt...

    pape
     

  2. #2
    Avatar von W-Stefan
    W-Stefan W-Stefan ist offline Mitglied Silber
    Registriert seit
    Apr 2004
    Ort
    Augsburg
    Beiträge
    98
    Also ich weiss jetzt nicht genau, bei was du das benutzt, aber ich habs jetzt mal für ein Memo geschrieben. Du könntest es auch in ein Editfeld, auf die Form selber oder wo anderst hin legen, vorrausgesetzt die Komponente besitzt die beiden Ereignisse "OnKeyDown" und "OnKeyUp".

    Also, zuerst brauchst du zwei Variablen, eine vom Typ Longint und eine vom Typ Boolean. Die deklarierst du am besten unter "Private".

    Dann der Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if gedrueckt = False then   // "gedrueckt" ist meine Boolean-Variable
      begin
        start := GetTickCount;   // Die Windows-Laufzeit wird in meine Longint-Variable "start" eingelesen
        gedrueckt := True;     // "gedrueckt" wird auf "true" gesetzt, sonst würde start immer wieder neu eingelesen werden
      end;
    end;
     
    procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      gedrueckt := False;   // gedrueckt wird zurueckgesetzt
      ShowMessage(IntToStr(GetTickCount - start));  // Die gedrückte Zeit wird in Millisekunden angezeigt
    end;

    Hoffe es funktioniert so wie du es möchtest.

    W-Stefan
     

  3. #3
    pape pape ist offline Mitglied
    Registriert seit
    Apr 2004
    Beiträge
    22
    öhm...
    Zitat Zitat von pape
    Ist es in Pascal möglich
    ...nicht delphi!

    ich brauche das für folgendes:

    ich habe ein programm geschrieben, sodass man (in diesem) auf der Tastatur "Klavier-spielen" kann.. nun möchte ich, dass man speichern kann was man grade spielt...

    dazu muss ich aber auch speichern wie lange ein Ton gedrückt wird...

    ...naja dabei gibt es übrigens auch noch nen problem...:
    wenn man eine taste gedrück hält, dann wird das KeyDown event immerwieder ausgeführt... kann man das abstellen?, sodass es dann möglich ist einen Ton lange zu halten.. ich habe das probiert:
    wenn eine taste gedrückt wird, dann wird eine procedure aufgerufen, in der der taste entsprechend eine fqz berechnet wird, die dann einen ton ergibt.. der ton wird dann mithilfe der errechneten fqz und sound(fqz); erzeugt!
    jetzt soll der ton solange anhalten, bis die taste losgelssan wird..:
    Code :
    1
    2
    3
    
            sound(round(f));//f ist die berechnete fqz
            repeat until not keypressed;
            nosound;
    aber das geht net...

    grz
    pape
    Geändert von pape (19.11.04 um 18:38 Uhr)
     

  4. #4
    pape pape ist offline Mitglied
    Registriert seit
    Apr 2004
    Beiträge
    22
    ...komisch.. hätte gedacht auf so ner risen-seite ne antwort zu bekommen...

    naja
    pape
     

  5. #5
    Avatar von zoku2020
    zoku2020 zoku2020 ist offline Mitglied Bronze
    Registriert seit
    Jan 2003
    Ort
    Hannover (NDS)
    Beiträge
    48
    Mal schaun
    Wenn du einen Ton auslöst mit "sound" dann wird er so lange gespielt, bis "nosound" kommt oder ein anderer Ton wiedergegeben wird... Wenn der Sound in der Schleife ist, wird immer wieder ein neuer Ton ausgegeben

    Zu deiner Frage weiß ich leider keine direkte Antwort, aber vielleicht hilft dir das hier weiter:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    
    unit thetimer;
    interface
    Uses
      {crt,} DOS;
     
    Var
      OldInt8 : Procedure;
      Milliseconds, gesamt: LongInt;
      i : integer;
     
      {Procedure NewInt8;}
      Procedure SetNewInt8;
      Procedure SetOldInt8;
      procedure timed(interval:integer);
     
    implementation
      Procedure NewInt8; Interrupt;
        Begin
          Inline ($FA);{CLI}
          Inc (Milliseconds);
          Inc (gesamt);
          IF ((Milliseconds mod 55{1000 / 18.2}) = 0) THEN
            Begin
              Inline ($9C / $FB);{PUSHF, STI}
              OldInt8;
            End
          ELSE
            Begin
              Inline ($FB);{STI}
              Port[$20] := $20; {Interrupt-end signal}
            End;
        End;
     
     
      Procedure SetNewInt8;
        Begin
          GetIntVec ($08, @OldInt8);
          SetIntVec ($08, @NewInt8);
          ASM {Set Timer to 1000 Hz}
            cli
            mov dx, $43
            mov al, $36
            out dx, al
            sub dx, 3
            mov al, 169
            out dx, al
            mov al, 4
            out dx, al
            sti
          End;
        End;
     
     
      Procedure SetOldInt8;
        Begin
          ASM {Reset Timer to 18.2 Hz}
            cli
            mov dx, $43
            mov al, $36
            out dx, al
            sub dx, 3
            xor ax, ax
            out dx, al
            out dx, al
            sti
          End;
          SetIntVec ($08, @OldInt8);
        End;
     
    procedure timed(interval:integer);
    begin
        Milliseconds := 0;
        repeat
        until (Milliseconds = interval);
    end;
     
    Begin
      {for i := 1 to 50 do begin
      clrscr;
      write(i);                          {testprogramm}
      {timed(1000);
      end;}
    End.

    Diese Unit abe ich aus einem Programm mit einem Millisekunden-timer erstellt.
    Der Befehl "timed(x);" unterbricht das Programm für x Millisekunden.

    Vielleicht hilft dir das.

    greetz zoku
     
    Der Mittelfinger ist der vierte Finger an der Hand, egal wo ich zu zählen anfange.

Ähnliche Themen

  1. Prüfen ob Button gedrückt wurde...
    Von kleiner_floh im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 10.11.07, 14:36
  2. Fragen welche Taste gedrückt wurde
    Von Prophet05 im Forum C/C++
    Antworten: 14
    Letzter Beitrag: 17.06.07, 20:53
  3. Welcher Button wurde gedrückt?
    Von syntraxx im Forum PHP
    Antworten: 1
    Letzter Beitrag: 24.03.05, 18:40
  4. testen ob eine Taste gedrückt wurde
    Von BobDerMeister im Forum PHP
    Antworten: 3
    Letzter Beitrag: 11.03.05, 14:14
  5. Welcher Button wurde gedrückt?
    Von andyK im Forum PHP
    Antworten: 3
    Letzter Beitrag: 05.08.04, 14:21