Diskuze: Posun kurzoru po button
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


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);
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);
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.
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
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
froshy:2.2.2022 9:36
Skúsim to odstrániť to + ale pokiaľ viem nikdy mi nič nešlo keď som dal len =
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
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.
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.
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
Zobrazeno 11 zpráv z 11.