Všemožné problémy aneb ať nemusím pořád zakládat nová vlákna – Visual Basic – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Všemožné problémy aneb ať nemusím pořád zakládat nová vlákna – Visual Basic – Fórum – Programujte.comVšemožné problémy aneb ať nemusím pořád zakládat nová vlákna – Visual Basic – Fórum – Programujte.com

 

Keny0
Návštěvník
24. 2. 2010   #1
-
0
-

Pisu ve VBA (pod Excelem 2003).

Pokud sem napisu nejaky kod kde mam s necim problem, tak me zajma samozdrejme hlavne jeho reseni, ale rad budu i za
opravu necoho, co na nej zadny vliv nema, ale proste se vam jen pri koukani na neco takoveho sviraji pesti (rozumej jde to
napsat lepe).

Mam problemek s prebiranim objektu z Wordu (makro se spousti v Excelu). Prebrat chci vlastni obsah stranek (jen "hlavniho
bloku" zapati, zahlavi a kdovico tam je jeste me nezajma). Prebrani funguje, ale zda se me byt nezkutecne pomale - presneji
zpocatku prebira jednu stranu snad minutu a v 30%-40% poctu stran se zrychli na nekolik sekund.
Takze co nechapu: a) Co se deje zpocatku (vytizeni procesoru 100%)?
b) Pokud zpocatku dam focus na Word (spustim makro v Excelu a pak kliknu na
Word) a v nem dojedu na konec dokumentu, opet se prebirani stran zrychli
na par vterin.

trochu to zkratim, takze kodu predchazi
Dim stranky As Word.Pages
Dim stranka As Word.Page
Dim odpocet As New Doba_trvani
...
Set stranky = app_word.Documents(1).ActiveWindow.Panes(1).Pages



i_stranky = -1
stranek = stranky.Count
neni = stranek
procento = 100 / stranek
ReDim p_stranky(stranek - 1)
odpocet.Caption = "Odpočet přebírání stránek z Wordu"
odpocet.Show 0

For Each stranka In stranky
i_stranky = i_stranky + 1
p_stranky(i_stranky).strana = i_stranky + 1
pocet = stranka.Rectangles.Count

If pocet > 0 Then
If pocet = 1 Then
p_stranky(i_stranky).i_radky = stranka.Rectangles(1).Lines.Count - 1
Set radky = stranka.Rectangles(1).Lines
Else
j = stranka.Rectangles(1).Lines.Count
idx = 1
For i = 2 To pocet
k = stranka.Rectangles(i).Lines.Count
If j < k Then
j = k
idx = i
End If
Next i
p_stranky(i_stranky).i_radky = stranka.Rectangles(idx).Lines.Count - 1
Set radky = stranka.Rectangles(idx).Lines
End If

ReDim p_stranky(i_stranky).radek(p_stranky(i_stranky).i_radky)
For k = 0 To p_stranky(i_stranky).i_radky
p_stranky(i_stranky).radek(k) = radky(k + 1).Range.text
Next k
End If

neni = neni - 1
je = je + 1
cas = ((Timer - cas_start) / je) * neni
procent = je * procento
odpocet.cas = Vteriny_na_cas(CLng(cas))
odpocet.procent = Round(procent, 2)
odpocet.Repaint
Next

odpocet.Hide
Set stranky = Nothing
Set stranka = Nothing
Set radky = Nothing
If zavrit = True Then app_word.Quit
Set app_word = Nothing

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
25. 2. 2010   #2
-
0
-

Bohužel toto je další věc po nepřesných desetinných číslech, se kterou se musíš smířit. Možná máš v tom programu nějakou chybku (žádnou sice nevidím), která to třeba i více brzdí, ale spíše jde o princip. To, že tahání dat z Wordu do Excelu přes makro je pomalé, je dáno jednak Visual Basicem a pak také OLE (COM) Automation. Intepretovaným jazykem provádíš příkazy, které přes RPC pasírují data z jedné aplikace do druhé. Než se přes IDispatch přežvejkají všechny parametry, najde se správná funkce, která se má zavolat ... Prostě to není jako když zavoláš v Cčku funkci. Každá operace bude trvat několikanásobně dlouho dobu.

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
25. 2. 2010   #3
-
0
-

Chapu ze to muze trvat (takze je mnohem rychlejsi spustit Word, dat ctrl+A a v Excelu ctrl+V), ale proc to chvili bezi pomalu a najednou 100x rychlejs... Toto by se teda tim, ze ma moc prace s tim prezvejkanim, dalo vysvetlit - jakmile s tim skonci probiha makro rychle nez kdyz dela jeste neco zaroven, nicmene logicky by me prislo, ze me zadnou stranu neprebere dokud neprobehne Automation a vse kolem toho. Takze me prijde, ze to co tak pracne (a dlouho) pocita k tomu co ja potrebuju ani nepotrebuje... otazkou je tedy co se presne deje a jestli to nejde ovlivnit (pokud je to neco co nepotrebuji, tak to vypnout).
A to proc ma na to vliv, ze predam rizeni Wordu (+aspon se me zda, ze musim najet na konec souboru) uz si nedokazu vysvetlit vubec.

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
26. 2. 2010   #4
-
0
-

Z počátku se musí dělat inicializace (proxy/stub), prostě se musí "profouknout kanál". A následně se neustále musí převádět volání procedur ... marshaling (http://msdn.microsoft.com/en-us/library/ms692621%28VS.85%29.aspx).

To, že rychlost ovlivňuje kde co, tak tomu se nedivím. Excel rozhodně není na psaní real-time aplikací. A určitě ho lidi nevyhledávají kvůli rychlosti. Makra jsou tam z toho důvodu, aby bylo možné práci zautomatizovat. To, že je to vymyšlené tak, že se z Excelu dostaneš třeba do Wordu nebo do nějaké jiné komponenty (třeba i svojí), tak to je přece báječné. A že to je to pomalé jaxviňa? Ale nemusíš to dělat všechno znovu ručně.

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
26. 2. 2010   #5
-
0
-

Existuje teda jine (rychlejsi) reseni, pokud mam vstupni data ve Wordu a vystup potrebuju v Excelu?

Nahlásit jako SPAM
IP: 83.208.251.–
liborb
~ Redaktor
+18
Guru
26. 2. 2010   #6
-
0
-

Můžeš to zkusit udělat v C++ (nebo jiného jazyka, třeba Python), ale bude to řádově pracnější (např. http://support.microsoft.com/kb/216686). Pokud s tím němáš zkušenosti, tak to ani není nic k doporučení. A rozhodně není jisté, jestli to bude o tolik rychlejší :smile11: . Jak jsem psal, v tomto případě nejde o rychlost, ale o snadnost. Stačí pár řádek makra v Excelu a funguje to. A daň, která se z toho platí, je právě ta rychlost.

A pak je tu ještě jiná možnost, změnit formáty. Třeba přes XML. Z wordovského dokumentu udělat třeba WordML a přes XSLT vytvořit jiné XML, které načte Excel. To by mohlo být i rychlé, ale vytvoření XSL souboru pro neznalého taky není záležitost na hodinku.

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
17. 3. 2010   #7
-
0
-

Kam se standardne umistuje vytvoreni objektu nejake tridy? Do tridy samotne (jako sub, function, property..?), nebo spis do
standardniho modulu? Chtel bych, aby to slo pak pouzivat takto: set a = Vytvor(parametry...), ale to jde jen pokud to napisu jako
funkci v nejakem standardnim modulu. Pokud bych to napsal v tride samotne, tak funkci musim volat pres objekt tridy:
set a = objekt.Vytvor(parametry...) coz se me moc nelibi, stejne jako: Call objekt.Vytvor(parametry...) v pripade, ze to mam jako
Sub v tride. Tak jestli to jde nejak lip, nebo se to musi opravdu cpat mimo tridu.

Nahlásit jako SPAM
IP: 84.244.114.–
Keny0
Návštěvník
17. 3. 2010   #8
-
0
-

* Editace me nefunguje a pokud neco na forum vlozim odjinud, tak asi editor, ve kterem se pisou prispevky nemaze znak konce radky, nebo nevim proc se to takhle rozplizne.

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
18. 3. 2010   #9
-
0
-

Kam se standardne umistuje vytvoreni objektu nejake tridy?



Odpověď zní tam i tam. Záleží na okolnostech. Častěji se používá způsob mimo třídu, ale někdy je výhodné, aby třída tvořila svoje instance sama (což ale asi nebude tvůj případ). A pokud ti nějaký způsob nevyhovuje a jiný ano a je funkční, tak ho používej :smile1: .

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
18. 3. 2010   #10
-
0
-

A jak vytvorit kopii tridy jinak nez kopirovanim vlastnosti?

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
19. 3. 2010   #11
-
0
-

Pokud se nepletu, tak ve VB už nijak. Stejně nejlepší (a asi i nejsprávnější) cestou je kopírovací konstruktor.

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
19. 3. 2010   #12
-
0
-

Konstruktor jsem videl naposled kdysi davno v Ccku, nemas odkaz jak to ma vypadat?

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
19. 3. 2010   #13
-
0
-

Ty to vlastně píšeš v Excelu, že? Tam zapomeň i na tuto možnost, je tam pouze implicitní konstruktor (událost) Class_Initialize(). Takže jedině kopírování atributů.

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
19. 3. 2010   #14
-
0
-

Kopirovani pomoci API by neslo? Ikdyz pokud by to bylo pomalejsi, nez kopirovanim atributu, tak to asi stejne pro me nema vyznam.

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
19. 3. 2010   #15
-
0
-

V API není žádná podpora pro "kopírování tříd". Maximálně kopírování bloku paměti, ale používat to ve VB(A) ... :smile13:

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
19. 3. 2010   #16
-
0
-

kopírování bloku paměti.. Jo to jsem myslel.

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
19. 3. 2010   #17
-
0
-
Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
19. 3. 2010   #18
-
0
-

V cem je teda problem, nebo co je na tom spatneho, ze jsi psal :-[ ?

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
19. 3. 2010   #19
-
0
-

Původně jsem měl za to, že dostat se k pointerům bude ve VBA problém. Ale jak je vindo zříti :smile1:

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
4. 6. 2010   #20
-
0
-

Ted resim, jak vytvorit cokoliv (sub, fce, property) Friend. Problemem po zmene z Public/Private na Friend je Late Bounding.

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
4. 6. 2010   #21
-
0
-

A můžeš se o to tvém problému více rozepsat? Chybí ti dispinterface nebo co?

Nahlásit jako SPAM
IP: 195.189.143.–
Keny0
Návštěvník
4. 6. 2010   #22
-
0
-

Z Private procedury class modulu, chci zavolat Friend proceduru z jine tridy (ve stejnem projektu). Po spusteni to hodi chybu:

Object doesn't support this property or method (Error 438)

Not all objects support all properties and methods. This error has the following cause and solution:

You specified a method or property that doesn't exist for this Automation object.
See the object's documentation for more information on the object and check the spellings of properties and methods.

You specified a Friend procedure to be called late bound.
The name of a Friend procedure must be known at compile time. It can't appear in a late-bound call.


Pripadne sem hodim nakej kod, pokud z toho nejde poznat o co me jde.


Nahlásit jako SPAM
IP: 83.208.251.–
liborb
~ Redaktor
+18
Guru
7. 6. 2010   #23
-
0
-

Asi nejdůležitější věta je dle mě tato: You specified a method or property that doesn't exist for this Automation object. Jinak řečeno, to co voláš není součástí (duálního) rozhraní - volané přes IDispatch. Bez kódu to asi nepůjde, takový šílenosti :smile1: jsem ještě ve VBA netvořil.

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
9. 6. 2010   #24
-
0
-

Ja bych prave cekal, ze na me se vztahuje:
You specified a Friend procedure to be called late bound.
The name of a Friend procedure must be known at compile time. It can't appear in a late-bound call.

Protoze, kdyz tu Friend proceduru zmenim na Public nebo Private, tak bez problemu zavolat jde, kompilator chodi chybu viz vyse jen pokud je ta sama procedura Friend. Navic v tom co ted delam zadnej automation object aspon vedome nepouzivam.

Nahlásit jako SPAM
IP: 84.244.114.–
Keny0
Návštěvník
9. 6. 2010   #25
-
0
-

Na zaklade toho co jsi psal, jsem zkusil zavolat proceduru jinak nez z indexu kolekce (collection) objektu a to chybu nehodi ani pokud je volana procedura Friend. Takze jestli je mozny ze automation se pouziva pri pouzivani kolekci... Stejne ale nechapu proc mu to pri Public/Private nevadi...

Nahlásit jako SPAM
IP: 84.244.114.–
Keny0
Návštěvník
10. 6. 2010   #26
-
0
-

1) Dalsi problem s tridama - nelibi se mi, ze se private default property zobrazuji ve watches (sledovani promenych) a to i mimo tridu i mimo projekt. Ty private sledovani hodne zneprehlednuji, treba :

Private p_bod2d as point2d 'nejde public (user defined type)

Public Property Get bod2d(point As Point2d) As Point2d
point = bod2d
End Property


a ve watches mam oboji p_bod2d i bod2d.

2) Pro test programu ho spustim a sleduju, jestli je vse spravne, ale doba behu se porad prodluzuje a do nejakeho mista, do ktereho je program jiz odladeny, stejne nema opetovne spousteni smysl (vysledek se nemeni). Otazka zni, jak se vyhnout pocitani casti, ktera me nezajma a rovnou nacist jeji vysledek jako vstup pro cast co teprva ladim. Neco jako treba ulozit data do pameti (tak aby se zachovala i po zruseni debugu) a pak je jen nacitat.

Nahlásit jako SPAM
IP: 84.244.114.–
liborb
~ Redaktor
+18
Guru
10. 6. 2010   #27
-
0
-

add 1) Nečekal bych, že v Excelu budou takové vychytávky jako filtrace ve watches, ale možné je, že to tam někde je. NIkdy jsem to nepotřeboval, takže buď google nebo jestli neví někdo jiný.

add 2) Tak v paměti je těžko udržíš, ale na disku v souboru už to problém není. Říká se tomu serializace. Jak je to s podporou serializace ve VBA ti opět nepovím neb jsem to opět nikdy nepotřeboval.

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
10. 6. 2010   #28
-
0
-

add 1) Pak me teda zajma, jak jsou udelany treba tridy excelu, tam zadny private ve watches nevidim.

add 2) Kdysi davno, kdyz jsem neco tvoril v Ccku, tak tam myslim je operator new, kterej ulozi promenou tak, ze je v pameti i po ukonceni programu (dokud na ni neni pouzit operator na uvolneni pameti). Neco podobneho teda nejspis VB nema, ale neni treba ve win API nejaka pouzitelna funkce?

Nahlásit jako SPAM
IP: 83.208.251.–
liborb
~ Redaktor
+18
Guru
11. 6. 2010   #29
-
0
-

add 1) :smile11:

add 2) Alokovat paměť a ukončit program ... hmm ... to dostaneš toto: http://cs.wikipedia.org/wiki/%C3%9Anik_pam%C4%9Bti. Jediná (mě) známá možnost ukládání stavu je disk a je jedno, jestli je to soubor, register nebo něco podobného. Stejně tak dobře si to můžeš uložit do toho Excelovského souboru, ale paměť k tomuto ohnout nelze resp. uložit si adresu pointeru a očekávat, že při dalším spuštění na té adrese budou opět moje data .... to je cesta do :smile20: . Leda bys měl aplikaci, která by ty mezivýsledky spravovala a měla je uložené třebas v paměti, ale ta taky musí běžet stále.

Nahlásit jako SPAM
IP: 85.207.166.–
Keny0
Návštěvník
24. 10. 2010   #30
-
0
-

Pro zmenu me trapi objekty, mam treba tridu Cara, napisu kod:

Dim oo as Cara
Dim cc as new Collection

cc.add new Cara
Set oo=cc(1)
cc.Remove(1)

A ted nechapu na co ma referenci objekt oo, kdyz objekt cc(1) uz neni v kolekci. Vubec mam chaos v tom na co je vlastne dobry operator NEW. Podle me, by mel alokovat pamet pro novy objekt a pokud tedy neni pouzit, tak se objekt pouze odkazuje na jiny objekt. Ale..

Dim o1 as new Cara
Dim o2 as new Cara

Set o2=o1

Coz ale opet vytvori pouze referenci (problem je asi ve VBA, ze nedokaze kopirovat objekty). Ale ve vysledku je tedy kazdy objekt ulozeny v pameti, nebo je ulozen pouze jeden a druhy objekt je jen ukazatel na prvni stejne jako kdybych o2 pouzil bez NEW?
Je tedy mozne, ze se v prvnim pripade po odmazani alokovaneho objektu stane z puvodni reference objekt, jako kdyby byl deklarovan s operatorem NEW?






Nahlásit jako SPAM
IP: 83.208.251.–
liborb
~ Redaktor
+18
Guru
26. 10. 2010   #31
-
0
-

Reference je reference a nový objekt je nový objekt. Každý objekt si počítá počet referencí, které na něj vedou a pokud klesne na 0, tak se smaže. Pokud chceš nový objekt, tak vytvoř nový objekt, pokud chceš pracovat se stávajícím, tak předej referenci.

Nahlásit jako SPAM
IP: 78.80.52.–
Keny0
Návštěvník
27. 10. 2010   #32
-
0
-

Viz vyse, proste vytvorim objekt, udelam na nej referenci a pak objekt smazu, ale reference stale funguje, tak se ptam jak je to mozny. Jak pises, tak asi proto, ze ikdyz ho odstranim, tak v pameti zustane, prestoze promenna, ve ktere byl puvodne ulozen jiz obsahuje jiny objekt nebo vubec neexistuje? Takze "nazivu" ho drzi reference a ne promenna?

Nahlásit jako SPAM
IP: 83.208.251.–
liborb
~ Redaktor
+18
Guru
27. 10. 2010   #33
-
0
-

Zjednodušeně řečeno takto: když vytvoříš objekt, tak do proměnné se ti dostane zase jen reference (objekt má počet referencí 1). Když přidáš další referenci, tak je počet 2. Zrušíš původní a má referenci 1, takže ho opravdu drží při životě ta druhá reference. A k těm tvým příkladům:

Dim o1 as new Cara 

Dim o2 as new Cara

Set o2=o1
Založíš objekt, pak druhý a pak z jednoho předáš referenci na druhého, takže ta původní jde do kytek i s objektem (počet referencí je 0). Výsledkem je to, že bys měl mít jeden objekt a na něj 2 reference.

V tom případě by to mělo být tak, že v kolekci sice už není (reference), ale drží ji ta proměnná, takže objekt by měl existovat.

Nahlásit jako SPAM
IP: 78.80.52.–
Keny0
Návštěvník
7. 11. 2010   #34
-
0
-

Chtel bych vedet jak (pokud to jde), jde udelat toto:
Ze souboru se nactou nejaka data, minimalne jedna polozka a muze jich byt vicemene libovolne (ikdyz nepredpokladam ze jich bude vic nez 100). A ted bych potreboval, aby se tyto polozky volaly z objektu pod ktery patri jejich jmenem - to jmeno je taky v souboru co se nacetl. Chci tedy aby se volaly objekt.jmeno_ze_souboru.

Nahlásit jako SPAM
IP: 83.208.251.–
Keny0
Návštěvník
17. 2. 2011   #35
-
0
-

Druha vec je, jestli jde ve VBA vytvaret neco jako tusim sablony v C, abych nemusel porad kvuli kazdemu datovemu typu delat jiny kod nebo jiny datovy typ, tak jestli neexistuje jina moznost.

Nahlásit jako SPAM
IP: 83.208.251.–
nervak0
Věrný člen
17. 2. 2011   #36
-
0
-

Možná by stačilo použít pro všechno typ Variant.

Nahlásit jako SPAM
IP: 213.211.51.–
Keny0
Návštěvník
18. 2. 2011   #37
-
0
-

To by samo stacilo, ale snazim se to co delam udelat aspon trosku rychle, takze se snazim pouzivat nejmin narocne typy. Tak pokud by to slo i jinak...

Ale spis me trapi ta vec vyse...
Coz by vyresilo treba :

type pole
pole() as nejaky_objekt
end type

dim a() as pole 'ted bych potreboval tem jednotlivym polim priradit jmeno, primo asi tezko, ale treba
'jen, aby se to jmeno, ktere ziskam az za behu, odkazovalo na nejaky index pole

Podobne neresitelny je to s kolekci:

dim a as new collection

a.add new collection 'sice by kolekce kolekci resila to co chci, ale opet nedokazu jednotlive kolekce
' volat objekt.a.jmeno. ale jen objekt.a.item(..)




Nahlásit jako SPAM
IP: 83.208.251.–
nervak0
Věrný člen
18. 2. 2011   #38
-
0
-

ale opet nedokazu jednotlive kolekce volat objekt.a.jmeno. ale jen objekt.a.item(..)

A čemu to vadí?

Nahlásit jako SPAM
IP: 213.211.51.–
Keny0
Návštěvník
19. 2. 2011   #39
-
0
-

No chci neco udelat viz vyse, neco vymyslim a ptam se jestli to nejde lepe... Treba pouziti trech do sebe vnorenych kolekci, je to hodne neprehledne oproti zapisu, ktereho bych chtel docilit (pro uzivatele tridy), neni z toho vubec patrne co se vubec vola. To uz to asi radsi udelam jako funkci...

dim a as collection
set a=objekt.typKolekce("jmeno") 'nicmene pokud se kouknu do Watches jak se jednotlive kolekce vetvi
' bude tam porad stejny chaos collection a item, ktery jen tak nekdo
' nepobere

Nahlásit jako SPAM
IP: 83.208.251.–
nervak0
Věrný člen
19. 2. 2011   #40
-
0
-

chci neco udelat viz vyse

Kdyby něco z toho dávalo smysl, tak se neptám :)

asi radsi udelam jako funkci

Bingo!

bude tam porad stejny chaos

Jaké si to uděláš, takové to máš...

Nahlásit jako SPAM
IP: 213.211.51.–
Keny0
Návštěvník
20. 2. 2011   #41
-
0
-

Neni na to kdyz poradi nekdo jako ty

Nahlásit jako SPAM
IP: 83.208.251.–
nervak0
Věrný člen
20. 2. 2011   #42
-
0
-

No jo, já jsem nervák :) Ale nevím, co jsi jako čekal. Ve VBA šablony nejsou, proměnné za běhu deklarovat nejdou. Variant není zas tak pomalý, když ho nepoužíváš jako prase. Složité struktury si udělej jednodušší a/nebo napiš pomocné funkce. Telepatii nezvládám, víc poradit nemůžu, snad ještě to, že pro účely "asociativního pole" je lepší Dictionary, hotovo.

Nahlásit jako SPAM
IP: 213.211.51.–
Keny0
Návštěvník
20. 2. 2011   #43
-
0
-

Stacilo rict ze to lip nejde, ze VBA na to nic nema, coz v odpovedi co si psal predtim neni. Znam z VBA jen neco malo, tak nevim jestli nekdo, kdo to ma prosle nezna odpoved na moje problemy ve stylu pouzij "...". nebo na todle VBA nic nema.

Nahlásit jako SPAM
IP: 83.208.251.–
Keny0
Návštěvník
20. 2. 2011   #44
-
0
-

Napadla me jeste silena moznost, ono jde myslim psat makrem jine makro, takze teoreticky, kdyby se nacetli data a podle nich napsalo makro promenne a pak ten kod spustilo... ale to je asi moc slozity :(

Nahlásit jako SPAM
IP: 83.208.251.–
montir0
Duch
21. 4. 2011   #45
-
0
-

liborb napsal:
Zjednodušeně řečeno takto: když vytvoříš objekt, tak do proměnné se ti dostane zase jen reference (objekt má počet referencí 1). Když přidáš další referenci, tak je počet 2. Zrušíš původní a má referenci 1, takže ho opravdu drží při životě ta druhá reference. A k těm tvým příkladům:

Dim o1 as new Cara 
Dim o2 as new Cara

Set o2=o1
Založíš objekt, pak druhý a pak z jednoho předáš referenci na druhého, takže ta původní jde do kytek i s objektem (počet referencí je 0). Výsledkem je to, že bys měl mít jeden objekt a na něj 2 reference.

V tom případě by to mělo být tak, že v kolekci sice už není (reference), ale drží ji ta proměnná, takže objekt by měl existovat.



Ve VB pokud objekt nesmažeš
Set o2 = Nothing
tak bude existovat v paměti stále i když nemá reference

Nahlásit jako SPAM
IP: 85.71.88.–
normál
montir0
Duch
21. 4. 2011   #46
-
0
-

Keny napsal:
To by samo stacilo, ale snazim se to co delam udelat aspon trosku rychle, takze se snazim pouzivat nejmin narocne typy. Tak pokud by to slo i jinak...

Ale spis me trapi ta vec vyse...
Coz by vyresilo treba :

type pole
pole() as nejaky_objekt
end type

dim a() as pole 'ted bych potreboval tem jednotlivym polim priradit jmeno, primo asi tezko, ale treba
'jen, aby se to jmeno, ktere ziskam az za behu, odkazovalo na nejaky index pole

Podobne neresitelny je to s kolekci:

dim a as new collection

a.add new collection 'sice by kolekce kolekci resila to co chci, ale opet nedokazu jednotlive kolekce
' volat objekt.a.jmeno. ale jen objekt.a.item(..)






Vytvoř si kolekci jako novou třídu a přidej Key. Potom se odkazuj : MáKolekce(NazevPolozky).Nevimco, Item nemusí být nutně číslo.

Nahlásit jako SPAM
IP: 85.71.88.–
normál
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý