Diskuze: problém s Button a stiskem klávesy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 16 zpráv z 16.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Při přidání buttonu dostane focus to tlačítko a ne formulář a ty reaguješ na klávesy na formuláři.
Jasně, chápu. Myslel jsem, že ve vlastnosti formuláře stačí nastavit KeyPreview = true a pak by to mělo odchytávat stisknuté klávesy, i když nemá formulář focus ...
Klávesy odchytávej pomocí
protected override bool ProcessCmdKey
Díky za rady, pořád se v tom plácám ...
Díky za trpělivost 
Asi jsem natvrdlý, ale přepínat focus mezi button mi jde, ale přepnout ho
na form1 to nebere - to vůbec tu metodu nenabízí... 
Vždyť jsem říkal, že je to vadné. Zkus Activate metodu 
Tak chyba bude někde jinde, ani to mi nepomohlo. Asi mám něco blbě - jsem začátečník.
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;
namespace pristaniGraficke
{
public partial class Form1 : Form
{
double casKonstant = 1000; // milisekundové cykly
private int x = 50;
private int y = 0;
int modulX = 100;
int modulY = 100;
double g = 1.62; //hodnota gravitačního zrychlení
double vyskaH; //h
double rychlostV; //v
double palivoM; //Mp
int tahMotoruT; //Z
double zrychleniA; //a
double doprava;
double doleva;
int hmotnostModulu = 9000; //M
double maxBrzdiciTah = 36000; //R
double vytokovaRachlost = 3000; //Vv
double rekord = 60;
double pokus;
int planeta;
double k; //pomocna konstanta
double l; //pomsocna konstanta
public Form1()
{
InitializeComponent();
resetHodnot();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Blue, x, y, modulX, modulY);
e.Graphics.DrawImage(new Bitmap("raketa.png"), x, y, modulX, modulY);
}
private void timer1_Tick(object sender, EventArgs e)
{
label2.Text = tahMotoruT.ToString();
label4.Text = (vyskaH-modulY-33).ToString(); // výpis výšky na obrazovku
label6.Text = (rychlostV*10).ToString();
label7.Text = palivoM.ToString();
if (vyskaH > modulY + 33)
{
zrychleniA = g - k * tahMotoruT / casKonstant;
vyskaH = (vyskaH - rychlostV - (zrychleniA / 2));
rychlostV = rychlostV + zrychleniA;
palivoM = palivoM - l * tahMotoruT * 10;
y = Height - Convert.ToInt16(vyskaH);
x = Convert.ToInt16(x - doleva + doprava);
if (x < 0)
{
x = 0;
doleva = 0;
}
if (x > Width - modulX)
{
x = Width - modulX;
doprava = 0;
}
}
else
{
if (rychlostV*10 < rekord)
{
rekord = rychlostV*10;
label9.Text = "Udělal jsi nový rekord: " + rekord.ToString();
}
label8.Text = "přistál jsi rychlostí: " + (rychlostV*10).ToString();
}
if (palivoM < 0)
{
palivoM = 0;
k = 0;
}
if (doleva > 0)
doleva = doleva - 0.05;
if (doprava > 0)
doprava = doprava - 0.05;
if (tahMotoruT > 0)
{
tahMotoruT = tahMotoruT - 1;
}
Invalidate();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
if(tahMotoruT<100)
tahMotoruT = tahMotoruT + 30;
if (e.KeyCode == Keys.Down)
if (tahMotoruT > 4)
tahMotoruT = tahMotoruT - 30;
if (e.KeyCode == Keys.Left)
if (x > 10)
doleva = doleva + 2;
if (e.KeyCode == Keys.Right)
if (x < (Width-5))
doprava = doprava + 2;
}
private void resetHodnot()
{
Form1.ActiveForm.Activate();
vyskaH = Height; // počáteční výška se nastaví dle velikosti okna snížená o proužek
rychlostV = 0; //v
palivoM = vyskaH/5; //Mp
tahMotoruT = 0; //Z
zrychleniA = 0; //a
g = 1.62;
x = Convert.ToInt16(Width/2)-modulX/2;
y = 0;
doleva = 0;
doprava = 0;
g = g / casKonstant;
k = maxBrzdiciTah / 100 / hmotnostModulu;
l = maxBrzdiciTah / 100 / (vytokovaRachlost * casKonstant);
label8.Text = "";
label9.Text = "";
}
private void Reset_Click(object sender, EventArgs e)
{
resetHodnot();
}
}
}
Form1.ActiveForm.Activate();
Tohle ti jde? Nahraď to tímto:
this.Activate()
EDIT: Divím se, že to vůbec zkompiluješ. Mělo by ti to vyhodit vyjímku, že odkazuješ na objekt, který nemá instanci.
A co teda chceš? Na co chceš přenést focus? Na ten Form, aby jsi mohl zachytávat ty klávesy, protože když má focus to tlačítko, tak to nejde?
Všiml jsem si toho až teď
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter)
{
MessageBox.Show("Stisknut byl Enter");
}
return base.ProcessCmdKey(ref msg, keyData);
}
form nemusí mít focus, klávesy jdou příídávat nebo odebírat kontrolou keyData
Zobrazeno 16 zpráv z 16.