Update velkého textového pole – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Update velkého textového pole – .NET – Fórum – Programujte.comUpdate velkého textového pole – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Matěj Andrle
~ Anonymní uživatel
1329 příspěvků
31. 7. 2013   #1
-
0
-

Dobrý den,

jak funguje velké editační pole? Nenapadá mne, jak editovat jen část. Vymyslel jsem systém takový, že při změně neproběhne vyčištění a vykreslení, ale jen se nastaví příznak editace. Vykreslování je voláno z Timeru (s co největším intervalem, který ještě nezhoršuje kvalitu práce) a proběhne jen při příznivém příznaku... Ovšem to funguje skvěle stále jen na malých plochách. Na větších se projevuje problém echa - kurzor skáče jako divý - když jeho posun nemůže být okamžitě zpozorován a i přes to všechno obraz problikává a dělá prodlevy. (Pořád je to mnohem lepší, než při okamžité reakci na změnu.)

Děkuji.

(C#)

Nahlásit jako SPAM
IP: 78.136.150.–
Reklama
Reklama
liborb
~ Redaktor
+18
Guru
2. 8. 2013   #2
-
0
-

Předpokládám, že je to ten HEX editor. Nemá cenu psát víc neb si budeš myslet zase něco o prdeli, takže ti to napíšu ještě jednou ve zkratce: takhle se to nedělá.

Nahlásit jako SPAM
IP: 188.75.135.–
Matěj Andrle
~ Anonymní uživatel
1329 příspěvků
2. 8. 2013   #3
-
0
-

Už to mám - a jede to dokonale... Vyřešil jsem to posláním další fronty. Tentokrát updatované řádky. Tudíž v pravidelných intervalech vykresluji změny - a to přesněji jen řádky se změnou. Přesněji jsem toho dosáhl polem bool, ve kterém se ukládá, zda byl řádek již poslán do fronty pro překreslení. Akci updatování po počinu vynulluji. Náročnost to má mizivou a nebliká zhola nic... Dokonce se zlepšilo i to echo. Mám to tedy jako jediný Control, s jediným zdrojem - List<char[]>... Co by na tom mělo být tak hrozného?

Když si vezmu kód z fóra z MSDN, tak jsem na tom o moc lépe... V tom z MSDN to řeší kupou Controlů, externích knihoven a kdo ví co. Jen si to vygoogluj - a pak si stěžuj na mé řešení...

Nahlásit jako SPAM
IP: 78.136.150.–
Matěj Andrle
~ Anonymní uživatel
1329 příspěvků
2. 8. 2013   #4
-
0
-

A cyklus zde proběhne jen při změně velikosti - protože se změní velikost bufferu. Buffer řeším přes pole akcí vykreslení řádků. Při updatování řádku přidám jeho index do akce drawBuffer. Vtip je v tom, že nemusím složitě větvit - stačí se pokusit před a po provedení zmapování kláves přidat do akce vykreslení řádku na cursorTop pozici. Pokud řádek nebyl změněn, pole bool zajistí, že se nic zbytečného nepřidá... Čeho je tam hodně, je pomocných int proměnných a pak 3 akce. Kód je ale přesto dost krátký a poměrně svyžný. OOP jsem neporušil - nevím - dle mého to lépe vyřešit nešlo...

private int

	top = 0,
	width = 0,
	halfWidth = 0,
	cursorTop = 0,
	cursorLeft = 0,
	difference = 0,
	charTopCount = 0,
	charLeftCount = 0;

bool[] previousRow;

Dictionary<int, char[]> source = new Dictionary<int, char[]>();

Action<Graphics>

	drawFullBuffer,
	drawBuffer;

Action<Graphics>[] buffer;

public SizeF CharSize { get; private set; }

private int PreviousRow
{
	set
	{
		int index = value;

		if(!previousRow[index])				
		{
			drawBuffer += graphics =>
			{
				buffer[index](graphics);
				previousRow[index] = false;
			};

			previousRow[index] = true;
		}
	}
}

public int CursorLeft
{
	get { return cursorLeft; }

	private set
	{
		if(value < difference * width)
		{
			if(top > 0 || cursorTop > 0)
			{
				CursorTop--;
				cursorLeft = charLeftCount + difference * halfWidth - 1;
			}
		}
		else if(value < charLeftCount + difference * halfWidth)
			cursorLeft = value;
		else
		{
			cursorLeft = difference * width;
			CursorTop++;
		}
	}
}

public int CursorTop
{
	get { return cursorTop; }

	private set
	{
		if(value < 0)
		{
			if(top > 0)
				top--;
		}
		else if(value < charTopCount)
			cursorTop = value;
		else
			top++;
	}
}
Nahlásit jako SPAM
IP: 78.136.150.–
Matěj Andrle
~ Anonymní uživatel
1329 příspěvků
2. 8. 2013   #5
-
0
-

Tak jsem zničil potřebu pole bool - nyní tedy nevidím žádnou prasárnu...

Nahlásit jako SPAM
IP: 78.136.150.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 102 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý