První řádek v textbox   zodpovězená otázka

Komponenty, Algoritmy

Potřeboval bych zjistit a pak též i nastavovat první viditelný řádek v textbox který je multiline - víčeřádkový.

Nevíte někdo náhodouu co je to za vlastnost ?

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

API.SendMessage(txtBOX.Handle,API.TBMultiline.EM_GETFIRSTVISIBLELINE,0,0)

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

Poněkud trapné Copy & Paste odkudsi, které nemůže fungovat bez definice konstant a metod, které zde nejsou uvedeny.

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

Tak takhle to vrací index prvního viditelného řádku v textboxz upravdu korektně.

Public Declare Function SendMessage Lib "user32.dll" Alias _
      "SendMessageW" (ByVal hwnd As IntPtr, _
      ByVal message As Integer, ByVal wparam As IntPtr, _
      ByVal lparam As IntPtr) As Integer

Public Function GetFirstVisibleLine(ByVal tb As TextBox) As Integer
    return SendMessage(tb.Handle, &HCE, 0, 0)
 End Function

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

Takhle to nejde. Text v TextBoxu je vždy přístupný jako jedna vlastnost typu String, ve které mohou být znaky vbCrLf pro konce řádků (které jsou pak vizuálně interpretovány jako další řádek). Takže buď napsat metodu, která nahradí první řádek něčím jiným, nebo použít jiný ovládací prvek než TextBox.

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

Neříkejte mi chlapci, že visual basic 2010 nemá na to nějakou vlastnost !

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

Tak tento váš příspěvek mě donutil ještě jednou a pečlivěji prozkoumat všechny vlastnosti a metody TextBoxu. Skutečně je tam vlastnost Lines, která vrací nebo nastavuje jednotlivé řádky pomocí pole Stringů, které se dynamicky mění při úpravě textu. O této vlastnosti jsem ani nevěděl z jednoho prostého důvodu - protože jsem takovou funkčnost nikdy nepotřeboval.

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

To mi ale nepomůže. Já potřebuji zjistit první viditelný řádek v textboxu.

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

Vypněte so wordwrap a bude to to co jste chtěl.

jinak RichTextBox bude to co hledáte

Me.RichTextBox1.Select(0, Me.RichTextBox1.GetFirstCharIndexFromLine(1))

vám označí první řádek

to co popisujete by se asi realizovalo takto

    Function FirstLine(ByVal rtb As RichTextBox) As String
        Return rtb.Text.Substring(0, Me.RichTextBox1.GetFirstCharIndexFromLine(1))
    End Function

    Sub SetFirstLine(ByVal rtb As RichTextBox, ByVal text As String)
        rtb.Text = text & rtb.Text.Substring(Me.RichTextBox1.GetFirstCharIndexFromLine(1))
    End Sub

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

vyše jmenovaná metoda je z TextBoxBase, kterou dědí i textbox

tedy platí i

   Function FirstLine(ByVal tb As TextBox) As String
        Return tb.Text.Substring(0, tb.GetFirstCharIndexFromLine(1))
    End Function

    Sub SetFirstLine(ByVal tb As TextBox, ByVal text As String)
        tb.Text = text & tb.Text.Substring(tb.GetFirstCharIndexFromLine(1))
    End Sub

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

už jsem to pořešil takto:

KdesPrvni = SendMessage(TextBox1.Handle, &HCE, 0, 0)

+ definice

Public Declare Function SendMessage Lib "user32.dll" Alias _

"SendMessageW" (ByVal hwnd As IntPtr, _

ByVal message As Integer, ByVal wparam As IntPtr, _

ByVal lparam As IntPtr) As Integer

teď ještě řeším naopak jak nastavit první viditelný řádek.

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

Opět se to musí dělati přes SendMessage, a to asi takhle :

Public Sub ScrollTxBox(byval tb as TextBox,byval lines as Integer)
   SendMessage(tb.Handle,&HB6,0,lines) 
End Sub

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

jo, jo, díky to je ono !!!

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

Tak teď už vůbec nevím co vlastně potřebujete. Pokud bude v TextBoxu například 10 řádků a vidět jich bude jenom 5, tak chcete zjistit ten, co je vidět jako první?

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

Správně. Ale už je vyřešeno - viz víše.

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

K čemu to bude v praxi sloužit?

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

Na řízení scrolování dle řádků?

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

Řekněme že ano, k čemu to ale v praxi bude? Uživatel může vždy posouvat text pomocí posuvníků vestavěných v TextBoxu a pokud to nebude text na několik stran v řádech stovek kB, nevidím absolutně žádný důvod vymýšlet takové obskurity.

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

Ne vřdy, pokud budete dělat text box se řádkováním, nebo podobně upravený.

Mne samotného by zajímalo, jak by jste řešil vytvoření editoru podobného tomu v VS (například pro XML). Asi jako základ použít RTB, ale co dál, že.

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