Avatar
xxluky
Člen
Avatar
xxluky:

Zdravím všechny,

jsem začátečník a pustil jsem se do prvních projektů. Snažím si vyladit textový editor. Potřebuji ale poradit, jak ve třídě ToolStrip povolit tlačítka pouze pokud označím text? Konkrétně se jedná o tlačítka Vyjmout, Kopírovat a následně, pokud existuje řetězec ve schránce, povolit i tlačítko Vložit.

Ve výchozím stavu chci mít tlačítka disabled. Jakmile uživatel označí text, chci zpřístupnit tlačítka vyjmout a Kopírovat. Jakmile bude v paměti text, povolit i tlačítko uložit.

Jak to mám provést?
Pro vyjmout jsem použil: (tlačítko Enabled -> false)

private void txtEdit_TextChan­ged(object sender, EventArgs e)
{
if (txtEdit.Selec­tedText.Length > 0)
tbtnVyjmout.Enabled = true;
else
tbtnVyjmout.Enabled = false;

  • toto ale nefunguje.

Zatím se mi pouze povedlo zpřístupnit tlačítka, jakmile to textového pole uživatel zadá nějaké znaky ... > 0, to ale nechci.

 
Odpovědět 31.3.2014 16:56
Avatar
rwn
Člen
Avatar
Odpovídá na xxluky
rwn:

Nj, protože se ho ptáš na něco co nechceš, musíš místo txtEdit.Selec­tedText.Length napsat jen txtEdit.Text.Len­gth. Ty se ho takhle ptáš jestli je něco Selectováno (označeno), předtím než se něco do něj zapíše. :)

Nahoru Odpovědět 31.3.2014 17:50
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
xxluky
Člen
Avatar
Odpovídá na rwn
xxluky:

No, to mi ale taky nic nedělá. Vůbec nic se neděje...
Chápeme se dobře, že znepřístupňování ikonek chci, aby probíhalo v debug módu?

 
Nahoru Odpovědět 31.3.2014 20:08
Avatar
rwn
Člen
Avatar
Odpovídá na xxluky
rwn:

Už je mě to jasné asi, zkusil jsem to narychlo naprogramovat. Popsal jsem to tak, žeby to mělo jít snad uchopit. :)

private string textSchranky ="";

private void Kopirovat_toolStripButton_Click(object sender, EventArgs e)
{
    textSchranky = Text_textBox.SelectedText;
}

private void Vyjmout_toolStripButton_Click(object sender, EventArgs e)
{
    textSchranky = Text_textBox.SelectedText;
    Text_textBox.SelectedText = "";
}


private void Vlozit_toolStripButton_Click(object sender, EventArgs e)
{
    Text_textBox.Text = Text_textBox.Text.Insert(Text_textBox.SelectionStart, textSchranky);
}

private void Text_textBox_MouseMove(object sender, MouseEventArgs e)
{
    if (textSchranky != "")
        Vlozit_toolStripButton.Enabled = true;

    else
        Vlozit_toolStripButton.Enabled = false;



    if (Text_textBox.SelectedText.Length > 0)
    {
        Kopirovat_toolStripButton.Enabled = true;
        Vyjmout_toolStripButton.Enabled = true;
    }
    else
    {
        Kopirovat_toolStripButton.Enabled = false;
        Vyjmout_toolStripButton.Enabled = false;
    }
}

Teda je to přes událost MouseMove,takže se to zachytává když někdo jede přes textBox - tedy něco označí třeba..

Editováno 31.3.2014 23:27
Nahoru Odpovědět 31.3.2014 23:24
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
xxluky
Člen
Avatar
xxluky:

Děkuji moc za radu. Přepsal jsem do mého projektu, ale pořád to nejede. Učím se teprve rok programovat, asi budu muset s touto vychytávkou ještě chvíli počkat.

Líbí se mi, jak to má udělané Word, kde se tlačítka zpřístupní, až když je akce dostupná.
Myslel jsem, že to bude jednodušší, ale kód výše je pro mne ještě moc složitý.

Kdyby se někomu podařilo přijít s jednodušší variantou, sem s ní :)

Moc díky.

 
Nahoru Odpovědět 1.4.2014 15:49
Avatar
rwn
Člen
Avatar
Odpovídá na xxluky
rwn:

Mě tohle třeba jede a je to napsáno dost jednoduše. :) Napíšu ti k tomu komentář - co která věc dělá. Snad to pomůže. :)

// tohle je proměnná, s kterou bude moc pracovat jakákoliv metoda ve stejné třídě - tedy všechny metody zde níže napsané, je nastavená na "" - tedy nic
private string textSchranky ="";

// tohle se aktivuje při zmáčknutí tlačítka Kopírovat, které je umístěno v toolStripu jako button
private void Kopirovat_toolStripButton_Click(object sender, EventArgs e)
{
    // vyselectovaný (vybraný) text se uloží do proměnné textSchranky
    textSchranky = Text_textBox.SelectedText;
}

// tohle se aktivuje při zmáčknutí tlačítka Vyjmout, které je umístěno v toolStripu jako button
private void Vyjmout_toolStripButton_Click(object sender, EventArgs e)
{
    // vyselectovaný (vybraný) text se uloží do proměnné textSchranky
    textSchranky = Text_textBox.SelectedText;
    // tento vybraný text se následně změní na nic - v podstatě se smaže
    Text_textBox.SelectedText = "";
}

// tohle se aktivuje při zmáčknutí tlačítka Vložit, které je umístěno v toolStripu jako button
private void Vlozit_toolStripButton_Click(object sender, EventArgs e)
{
    // Text_textBox.Text - tedy současný text v textBoxu se přepíše na: ten samý textm který bude mít na indexové pozici, kde začíná vyselectovaná část se připíše náš text, který máme uložený v textSchranky
    // Text_textBox.SelectionStart - tohle vrací index současné označené pozice
    Text_textBox.Text = Text_textBox.Text.Insert(Text_textBox.SelectionStart, textSchranky);
}

// pokud se někdo bude pohybovat v tomto textBoxu, tak se tahle metoda aktivuje
private void Text_textBox_MouseMove(object sender, MouseEventArgs e)
{
    // pokud v proměnné textSchranky bude uložené cokoliv, tak se tlačítko Vložit zviditelní
    if (textSchranky != "")
        Vlozit_toolStripButton.Enabled = true;
    // v každém jiném případě - tedy pokud není žádný textuložen, tak bude tlačítko Vložit znepřístupněno
    else
        Vlozit_toolStripButton.Enabled = false;


    // pokud je vyselectováno (označeno aspon jedno písmeno), tak se tlačítko Kopírovat a Vyjmout zviditelní
    if (Text_textBox.SelectedText.Length > 0)
    {
        Kopirovat_toolStripButton.Enabled = true;
        Vyjmout_toolStripButton.Enabled = true;
    }
    // v každém jiném případě - tedy pokud není nic vyselectováno - označeno, tak se tlačítka Kopírovat a Vyjmout znepřístupní
    else
    {
        Kopirovat_toolStripButton.Enabled = false;
        Vyjmout_toolStripButton.Enabled = false;
    }
}
Editováno 1.4.2014 19:13
Nahoru Odpovědět 1.4.2014 19:11
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
xxluky
Člen
Avatar
Odpovídá na rwn
xxluky:

Moc děkuji za vyčerpávající komentáře. V původním projektu to nefungovalo, proto jsem udělal toto:

Založil jsem nový projekt Form aplikace, přidal třídu ToolStrip, přidal 3 tlačítka, nazval je (pro výše uvedený kód) Kopirovat_tool­StripButton, Vyjmout_toolStrip­Button a Vlozit_toolStrip­Button. Dále jsem přidal textBox a nazval ho Text_textBox. Vložil jsem tvůj kód a prostě mi to nejde. Zkoušel jsem ve výchozím stavu tlačítka Enabled -> false, ale podle kódu by to mělo být jedno.
Opravdu nevím.

 
Nahoru Odpovědět 2.4.2014 14:49
Avatar
rwn
Člen
Avatar
Odpovídá na xxluky
rwn:

Už vím kde máš problém. :) Ty si všechny ty metody píšeš do zdrojáku jen a nevytváříš je přímo na dané kontrolce. :) Například metoda:

private void Kopirovat_toolStripButton_Click

- to nemůžeš jen tak napsat do kódu, ale musíš taky tlačítku říct že něco takového tam existuje. Musíš si kliknout na danou kontrolku v návrhu a v pravo dole máš takový panel, jmenuje se to Properties, kde je nastavení kontrolky, je tam taky takovej "oranžovej blesk" (Events) - to znázorňuje události na dané kontrolce, na které bude schopná reagovat. :) Pokud chceš aby se něco stalo po kliknutí, tak si tam musíš najít událost co se jmenuje Click - v současnosti tam nic není, protože se nic neděje při kliknutí na tlačítko, když si na to místo u Click klikneš dvakrát, tak se ti vytvoří ona metoda ve zdrojovém kódu propojená s kontrolkou. Tahle metoda se ti aktivuje při kliknutí na kontrolku. (U tlačítek ti stačí i pouhý dvojklik na kontrolku v tom tvém návrhu). Takhle to v podstatě uděláš u všech tlačítek co chceš aby něco dělaly. :) Pak si klikneš na ten textBox a najdeš v properties událost MouseMove. Když to takhle budeš mít, tak si stačí do jednotlivých metod dopsat kousky kódu co se mají provést. A máš to. :)

Nahoru Odpovědět 2.4.2014 15:06
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
xxluky
Člen
Avatar
xxluky:

aha, tak už vím, proč mi nefungovali všechny návody, co jsem nacházel na internetu :D Jo, to jsou ty začátky.. Trochu trapas... :)

Každopádně mi to už funguje. Pouze tam mám chybu, a to tu, že v tom mým programu mám tlačítka napojeny na menuStrip a to takhle:

private void mnuUpravyKopirovat_Click(object sender, EventArgs e)
        {
            txtEdit.Copy();
private void tbtnKopirovat_Click(object sender, EventArgs e)
{
    mnuUpravyKopirovat_Click(sender, e);
    textSchranky = txtEdit.SelectedText;

takže se děje to, že mi to při zkopírování vkládá 2x.
Právě jsem odstranil to předávání z hlavní nabídky a už to funguje jak má.

Díky moc za trpělivost se mnou... :) Fakt díky za radu a mnoho úspěchů!

 
Nahoru Odpovědět 3.4.2014 14:35
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 9 zpráv z 9.