Announcement

Collapse
No announcement yet.

Aus Endlosschleife mit Tastendruck aussteigen

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

  • Aus Endlosschleife mit Tastendruck aussteigen

    Moin moin,

    ich habe folgenden Code :
    Code:
    // --------------
    // Comport öffnen
    // --------------
    
       ret    = csp2Init(Port);
       while (ret != STATUS_OK)
       {
          Sleep (1000);
          ret    = csp2Init(Port);
          Application->ProcessMessages ();
       }
       ComStarted = true;
    Zusätzlich habe ich eine Action die auf Esc reagiert.

    Leider gelingt es mir nicht, aus dieser Schleife mit Esc auszusteigen, oder das Fenster über das x zu schließen.

    Was mache ich falsch ???

  • #2
    Verändert ein Druck auf ESC den Wert von ret? Nö.
    Dirk

    Comment


    • #3
      Was mache ich falsch ???
      - mit Sleep 1000 das System totzulegen
      - keinen Timer zu benutzen

      und wenn du auf einen Tastendruck wartest:

      - keinen entsprechenden Event implentiert, der einen Tastendruck aufnimmt und ggf. ret ändert, sofern es sich um eine globale oder Membervariable handelt
      Christian

      Comment


      • #4
        Ich hab das jetzt so gemacht :

        Code:
        bool ende = false;
        void __fastcall TfScannerLesen::FormActivate(TObject *Sender)
        {
        // --------------
        // Comport öffnen
        // --------------
        
           ret    = csp2Init(Port);
           while (ret != STATUS_OK && !ende)
           {
              Sleep (1000);
              ret    = csp2Init(Port);
              Application->ProcessMessages ();
           }
           if (ende)
              Close ();
           ComStarted = true;
           STB->Panels->Items[2]->Text = " Open";
           Bild->Visible   = true;
           Label4->Visible = false;
        
        }
        
        void __fastcall TfScannerLesen::FormKeyDown(TObject *Sender, WORD &Key,
              TShiftState Shift)
        {
           if (Key == 27)
            ende = true;
        }
        Das geht, aber nicht das Close ();

        Comment


        • #5
          Das geht, aber nicht das Close ();
          Wie immer:
          "Geht nicht" ist keine Fehlermeldung

          Da ein Close im OnActivate möglich ist, debugge dein Programm Schritt für Schritt setze einen Breakpoint bei if(ende)
          Christian

          Comment


          • #6
            Rauskriegen wirst du dann, dass wohl seltsamer Weise dein FormKeyDown nicht aufgerufen wird.....

            Helfen könnte dann:

            TCustomForm::KeyPreview Eigenschaft Bestimmt, ob das Formular Tastaturereignisse vor dem aktiven Steuerelement erhält.
            Christian

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              Rauskriegen wirst du dann, dass wohl seltsamer Weise dein FormKeyDown nicht aufgerufen wird.....

              Helfen könnte dann:

              TCustomForm::KeyPreview Eigenschaft Bestimmt, ob das Formular Tastaturereignisse vor dem aktiven Steuerelement erhält.
              Also KeyPreview ist auf true;
              FormKeyDown wird aufgerufen.

              Die Schleife wird verlassen.
              Close () wird aufgerufen, macht aber nichts ???

              Comment


              • #8
                läuft ein OnCloseQueryEvent?

                Steuerst du einen Scanner an? Wenn ja, warum nicht mit der TWAIN-Schnittstelle?
                Christian

                Comment


                • #9
                  Nein. Ist ein ganz normales Formular. Am Anfang wird gewartet, bis der Anwender den Barcodescanner einstöpselt. Wenn er keinen hat, soll er den Vorgang einfach abbrechen können.

                  Comment


                  • #10
                    Versuch mal statt Close

                    Application->Terminate();
                    Christian

                    Comment


                    • #11
                      Geht leider nicht, das Programm besteht aus mehreren Fenstern.
                      Das ganze soll auch mehr ein Gimmick sein, wenn der Scanner eingesteckt wird erscheint ein Bild von selbigen. Ich glaube ich nehme einfach einen Button

                      Danke trotzdem

                      Comment


                      • #12
                        Warum nimmst Du nicht statt des Sleep() einen TTimer?
                        Im Form::OnShow() setzt Du den Timer auf Active=true, im OnTimer überwachst Du den Status des Scanners? Du kannst doch dann ganz normal auf Close() und OnkeyUp() bzw. einen Cancel-Button::OnClick() reagieren.
                        Dirk

                        Comment


                        • #13
                          Originally posted by hgdorn View Post
                          Warum nimmst Du nicht statt des Sleep() einen TTimer?
                          Im Form::OnShow() setzt Du den Timer auf Active=true, im OnTimer überwachst Du den Status des Scanners? Du kannst doch dann ganz normal auf Close() und OnkeyUp() bzw. einen Cancel-Button::OnClick() reagieren.
                          Danke, genau so habe ich es jetzt gemacht

                          Comment


                          • #14
                            When du die variabele ende aulesen willst dan natürlich innerhalb deiner Schleife:

                            while (ret != STATUS_OK && !ende)
                            {
                            Sleep (1000);
                            ret = csp2Init(Port);
                            Application->ProcessMessages ();
                            if (ende)
                            Close ();
                            }


                            Aber Ich bin auch der Meinung dass diese construction mit Sleep() nicht schön is. Eine TTimer wäre da besser.

                            Uebrigens soll deine form mit [X] zu schliesen sein. Weil es ja ein Processmessages() in deine Scheife gibt.

                            Comment


                            • #15
                              Aha: etwas uebersehen. Die ende war schon in die Bedingung

                              while (ret != STATUS_OK && !ende)

                              vielleicht lief es nicht weil der Compiler das interpretierte wie
                              while (ret != (STATUS_OK && !ende))

                              statt
                              while ( (ret != STATUS_OK) && !ende)

                              Comment

                              Working...
                              X