Vlastní ovládací prvek (TabControl)   otázka

VB.NET

Dobrý den,

vytvořil jsem si vlastní ovládací prvek TabControlF

Public Class TabControlF
    Inherits TabControl

End Class

na stránce tohoto TabControlF1 vytvořím Button1 a přiřadím mu nějakou funkci

    Private Sub Test(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
	MsgBox("kuk")
    End Sub

Můj problém je, že bych potřeboval aby zápis byl (a zůstal) v tomto formátu:

    Private Sub Test() Handles Button1.Click
        MsgBox("kuk")
    End Sub

V případě že ho takto upravím, tak se mi po kompilaci a následné úpravě kteréhokoli prvku formuláře vygeneruje v kódu opět:

    Private Sub Test(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    End Sub

U kteréhokoliv prvku, který není součástí TabControlF se toto neděje.

Situaci zde uvádím velmi zjednodušenou, ve skutečnosti je TabControl více upraven a samotný "Test" je vyvoláván více eventy z různých prvků a jiných podprogramů. Chová se mi to však stejně i v této vzorové situaci.

Děkuji za radu, popřípadě za navedení správným směrem.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Asi blbá otázka...ale nedá mi to..Proč to potřebujete?! Metoda by měla vědět kdo ji volá a jaké ji předává argumenty.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já si tímhle způsobem přímo spouštím proceduru a jednou ji spouštím událostí Click a jindy KeyUp atd...

Např:

    Private Sub Prepocet() Handles TextBox1.TextChanged, _
                                  TextBox2.TextChanged, _
                                  TextBox3.TextChanged, _
                                  TextBox4.TextChanged, _
                                  ComboBox1.SelectedIndexChanged

Přišlo mi to jednodušší než to rozebírat na jednotlivé skupiny objektů:

    Private Sub Test_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged
Prepocet()
    End Sub

    Private Sub Test_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Prepocet()
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Člověče naučte se alespoň ty naprosté základy! Událost Click má jednou definovanou nějakou signaturu pro obslužné metody a ta prostě změnit nejde.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za velmi inspirativní podporu. Já se snažím učit základy, jinak bych se tu na nic neptal. Dle přísloví zeptej se a budeš hodinu za blbce, neptej se a budeš blbec celý život :)

A ano událost Click má definovanou signaturu, děkuji za vysvětlení.

Já jsem do dnes bez problémů používal zápis (byď ne asi správný):

Private Sub Test() Handles TextBox1.TextChange

a vše mi bez problémů fungovalo. Mohl jsem takto spustit proceduru přímo různými událostmi s různými signaturami a vše fungovalo. Nepsalo mi to že jsem začátečník a že se mám učit základy :)

Problém nastal až teď když jsem tyto prvky přiřadil pod vlastní TabControl.

Jdu tedy tento zádrhel řešit odkazováním na proceduru z jednotlivých událostí. Bohužel jako člověk který se zatím učí naprosté základy nevím, zda je nějaký lepší způsob.

Bohužel přemýšlím zda se to na tomto fóru vůbec dozvím :(

Každopádně děkuji za reakci a mějte prosím trošku více trpělivosti i s námi "začátečníky". I když to asi je někdy hodně těžké :)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nesouhlasím sice s tónem odpovědí, ale zvažte, zda si za ně trochu nemůžete sám, když informace předáváte po částech a teprve až po připomínkách, na které si stěžujete.

V tom, co jste uvedl, nevidím žádnou příčinu, proč byste nemohl volat vlastní proceduru přes handles více různých prvků umístěných na stránce vlastního TabControl.

Píšete: "Problém nastal až teď když jsem tyto prvky přiřadil pod vlastní TabControl" - no, a v tom ten problém bude - jak jste tyto prvky přiřadil pod vlastní TabControl?

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

No udělal jsem asi docela "prasárnu". Měl jsem hotový funkční prográmek, který byl rozdělen na několik "karet" v klasickém TabControlu. Všechno fungovalo bez problémů.

Po nějaké době jsem se zhlédl v TabControlEx - vzhledově upraveném TabControlu.

Vytvořil jsem si vlastní takovýto prvek a vložil ho do nového formuláře v původním projektu. Poté jsem z jednotlivých karet původního formuláře zkopíroval na karty nového TabControluF. Stejně tak jsem zkopíroval i kód, ve kterém jsem pouze upravil odkazy na jinak se jmenující TabControl.

Vše fungovalo bezvadně, dokud jsem si nevšiml že po zkompilování a až následné úpravě kteréhokoliv prvku formuláře se mi vygenerovaly všechny události, které jsem používal v programu a neměli specifikovanou signaturu. Tady pak samozřejmě došlo i ke konfliktu, kdy jsem spouštěl proceduru událostmi s různou signaturou.

Poté jsem tedy zkoušel čím toto mohlo nastat.

Vytvořil jsem nový projekt, na formulář jsem umístil 3 objekty (klasicky vybrat z toolboxu a kliknout).

Button1 - přímo na formulář

TabControlF - přímo na formulář

Button2 - na "kartu" TabControluF

Vlastnosti samotného TabControlF jsem nijak neupravoval, viz:

Public Class TabControlF
    Inherits TabControl

End Class

Vytvořil jsem jednoduchou událost a u této události jsem schválně umazal signaturu.

    Private Sub Button1_Click() Handles Button1.Click
        MsgBox("kuk1")
    End Sub
    Private Sub Button2_Click() Handles Button2.Click
        MsgBox("kuk2")
    End Sub

Po zkompilování a následné úpravě kteréhokoliv prvku formuláře se mi vygenerovalo:

    Private Sub Button1_Click() Handles Button1.Click
        MsgBox("kuk1")
    End Sub
    Private Sub Button2_Click() Handles Button2.Click
        MsgBox("kuk2")
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click

    End Sub

Můj dotaz byl směřovaný zda jde tomuto "generování" nějakým způsobem zabránit. Pokud ne, musím samozřejmě na proceduru odkazovat tak jak jsem již napsal v některém z dřívějších příspěvků.

Omlouvám se, že to takhle obepisuji, ale opravdu nevím jak to napsat krátce. To je taky důvod proč jsem nedokázal sepsat pořádně původní dotaz, sám jsem se v tom pěkně zamotal :)

Jako opravdový začátečník jsem pravděpodobně přehlédl/nedodržel nějaké jednoduché základní pravidlo, proto vznikl tento dotaz.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Plete si hodinky a holínky!

Jedna věc je volat vlastní proceduru pomocí různých handles různých prvků (to jde) a úplně jiná věc je předělávání zabudovaných událostních procedur (to nejde! - a k čemu by to bylo?)

Tím, že odeberete parametry "Button1_Click", vytvoříte v podstatě novou vlastní proceduru, ale s vadným jménem. A to vlastně ani nechcete. Uvedl jste přece, že chcete takto volat "Private Sub Prepocet() ", a jako příklad demonstroval na "Private Sub Test()". To že do vlastní procedury dáte "...Handles Button1.Click" nemá nic společného s

  Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    '....
  End Sub 

"Button1_Click" v kódu nepotřebujete, chcete přece volat "Prepocet()", ne? A pokud do kódu dáte i kompletní! "Button1_Click", provede se po kliku jako první a potom vaše vlastní procedura s "Handles Button1.Click".

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

No tak ujišťuji vás, že výše zmiňovanou hovadinu by Visual Studio ani nepřeložilo, protože TextChanged má opět zcela jinou signaturu než prostá metoda bez parametrů (a to ani při použití late bindingu u typu Object). Takže přestaňte lhát a akceptujte fakt, že metoda napojená na událost musí přesně odpovídat její signatuře.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Myslím, že tazatel má na mysli:

  Private Sub Test() Handles Button1.Click, TextBox1.TextChanged        
    MsgBox("kuk")
  End Sub

což se signaturou "Button1_Click" ani s "TextBox1_TextChanged" nemá nic společného

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Vy si můžete s tazatelem podat ruce, máte vůbec ponětí, co znamená klauzule Handles a jaké jsou podmínky jejího použití? Nehádejte se o něčem, o čem nevíte ani ten prd, protože pak jste za debila i těm méně zkušeným. To platí i o vašem předchozím příspěvku z 3.1.2012 18:42, který je taková snůška hovadin, že jsem ho ani nedočetl.

Samozřejmě že na signatuře (zjistěte si někde co to vlastně je) události Click (případně TextChanged) je to plně závislé a z toho důvodu to nepůjde ani přeložit.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Hmm... zajímavé. Vy tedy tvrdíte že (kromě toho že to je celé špatně) tento zápis ani nebude fungovat ?:

Private Sub Zmena() Handles Button1.Click, _
                            TextBox1.LostFocus, _
                            CheckBox1.CheckedChanged, _
                            TextBox2.TextChanged, _
                            ComboBox1.SelectedIndexChanged
MsgBox("kuk")
End Sub

Kombinuji prvky s různou signaturou a pomocí klauzule Handles spouštím proceduru.

Přestože tvrdíte že to nepůjde ani přeložit (zkompilovat ?), mě to funguje/fungovalo celkem bez problémů.

Problém nastal až ve výše uvedeném případě.

Používám Visual Studio 2010 Express, ale nemyslím si že by se to v jakékoliv profesionálnější verzi chovalo jinak (pouze odhad mého selského rozumu).

Jinak děkuji neregistrovanému uživateli že se alespoň snaží pochopit můj problém.

Pane Linhart Vám již děkuji méně. Kdyby jste alespoň navrhnul jak je to správně, místo aby jste pouze opakoval jak je vše co děláme a jak to chápeme špatně :(

Jako začátečník jsem vznesl dotaz s úmyslem se dozvědět jak problém vyřešit tak, aby to bylo správně a fungovalo. Od Vás jsem se zatím pouze dozvěděl že všechno co dělám je špatně, ale konkrétní řešení jste zatím nenavrhnul.

Budu se asi muset zaměřit na některé méně profesionální fórum, kde mé dotazy nebudou urážet hrdost a um profesionálů :)

S pozdravem a přáním všeho nejlepšího do nového roku

Sari

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Soudím, že tento web je vysoce profesionální včetně fóra, ve kterém se účastní lidé s nejen znalostmi a zkušenostmi, ale současně i vstřícní a přátelští, kteří nemají potřebu se povyšovat anebo si léčit mindrák - nesuďte podle jednoho, byť jistě profesionála (tím hůře).

Souhlasím, že profesionál by mohl poradit, ne soudit, hanit a chytat se za hlavu.

Nehádám se, nelžu: uvedl jsem jen to, co mi funguje a byl jsem napaden. Přitom argumentace signaturou je buď mylná anebo signatura není tak strikní, když funguje pomocí handles vyvolaná obslužná procedura jak s parametry typu "System.Object" a "EventArgs", tak bez parametrů. Rozdíl mezi signaturou při použití "Handles Button1.Click, TextBox1.TextChanged" a současně nevadí při ladění, při překladu a ani při běhu EXE.

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

Speciálně kvůli tomuto příspěvku jsem si nainstaloval Visual Studio 2010 (normálně používám 2008), abych vyzkoušel, jestli toto náhodou není jinak než ve verzi 2008. JE. Pro zjednodušení psaní kódu lze mapovat metody s prakticky libovolnou signaturou na libovolné události a kompilátor potom automaticky vygeneruje Lambda metodu s odpovídající signaturou. Toto jsem nevěděl, protože jak už jsem říkal používám 2008/3.5, kde je to přesně tak, jak jsem psal. Každopádně zmínka o použití verze 2010 byla uvedena skoro až úplně na konci, takže se nelze divit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Neuváděl jsem žádnou verzi. Že něco nemáte nebo neznáte, nevylučuje jeho existenci.

Co vás opravňuje k jednání, které jste předvedl? A znáte slovo "omluva"?

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Příště napište použitou verzi rovnou a bude to hned jasné. Omlouvat se není za co.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Neznalost druhých neomlouváte a tvrdě napadáte:Člověče naučte se alespoň ty naprosté základy!

Takže přestaňte lhát a akceptujte fakt, že metoda napojená na událost musí přesně odpovídat její signatuře.

Nehádejte se o něčem, o čem nevíte ani ten prd, protože pak jste za debila i těm méně zkušeným. To platí i o vašem předchozím příspěvku z 3.1.2012 18:42, který je taková snůška hovadin, že jsem ho ani nedočetl.

Ve skutečnosti šlo o vaši neznalost! Omluva by se za mylné soudy a napadání slušela! Že neznáte současné VS je vaše chyba.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Současné VS samozřejmě znám, nedělám v něm z důvodu chybějící podpory pro vývoj na mobilní zařízení. Prasárny typu napojení metody na událost s jinou signaturou jsem nikdy nedělal a proto mě ani nenapadlo, že by to mohlo jít.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback