Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.03.2012, 13:44
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию Высота RichEdit в зав-ти от кол-ва строк

Всем привет! Столкнулся с такой проблемой - создаю динамически 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  
Старый 06.03.2012, 14:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

j и i не объявлены.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 06.03.2012, 19:50
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

i и j объявленны в самом начале как integer. Ты это имеешь в виду?
Прилагаю скрин ошибки. Может быть это поможет
Изображения
Тип файла: jpg Ошибка.JPG (16.4 Кбайт, 9 просмотров)
Ответить с цитированием
  #4  
Старый 06.03.2012, 21:46
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Создавать 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;
...
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 07.03.2012, 07:54
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Angvelem, не совсем тебя понял. RichEdit-ы создаются в ButtonClick. Причем до создания RichEditChange были работоспособны, после создания оной процедуры при попытки набрать текст, выскакивает ошибка (см. выше).
Ответить с цитированием
  #6  
Старый 07.03.2012, 08:55
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вместо скриншота ошибки дай минимальный проект с воспроизводимой ошибкой
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 07.03.2012, 09:44
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

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  
Старый 07.03.2012, 09:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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  
Старый 07.03.2012, 10:15
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Спасибо, NumLock! А почему так?
Ответить с цитированием
  #10  
Старый 07.03.2012, 10:22
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

у тебя RE : array [1..50] of TRichEdit; уже объявлен глобальный, в котором и создаются TRichEdit. а в процедуре RichEditChange получается используется локальный, который естественно "пустой".
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
bambooshoot (07.03.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter