Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
froshy
Člen
Avatar
froshy:9.1.2022 15:57

Ahojte, potrebujem poradit. Potrebujem jednoduchu vec naprogramovat ale asi nie je uplne jednoducha. Mam spravenu progrma kde je viac buttonov. Potrebujem aby program automaticky presunul kurzor na button1 po sekune na button2 atd. Ked dojde na koniec tak zacne od zaciatku.

Zkusil jsem: Prvy pokus, je sice jdnoduchy ale ked je napriklad 80 buttonov tak je to o drzku.

namespace kp7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            timer1.Start();
        }
        private int count = 0;


        public Point Point { get; private set; }

        private void timer1_Tick(object sender, EventArgs e)
        {
            count++;
       if ( count == 1 ) { Cursor.Position = PointToScreen(button1.Location); }
        }

Druhy pokus, je zlozitejsi ale nevyhoda je ze pri inom rozliseny kurzor skonci mimo button a tak ho neoznaci

 private void Update_mouse_position_Tick(object sender, EventArgs e)
        {
            Process[] processes = Process.GetProcessesByName("vk");
            if (processes.Length == 0)
            {

                if (panel1.Visible == false)
                {
                    Update_cursor_coordinate2 = false;
                    if (Update_cursor_coordinate == false)
                    {
                        Cursor.Position = PointToScreen(pictureBox1.Location);
                        x = Cursor.Position.X;
                        y = Cursor.Position.Y;
                        Update_cursor_coordinate = true;
                        Update_cursor_positions = 0;
                        Lines_cursor_positions = 0;
                    }
                    Update_cursor_positions++;

                    Cursor.Position = new Point((x - 10) + 100 * Update_cursor_positions, (y + 50) + Lines_cursor_positions);
}

Chci docílit: Chcel by som lepsi sposob ako som uviedol, moja prestava je ze jednoduchy algoritmus ako v priklade 1 ktori by pekne oznacoval buton za radom od prveho buttona po posledny. Prestavka by bolo 1 sekunda pokial posunie dalej button.

Mal som na mysli daco taketo:

private void timer1_Tick(object sender, EventArgs e)
        {
            count++;
       i Cursor.Position = PointToScreen(button [count].Location);
        }

Dakujem za radu, pripade som ochotny aj dat odmenu ked mi niekto posle funkcny kus kodu.

Editováno 9.1.2022 15:59
 
Odpovědět
9.1.2022 15:57
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10.1.2022 8:59

Co jsi nasel googlem?
google = net change number of button by name
https://stackoverflow.com/…-button-text

Button[] buttons = new Button[] { btn0, btn1, btn2 };
buttons[0].Text = "abc";
---
Control[] matches = this.Controls.Find("btn0", true);
Button b = matches.Length > 0 ? matches[0] as Button : null;
if (b != null)
{ }

google = net select button by id
net select button by name
https://www.codeproject.com/…trol-by-name

foreach (Control c in f.Controls)
   {
   Button b = c as Button;
   if (b != null)
      {
      ...
      }
   }
---
foreach (Button item in f.Controls.OfType<Button>())

https://www.geeksforgeeks.org/…-in-c-sharp/

Button MyButton = new Button();
Mybutton.Name = "First_button";
// Add this Button to form
this.Controls.Add(Mybutton);
 
Nahoru Odpovědět
10.1.2022 8:59
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10.1.2022 9:02

Jestli to spravne chapu, jak pridavas button do form-conntrols, tak muzes ho pridat do nejakeho tveho pole.

this.Controls.Add(Mybutton);

Button[] buttons = new Button[] {};
Button MyButton = new Button();
buttons.Add(Mybutton);
 
Nahoru Odpovědět
10.1.2022 9:02
Avatar
froshy
Člen
Avatar
froshy:31.1.2022 19:03

Video o mojom projekte:
https://www.youtube.com/watch?…

Takto mam riesenie pridavanie buttonov/picturebox na plochu:

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace kp7
{
    internal class Add_apps_to_desktop
    {
        private PictureBox[] Desktop_icon = new PictureBox[0];
        private Label[] Desktop_label = new Label[0];
        private int Desktop_icon_counter = 0;

        private readonly Error2file se = new Error2file();
        private readonly Exec_utils Exec = new Exec_utils();

        private readonly Timer Emulate_mouse_click = new Timer();
        private readonly Load_seting ls = new Load_seting();
        private string Hovered_app = null;

        public void Get_apps(Form desktop)
        {
            ls.To();
            Emulate_mouse_click.Interval = Convert.ToInt32(ls.Mouse_click_sleep);
            Emulate_mouse_click.Tick += Emulate_mouse_click_Tick;

            try
            {
                string[] dirs = Directory.GetDirectories(@"application");
                foreach (string item2 in dirs)
                {
                    FileInfo f = new FileInfo(item2);
                    {
                        Desktop_icon_counter++;
                        Array.Resize(ref Desktop_icon, Desktop_icon.Length + (Desktop_icon_counter + 1));
                        Array.Resize(ref Desktop_label, Desktop_label.Length + (Desktop_icon_counter + 1));

                        Desktop_icon[Desktop_icon_counter] = new PictureBox
                        {
                            Location = new Point(Desktop_icon_counter * 115 - 100, Screen.PrimaryScreen.WorkingArea.Height - 110),
                            Size = new Size(100, 100),
                            BackColor = Color.FromArgb(8, Color.WhiteSmoke),
                            Name = f.Name
                        };


                        Desktop_label[Desktop_icon_counter] = new Label
                        {
                            Location = new Point(Desktop_icon_counter * 115 - 100, Screen.PrimaryScreen.WorkingArea.Height - 11),
                            Size = new Size(100, 50),
                            ForeColor = System.Drawing.ColorTranslator.FromHtml("white"),
                            BackColor = Color.Transparent,
                            Font = new Font("Calibry", 10),
                            Text = f.Name
                        };

                        Desktop_icon[Desktop_icon_counter].MouseClick += Add_apps_to_desktop_MouseClick;
                        Desktop_icon[Desktop_icon_counter].MouseEnter += Add_apps_to_desktop_MouseEnter;
                        Desktop_icon[Desktop_icon_counter].MouseLeave += Add_apps_to_desktop_MouseLeave;

                        try
                        {
                            Desktop_icon[Desktop_icon_counter].BackgroundImage = Image.FromFile(@"application\" + f.Name + @"\" + f.Name + @".png");
                            Desktop_icon[Desktop_icon_counter].BackgroundImageLayout = ImageLayout.Stretch;

                            string filename = @"application\" + f.Name + @"\" + f.Name + @".txt";
                            using (StreamReader reader = File.OpenText(filename))
                            {
                                string line = String.Empty;
                                while ((line = reader.ReadLine()) != null)
                                {
                                    Desktop_label[Desktop_icon_counter].Text = line;
                                }
                            }
                        }
                        catch
                        {
                            se.Save_to_file("[" + DateTime.Now.ToString("MM/dd/yyyy HH:mm") + "] Error msg: " + "Desktop image app error: " + Desktop_icon[Desktop_icon_counter].Name);
                        }
                    }
                    desktop.Controls.Add(Desktop_icon[Desktop_icon_counter]);
                    desktop.Controls.Add(Desktop_label[Desktop_icon_counter]);
                }
            }
            catch
            {
                se.Save_to_file("[" + DateTime.Now.ToString("MM/dd/yyyy HH:mm") + "] Error msg: " + "Desktop app error: " + Desktop_icon[Desktop_icon_counter].Name);
            }
        }

        private void Emulate_mouse_click_Tick(object sender, EventArgs e)
        {
            Exec.Execute(@"application\" + Hovered_app + @"\" + Hovered_app);
            Emulate_mouse_click.Stop();
        }

        private void Add_apps_to_desktop_MouseClick(object sender, MouseEventArgs e)
        {
            Exec.Execute(@"application\" + Hovered_app + @"\" + Hovered_app);
        }

        private void Add_apps_to_desktop_MouseEnter(object sender, EventArgs e)
        {
            PictureBox APP = (PictureBox)sender;
            APP.BackColor = Color.FromArgb(250, Color.DodgerBlue);
            Hovered_app = APP.Name;
            if (!(ls.HID_jb == "on"))
            {
                Emulate_mouse_click.Start();
            }
        }

        private void Add_apps_to_desktop_MouseLeave(object sender, EventArgs e)
        {
            PictureBox APP = (PictureBox)sender;
            APP.BackColor = Color.FromArgb(8, Color.WhiteSmoke);
            Emulate_mouse_click.Stop();
        }
    }
}

Algoritmus ktory zaistuje posun kurzoru na buttonmi vypada takto:

Move_cursor.Interval = Convert.ToInt32(ls.Move_cursor);
            Move_cursor.Tick += (s, d) =>
            {
                Direcotry_count = 0;
                Direcotry_count = Directory.GetDirectories(@"application\").Length;
                Update_cursor_positions++;

                if (Direcotry_count >= Update_cursor_positions)
                {
                    Cursor.Position = new Point(Update_cursor_positions * 115 - 50, Screen.PrimaryScreen.WorkingArea.Height - 70);
                }
                else
                {
                    Update_cursor_positions = 0;
                }

Hladam sposob ako lepsie urobit to ze kurzor posunie na prvy objekt (button/picturebox) pocka sekund a potom prejde kurzor na dalsiu button.

 
Nahoru Odpovědět
31.1.2022 19:03
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.2.2022 8:34

Tip1:

Hele, ja v c# nedelam, takze mozna budu psat hlouposti... Ale delam treba v javascriptu. Mam zkusenosti s tim, ze timerove objekty nejsou vzdy delane tak, jak potrebuji. Takze si na to delam vlastni verzi, ktere pak predam pri vytvareni funkci start, run, pause, stop.

Move_cursor = new myTimer ({start: ..., run: Move_cursor_Tick})

V tom timeru mam prave definovane zavislosti, ktere mi ten timer dokaze zastavit a jako bonus spousteji tu funkci, kterou sem mu tam pridal pri vytvareni

this.func.timerStart = function()
        {
        root.func.timerStop();
        root.user_func.timerStart();
        root.vars.timer.timer   = setTimeout(root.func.timerRun, root.vars.timer.speed);
        }

this.func.timerStop = function()
        {
        if (root.vars.timer.timer!=null)
                {
                clearTimeout(root.vars.timer.timer);
                }
        root.vars.timer.timer = null;
        root.user_func.timerStop();
        }

Tip2:

Desktop_icon[Desktop_icon_counter] = new PictureBox

-- ja bych to resil jako
new_icon = new PictureBox ...
new_icon.MouseClick...
Desktop_icon[Desktop_icon_counter] = new_icon;

tip3

Move_cursor.Interval = Convert.ToInt32(ls.Move_cursor);
            Move_cursor.Tick += (s, d) => // tomuto zapisu moc nerozumim (ale to je tim, ze za nas se program psal jinak)
            { // odsud, po konec bych si to udelal jako extra funkci (se jmenem), jestli to teda spravne chapu, ze je to funkce
                Direcotry_count = 0;
                Direcotry_count = Directory.GetDirectories(@"application\").Length;
                Update_cursor_positions++;

                if (Direcotry_count >= Update_cursor_positions)
                {
                }
                else
                {
                    Update_cursor_positions = 0;
                }
                    Cursor.Position = new Point(Update_cursor_positions * 115 - 50, Screen.PrimaryScreen.WorkingArea.Height - 70); // tohle preci potrebujes pocitat i pro pozici 0, tak, proc jsi to schoval do ifu?

// a tim padem se ty ifka daji pak napsat jako (pomoci ternarniho operatoru)
                Update_cursor_positions = Update_cursor_positions<Direcotry_count ? Update_cursor_positions+1 : 0;

// directory count preci nemusis pocitat v kazdem ticku. Nebo je k tomu duvod? Pokud ne, tak to dam do inicializacni casti
        private int Desktop_icon_counter = 0;
        private int Desktop_icon_counter_max = 0; // ja pouzivam max nebo end
// inicializace
                Desktop_icon_counter_max = Directory.GetDirectories(@"application\").Length;
// a kupodivu, ty to same delas pak tady
                string[] dirs = Directory.GetDirectories(@"application");
                foreach (string item2 in dirs)
// tobe vlastne staci vzit posledni Desktop_icon_counter z toho cyklu
                foreach (string item2 in dirs)
                {
                }
                Desktop_icon_counter_max = Desktop_icon_counter;

// jak jsem u --- private int Desktop_icon_counter_max --- zminoval to start, end, tak to pouzivam pro cykly
start = 0
end = 5
for (i=start; i<end; i++)

// jo, ta ikona ma nejakou Location (to je snad nejaka poloha zleva a zhora ne?), proc nevyuzijes tohle pro nastaveni pozice mysi?
// existuje neco jako focus, ale to asi nepremysti kurzor

Ja myslim, ze to celkove delas asi dobre. Jen se v tom kodu clovek brzo ztrati, protoze si vymyslis pro kazdou vec uplne novy odlisny nazev. Otazkou je, do jake miry je to treba. Treba mas slozitejsi appku a mel bys tam spoustu podobnych.
V podstate delas nejakou takovou simulaci klavesy tabelator v prohlizeci pro odkazy.

                        Desktop_icon[Desktop_icon_counter].MouseClick += Add_apps_to_desktop_MouseClick;
                        Desktop_icon[Desktop_icon_counter].MouseEnter += Add_apps_to_desktop_MouseEnter;
                        Desktop_icon[Desktop_icon_counter].MouseLeave += Add_apps_to_desktop_MouseLeave;

                        new_icon.MouseClick += Icon_MouseClick;
                        new_icon.MouseEnter += Icon_MouseEnter;
                        new_icon.MouseLeave += Icon_MouseLeave;

                        icon[icon_index++] = new_icon; // on to udela ++ az po ulozeni

Update_cursor_positions++;
icon_cursor_positions++;
icon_index++; // je to vlastne index nebo pro cykly nejake icko for(i=0; i<5; i++)
//nebo mozna counter
 
Nahoru Odpovědět
1.2.2022 8:34
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.2.2022 8:38

Poslys, a jeste, kdyz na to koukam, proc tam mas skoro vsude += ? Ono se to tak v c# pise?

                        Desktop_icon[Desktop_icon_counter].MouseLeave += Add_apps_to_desktop_MouseLeave;
                        Desktop_icon[Desktop_icon_counter].MouseLeave = Add_apps_to_desktop_MouseLeave;
// preci, handle (pointer) na jinou funkci predavas primym presmerovanim pres =
// += mozna funguje, protoze je tam null nebo undefined, ale nezda se mi to jako stastna volba pro jine programy
 
Nahoru Odpovědět
1.2.2022 8:38
Avatar
froshy
Člen
Avatar
Odpovídá na Peter Mlich
froshy:2.2.2022 9:36

Skúsim to odstrániť to + ale pokiaľ viem nikdy mi nič nešlo keď som dal len =

 
Nahoru Odpovědět
2.2.2022 9:36
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2.2.2022 13:45
a += b // by melo byt totez jako
a = a + b

a = null + b // tak by to melo byt totez jako
a = b // nebo mozna se to v pripade funkce eventu chape jako
a = null || b // null or b, nevim

Proste, pokud to tak neni v dokumentaci na netu nekde nebo v prikladu, tak si myslim, ze je to zbytecne. Ale uz jsem se setkal v jinych jazycich s podobnymi fintami, kdy neco nefungovalo s ocekavanym zapisem, kdyz se to nenapsalo podle dokumentace.
Treba pro mne posledni takovy pripad. Bracha resil real-time komunikaci pres websockety nebo tak. V dokumentaci bylo

function send (data, func_true, func_false)

A pokud jsi do funkce nezadal 3 parametry, tak to odmitlo fungovat. Ikdyz jsi na funkci pro false nechtel nic navazovat :) Minimalne tam muselo byt null. Coz je nezvyk, protoze v javascript obvykle na vyplneni parametru netrva a vypise kdyztak error. Tohle nevypisovalo nic. A az po 2 dnech zkouseni a hledani, kopirovani prikladu se mi podarilo odhalit problem :)

 
Nahoru Odpovědět
2.2.2022 13:45
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Peter Mlich
DarkCoder:2.2.2022 13:59

A pokud jsi do funkce nezadal 3 parametry, tak to odmitlo fungovat. Ikdyz jsi na funkci pro false nechtel nic navazovat :) Minimalne tam muselo byt null. Coz je nezvyk, protoze v javascript obvykle na vyplneni parametru netrva a vypise kdyztak error. Tohle nevypisovalo nic.

To je přeci normální chování. Nechtěl bych pracovat s jazykem, který by se nedržel těchto pravidel. :-) Ještě se dá přejít přetížení funkcí a výchozí hodnota, není-li parametr zadán. Ale aby mi překladač nehodil chybu, když funkce má mít tři parametry a zadám pouze dva, to opravdu ne.

Nahoru Odpovědět
2.2.2022 13:59
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na froshy
DarkCoder:2.2.2022 14:24

Algoritmus je jednoduchý, jednorozměrné pole objektů typu Button, ve kterém máš pozici tlačítka, výšku a šířku. Z těchto hodnot určíš souřadnici na kterou máš přenést kurzor. Pak funkci časovače, kde se bude za stanovený interval přesouvat po indexech a vykreslení kurzoru na pozici středu (popřípadě jiné pozice) kurzoru.

Nahoru Odpovědět
2.2.2022 14:24
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.2.2022 12:40

Ted jsem cetl zpravu, ze win ma potize s pomalym pruzkumnikem.
Docela mne prekvapuje, ze si win nevede databazi. sql prikaz seznam souboru dokaze podle id najid do mikrosekund. Pak uz to staci jen vypsat na obrazovku.
V teto souvislosti mne napada, ze bys mohl ty ikonky vycucat do databaze a tu updatovat jen pri prepsani toho souboru. Vis, nenacitat to pokazde soubor po souboru jako nejak windows :)

 
Nahoru Odpovědět
4.2.2022 12:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.