Az ultragyors fények szintaxis delphi TRichEdit

Amikor írtam Scriptaint PaintCAD 4Windows, aztán volt, hogy a háttérvilágítás szkripteket. Alig néhány hét múlva felbukkan az interneten számos forrásból, de nem jött. Meg kellett gyűjteni őket az ő Frankenstein.







Amikor írtam ezt az eljárást, egy kis script, hogy kiemelje a mérete 200 sornyi Windows XP töltött mintegy fél másodperc. Ezért minden gomb megnyomása után, vagy miután megváltoztatta a script nem lehetett azonnal kiváltja a háttérvilágítást. Csináltam egy időzítőt, amely frissítik minden alkalommal, amikor változtatni TRichEdit szöveget, és ha 2 másodpercen belül senki sem változott a szöveget -, akkor futtassa a fények.

Amikor elkezdtem tesztelés Windows 8 - Láttam, hogy ahelyett, hogy fél másodperccel a megvilágítási azonos forgatókönyv volt, hogy elhagyja 5-6 mp (valószínűleg Win8 valami namudrili rossz richeditom)! És lehetetlen volt szerkeszteni semmit, rettegve, hogy csak világítani kezd, és minden zalipnet öt másodperc.

Kiderült, hogy a hosszú futás TRichEdit, ami fekszik az űrlapot, és nagyon gyors TRichEdit a memóriában. Úgy tűnik, a Windows 8 nem valami szörnyű minden átfestés. És még miután a zárak képszerkesztő összetevők RichEdit csomó WinAPI funkciók ponaderganyh külföldi fényforrásokat fekvő RichEdit formában is tovább folytatta a munkát hosszú ideig.

Ezért egy új eljárás másolni a tartalmát láthatatlan RichEdit RichEdit szem előtt tartva, hogy mindent a feldolgozás és hátraveti a kapott tartalmat, visszaállítva a régi pozíció után a görgetősáv és a kurzor.

De miután teszteket Windows 98 azt találták, hogy a függőleges görgetősáv nem hallgat a régi létesítmény helyzetét. Kellett hozzá EN_LINESCROLL üzenetek küldésére RichEdit és visszaállítja a helyzet ugyanaz nyer 98 is.

Itt van, a háttérvilágítás richedita RichEdit1 eljárás és a kapcsolódó eljárások, gyorsan (talán 0,1-0,2 másodperc), bár a szöveg vastag és lelassítják (ha meg kell írni a háttérvilágítás belül láthatók a RichEdit darab szöveg, és ez egy másik történet):

oldali határoló - a karaktersorozat, amely lehet oldalirányú fenntartott szó. Algoritmus a fogásait oldalán talált szót, így „funkció”, kiemelve a »efunction« - nem.

Reswords - egy sor szó, hogy merész a szövegben, ha az oldalán a karakterek oldali határoló.

FillChar (tsih, sizeof (tsih), 0);
tsih.cbSize: = sizeof (tsih);
tsih.fMask: = SIF_POS;
// tároljuk őket abban a helyzetben görgetősávokkal
GetScrollInfo (RichEdit1.Handle, SB_VERT, tsiv);
GetScrollInfo (RichEdit1.Handle, SB_HORZ, tsih);

// indul kerítés kiemelve a láthatatlan TRichEdit
megpróbál
// tiszta minden korábbi háttérvilágítás
ri.SelStart: = 0;
ri.SelLength: = hossz (ri.Text);
ri.SelAttributes: = RichEdit1.DefAttributes;
ri.SelAttributes.Color: = clBlack;
ri.SelAttributes.Style: = [];

i: = 0;
// kiírása a teljes szöveget a változó munka, hozzátéve végén a határoló karakter kíván fenntartott szavak végén a szöveg is
munka: = ri.Text + # $ D $ # A;
WL: = hossz (munka);
míg a (I<=wl) do
kezdődik
i: = i + 1;
// végig a szöveget

// találni félidézőjel előtt, hogy talált egy másik (insidestr1 check) - festeni az első idézet talált minden lila
ha insidestr1 és (munka = „” „”), akkor
kezdődik
ri.SelStart: = IS1;
ri.SelLength: = i-IS1;
ri.SelAttributes.Color: = clPurple;
insidestr1: = false;
tovább;
végén;

// találni idézőjel előtt, hogy talált egy másik (insidestr2 check) - festeni az első idézet talált minden kék
ha insidestr2 és (munka = „„”), majd
kezdődik
ri.SelStart: = IS2;
ri.SelLength: = i-IS2;
ri.SelAttributes.Color: = RGB (0,0,128);
insidestr2: = false;
tovább;
végén;

// ha nem az utolsó karaktert, és ő következik a * / és előtt volt egy / * (longcomm ellenőrzés) - a festék minden zöld






ha én ha longcomm és (munka = '*') és (munka [i + 1] = '/'), majd
kezdődik
ri.SelStart: = ls;
ri.SelLength: = i-ls + 1;
ri.SelAttributes.Color: = clGreen;
i: = i + 1;
longcomm: = false;
tovább;
végén;

// ha végig a szöveget, és nem vagyunk kapcsolatba a választás -, akkor keresse meg az első pár karaktert ilyen váladék és fenntartott szavak
Ha a (nincs htmlcomm) és (nem longcomm) és (nem insidestr1) és (nem insidestr2), majd
kezdődik
// aposztróf - emlékszik, hol volt, és hogy egy zászló kezdeni festmény
ha a munka = „” „”, akkor
kezdődik
insidestr1: = true;
IS1: = i-1;
tovább;
végén;

// idézőjel - emlékszik, hol volt, és hogy egy zászló kezdeni festmény
ha a munka = „„”, akkor
kezdődik
insidestr2: = true;
IS2: = i-1;
tovább;
végén;

// befejezte a távon a szöveg

// ha kiosztás szakadt megjelenés (befejezetlen) -, akkor csak festeni a szöveget, hogy a végén

I: = WL-1;
ha insidestr1 majd
kezdődik
ri.SelStart: = IS1;
ri.SelLength: = i-IS1;
ri.SelAttributes.Color: = clPurple;
insidestr1: = false;
végén;

ha insidestr2 majd
kezdődik
ri.SelStart: = IS2;
ri.SelLength: = i-IS2;
ri.SelAttributes.Color: = RGB (0,0,128);
insidestr2: = false;
végén;

ha longcomm majd
kezdődik
ri.SelStart: = ls;
ri.SelLength: = i-ls;
ri.SelAttributes.Color: = clGreen;
longcomm: = false;
végén;

ha htmlcomm majd
kezdődik
ri.SelStart: = hs;
ri.SelLength: = i-hs;
ri.SelAttributes.Color: = clGreen;
htmlcomm: = false;
végén;

// minden festett, másolja vissza
ms: = TMemoryStream.Create;
ri.PlainText: = false;
RichEdit1.PlainText: = false;
megpróbál
ri.Lines.SaveToStream (ms);
ms.Seek (0, soFromBeginning);
RichEdit1.Lines.LoadFromStream (ms);
végül
ms.Free;
végén;

// visszaállítani a helyzet tekercsek
RichEdit1.Perform (WM_VSCROLL, SB_THUMBPOSITION + tsiv.nPos * 65536,0);
RichEdit1.Perform (WM_HSCROLL, SB_THUMBPOSITION + tsih.nPos * 65536,0);

// Win98 és egyéb ügyek - nézd, akkor kényszeríteni lépjen a megfelelő hely, hogy ha a függőleges görgetést nem ért oda
st: = SendMessage (RichEdit1.Handle, EM_GETFIRSTVISIBLELINE, 0,0);
ha st<>en, majd SendMessage (RichEdit1.Handle, EM_LINESCROLL, 0, en-st);

// RichEdit memória szolgált neki, rombolni
ri.Free;

// állítsa a kurzort, és a kiválasztás a megfelelő helyre
RichEdit1.SelStart: = ss;
RichEdit1.SelLength: = SL;

// lehetővé teszik a fogyatékkal vissza, hogy dolgozza át és dolgozza át a komponens
SendMessage (RichEdit1.Handle, WM_SETREDRAW, 1,0);
InvalidateRect (RichEdit1.Handle, 0, true);
SendMessage (RichEdit1.Handle, WM_USER + 69,0, EMA);
RichEdit1.DoubleBuffered: = false;
RichEdit1.Repaint;

Procedure Call háttérvilágítás időzítő

eljárás TForm37.Timer1Timer (Sender: TObject);
kezdődik
ha nem ((Word (GetAsyncKeyState (VK_SHIFT)), és 8000 $)<>0), akkor
kezdődik
Timer1.Enabled: = false;
Podsvet ();
végén;
végén;

Önmagában RichEdit1 a OnChange esemény rendelni ezt az eljárást, hogy frissítse az időzítőt, és mindig várja az utolsó változtatás a szöveget a hívás pontosan 2 másodpercig:

eljárás TForm37.RichEdit1Change (Sender: TObject);
kezdődik
Timer1.Enabled: = false;
Timer1.Enabled: = true;
végén;

Ez minden. Kiderült gyors fények RichEdit után 2 másodperccel az utolsó módosítás a szöveg.

Mennyiségének növelésével szövegének RichEdit

Van RichEdit MaxLength tulajdonság, amely alapértelmezésben nulla. És akkor a karakterek maximális száma a RichEdit válik 65.536.

Tájékoztatása az interneten, akkor növeli ezt az értéket, ha a program hozzá egy sort:
RichEdit1.MaxLength: = System.MaxInt-2;

Vagy közvetlenül a forma fejlődését RichEdit azonosítása és rekord számú 2147483645 a MaxLength tulajdon.

Vissza az elejére

Egynapos működését a háttérvilágítás azt mutatja, hogy:
1) nagy mennyiségű szöveget a zsákmányt, RichEdit fojtó ha befogják a szöveg előtt a memóriában világítás. Ezért az eljárásokat korrigálni néhány helyen. A szöveg most vett egy egyszerű szöveges:

// példányt a témához TRichEdit teljes tartalmát az újonnan létrehozott TRichEdit
ms: = TMemoryStream.Create;
RichEdit1.PlainText: = true;
ri.PlainText: = true;
megpróbál
RichEdit1.Lines.SaveToStream (ms);
ms.Seek (0, soFromBeginning);
ri.Lines.LoadFromStream (ms);
végül
ms.Free;
végén;

2) és attribútumai a szöveget kell másolni a folyamat alaphelyzetbe attribútumok a korábbi:

ri.SelStart: = 0;
ri.SelLength: = hossz (ri.Text);
ri.SelAttributes: = RichEdit1.DefAttributes;
ri.SelAttributes.Color: = clBlack;
ri.SelAttributes.Style: = [];

3) a végén, túl sok minden változott másolja be a kódot a ri vissza RichEdit

// minden festett, másolja vissza
ms: = TMemoryStream.Create;
ri.PlainText: = false;
RichEdit1.PlainText: = false;
megpróbál
ri.Lines.SaveToStream (ms);
ms.Seek (0, soFromBeginning);
RichEdit1.Lines.LoadFromStream (ms);
végül
ms.Free;
végén;

4) a maximális mérete alapértelmezés RichEdit szállított 65536 (a maxlength = 0), úgy, hogy kiállítva maximális:

látni. „A növekedés a szöveg mennyisége a RichEdit” rész az első post.

Mindezek a változások 1-4 pontot adtak a forgatókönyvet az első post.

5) A vizsgálatok azt mutatták, hogy a szövegek terjedelmét 5-10.000 vonalak időt vesz igénybe, a háttérvilágítás 1-2 másodpercig. Milyen egy jó ötlet, különösen Skriptainta vannak 10000-húros script egy nagyon erős dolog, hogy legyen.

Csak akkor kell, hogy a háttérvilágítás után 2 másodperccel később nemcsak változások a szövegben, de még csak a változás után az en: = SendMessage (RichEdit1.Handle, EM_GETFIRSTVISIBLELINE, 0,0); másik értéket.

Vissza az elejére