UpDown Button soll den Focus verlieren...



  • Hallo zusammen,

    entschuldigt bitte vorab wegen dem ungenauen Titel, aber mir ist nichts besseres eingefallen.

    Zum Problem:

    Auf meinem Formular ist ein StringGrid. Darunter ist ein UpDown Button plaziert. Mit diesem UpDown Button kann man Zeilen dem StringGrid hinzufügen, bzw. aus diesem entfernen. Entfernen wird nur akzeptiert, falls die komplette Zeile leer ist. Ist dies nicht der Fall gebe ich eine Meldung aus.

    (Es wird immer die letzte Zeile gelöscht, bzw. eine letzte Zeile eingefügt)

    Der Fall: "Lösche Zeile wenn nicht komplett geleert" macht Probleme. Die Fehlermeldung erscheint wie gewüscht. Nur leider verliert der UpDown Button den Focus nicht. Wenn ich jetzt mit der Maus in das betreffene Feld des StringGrids gehe um es zu leeren, wird automatisch wieder das UpDownClick Event ausgelöst.

    void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
    {
     int Zeile = StringGrid1->RowCount - 1;
    
     switch (Button) {
    
         case btNext: if (Zeile == 1) return;
                      if (Zeile_leer(Zeile))
                          this->StringGrid1->RowCount = this->StringGrid1->RowCount - 1;
                      else MessageBox(this->Handle,"Nur komplett geleerte Zeilen können gelöscht werden",
                                      "Anwendung",MB_ICONWARNING|MB_APPLMODAL);
                      break;
    
         case btPrev: this->StringGrid1->RowCount = this->StringGrid1->RowCount - 1;
                      break;
    
         default:;}
    }
    
    //------------------------------------------------------------------------------
    
    bool __fastcall TForm1::Zeile_leer(int &Zeile)
    {
     bool leer         = true;
     int spaltenanzahl = this->StringGrid1->ColCount;
    
     for (int i = 0; i < spaltenanzahl; i++) {
    
          if (!this->StringGrid1->Cells[i][Zeile].IsEmpty()) {leer = false; break;}}
    
     return leer; 
    
    }
    

    Ich habe schon versucht, den Focus auf ein anderes Objekt zu legen, aber anscheinend liegt es nicht daran. Das Problem tritt auf nur dann auf, falls versucht wird, eine nicht-leere Zeile zu löschen.



  • Du hast den Focus vor Aufruf der MessageBox auf ein anderes Objekt gelenkt und trotzdem wird der UpDown-Event ausgelöst?
    Hast du diesen Event evtl. irgendwo anders (z.Bsp. im Stringgrid) mit eingetragen?
    Weiterhin:
    Sollte bei einem von beiden case-Zweigen nicht ein + stehen?
    Man könnte deine Funktion noch etwas optimieren.

    bool __fastcall TForm1::Zeile_leer(int Zeile) //Wozu eine Referenz?
    {
      int spaltenanzahl = StringGrid1->ColCount;
      for (int i = 0; i < spaltenanzahl; i++)
          if (!StringGrid1->Cells[i][Zeile].IsEmpty()) return false; //ist ja schon nicht leer
      return true;
    }
    


  • Hallo Braunstein,

    egal ob ich vor der MessageBox oder danach den Focus auf ein anderes Objekt lege, bleibt der UpDown Button aktiv. Selbst wenn augenscheinlich wirklich der Focus auf einem anderen Objekt liegt.

    Die beiden Funktionen werden ausschließlich und nur für das UpDown1Click Event genutzt, von keinem anderen Objekt sonst.

    Das Problem tritt aber nur auf, falls man versucht eine nichtleere Zeile zu löschen.

    -- Im zweiten Fall habe ich + mit - verwechselt -- 🙄
    -- Warum ich die Zeile by referece übergebe und nicht by value? Darüber habe ich mir keine Gedanken gemacht, aber ich denke schaden sollte es nicht, oder? --

    Aber das eigentliche Problem ist ja der Focus vom UpDown Button. Vielleicht kann ja jemand das ganze mal austesten und sagen, ob er das Problem (was wirklich ein Problem für mich darstellt) reproduzieren kann. Das wäre supi 👍



  • Du kannst mir das Projekt ja mal schicken.



  • Ich habe gerade ein Testprojekt (BCB2007) erstellt. Das könnte ich dir schicken? Nur die .exe oder auch Source-Code?

    Falls du noch Interesse hast drüber zu gucken, sag mir bescheid wo ich das ganze hinschicken kann. Danke



  • Schicke bitte das Projekt. Also den Source-Code und die Projektdatei.



  • Oki...Aber an welche Adresse?



  • Steht in meinem Profil.



  • Da hab ich schon geguckt. Aber ich sehe die Adresse nicht, sondern kann nur über einen Hyperlink "E-Mail senden" eine Nachricht verschicken. Dazu müsste ich hier aber Mitglied sein, was ich nicht bin 😞

    Wenn du sie hier nicht veröffentlichen möchtest, dann schicke mir doch bitte eine Mail an: alpha60@freenet.de und ich antworte dann darauf und schicke die Dateien mit.



  • Hallo nochmal,

    Ich habe mir jetzt dein Projekt mal angeschaut. Der Fehler liegt im Verhalten von TUpDow. Wenn du dort mit der Maus drauf klickst übernimmt TUpDown mit SetCapture die Maus bis sie wieder losgelassen wird. Dazwischen werden alle Mausklicks zu TUpDow umgeleitet. Dadurch sollen solche Sachen wie das Ziehen der Maus bei gedrückter Taste in weitere Klickevents umgesetzt werden.
    Das Problem hier ist nun, dass du im OnClick-Event ein neues Fenster anzeigst (MessageBox). Dadurch verliert TUpDown den Fokus und der MouseUp-Event wird nicht mehr ausgewertet. Somit wird die eingefangene Maus nicht mehr freigegeben und reagiert auf jeden weiteren Klick. Ein ReleaseCapture in der Funktion ändert daran auch nichts.
    Du darfst also innerhalb des OnClick-Events von UpDown kein anderes Fenster anzeigen.
    Ein mögliche Lösung wäre es nun, statt in OnClick, in OnMouseUp zu reagieren. Da ist ja dann die Maus wieder freigegeben. Du musst dir natürlich vorher noch merken welche Taste gedrückt wurde. Ich habe das in dem Projekt von dir über eine private Variable der Form gemacht. Die wird in OnClick gesetzt und in OnMouseUp ausgewertet.
    Ich schicke dir eine geänderte Version des Projektes zurück.



  • Hallo Braunstein,

    danke für deine tolle Hilfe und die Mühe die du dir damit gemacht hast.

    Habe das geänderte Projekt erhalten und getestet. Funktioniert einwandfrei, so wie ich es mir vorgestellt hatte.

    Liebe Grüße
    Stefan



  • @StefanN: Editiere mal deinen Eintrag mit der email-adresse und lösch sie raus... Deine Wohnadresse schreibst du doch auch nicht mit der Spraydose ans Bahnhofsgebäude oder? 😉


Log in to reply