Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
první je spíše jen takový dotaz - při vyčištění konzole zavoláním Clear se vymaže jen dosavadní paměť - ne dosavadní text. Což mi sice nepůsobí funkční problémy, ale přijde mi blbé, že ihned zahltím celou konzoly zbytečným textem - nedal by se mazat i starý text? Tedy pochopitelně když je to něco navíc, tak myslím nějak efektivně - něco navíc a ještě náročné by se nevyplatilo...

A druhý - příkazová řádka - rád bych si vyhradil první linku jako CommandLine. Našel jsem 2 způsoby - oba neefektivní. První - pracuji pouze se stringem - pohlcuji klávesy a switchem si pohlídám jednoklávesové příkazy - propouštím jen charovatelné klávesy. Což by bylo sice pěkné - jenže ve vypsaném textu se nedá pohybovat. Druhý způsob spočíval v práci jak se stringem, tak konzolí. To fungovalo nejlépe - jenže zbytečně náročné. Vše co vlastně chci je pohlídat a nepustit Enter klávesu - aby se mi nepřidala nová řádka. Necharovatelné klávesy se stejně nevypisují. A protože se chci držet v prvním řádku, pozicování kurzoru mi nepomůže - nový řádek nesmí vzniknout... Děkuji.

 
Odpovědět 26.1.2013 9:10
Avatar
Luboš Běhounek (Satik):

Oba problémy budeš si asi muset vyřešit tak, že si napíšeš vlastní obsluhu konzole.

Netuším, jak přesně ke konzoli C# přistupuje, já jsem si psal vlastní konzoli v C++, když jsem se snažil udělat co nejmenší exáč a nepoužíval jsem standardní knihovny.

Jestli chceš, tak ti sem hodím C++ zdrojáky, ale nejsem si moc jistej tím, jak moc to bude složitý přepsat do C#.

Nahoru Odpovědět 26.1.2013 12:07
:)
Avatar
matesax
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
matesax:

To je ten problém - přístup C# je celkem neviditelný - nikde nic ukázaného - neznám jedinou věc, co bych si mohl overridovat...

 
Nahoru Odpovědět 26.1.2013 12:27
Avatar
matesax
Redaktor
Avatar
matesax:

Řádek jsem vyřešil:

Console.CursorTop = 0;

while ((pressed = Console.ReadKey(true)).Key != ConsoleKey.Escape)
{
        switch (pressed.Key)
        {
                case ConsoleKey.LeftArrow:

                        if (Console.CursorLeft > 0)
                                Console.CursorLeft--;

                        break;

                case ConsoleKey.RightArrow:

                        if (Console.CursorLeft < text.Length)
                                Console.CursorLeft++;

                        break;

                case ConsoleKey.UpArrow:

                        htmlView.ScrollUp();

                        break;

                case ConsoleKey.DownArrow:

                        htmlView.ScrollDown();

                        break;

                case ConsoleKey.Enter:

                        Console.Write(new string(' ', '\r' + text.Length + '\r'));

                        text = "";

                        break;

                case ConsoleKey.Backspace:

                        if (Console.CursorLeft > 0 && text != "")
                        {
                                Console.CursorLeft--;

                                text = text.Remove(Console.CursorLeft, 1);
                        }

                        break;

                case ConsoleKey.Delete:

                        if (Console.CursorLeft < Console.WindowWidth && Console.CursorLeft < text.Length)
                                text = text.Remove(Console.CursorLeft + 1);

                        break;

                default:

                        if (text.Length < Console.WindowWidth - 1)
                        {
                                text = text.Insert(Console.CursorLeft, pressed.KeyChar.ToString());

                                Console.CursorLeft++;
                        }

                        break;
        }

        savePosition = Console.CursorLeft;

        Console.CursorLeft = 0;

        if (pressed.Key != ConsoleKey.LeftArrow && pressed.Key != ConsoleKey.RightArrow)
                Console.Write("{0," + (-Console.WindowWidth + 1) + "}", text);

        Console.CursorLeft = savePosition;

Ale ani omylem z toho nejsem nadšen...

Do Enter větve by přibyla mapa textových příkazů - leč budu se snažit najít lepší řešení... Jo a char array mne lákalo, ale bylo by to jen horší...

Editováno 26.1.2013 13:19
 
Nahoru Odpovědět 26.1.2013 13:17
Avatar
matesax
Redaktor
Avatar
matesax:

Nemůžu dostat alespoň WindowResize? Takto všude počítám se změnou - a nemohu si hodnoty napevno ukládat. S nějakým resize eventem bych měnil jen když bude třeba...

 
Nahoru Odpovědět 26.1.2013 14:05
Avatar
Luboš Běhounek (Satik):

Pokud nemáš nějakou vlastní smyčku na zpracování zpráv, ale necháváš pořád otevřenou konzoli pro zápis (tj. máš pořád otevřený příkaz třeba Console.ReadLine), tak ne, protože ta si ty zprávy zpracovává uvnitř sama.

Musel bys konzoli přepsat.

Nebo by to šlo ještě obejít jednou né moc pěknou věcí - spustit si druhé vlákno, ve kterém by sis zahookoval zprávy WM_SIZE/WM_SIZING a zpracovával to tam, ale není to moc elegantní řešení.

Nahoru Odpovědět 26.1.2013 14:21
:)
Avatar
lcet.m
Člen
Avatar
lcet.m:

Proč děláš v roce 2013 aplikaci, která se bude v textovém režimu (konzole) snažit nějakými obezličkami chovat jako aplikace v okně? Chápu, že sis chtěl napsat prohlížeč a chápu, že renderování dokumentu je trošičku hardcore. Ale tohle je taková zbytečná ztráta energie, řekl bych...

 
Nahoru Odpovědět  +2 27.1.2013 21:08
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 7 zpráv z 7.