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
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