Prosim, najde se nekdo kdo mi vysvetli tuto trivialnost ?   zodpovězená otázka

VB.NET

Dobry den Vsem,

jsem zacatecnik, delam muj prvni Outlook Addin a narazil jsem na problem volani kodu(nebo i nastavovani ovladacich prvku) z jine tridy(formulare).

Prosim, proc je:

me.button1.text - v poradku

ta sama trida.button1.text - neni v poradku. Reference to a non-shared member .

http://screencast.com/t/lKh6Hk16kv

Toto je jen modelovy priklad, ve skutecnosti mam stejny problem v jinem projektu, ale na tomto jsem to chtel ukazat. Tusim, ze bude problem nekde ve sdileni trid, ale vse je Public, tak nevim co delam spatne. Ve WinForms app mi to jede normalne jak jsem zbykly.

Dekuji, pokud se nekdo najde kdo by mi tuto neznalost objasnil.

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Me.Button1.Text = "ME"
        Form1.Button1.Text = "ME" 'Reference to a non-shared member requires an object reference.	L:\WinAppsByMe\OutlookAddIn1\OutlookAddIn1\Form1.vb	6	9	OutlookAddIn1

    End Sub
End Class
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jsou dva typy členů třídy (vlastnosti, metody, události) - instanční a statické. Aby bylo možné používat instanční členy, kterých je drtivá většina, musí se k nim přistupovat přes instanci dané třídy, nikoliv přes její název. Ke statickým členům se dá přistupovat bez nutnosti vytváření instance. Statické členy se používají pouze ve speciálních případech.

REM Použití statické metody
Form1.Show()

REM Použití instanční metody
Dim f1 As New Form1
f1.Show()

Zbytečné zveřejňování (Public) členů třídy je proti zásadám OOP, takže i ten Button1 by měl být Private a přístup k němu řešen jinak. Když toto opomenu, tak to bude fungovat takto:

Dim f1 As New Form1
f1.Button1.Text = "ME"

Uvědomte si, že instance f1 bude platná pouze tam, kde je definovaná, takže pokud to bude v nějaké metodě, která rychle skončí, skončí tím i platnost této instance (nebude možné s ní dále pracovat).

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

Přesně tak.

Ještě doplním, že důvodem proč vám ve WinForms funguje ten druhý způsob je ten, že kompilátor VB.NET vytvoří interní třídu MyProject+MyForms ve které je pro každý formulář vlastnost, která vytváří instanci daného formuláře.

V ní se pak se provede volání My.Forms.Form1.Button1.Text = ...

Už se to tu řešilo zde http://www.dotnetportal.cz/forum/tema/26....

Toto je specialita pouze formulářů a pouze ve VB.NET WinForms aplikacích, proto to takto není možné v Outlook Addin, kde se nic takového nevygeneruje.

Také píšete, že na to jste ve WinForms zvyklí, tak vám radím se to odnaučit používat, bude se vám tak v budoucnosti lépe přecházet na jiné jazyky a technologie.

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

Když mluvíte o sobě, taky si neříkáte jménem, ale mluvíte o sobě jako "já". Stejné je to i s formulářem. Formulář sám na sebe ukazuje slovíčkem "Me" a ne svým názvem "Form1".

Nehledě k tomu, že když se chcete odkazovat na tlačítko v e stejném formuláři, nemusíte "Me" použít vůbec...

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

Děkuji všem za trpělivé odpovědi. Asi se budu muset opět vrátit k nějaké teorii OOP a trochu to oživit. Děkuji !

nahlásit spamnahlásit spam 0 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