NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: c# form - zakázání označování textu v komponentě textBox

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
HONZ4
Člen
Avatar
Odpovídá na D0ll0k
HONZ4:15.2.2017 22:29

Většina lidí na to přijde až ve chvíli kdy na to nechtěně poklepe, nebo když přiřadí k doubleclick nějakou metodu. :)

 
Odpovědět
15.2.2017 22:29
Avatar
Michaal.K
Člen
Avatar
Odpovídá na HONZ4
Michaal.K:20.2.2017 13:44

Tak už jsem se k tomu konečně dostal a už mi to funguje :-) Díky moc. Ještě jsem se chtěl zeptat jestli by bylo možné aby ten sroll byl viditelný a enabled=false když je krátký text (vejde se do labelu) a kdyby byl text dlouhý (nevejde se do labelu) pak by byl scroll viditelný a enabled=true.

 
Nahoru Odpovědět
20.2.2017 13:44
Avatar
HONZ4
Člen
Avatar
Odpovídá na Michaal.K
HONZ4:20.2.2017 18:37

při tomhle řešení ne. Muselo by se to řešit jinak (bude to složitější), třeba podobně jako to řešil D0ll0k, ale jeho příklad nefunguje dobře. Možná to i zkusím.

 
Nahoru Odpovědět
20.2.2017 18:37
Avatar
HONZ4
Člen
Avatar
Odpovídá na Michaal.K
HONZ4:20.2.2017 20:53

takže tady jsem předchozí projekt trochu upravil:
Přidal jsem do toho panelu VScrollBar a Dock jsem mu nastavil na Right

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // do panelu panel1 jsem vložil na pozici 0 0 label label1 a
        // VScrollBar vScoll s nastavením Dock-Right
        label1.AutoSize = true;
        panel1.Resize += UpdateSize;
        //label1.TextChanged += UpdateSize;
        label1.Resize += UpdateSize; //<= toto jsem doplnil
        Load += UpdateSize;
        vScoll.Scroll += vScrollAction; //<= toto jsem doplnil
    }
    //a upravil jsem tuto metodu:
    private void UpdateSize(object sender, EventArgs e)
    {
        Size maxsize = label1.MaximumSize;
        maxsize.Width = panel1.Width - 3 - vScoll.Width;
        label1.MaximumSize = maxsize;
        label1.Top = 0;
        vScoll.Enabled = (label1.Height > panel1.Height);
        vScoll.LargeChange = panel1.Height;
        vScoll.Maximum = label1.Height + 16;
        //těch 16 jsem tam dal, aby měl uživatel jistotu, že je dole
        vScoll.Value = vScoll.Minimum;
    }
    //vložení textu:
    private void button1_Click(object sender, EventArgs e)
    {
        if (Clipboard.ContainsText()) label1.Text = Clipboard.GetText();
    }

    private void vScrollAction(object sender, ScrollEventArgs e)
    {
        label1.Top = -vScoll.Value;
    }
}

doufám, že už budeš spokojený

 
Nahoru Odpovědět
20.2.2017 20:53
Avatar
Michaal.K
Člen
Avatar
Odpovídá na HONZ4
Michaal.K:21.2.2017 8:49

Super tak to je přesně to co jsem potřeboval. Díky moc :-) Ještě prosím mám jednu otázku. Nešlo by rychleji rolovat v labelu? Teď je to o něco pomalejší než v předchozím případě. To už je snad opravdu poslení dotaz. Jinak skvělá práce...
Díky

 
Nahoru Odpovědět
21.2.2017 8:49
Avatar
HONZ4
Člen
Avatar
Odpovídá na Michaal.K
HONZ4:21.2.2017 17:26

Mě se to funguje, normálně. Tak nevím jestli to pomůže, ale můžeš zkusit dát do konstruktoru okna DoubleBuffered = true; nebo i použít upravený Label

public class MyLabel : Label
    {
        public MyLabel()
        {
            DoubleBuffered = true;
        }
    }

Ono přece jen hýbání komponentami není ideální způsob jak pracovat s WinForm.
Nejlepší by asi bylo kreslení textu, ale teď nemám moc čas se s tím drbat.

 
Nahoru Odpovědět
21.2.2017 17:26
Avatar
Michaal.K
Člen
Avatar
Odpovídá na HONZ4
Michaal.K:8.3.2017 12:33

Ahoj, tak jsem se k tomu opět po dlouhé době dostal. Tak DoubleBuffered = true; mi nepomohlo, pořád když chci rollovat v labelu je to hrozně pomalé oproti předchozímu případu viz. gif v příloze. V horním labelu jde rollovat rychle a ve spodním ne. Spodní label je poslední varianta a vše jinak funguje jak má. Nevíš co stím? Díky

 
Nahoru Odpovědět
8.3.2017 12:33
Avatar
HONZ4
Člen
Avatar
Odpovídá na Michaal.K
HONZ4:8.3.2017 15:12

tak na to zkus jít od lesa:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // do panelu panel1 jsem vložil na pozici 0 0 label label1 a
        // VScrollBar vScroll s nastavením Dock-Right
        label1.AutoSize = true;
        panel1.AutoScroll = true; //!
        panel1.Resize += UpdateSize;
        label1.Resize += UpdateSize;
        Load += UpdateSize;
        vScroll.Maximum = vScroll.Minimum; //!
        vScroll.Enabled = false; //!
    }

    private void UpdateSize(object sender, EventArgs e)
    {
        Size maxsize = label1.MaximumSize;
        maxsize.Width = panel1.Width - 3 - vScroll.Width;
        label1.MaximumSize = maxsize;
        vScroll.Visible = (label1.Height < panel1.Height); //!
    }
    /*
    //vložení textu:
    private void button1_Click(object sender, EventArgs e)
    {
        if(Clipboard.ContainsText()) label1.Text = Clipboard.GetText();
    }
    */
}

(důležité změny jsem označil vykřičníkem)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
8.3.2017 15:12
Avatar
HONZ4
Člen
Avatar
HONZ4:8.3.2017 15:22

a taky můžeš zvýšit VerticalScroll­.SmallChange

 
Nahoru Odpovědět
8.3.2017 15:22
Avatar
Michaal.K
Člen
Avatar
Odpovídá na HONZ4
Michaal.K:9.3.2017 15:05

Skvělá práce teď vše funguje jak má. Díky moc za pomoc :-)

 
Nahoru Odpovědět
9.3.2017 15:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 60.