Как да определите височината на текста в RichEdit e Ако текстът е въведен

различни шрифтове и размери, не е много ясно. Кажи ми, а? Необходимо е размерите на самия RichEdit да могат да се напаснат към размера на текста в него.

Песен ( 2002-10-12 11:26 ) [1]

Кен ( 2002-10-16 01:25 ) [2]

2 песен И как да я напиша напълно? Височина на текста := RichEdit1. (какво е това?) .Canvas.TextHeight();

Опитах, но нищо не става. Проблемът е в различни размери на шрифта. Едната буква е голяма, другата е малка, но как да изчислим общата височина на текста? В края на краищата се счита за същото, за лента за превъртане, например. Но как ?

MBo ( 2002-10-16 06:38 ) [3]

varp:Tpoint; започнете Richedit1.Perform(em_posfromchar,Integer(@p),Length(Richedit1.Text)); надпис:=inttostr(p.x)+" "+inttostr(p.y); Това е горната точка на последния знак, така че p.y също трябва да се добави с височината на последния ред, изчислена от Song по указания начин

Кен ( 20.10.2002 01:13 ) [4]

След това натискам бутона и размерът на прозореца се изрязва до предпоследния ред. Предлага се и с лента за превъртане. Така че си струва да преместите този владетел малко и да преизчислите размера на прозореца, в резултат на което се получава различен. И така всеки път, когато местим линийката, резултатите са различни всеки път. Как да го отстраним?

За последния ред, честно казано не разбрах много. Как да приложа .Canvas.TextHeight(); ? Какъв е произходът на този код?

Кен ( 2002-10-23 03:39 ) [5]

Как да решим проблема?

Разделител ( 2002-10-23 08:17 ) [6]

Кен ( 2002-10-30 03:05 ) [7]

И така, как ТОЧНО да определите височината на текста в RichEdit? Наистина ли е таканеразрешим проблем?

Ник Н А ( 2002-10-30 05:31 ) [8]

Той може да определи височината буква по буква или ред по ред, опитайте:

Единственият начин да получите свойствата на текста е да го изберете със SelStart и SelLength=1, тогава SelAttributes съдържа подробна информация за избрания текстов фрагмент, съмнявам се, че ако е избрана повече от една буква, това ще даде правилна информация. RichEdit1.SelAttributes.Height. Текст, избран чрез SelText Може да е достатъчно да се измери височината на всеки ред текст.

Кен ( 2002-11-01 07:41 ) [9]

2 Nick N AПо принцип направих изчисление на височината на всяка буква в низ и по този начин изчислих общата височина на низовете по най-високата буква в тях. Но резултатът не е точен. Изчислява се само височината на шрифта, а височината на разстоянието между редовете не се взема предвид. Как да го дефинираме?

Отначало се опитах да приема, че е равно на две, но след като се заиграх се оказа, че колкото по-голяма е височината на шрифта, толкова по-голяма е разликата между редовете. Освен това е невъзможно да се изчисли имперски.

Как да бъдем? Как да изчислим височината на празнината между редовете?

MBo ( 2002-11-01 07:47 ) [10]

Кен ( 2002-11-01 08:01 ) [11]

2 MBo Какви са показателите? Все пак шрифтът е различен всеки път. Как да го направим ?

MBo ( 2002-11-01 08:02 ) [12]

намерете шрифта с най-голям размер в последния ред - именно върху него се изчислява отстъпът

Alx2 ( 2002-11-01 09:14 ) [13]

>Ken (11/01/02 08:01 AM) Без колебание предлагам донякъде хулиганско решение въз основа на публикациите на MBo: procedure TForm1.Button1Click(Sender: TObject); променлива p1, p2: tpoint; правилно: цяло число; започнете RichEdit.Lines.Add("!"); RichEdit.Lines.Add("!");

Richedit.Perform(em_posfromchar, Integer(@p1), Length(Richedit.Text)); Richedit.Perform(em_posfromchar, Integer(@p2), 0); ако (RichEdit.ScrollBars = ssBoth) или (RichEdit.ScrollBars = ssHorizontal) тогава правилно := GetSystemMetrics(SM_CXHSCROLL) друго правилно := 0; RichEdit.Height := p1.Y - p2.y + правилно; RichEdit.Selstart := 1;

RichEdit.Lines.Delete(RichEdit.Lines.Count - 1); RichEdit.Lines.Delete(RichEdit.Lines.Count - 1);

Alex4444444444 ( 2002-11-01 10:03 ) [14]

Po moemu, u TRichEdit est" event, generiruyushijsya, kogda on hochet change" svoj размер. Mozhet, ego pojmat "? Ili posmotret", as on realizovan (eto ved "prosto perehvat kakoj-to message; vpolne mozhet byt" i "dvojstvennaya" съобщение). Ne isklyucheno takzhe, chto eto mozhet byt" svyazano s ClientHeight.

MBo ( 2002-11-01 12:19 ) [15]

Има такова нещо - EM_REQUESTRESIZE, трябва да генерира WM_NOTIFY c EN_REQUESTRESIZE родител, но при проверката не получих EN_REQUESTRESIZE ;( SETEVENTMASK направи. Може би някой ровеше?

MBo ( 2002-11-01 14:32 ) [16]

процедура TForm1.RichEdit1Change(Подател: TObject); var fr: TFormatRange; r: TRect; започнете r:=rect(0,0,RichEdit1.Width*screen.Pixelsperinch, RichEdit1.Height*screen.Pixelsperinch); fr.hdc:=b.canvas.handle; fr.hdctarget:=b.canvas.handle; fr.rc:=r; fr.rcpage:=r; fr.chrg.cpMin:=0; fr.chrg.cpMax:=-1; Изпращане на съобщение(RichEdit1.handle,EM_FORMATRANGE,1,longint(@fr)); Richedit1.Height:=Trunc(screen.Pixelsperinch*fr.rc.bottom/1440)+8; Изпращане на съобщение(RichEdit1.handle,WM_VSCROLL,SB_TOP,0); край;

Кен ( 2002-11-07 01:19 ) [17]

2 Alx2Използвах подобен метод. Добавям линия, определям размера и изтривам линията.

процедура TForm1.Button1Click(Подател: TObject); var p:Tpoint; започнете RxRichEdit1.Lines.Add("!"); Изпращане на съобщение(RxRichEdit1.Handle,WM_VSCROLL,SB_TOP,0); RxRichedit1.Perform(em_posfromchar,Integer(@p),Length(RxRichedit1.Text)); RxRichEdit1.Lines.Delete(RxRichEdit1.Lines.Count-1); RxRichedit1.Height := p.y; край;

Sendmessage е необходим тук, за да завъртите текста нагоре, в противен случай оразмеряването е бъгово. Но тук се появи друг проблем. Когато правите първо RxRichEdit1.Lines.Add(""); и след това RxRichEdit1.Lines.Delete(RxRichEdit1.Lines.Count-1); след това по някаква причина към текста се добавя празен ред. И не може да се премахне. Вместо това предпоследният ред се изтрива. Не разбрах как да се отърва от този идиотски бъг.

MBoКогато се опитам да направя това, Delphi се оплаква от TFormatRange. Разбирам, че нещо трябва да се добави към Uses, за да работи кодът, но просто не знам. Как можете да разберете какво да добавите към Употреби в такива случаи? Има ли някакъв универсален списък на всичко, което може да се добави там?

Alex4444444444 ( 2002-11-07 01:29 ) [18]

> Има ли някакъв универсален списък на всичко, което може да бъде > добави там?

MBo ( 2002-11-07 13:16 ) [19]

Кен ( 2002-11-08 04:05 ) [20]

И как мога да премахна последния ред в RichEdit, ако е празен? По някаква причина в този случай вместо това се премахва предпоследният. И последният остава празен.

MBo ( 2002-11-08 07:47 ) [21]

б-Променлива TBitmap, която, разбира се, вече трябва да бъде създадена, например в ONCreate на формуляра

Кен ( 2002-11-09 02:10 ) [22]

2 MBOРазбрах. Ето как се случи: procedure TForm1.Button1Click(Sender: TObject); Променлива fr : TFormatRange; r: TRect; b : TBitmap; започнете b:=TBitmap.create; r:= rect(0, 0, RichEdit1.Width*screen.Pixelsperinch, RichEdit1.Height*screen.Pixelsperinch); fr.hdc := b.canvas.handle; fr.hdctarget:=b.canvas.handle; fr.rc:=r; fr.rcpage:=r; fr.chrg.cpMin:=0; fr.chrg.cpMax:=-1; Изпращане на съобщение(RichEdit1.handle,EM_FORMATRANGE,1,longint(@fr)); Richedit1.Height:=Trunc(screen.Pixelsperinch*fr.rc.bottom/1440)+8; Изпращане на съобщение(RichEdit1.handle,WM_VSCROLL,SB_TOP,0); b.Унищожаване; край; Всичко работи.

И как може това да стане сега като отделен компонент, с толкова полезна функция? Никога не съм го правил, така че дори не знам откъде да започна.