Lze dynamicky doplnit argumenty při vytváření instance třídy?   otázka

VB.NET

Dobrý den,

nejdříve musím poděkovat, zejména za práci, kterou si autoři webu nadělili a za sdílejí svých vědomostí.Dík.Programuji občasně, když není zbytí, tak se vždy po čase znovu učím. QBASIC, VB do verze 6 a nyní, po delší době VB.NET VS 2008.

Myslím, že se standardními věcmi si poradím, ale narazil jsem na jeden problém a než ho prohlásím za neřešitelný, rád bych se v jeho neřešitelnosti utvrdil.

O co jde?

K dispozici mám zkompilovanou DLL Class (Framework 2.1), u které je zásadní, že vyvolává událost.

Omezení je v tom, že argumenty se předávají již při vytvoření instance:

Imports NDde.Client

Public Class MainForm
    Private WithEvents client As New DdeClient("excel", "sheet1", Me)

    Private Sub ....

Hodnoty argumentů, ale neznám při psaní kódu, jsou dynmické a načítají se až za běhu programu.

Zkoušel jsem najít informace po netu, zkoušel jsem různá řešení, ale na nic jsem nepřišel. (Navíc, instancí "client" mohou být stovky, ale už jsem se smířil s faktem, že v této verzi VS mi indexy nepomohou.)Poznámka:

K uvedené DLL existuje zdrojový kód v C#.NET. Doplnění DLL určitě je cesta, ale to je až záložní řešení.

Tedy otázka:

Lze nějakým způsobem dynamicky doplnit argumenty při vytváření instance třídy, když vyžaduje výše uvedenou syntaxi?

Budu rád i za odpověď, že toto vyřešit nelze.

Případné doplňující informace rád poskytnu.

Dík předem za odpověď.

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

1. Indexy komponent sice ve VB.NET nejsou, ale můžete to vyřešit tak, že si uděláte pole komponent a nainicializujete je For cyklem ručně ve Form_Load nebo v konstruktoru formuláře. Akorát už nebudete mít krabičky na formuláři, i když osobně považuji nevizuální komponenty za přežitek.

2. Doplnit argumenty resp. spíš hodnoty vlastností při vytváření instance jde novou syntaxí Visual Basicu, která se objevila ve verzi 9 (tedy ve VS 2008).

Private WithEvents client As New DdeClient("excel", "sheet1", Me) With { .Vlastnost = hodnota, .Vlastnost2 = hodnota }

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

Ou. Díky. Jdu zkoušet ....

ad 1.

For cyklem, nebo jinak je skoro jedno, pokud to stejně bude "ručně".

ad 2.

Tak tohle jsem nepobral. Argumenty, resp. hodnoty nelze nastavit jinak, než při vytváření instance.

Co řeší přidání "With(Set ...)"?

_

"Krabičku" na formu nemám ani jednu, ale pamatuji si na ně. :)

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

Proč nemůžete vytvořit instanci třídy a její události přiřadit delegáty až v momentě, kdy máte k dispozici příslušné parametry?

Parametry uvedené ve složených závorkách je jenom syntaktické ulehčení pozdějšího nastavení vlastností. Kompilátor to vyřeší nastavením těchto vlastností v konstruktoru příslušné třídy.

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

Proč nemůžete vytvořit instanci třídy a její události přiřadit delegáty až v momentě, kdy máte k dispozici příslušné parametry?

To bych také rád věděl. Domnívám se, že po předání páru hodnot proběhne v Client inicializace vnořené třídy a hodnoty už nelze změnit.

Cituji: 'Set' accessor of property 'Service' is not accessible.

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

Pokud to hlásí tohle, tak vlastnost Service prostě nastavit nemůžete.

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

Jasně.

Jestli tomu rozumím dobře, tak v tomto případě nelze hodnoty zadat jinak, než při vytváření instance?

Doplnění závěru:

Jelikož v tomto případě instanci s WithEvents nelze vytvořit jinde než v deklaraci a vzhledem k tomu, že do části "Deklarace" nelze doručit hodnoty z jakékoli proměnné, nelze dynamicky doplnit argumenty při vytváření třídy.

Pokud by někdo nesouhlasil, bud rád za popsání důvodů.

V každém případě děkuji za pomoc.

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

Prostě nevytvářejte globální instanci hned v deklaraci, ale až později kdy to bude potřeba (to už budete mít k dispozici potřebné parametry). Co je na tom složitého?! Řekl bych, že jediný problém je, že nevíte že se dá handler události připojit i dynamicky pomocí AddHandler a ne jen deklarativně pomocí WithEvents...

To že některá třída vyžaduje inicializační parametry v konstruktoru a tyto později nelze změnit je zcela běžné, ve Frameworku je takových věcí většina (říká se tomu Immutable Object).

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

Nevěděl jsem, pravda.

Rada dobrá, pak už jen dohledat ...

Nakonec to tak složité nebylo.

Dík.

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