Pozice výběru v HTML zdroji   zodpovězená otázka

HTTP/HTML

Zdravím,

už dlouhou dobu se sháním po způsobu, jak v dokumentu ve WebBrowseru přesouvat Caret. Chci totiž WebBrowser použít podobně jak RTB s tím, že do něj budu něco psát (bude v contenteditable módu) a při každém stisku klapky zamknu okno, vezmu text z WB, zpracuji jej, vrátím do WB, odemknu okno. To jsem už zvládl, ovšem funguje to pouze, pokud píšu na konec textu, ale když se přesunu doprostřed textu, Caret se mi hodí na konec. A já bych tedy potřeboval Caret přesouvat podle uvážení. A taky bych potřeboval vědět, jak lokalizovat výběr ve zdroji, což je s tímto tématem v úzké souvislosti, ale navzdory nadpisu vlákna to pro mne není prioritní. :)

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

Jo, tomu se říká zneužívání WebBrowseru k věcem, ke kterým nebyl nikdy určen. Chtělo by to uvést kousíček kódu, ať víme, na čem jsme.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        WebBrowser1.DocumentText = <html>
                                       <body style="font: icon;" contenteditable="true">
                                           Test
                                       </body>
                                   </html>.ToString
    End Sub

    Private Sub WebBrowser1_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles WebBrowser1.PreviewKeyDown
        Dim src As String = WebBrowser1.Document.Body.InnerText ' vrátí textovou hodnotu stránky ve webbrowseru
        ' já tady s ní provedu nějakou opičárnu
        src = src.Replace("a", "<b>a</b>") ' například vykrmím všechna áčka
        WebBrowser1.Document.Body.InnerHtml = src ' upravený text navátím zpět do wb
        WebBrowser1.Document.ExecCommand("paste", False, "") ' a vložím nic, abych hodil do wb focus
        ' tady je ale kámen úrazu, protože to logicky vloží na konec stránky, jenže co když edituji uprostřed?
    End Sub

Btw ano, máte pravdu, je to zneužívání k účelům, ke kterým nebyl stvořen, ale RTB neumí tak hezky obtékat (vlastně vůbec) a taky má divnou syntaxi. Další varianty jsem nevymyslel :)

A mimochodem, k čemu je tedy DHTML a microsoftí komponenta DHTMLEditControl, která je (doufám že se nemýlím) postavená na WebBrowseru, když není WB určen k (také) editaci HTML stránek? :)

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

Vy skutečně používáte WebBrowser k něčemu, k čemu nebyl určen a potom se divíte, že s tím nelze pracovat tak jak byste si představoval.

DHTML Edit Control je ActiveX ovládací prvek určený k WYSIWYG editaci DHTML stránek. Vzhledem k tomu, že se jedná o technologii z Internet Exploreru 5.0 tak bych použití silně nedoporučoval.

Pokud potřebujete vytvořit editor zvýrazňující syntaxi tak buď použijte/upravte některé z již hotových komponent, nebo si napište vlastní. Hackovat WebBrowser na editor je drbání se levou nohou za pravým uchem.

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

Dobře, pokusím se vysvětlit, proč na to jdu takhle: Skutečně se pokouším vytvořit obarvovač syntaxe a WebBrowser jsem si zvolil kvůli tomu, že je to šikovná komponenta pracující s mne blízko technologií, tedy HTML. Již hotovou komponentu jsme měl staženou, řešena byla pomocí RTB a fungovala tak, že po každém stisku klapky obarvila aktuální řádek atd atd atd... Ovšem používala WinAPI. To se mi podařilo z velké části nahradit .NET řešeními, ale ne úplně a navíc byl pak problém s tím, že obarvený text byl RTF a ne HTML jak bych to potřeboval já. To jsou hlavní důvody proč WebBrowser.

Zřejmě to bude ještě nesnadnější úkol než jsem myslel, takže Vám i p. Hercegovi děkuji za vysvětlení.

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

Takhle, jde o to, že HTML má prostředky pro poměrně bohaté formátování textu, ale tím, že budeš šťouchat do DOMu, to šíleně zpomalíš. Samotné vykreslování a renderování HTML není triviální záležitost (důkazem toho nechť je to, že ještě neexistuje prohlížečka, která by to uměla nez jediné chyby, ono to ani nejde) a pokud bys v tomto řešení editoval víc než 5kB textu, tak to bude zatraceně pomalé. HTML má prostě strašný overhead, kvůli změně barvy je tam něco jako <span style="color:#ff0000">, to je zbytečně moc bajtů a špatně se to parsuje.

Dá se využít RichTextBox, který bude rychlejší, protože je na podobné věci dělaný, ale podle mého názoru je nejlepší napsat si úplně vlastní komponentu. System.Drawing určitě používat umíš (chce ho vlastně jenom metody DrawString a MeasureString, která měří, kolik místa text zabere) a pár dalších udělátek. Horší už to bude s chytáním kláves a tak, a pak už si na to napíšeš nějak to zvýrazňování syntaxe (a když si to pěkně navrhneš, tak tu komponentu budeš moct použít obecně).

To, co s WebBrowserem provádíš, už je i na mě moc, musel bych půl hodiny studovat dokumentaci, abych ti mohl poradit.

Když si napíšeš vlastní komponentu, hodně se toho naučíš. A nejdřív si zkus na papír rozmyslet, které metody by se ti mohly hodit, určitě nezačínej hned programovat.

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

Musím říct, že jsi mě dovedl k zamyšlení. Určitě je pádný argument ta rychlost a přiznám se, že na to jsem ani nepomyslel. Teď, když opadlo počáteční "nadšení" a dívám se na to objektivně, dochází mi, že by to asi skutečně nebylo snadné, ale co víc, efektivní.

Nechtělo se mi psát vlastní komponentu proto, že jsem si nemyslel, že řešit to pomocí GDI+ bude elegantní. Určitě mi pomůže ta fce MeasureString, jejíž znalost jsem dlouho a citelně postrádal. Děkuji Ti tedy za radu, jdu se pustit do návrhu vlastní komponenty.

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

Ahoj,

som uplny amater, a mam podobny problem. Mam kopu HTML stranok, ktore mam aj v rtf a potreboval by som ich spracovat do databazy. Problem spociva v tom, ze neviem z tychto dokumentov rtf alebo html ziskat datum popripade url alebo nazov. O nieco som sa pokusil ale neviem ako nahradit presny text za premennu. moje vsetky pokusy sklamali.

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

Dim aa As Date

Me.RichTextBox1.LoadFile("C:\Users\vlasto\Desktop\1.rtf")

Me.RichTextBox1.Find("24" & "." & "7" & "." & "2008")

End Sub

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