Announcement

Collapse
No announcement yet.

button->Enabled funktioniert nicht

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

  • button->Enabled funktioniert nicht

    Hallo zusammen,
    ich habe folgende Situation:
    Ich zeichne zwei Linien immer neu bis sie den Rand erreicht haben und dann änder ich die Richtung. Das ganze geschieht anzahlWiederholungen mal, wenn ich einen Button Animation Start klicke. Soweit klappt alles. Nun habe ich den Button disabled damit mann ihn nicht mehrmals drücken kann, sonst geht die Animation gleich wieder los. Aber trotz das er grau dargestellt wird merkt er sich den Klick und führt die Animation ein zweites mal durch was er nicht machen soll. Kann mir jemand sagen was ich da machen kann?
    Danke. Folgend der Code:

    [highlight=c++]
    private: System::Void buttonAnimation_Click(System::Object^ sender, System::EventArgs^ e) {
    buttonAnimation->Enabled = false;
    //eine lokale Variable für die Größe
    Int32 groesse;
    Int32 anzahlWiederholungen=Convert::ToInt32(textBoxAnzah lWiederholungen->Text);
    Int32 geschwindigkeit=Convert::ToInt32(textBoxGeschwindi gkeit->Text);
    Int32 schritt=0;
    Int32 durchlauf=0;
    //einen Stift mit der aktuellen Farbe erzeugen
    Pen ^stift = gcnew Pen(linienFarbe);
    //einen Pinsel in der aktuellen Farbe erzeugen
    SolidBrush ^pinsel = gcnew SolidBrush(hintergrundFarbe);
    //den Linienstil setzen
    if (listBoxLinieStil->SelectedIndex >= 0)
    stift->DashStyle = linienstil[listBoxLinieStil->SelectedIndex];
    //die Dicke des Stiftes setzen
    stift->Width=Convert::ToSingle(numericUpDownLinieStaer ke->Value);
    //die Größe der Figur ermitteln
    switch (trackBar1->Value) {
    case 1: groesse=125;
    break;
    case 2: groesse=100;
    break;
    case 3: groesse=75;
    break;
    }
    if (radioButtonLinie->Checked == true)
    {
    Boolean schalter = true;
    do
    {
    if (panel1->ClientRectangle.Height / 2 - schritt == panel1->ClientRectangle.Height)
    schalter = true;
    if (panel1->ClientRectangle.Height / 2 - schritt == panel1->ClientRectangle.Top)
    schalter = false;
    switch(schalter)
    {
    case true:
    if (durchlauf == anzahlWiederholungen)
    break;
    else
    //die Zeichenfläche löschen
    zeichenflaeche->Clear(panel1->BackColor);
    schritt++;
    zeichenflaeche->DrawLine(stift, panel1->ClientRectangle.Left + groesse, panel1->ClientRectangle.Height / 2 - schritt, panel1->ClientRectangle.Width - groesse, panel1->ClientRectangle.Height / 2 - schritt);
    zeichenflaeche->DrawLine(stift, panel1->ClientRectangle.Left + groesse, panel1->ClientRectangle.Height / 2 + schritt, panel1->ClientRectangle.Width - groesse, panel1->ClientRectangle.Height / 2 + schritt);
    durchlauf++;
    labelDurchlauf->Text=Convert::ToString(durchlauf);
    labelDurchlauf->Refresh();
    System::Threading::Thread::Sleep(geschwindigkeit);
    break;

    case false:
    if (durchlauf == anzahlWiederholungen)
    break;
    else
    //die Zeichenfläche löschen
    zeichenflaeche->Clear(panel1->BackColor);
    schritt--;
    zeichenflaeche->DrawLine(stift, panel1->ClientRectangle.Left + groesse, panel1->ClientRectangle.Height / 2 + schritt, panel1->ClientRectangle.Width - groesse, panel1->ClientRectangle.Height / 2 + schritt);
    zeichenflaeche->DrawLine(stift, panel1->ClientRectangle.Left + groesse, panel1->ClientRectangle.Height / 2 - schritt, panel1->ClientRectangle.Width - groesse, panel1->ClientRectangle.Height / 2 - schritt);
    durchlauf++;
    labelDurchlauf->Text=Convert::ToString(durchlauf);
    labelDurchlauf->Refresh();
    System::Threading::Thread::Sleep(geschwindigkeit);
    break;
    }
    }while(durchlauf != anzahlWiederholungen);
    schritt=0;
    durchlauf=0;
    //Stift und Pinsel löschen
    delete stift;
    }
    buttonAnimation->Enabled = true;
    }[/highlight]

  • #2
    Du gibst der Anwendung zwischen disable und enable des Buttons wahrscheinlich nie die Chance ihre Botschaftenwarteschlange zu leeren.

    Heißt der Maus Klick wird immer in die Warteschlange geschrieben. Wenn der Button zum Zeitpunkt der Abarbeitung der Warteschlange disabled ist wird der Maus Click aber verworfen. Du mußt also dafür sorgen das die Message bearbeitet wird während der Button disabled ist und nicht danach. Das erreichst du z.B. durch einen eigenen Aufruf von Application.DoEvents(). Den genauen Syntax kann ich dir leider nicht sagen dafür reicht mein c++ nicht aus.

    Comment


    • #3
      Super Vielen Dank genau das war das Problem hat mit Application:oEvents() in den Do-While Schleifen untergebracht wurde.

      Gruß
      Andreas

      Comment

      Working...
      X