Home > Software design >  Is there a way to call a function after button is pressed?
Is there a way to call a function after button is pressed?

Time:04-12

So my problem is the following:

I have a button, which has a set background. If the button is pressed, I call the function, which is called check(); The problem is, that if the button is pressed, I will set the background to a certain picture, and if I call the fucntion check, and in that check, sometimes I delete the background.

So sometimes without even seeing the background it gets deleted. How can I improve it, so it gets deleted only like after 3-4 seconds?

private void button2_Click(object sender, EventArgs e)
        {
            Image img = Image.FromFile(@"C:\Users\nhorv\Downloads\javascript.jpg");
            button2.BackgroundImage = img;
            buttonList.Add(button2);
            counter  ;
            check();
        }

This is the button_click function, and this is the check() func:

void check()
        {
            if (counter == 2)
            {
                if (buttonList.Contains(button1) && buttonList.Contains(button6))
                {
                    progressBar1.Increment(10);
                }
                .
                .
                .
                else 
                {
                    buttonList[0].BackgroundImage = null;
                    buttonList[1].BackgroundImage = null;
                }
                buttonList.Clear();
                counter = 0;
            }
        }

The buttons are stored in the buttonList list.

For the timing, I heard about: System.Threading.Thread.Sleep(1000); - for a 1 second delay.

Any help is really appreciated!

Edit:

The problem is with the buttons. If I call the button1_pressed function, it runs trough and only after that is the background changed. Unfortunately, there is the check function, which immediately deletes the background. So I have to somehow make the check function after the button press, so that the button can change the background, and only after that will I call check();

CodePudding user response:

Use

 System.Threading.Thread.Sleep(3000); 

to pause the execution for 3 seconds and then delete the background based on the condition.

private void button2_Click(object sender, EventArgs e)
    {
        Image img = Image.FromFile(@"C:\Users\nhorv\Downloads\javascript.jpg");
        button2.BackgroundImage = img;
        buttonList.Add(button2);
        System.Threading.Thread.Sleep(3000);
        check();
    }

CodePudding user response:

To create a smaal delay (so the player can check if they match, you should go for the async method)

But you need to prevent that, when the Task.Delay is running, a button is disabled. The await Delay ensures that the paint messages are handled, but also new buttons can be clicked.

Here an example:

private bool _buttonsEnabled = true;

private async void button2_Click(object sender, EventArgs e)
{
    if(!_buttonsEnabled)
        return;

    _buttonsEnabled = false;
    
    Image img = Image.FromFile(@"C:\Users\nhorv\Downloads\javascript.jpg");
    button2.BackgroundImage = img;
    buttonList.Add(button2);
    counter  ;
    await check();
    
    _buttonsEnabled = true;
}

private async Task check()
{

    if (counter == 2)
    {
        if (buttonList.Contains(button1) && buttonList.Contains(button6))
        {
            progressBar1.Increment(10);
        }
        .
        .
        .
        else 
        {
            // wait for a second before clearing the background.
            await Task.Delay(1000);


            buttonList[0].BackgroundImage = null;
            buttonList[1].BackgroundImage = null;
        }
        buttonList.Clear();
        counter = 0;
    }

}

CodePudding user response:

So this is what I have understood from your code: you have button 2 with the event handler button2_Click associated on it.

Once you have clicked button 2, you set the background image to the button, add the BUTTON 2 to a list of button, increment a variable called counter by 1 and then call check function.

Check function, first of all, controls if counter is 2. If not, exit. Else, controls if button1 and button6, that I don't know where they're and if thery're added to to buttonList or not, are into the list or not. If they both are present, then increment the progressbar by 10. If one of them is not in the list, or both, you set the background immage of the first 2 buttons in the buttonList to null...

In the end, you clear the buttonList and set the counter to 0.

First of all, we should see the entire code in order to understand what's going on. Relying only on what I can see, start the programm in debug mode and check if button1 and button6 are in the list. In my opinion, you never add those 2 buttons to the list (is enough that only one of them is not present, since there's an and into the if), so the program will always delete the background image.

CodePudding user response:

If I understand you correctly, you want to delay the check() function that deletes the background. You will need to create a thread that will do that:

async Task check()
{
    if (counter == 2)
    {
       await Task.Delay(3000);
       ...<your other code>
    }
}

Your button click then becomes:

private async void button2_Click(object sender, EventArgs e)

An you call your check method:

_ = check();
  • Related