Přenos hodnoty proměnné   otázka

VB6/VBA

Prosím o radu, jsem začátečník a mám problém s přenosem hodnot proměnných mezi jednotlivými formuláři. Pro deklaraci jsem použil v GENERAL - DEKLARATION příkaz Public a stejně v dalším programu jiného formuláře proměnná má hodnotu nula ( hodnota se nepřenese ). V původním (prvním formuláři, kde proměnná je deklarována a načtena hodnotou je vše OK.

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

Píšete že jste začátečník, podle kategorie kam jste příspěvek zařadil se tedy učít VB 6 nebo to je jenom překlep? Pokud to překlep není, doporučuji se spíše věnovat novejší verzi VB (samozřejmě pokud nemáte nějáké závažné důvody se učit VB 6)

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

Pokud deklarujete hodnotu jako Public ve formuláři, tak se pochopitelně dá využít i mimo tento formulář za předpokladu, že

a) Ten původní formulář je instancován a nahrán

b) Hodnota té proměnné je přiřazena.

Ještě by Vás mohlo zajímat:

a) Public proměnné v modulech

b) Nahrazení proměnných vlastnostmi - výhody a nevýhody.

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

Ad a) Potom ale musí volající kód vidět tuto instanci formuláře, nebo tato proměnná musí být statická.

Ad b) Není pravda, hodnota být přiřazena nemusí. U hodnotových typů provede výchozí inicializaci kompilátor a u referenčních bude mít hodnotu Nothing (null).

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

Hodnota public na formuláři bude přece vidět pouze pokud je tento formulář iniciován a a to ještě za podmínky, že se přes form na něj odvolám. Jinak obecně public pro všechny formy vždy v modulu (tzn. přidat modul a do něho vložit proměnou public)

Modul:

Public Radim as byte

Ve formu1

Radim=1

Ve formu2

Radim=2
msgbox(Radim)

) . Pokud ještě programujete ve vb6 tak pozor neplést si modul s modulem třídy (tam je public pouze pro instanci volané třídy a po její zavření nebo inicializaci z jiného místa je proměná nově vytvořena pro novou instanci (každá instance má svojí hodnotu proměné))

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

Další nesmysly. Již výše jsem uváděl, že pokud je proměnná statická, lze se na ní dostat i bez nutnosti vytváření instance dané třídy (formuláře). To je účel statické proměnné (vlastnosti, metody, atd.).

Pokud chcete sdílet data mezi různými třídami (formuláři), tak zveřejnit je v modulu je ta největší zhovadělost a porušení pravidel objektově orientovaného programování (zapouzdřenost), nehledě na to, že v případě přístupu z více vláken by bylo nutné zajistit synchronizaci. Pro sdílení dat mezi různými třídami slouží buď jejich veřejné členy (instanční, ne statické) nebo metodika zvaná Dependency Injection.

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

Jen připomínám že se pohybujeme v sekci vb6. Proto bych o vláknech radši ani nepsal. Kdyby už někdo chtěl jít do vláken ve vb6, tak by asi zkusil spustit nebo ukončit nové vlákno pomocí API, ale dopadl by kritickou chybou (jiné cesty skončí rozkousaným monitorem :) ). Buďme rádi že vb6 zvládal alespoň subclassing:)

Jinak statické proměné ve vb6 nejdou. Pouze "Static" lze označit deklaraci funkce nebo procedury.

Ondřeji nejspíš si už nevzpomínáš na šestku :) A taky nezapomínej, že původní tazatel je začáteční, tak mu tvoje rady budou na dvě...

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

Ještě jednu vychytávku. Pokud chcete, aby jiný form před jeho naloudováním získal hodnotu z jiného formu, pracoval s ní a pak ji upravenou vratil zpět, tak se dá použít:

Form2

Private Real_ID as long

Public Property Let Ziskani_Id(Id As Long)
  Real_ID=id
End Property

Public Property Get Vystup_ID() As long
        Vystup_ID = Real_ID
End Property

Private Sub Command1_Click()
        Real_ID=Real_ID+5
end sub

Na form 1 pak staci např. do commandu

with form2
  .ziskani_id=55
  .show 1 'Modálně jinak to fungovat nebude, protože nestačíme   změnit hodnotu real_id události click na Command1
  msgbox Vystup_Id
end with

Taky jedna z cest (tímto způsobem můžete obsloužit vstupni hodnotu Ziskani_Id při jejím získání z druhého formu (zjednodušeně) a také můžete hodnotu upravit při jejím výstupu Vystup_ID() apod.)

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

Tak opět jsem přehlédnul že se pohybujeme v oblasti VB 6.0 za což se omlouvám, já už totiž automaticky na všechno odpovídám po NETovsku. Moje předchozí tvrzení samozřejmě platí pro VB.NET. Na VB 6.0 jsem nezapoměl, ještě dnes se s ním vyjímečně setkávám v podobě VBA.

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

tento problém jsem kdysi ve VB 6.0 také řešil a to takto:

form2.prenasena_promena = form1.prenasena_promena

s tím že prenasena_promena byla v modulu deklarována pomocí Public

Vím, že to asi není nejlepší způsob, ale funguje to ;)

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

Děkuji mnohokráte - toto řešení je opravdu plně funkční - Dík

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

Není zač, rád jsem pomohl. :-)

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