W pętli for nie działa timer1.Interval

0

Siemka.
Chciałem sobie napisać programik który by mi pisał teksty na gadu ale mam problem z pętlą for.

W pętli for nie działa timer1.Interval

 for (int i = 0; i < a ; i++)
            {
                SendKeys.Send(textBox1.Text);
                SendKeys.Send("{ENTER}");
                timer1.Interval = Convert.ToInt16(textBox2.Text);
            } 

a bez pętli działa.

                SendKeys.Send(textBox1.Text);
                SendKeys.Send("{ENTER}");
                timer1.Interval = Convert.ToInt16(textBox2.Text);
0
 int a = Convert.ToInt16(numericUpDown1.Text);
0
łorcyk napisał(a):
 int a = Convert.ToInt16(numericUpDown1.Text);

To nie prościej użyć numericUpDown1.Value?

I co chcesz osiągnąć? Po co Ci timer w pętli?

0

timer1.Interval odstęp w mili sekundach po napisaniu tekstu
a pętla do ilości powtórzeń wpisanego tekstu
.Text czy Value i tak musze konwertować do Inta

0

W linijce:
timer1.Interval = Convert.ToInt16(textBox2.Text);
Ustawiasz timer, nie z niego korzystasz, czy nie chciałeś wykorzystać np:?
Thread.Sleep(Convert.ToInt16(textBox2.Text));
Żeby zwolnić działanie pętli.
PS. Najlepiej w osobnym wątku, żeby nie mrozić GUI.

0

Mam w textboxie1 zdanie "Ala ma kota"
Pętlą ustalam ile razy ma być to napisane
timer1.Interval ustalam pałze po napisaniu zdania przed ponownym napisaniu tyle milisekund co w textbox2 jest wpisane

Ala ma kota
przerwa 1 sekunde
Ala ma kota
przerwa 1 sekunde

bez pętli działa a z pętlą nie.

0
łorcyk napisał(a):

.Text czy Value i tak musze konwertować do Inta

Nie. Text musisz konwertować, a Value tylko rzutować.

łorcyk napisał(a):

bez pętli działa a z pętlą nie.

A po co Ci pętla? Przecież timer jest sam w sobie nieskończoną pętlą, która robi coś w odstępie czasu, który ustawiasz przez Interval.

public partial class Form1 : Form
{
    private string text = "Ala ma rosół\n";

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.timer1.Interval = (int)this.numericUpDown1.Value;
        this.timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        this.textBox1.AppendText(this.text);
    }
}
0

Przecież napisałem po co mi pętla. Ludzie czytajcie jak odpisujecie bo potem jeden temat ma 100 postów z tymi samymi pytaniami i odpowiedziami.
Napisze jeszcze raz DUŻYMI LITERAMI.

PĘTLA DO ILOŚCI WPISYWANEGO ZDANIA A TIMER ODSTĘPEM MIEDZY TYMI WPISANIAMI!

A po drugie pytałem się dlaczego to w pętli nie działa ! ! !
Jeśli ktoś nie wie dlaczego to w pętli nie działa to niech nie pisze a nie pyta po co mi to po co mi tamto po co mi siamto.

1

A po drugie pytałem się dlaczego to w pętli nie działa ! ! !
Bo nie ! ! !
Bo Interval ustawia ci tylko jaki odstęp ma być używany w timerze ! ! !
Ale cała twoja pętla wykonuje się szybko, bo samo ustawienie Interval na nic nie czeka ! ! !
To tylko przypisanie wartości, tak jak przy zwykłej zmiennej ! ! !

3
łorcyk napisał(a):

A po drugie pytałem się dlaczego to w pętli nie działa ! ! !

Do zrobienia tego, co chcesz, możesz użyć albo pętli i usypiania wątku, albo timera. Ty próbujesz w użyć połowy pętli i połowy timera.

Pytam, co chcesz osiągnąć, żeby Ci pomóc. Sam nie dajesz sobie rady, nie tylko jeśli chodzi o implementację, ale nawet o wymyślenie jak to powinno być zrobione. Do tego nie wiesz, jak działa timer, i chyba dlatego próbujesz go używać w sposób losowy.

0

To może coś innego. Czy ktoś wie jak regulować prędkość wpisywania liter

SendKeys.Send(textBox1.Text);

np 1 litera co pół sekundy

0

Zamieszczam cały kod jak by ktoś chciał przeanalizować

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Input;
namespace WindowsFormsApplication12
{
    public partial class Form1 : Form
    {
        private WinHooksNET.KeyboardHook _keyboardHook = new WinHooksNET.KeyboardHook();
        public Form1()
        {
            InitializeComponent();
            _keyboardHook.OnKeyboardAction += _keyboardHook_OnKeyboardAction;
        }
        

        public void _keyboardHook_OnKeyboardAction(object sender, WinHooksNET.Events.KeyboardHookEventArgs e)
        { 
            if (e.Key == Key.F7)
            {
                timer1.Interval = 100;
                timer1.Enabled = true;
            }else
            if (e.Key == Key.F8)
            {
                timer1.Enabled = false;
            }
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int a = Convert.ToInt16(numericUpDown1.Text); 
            
            for (int i = 0; i < a ; i++)
            {
                SendKeys.Send(textBox1.Text);
                SendKeys.Send("{ENTER}");
               timer1.Interval = Convert.ToInt16(textBox2.Text);
            }
            timer1.Enabled = false;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            textBox2.Text = "" + trackBar1.Value * 10;

        }
    }
}

Gdy się usunie pętlę i

 timer1.Enabled = false;

to timer1.Interval = Convert.ToInt16(textBox2.Text);

 działa
0

Wydaje mi się, że to nie jest najlepsze możliwe rozwiązanie:

        private void timer1_Tick(object sender, EventArgs e)
        {
            int a = Convert.ToInt16(numericUpDown1.Text); 
 
            for (int i = 0; i < a ; i++)
            {
                SendKeys.Send(textBox1.Text);
                SendKeys.Send("{ENTER}");
               timer1.Interval = Convert.ToInt16(textBox2.Text);
            }
            timer1.Enabled = false;
        }
  1. Zapnij się na zdarzenie zmiany wartości w kontrolce: numericUpDown1 i przy zmianie tej wartości ustawiaj interwał timera
  2. W zdarzeniu timer Tick umieściłbym tylko logikę tego co ma się dziać faktycznie, czyli wypisywania kolejnej litery, jak przy każdym wystąpieniu timer Tick będziesz na koniec wywoływał linijkę
timer1.Enabled = false;

to nic dziwnego, że nie działa.

PS. to ma być jakiś bot do czegoś? kiedyś pisałem podobny mechanizm, jeśli masz gdzieś wbity kod w svn/git/cokolwiek chętnie pomogę z rozwojem aplikacji w wolnym czasie.

0

No bot do pisania na gadu jak chce przepisać jakiś kod programu czy cos

0

Rozwiązałem to w ten sposób.

  private void timer1_Tick(object sender, EventArgs e)
        {
            int a = Convert.ToInt16(numericUpDown1.Text);
            for (int i = 0; i < a; i++)
            {
                
                SendKeys.Send(textBox1.Text);
                SendKeys.Send("{ENTER}");
                timer1.Interval = Convert.ToInt16(textBox2.Text);
                Thread.Sleep(timer1.Interval);
            }
                timer1.Enabled = false;
        }
0

Ech, Ty w ogóle nie rozumiesz tego, co piszesz. Skoro usypiasz wątek w pętli, to żaden timer NIE jest Ci do niczego potrzebny.
Wyłączanie timera w jego tyknięciu to w ogóle jest jakiś majstersztyk, podobnie jak to:

timer1.Interval = Convert.ToInt16(textBox2.Text);
Thread.Sleep(timer1.Interval);
0
łorcyk napisał(a):

Rozwiązałem to w ten sposób.

  private void timer1_Tick(object sender, EventArgs e)
        {
            int a = Convert.ToInt16(numericUpDown1.Text);
            for (int i = 0; i < a; i++)
            {
                
                SendKeys.Send(textBox1.Text);
                SendKeys.Send("{ENTER}");
                timer1.Interval = Convert.ToInt16(textBox2.Text);
                Thread.Sleep(timer1.Interval);
            }
                timer1.Enabled = false;
        }

Kombinujesz, kombinujesz i dalej brniesz w jakąś skomplikowaną idee, a sprawa jest bardzo prosta, zamiast klepać kod bez namysłu powinieneś usiąść i zastanowić się co chcesz zrobić.
Wyłączenie zegara za każdym tyknięciem?

                timer1.Enabled = false;

A to?

                timer1.Interval = Convert.ToInt16(textBox2.Text);
                Thread.Sleep(timer1.Interval);

Po co przypisywać Property, z któego nie korzystasz?, może lepiej po prostu:

                Thread.Sleep(Convert.ToInt16(textBox2.Text));

Skoro już korzystasz z Thread.Sleep to odpuść timer, możesz przecież wartość przekazać dowolną zmienna, nie twórz obiektu timer bo z niego i tak nie korzystasz.

Podsumowując wydaje mi się, że wszystko co potrzebujesz to po wciśnięciu F7 jednorazowe wywołanie metody (w zasadzie to się właśnie dzieje, tylko przez zdarzenie timer.Tick i kod się zrobił lekko śmieszny). Do metody potrzebujesz przekazać twoją wiadomość, która ma być przepisana i interwał z jakim mają być wpisywane kolejne znaki.

        public void SendKeysWithInterval(string message)
        {
            foreach (var c in message)
            {
                //Wpisanie kolejnego znaku z wiadomości przekazanej jako parametr,
                Thread.Sleep(/* aktualna wartość interwału pomiędzy znakami, przekazywana bokiem, np: Convert.ToInt16(textBox2.Text)*/);
            }
            //Wciśnięcie entera, wyjście z metody: SendKeys.Send("{ENTER}");
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1