Proč to dělat jednoduše, když to jde složitě

Kategorie: (Software), napsal Jirka Helmich, 18.7.2008

Tagy : , , ,

Tohle heslo je mi dobře známo už od základní školy, když jsme na hodinách matematiky něco dělali až příliš složitě a mě nikdy nebylo jasné, proč. Teď to konečně začínám chápat. Když člověk zná složitá řešení, ta jednoduchá ho mnohdy vůbec nenapadnou. Na to samé jsem před pár minutami narazil při vývoji GiddyGoat.

Když v jakémkoliv editoru píšete kód, přejete si, aby onen editor uměl alespoň tak základní věc, jakou je odsadit na novém řádku přesně o tolik, o kolik je odsazeno na předchozím. Banální myšlenka, banální kód, ale pro mě nakonec celkem anabáze. Kód mám v extendovaném RichTextBoxu, což je samo o sobě to nejhorší, co se mi mohlo stát, neboť

  • RTB nemá vlastní kontextovou nápovědu
  • barvení pomocí Selection je velmi pomalé, může za to koncepce RichTextBoxu, ani vypnutí překreslování pomocí SendMessage krze Windows API tomu dvakrát nepomůže, zkrátka po TextChanged volané KeyEvent se chová velmi zvláštně. Řešením by byl vlastní prvek využívající WinAPI na celkem hardcore úrovni
  • VScroll je po pixelech, nikoli po linkách - hodně štěstí s přepisováním labelu s čísly řádků
  • property Rtf (IMHO něco jako RichTextFormatted) je taková nějaká celá veselá, protože metoda Insert počítá nejen viditelné znaky, ale i za normálních okolností neviditelný balast (značky pro barvy a fonty) a tudíž je SelectionStart úplně někde jinde než v případě property Text

    A v tuto chvíli si představte vložení znaků na určité místo bez ztráty obarvení. Text sice počítá tak, jak se vám to líbí, ale protože metoda string neupraví hodnotu v poli, ale vrátí string, formulkou


    this.Text = this.Text.Insert(SelectionStart, stringValue);

    jste si právě vložili string do textu, ale jste bez obarvení.

    Naopak když použijete


    this.Rtf = this.Rtf.Insert(SelectionStart, stringValue);

    Máte krásně obarvený text, dokonce i vloženou hodnotu onoho stringu, ale o pár řádků jinde.

    Začal jsem tedy googlovat, abych zjistil, jak donutit Rtf vzít “správný” SelectionStart a asi po hodině jsem si díky jednomu postu uvědomil, jak jednoduché řešení mého problému je.

    this.SelectionText = stringValue;

    Nic? Nesmějete se? Nechápete? Tak třeba někdy příště :-)

  • Zanechte zde nějaké moudro: