![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет! Столкнулся с такой проблемой - создаю динамически RichEdit.
Увеличиваю высоту компонента в зависимости от количества строк. Увеличение высоты делаю в RichEditChange, вот код: Код:
procedure TForm1.RichEditChange(Sender: TObject); var fr : TFormatRange; r : TRect; b : TBitmap; RE : array [1..50] of TRichEdit; begin b:=TBitmap.create; r:= rect(0, 0, RE[j].Width*screen.Pixelsperinch, RE[j].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; Sendmessage(RE[j].handle,EM_FORMATRANGE,1,longint(@fr)); RE[j].Height:=Trunc(screen.Pixelsperinch*fr.rc.bottom/1440)+8; Sendmessage(RE[j].handle,WM_VSCROLL,SB_TOP,0); RE[i].Height:=RE[j].Height; b.Destroy; end; Код:
r:= rect(0, 0, RE[j].Width*screen.Pixelsperinch, RE[j].Height*screen.Pixelsperinch); |
|
#2
|
||||
|
||||
|
j и i не объявлены.
|
|
#3
|
|||
|
|||
|
i и j объявленны в самом начале как integer. Ты это имеешь в виду?
Прилагаю скрин ошибки. Может быть это поможет |
|
#4
|
||||
|
||||
|
Создавать RichEdit-ы я так понимаю не нужно:
Код:
var RE : array [1..50] of TRichEdit; begin ... r:= rect(0, 0, RE[j].Width*screen.Pixelsperinch, RE[j].Height*screen.Pixelsperinch); ... Sendmessage(RE[j].handle,EM_FORMATRANGE,1,longint(@fr)); RE[j].Height:=Trunc(screen.Pixelsperinch*fr.rc.bottom/1440)+8; ... RE[i].Height:=RE[j].Height; ... |
|
#5
|
|||
|
|||
|
Angvelem, не совсем тебя понял. RichEdit-ы создаются в ButtonClick. Причем до создания RichEditChange были работоспособны, после создания оной процедуры при попытки набрать текст, выскакивает ошибка (см. выше).
|
|
#6
|
||||
|
||||
|
вместо скриншота ошибки дай минимальный проект с воспроизводимой ошибкой
|
|
#7
|
|||
|
|||
|
Ok
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, RichEdit, Grids;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure RichEditChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
i, j : integer;
RE : array [1..50] of TRichEdit;
procedure TForm1.Button1Click(Sender: TObject);// создание
begin
i:= i+1;
RE[i]:= TRichEdit.Create(Form1);
RE[i].Parent:=Form1;
RE[i].Top:=i*21;
RE[i].Left:=8;
RE[i].Width:=129;
RE[i].Height:=22;
j:=j+1;
RE[j]:= TRichEdit.Create(Form1);
RE[j].Parent:=Form1;
RE[j].Top:=j*21;
RE[j].Left:=136;
RE[j].Width:=465;
RE[j].Height:=22;
RE[j].OnChange:=RichEditChange;
end;
procedure TForm1.RichEditChange(Sender: TObject);
var
fr : TFormatRange;
r : TRect;
b : TBitmap;
RE : array [1..50] of TRichEdit;
begin
b:=TBitmap.create;
r:= rect(0, 0, RE[j].Width*screen.Pixelsperinch, RE[j].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;
Sendmessage(RE[j].handle,EM_FORMATRANGE,1,longint(@fr));
RE[j].Height:=Trunc(screen.Pixelsperinch*fr.rc.bottom/1440)+8;
Sendmessage(RE[j].handle,WM_VSCROLL,SB_TOP,0);
RE[i].Height:=RE[j].Height;
b.Destroy;
end;
end. |
|
#8
|
||||
|
||||
|
Код:
procedure TForm1.RichEditChange(Sender: TObject); var fr : TFormatRange; r : TRect; b : TBitmap; //RE : array [1..50] of TRichEdit; begin b:=TBitmap.create; ![]() |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
bambooshoot (07.03.2012)
| ||
|
#9
|
|||
|
|||
|
Спасибо, NumLock! А почему так?
|
|
#10
|
||||
|
||||
|
у тебя RE : array [1..50] of TRichEdit; уже объявлен глобальный, в котором и создаются TRichEdit. а в процедуре RichEditChange получается используется локальный, который естественно "пустой".
|
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
bambooshoot (07.03.2012)
| ||