Ultrarapida lumini de sintaxă delphi trichedit

Când am scris în Scriptaint PaintCAD 4Windows, apoi a trebuit să fac script-urile de iluminare din spate. În doar câteva săptămâni, am rândul său, pe internet, un număr de surse, dar acestea nu au venit. A trebuit să le colecteze de la Frankenstein lui.

Când am scris această procedură, un mic script pentru a sublinia dimensiunea de 200 de linii de Windows XP a petrecut aproximativ o jumătate de secundă. De aceea, după fiecare apăsare de tastă, sau după schimbarea script-ul nu a putut fi imediat declanșează lumina de fundal. Am făcut un timer, care este actualizat de fiecare dată când schimbați textul TRichEdit și dacă în decurs de 2 secunde, nimeni nu a schimbat textul - apoi executați luminile.

Când am început testarea-l pe Windows 8 - Am văzut că, în loc de o jumătate de secundă pe iluminarea același scenariu a fost să plece timp de 5-6 secunde (probabil în namudrili ceva Win8 cu richeditom săraci)! Și era imposibil să editați ceva, temându care tocmai începe de iluminat și de zalipnet cinci secunde.

Sa dovedit că TRichEdit lungă de funcționare, care se află pe formular, și TRichEdit foarte rapid în memorie. Se pare că Windows 8 face ceva teribil în fiecare vopsi. Și chiar și după ce se blochează mele de redare componente richedit funcții buchet WinAPI ponaderganyh din surse externe de iluminare situată pe formularul richedit încă a continuat să lucreze pentru o lungă perioadă de timp.

Prin urmare, o nouă procedură pentru a copia conținutul în richedit richedit invizibil în minte, ea a făcut tot prelucrarea și aruncă înapoi conținutul primit, restaurarea poziția vechi după barele de defilare și poziția cursorului.

Dar, după testele pe Windows 98, sa constatat că bara de derulare verticală nu asculta poziția de instalare veche. A trebuit să adăugați EN_LINESCROLL trimiterea de mesaje către richedit și de a restabili poziția sa în aceeași câștiga 98 de asemenea.

Aici este, procedura de iluminare din spate richedita RichEdit1 și procedurilor aferente, de lucru rapid (probabil 0,1-0,2 secunde), chiar dacă textele sunt groase și încetinesc (dacă trebuie să scrie lumina de fundal în termen de afișat în bucată richedit de text, și asta e altă poveste):

delim - șirul de caractere care pot fi cuvinte lateral rezervate. Algoritmul capturile pe părțile laterale ale cuvântului găsit, astfel încât „funcția“, a subliniat și «efunction» - nr.

Reswords - o serie de cuvinte, pentru a fi caractere aldine în text, în cazul în care părțile laterale ale caracterelor lor de la delim.

FillChar (tsih, sizeof (tsih), 0);
tsih.cbSize: = sizeof (tsih);
tsih.fMask: = SIF_POS;
// a le stoca în poziția barelor de defilare
GetScrollInfo (RichEdit1.Handle, SB_VERT, tsiv);
GetScrollInfo (RichEdit1.Handle, SB_HORZ, tsih);

// începe gard subliniind TRichEdit invizibil
încerca
// curăța toate lumina de fundal anterioară
ri.SelStart: = 0;
ri.SelLength: = lungime (ri.Text);
ri.SelAttributes: = RichEdit1.DefAttributes;
ri.SelAttributes.Color: = clBlack;
ri.SelAttributes.Style: = [];

i: = 0;
// dump întregul text în activitatea variabilă, adăugând la sfârșitul unui caracter delimitator pentru a căuta cuvinte rezervate, la sfârșitul textului, prea
de lucru: = ri.Text + # $ D # $ A;
wl: = lungime (de lucru);
în timp ce (i<=wl) do
începe
i: = i + 1;
// alerga prin text

// găsi un apostrof, și înainte de aceasta a găsit un alt (cec insidestr1) - vopsea de la primul citat la găsit toate în purpuriu
dacă insidestr1 și (lucrare = „“ „“), atunci
începe
ri.SelStart: = IS1;
ri.SelLength: = i-IS1;
ri.SelAttributes.Color: = clPurple;
insidestr1: = false;
continua;
se încheie;

// găsi dublu citat și înainte de care a găsit un alt (cec insidestr2) - vopsea de la primul citat a găsit toate în albastru
dacă insidestr2 și (locul de muncă = „„“), apoi
începe
ri.SelStart: = IS2;
ri.SelLength: = i-IS2;
ri.SelAttributes.Color: = RGB (0,0,128);
insidestr2: = false;
continua;
se încheie;

// daca nu este ultimul caracter, și el urmează cu * /, și înainte de a existat o (verificare de longcomm) / * - vopseaua este tot verde
dacă am dacă longcomm și (muncă = '*') și (locul de muncă [i + 1] = '/') atunci
începe
ri.SelStart: = ls;
ri.SelLength: = i-ls + 1;
ri.SelAttributes.Color: = clGreen;
i: = i + 1;
longcomm: = false;
continua;
se încheie;

// daca vom rula prin text și nu suntem în niciuna dintre selecțiile - puteți căuta primele caractere ale acestor secretii si cuvinte rezervate
dacă (nu htmlcomm) și (nu longcomm) și (nu insidestr1) și (nu insidestr2) atunci
începe
// un singur citat - amintiți-vă în cazul în care a fost și a pus un steag începe pictura
în cazul în care locul de muncă = „“ „“ atunci
începe
insidestr1: = true;
IS1: = i-1;
continua;
se încheie;

// dublu citat - amintiți-vă în cazul în care a fost și a pus un steag începe pictura
în cazul în care locul de muncă = „„“atunci
începe
insidestr2: = true;
IS2: = i-1;
continua;
se încheie;

// a terminat o cursă de text

// dacă aspectul de alocare este rupt (neterminat) - vopsea apoi pur și simplu textul la sfârșitul anului

i: =-wl 1;
în cazul în care insidestr1 atunci
începe
ri.SelStart: = IS1;
ri.SelLength: = i-IS1;
ri.SelAttributes.Color: = clPurple;
insidestr1: = false;
se încheie;

în cazul în care insidestr2 atunci
începe
ri.SelStart: = IS2;
ri.SelLength: = i-IS2;
ri.SelAttributes.Color: = RGB (0,0,128);
insidestr2: = false;
se încheie;

în cazul în care longcomm atunci
începe
ri.SelStart: = ls;
ri.SelLength: = i-ls;
ri.SelAttributes.Color: = clGreen;
longcomm: = false;
se încheie;

în cazul în care htmlcomm atunci
începe
ri.SelStart: = hs;
ri.SelLength: = i-hs;
ri.SelAttributes.Color: = clGreen;
htmlcomm: = false;
se încheie;

// toate pictate, copiați înapoi
ms: = TMemoryStream.Create;
ri.PlainText: = false;
RichEdit1.PlainText: = false;
încerca
ri.Lines.SaveToStream (ms);
ms.Seek (0, soFromBeginning);
RichEdit1.Lines.LoadFromStream (ms);
în cele din urmă
ms.Free;
se încheie;

// restaura sulurile de poziție
RichEdit1.Perform (WM_VSCROLL, SB_THUMBPOSITION + tsiv.nPos * 65536,0);
RichEdit1.Perform (WM_HSCROLL, SB_THUMBPOSITION + tsih.nPos * 65536,0);

// pentru Win98 și în alte cazuri - uite, atunci forța pentru a defila la locul potrivit pentru a obține dacă defilare verticală nu este ajuns acolo
st: = SendMessage (RichEdit1.Handle, EM_GETFIRSTVISIBLELINE, 0,0);
în cazul în care st<>en apoi SendMessage (RichEdit1.Handle, EM_LINESCROLL, 0, en-st);

// Memoria richedit ei a servit, se demola
ri.Free;

// setați cursorul și selecția la locul potrivit
RichEdit1.SelStart: = ss;
RichEdit1.SelLength: = sl;

// permite spate cu handicap pentru a aspira si redesena componenta
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;

Procedură cronometrare apel iluminare din spate

Procedura TForm37.Timer1Timer (Expeditor: TObject);
începe
în cazul în care nu ((Word (GetAsyncKeyState (VK_SHIFT)) și $ 8.000 de)<>0), atunci
începe
Timer1.Enabled: = false;
Podsvet ();
se încheie;
se încheie;

În sine RichEdit1 evenimentul onchange atribuie această procedură pentru a actualiza cronometrul și întotdeauna așteptați cu ultima modificare a textului pentru a evidenția apelul exact 2 secunde:

Procedura TForm37.RichEdit1Change (Expeditor: TObject);
începe
Timer1.Enabled: = false;
Timer1.Enabled: = true;
se încheie;

Asta e tot. Se pare luminile rapid RichEdit 2 secunde după ultima modificare a textului.

Creșterea cantității de text în RichEdit

Avem RichEdit MAXLENGTH de proprietate, care implicit la zero. Și apoi numărul maxim de caractere în RichEdit devine 65536.

După cum a informat în internet, puteți crește această valoare în cazul în care programul adăuga o linie:
RichEdit1.MaxLength: = System.MaxInt-2;

Sau direct pe forma dezvoltării RichEdit să identifice și să înregistreze numărul 2147483645 în proprietatea MAXLENGTH.

Înapoi sus

operațiune de o zi a luminii de fundal a arătat că:
1) pentru cantități mari de text toate prăzi, richedit inductoare atunci când captarea de text în memorie înainte de iluminat. Prin urmare, în procedurile au fost corectate unele locuri. Textul este acum luată ca plaintext-:

// copie a TRichEdit nostru vizibil întregul conținut în TRichEdit nou creat
ms: = TMemoryStream.Create;
RichEdit1.PlainText: = true;
ri.PlainText: = true;
încerca
RichEdit1.Lines.SaveToStream (ms);
ms.Seek (0, soFromBeginning);
ri.Lines.LoadFromStream (ms);
în cele din urmă
ms.Free;
se încheie;

2) și atribute pentru textul care urmează să fie copiat în procesul de resetare atribute ale dintâi:

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

3) la sfârșitul anului, prea puțin sa schimbat copiați codul din richedit spate ri

// toate pictate, copiați înapoi
ms: = TMemoryStream.Create;
ri.PlainText: = false;
RichEdit1.PlainText: = false;
încerca
ri.Lines.SaveToStream (ms);
ms.Seek (0, soFromBeginning);
RichEdit1.Lines.LoadFromStream (ms);
în cele din urmă
ms.Free;
se încheie;

4) mărimea maximă implicit richedit livrate în 65536 (pentru maxlength = 0), astfel încât acesta a expus maximă:

a se vedea. „Creșterea volumului de text în RichEdit“ din primul post.

Toate aceste modificări de la 1 la 4 puncte au fost adăugate la script-ul în primul post.

5) Testele au arătat că volumul de texte 5-10 mii de linii necesită timp în 1-2 secunde de iluminare din spate. Ce idee bună, mai ales pentru Skriptainta, există 10000 șir script-ul este un lucru foarte puternic pentru a fi.

Numai atunci va trebui să facă lumina de fundal după 2 secunde mai târziu, prin faptul că nu numai modificări în text, dar chiar și numai după schimbarea en: = SendMessage (RichEdit1.Handle, EM_GETFIRSTVISIBLELINE, 0,0); la o altă valoare.

Înapoi sus