Autor Zpráva
Jan Mach
Profil
Windows 10, Office 13.
Ve formuláři (UserForm) v Excelu mám MS WebBrowser Control (dále WB), html-texty a obrázky (bitmapy, ikony) mám v knihovně DLL. Dostat text do WB samozřejmě není problém, ale obrázky, související s aktuálním textem ve WB, vkládám z DLL do formuláře nad WB; při změně stránky ve WB je musím ve formuláři aktualizovat.
Existuje nějaký rozumný (!), stručný a rychlý způsob, jak dostat obrázky z DLL přímo do WB? Musí to probíhat za chodu excelského makra v interakci s uživatelem, nelze to udělat před zobrazením formuláře uživateli. Mohu k tomu použít jen HTML, excelský Visual Basic for Applications a případně API funkce Windows (těch by ovšem nesmělo být moc, abych kvůli jednomu formuláři nevyrobil programové monstrum).
Nechci obrázky jeden po druhém z DLL vkládat do (třeba neviditelného) Image Control ve formuláři, z něj zapisovat na disk do dočasných souborů a v html-textu ve WB se na ně odkazovat; to mi připadá jako čiré zoufalství, navíc těch dočasných souborů by bylo neúrekom - až 150 současně.
Joker
Profil
Nešlo by je vložit přímo do stránky přes data URI?

Tj. načíst obrázek a pak vyrobit <img src="data:image/něco,data obrázku">
Jan Mach
Profil
Dík za nápad. Jazyk HTML pořádně neumím, tak si to
data:image/cosi
zkusím najít, třeba to k něčemu bude; v nejhorším se aspoň něco přiučím :-).

Bohužel, HTML neumí komunikovat s VBA, natož s objekty v excelských formulářích, takže mu jako src asi nejde nějak předložit Im.Picture (kde Im je image control ve formuláři).
Přímé jednoduché čtení bitmapu z DLL vrací jeho chňapku (můj překlad slova handle) a tu zaručeně HTML nedokáže přijmout.
Určitě jde číst bitmap z DLL jako anonymní data, chce to ovšem spoustu práce s funkcemi API (několika funkcemi si uzurpovat kus paměti pro všechny obrázky dané budoucí stránky ve WB a několika dalšími funkcemi do ní načist data) a výsledkem je adresa začátku načtených dat, jejichž velikost ovšem musím znát předem, takže by program komplikovala možnost, že se úpravou obrázku změní. Jde vůbec nějak do src nacpat odkaz na adresu v paměti?

Omlouvám se, že s tímhle problémem otravuju, když ho vlastně umím řešit tím, že obrázky jsou ve formuláři mimo WB. Ale jsem ze staré školy, které nestačí, když program (většinou) funguje, ale chce, aby program byl programátorsky čistý. A navíc si myslím, že používání DLL jako kontejneru obrázků, zvuků (ty jdou jednoduše přehrávat přímo z DLL) a textů pro webové stránky by bylo elegantnější i efektivnější, než složka s desítkami samostatných bitmapů, ikon a cancourů html, z nichž prohlížeč vytváří stránku. Takže snad jde o všeobecně užitečnou věc.
Martin_
Profil *
Potřeboval bys z té handle dostat binární data a ty potom převést do base64, které normálně vložíš do HTML. Nemusel bys ani načítat všechna ta binární data najednou, stačil by ti jen nějaký malý kousek vyrovnávací paměti, z které bys to převedl do base64 a pak ukládal do obyčejného VBA řetězce.
Joker
Profil
Jan Mach:
Více informací třeba tady: Data URI

Do toho data: potřebujete MIME typ (podle toho v jakém formátu máte data, např. image/jpeg, image/gif, image/png, …) a data obrázku.

Bohužel se moc nevyznám ve VBA a dokumentace taky není nic moc, takže nevím jak přesně z toho objektu vydojit „surová“ data. Nadějně vypadá Image.PictureData (ovšem s dost zmatenou dokumentací) a Image.Picture (kde podle dokumentace jsou buď bitmapová data, nebo cesta k souboru… heh).
Jan Mach
Profil
Díky za rady. Zvládl jsem to podle Jokerovy rady takhle:
DLL zvládá z obrázků jen ICO a BMP, já mám BMP. Když z nich udělám GIFy (jsou nejmenší) a z nich base64-stringy, mohu mít v DLL místo BMPů ty stringy (u velkých obrázků roztrhané) a dokonce se tím DLL zmenší. Pak stačí za chodu programu do každé struktury
<IMG src='data:image/gif;base64,*' alt='pikčr, vole'>
v html-stringu (ten mám samozřejmě také v DLL) místo hvězdičky plácnout odpovídající base64-string, pohodlně načtený z DLL, a po takovémto doplnění html-stringu ho předhodit webbrowseru. Probatum est.
Mimochodem, pro konverzi obrázků do base64-stringů se mi líbí konvertor dataurl.net/#dataurlmaker .

Napsal jsem to podrobně pro ty, co sem dorazí se stejným či podobným dotazem. Pro mne osobně je to ovšem...
...
nepoužitelné :-(
Ve formuláři jsem dosud měl obrázky s popisy a okno WB s různě formátovaným textem a s odkazy na internet <A ...>...</A> a pro uživatele formulářové tlačítko pro export celého obsahu formuláře do Wordu. Tlačítko musí obrázky jeden po druhém dost složitě (nechci jít přes disk) přenášet do Wordu, obsah WB jde přenést snadno přes schránku (do Wordu se vloží pomocí PasteSpecial). Těšil jsem se, že když budou obrázky ve WB, bude stačit jediný přenos, totiž přenos obsahu WB.
Jenže při přenosu z WB se přenesou jen obrázky zadané
src='cesta na disk'
obrázky zadané
src='data:...'
se nepřenesou - vyzkoušeno. Asi by šlo nějak je vyčenichávat ve WB a jeden po druhém vkládat do Wordu, jenže to je právě to, čemu jsem se chtěl vyhnout. Tak zůstanu u dosavadní koncepce s obrázky mimo WB.

Ještě jednou děkuji za rady a tohle téma asi můžeme uzavřít, jen jsem tu nenašel, jaxe to uzavírá :-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0