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

Delphi Sources



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

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

Всем привет! Вставляю RichEdit в StringGrid. Вставка в первую ячейку проходит без проблем, текст вводится без проблем в RichEdit, высота строки SG реагирует на кол-во строк текста в RichEdit, текст корректно отображается в SG при выходе из RE. Самое интересное начинается, когда начинаешь ввод во вторую строку. Увеличивается высота строки, где до этого был ввод данных, высота RE тоже увеличивается и тд и тп. Вообщем все работает не так, как хотелось. Вот код с которым работаю:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Grids, WinProcs, RichEdit;

type
  TForm1 = class(TForm)
    SG: TStringGrid;
    RE: TRichEdit;
    procedure SGSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
      State: TGridDrawState);
    procedure REChange(Sender: TObject);
    procedure REExit(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.REChange(Sender: TObject);
var
fr : TFormatRange;
r : TRect;
b : Graphics.TBitmap;
k:integer;
begin
b:= Graphics.TBitmap.Create;
r:= rect(0, 0, RE.Width*screen.Pixelsperinch, RE.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.handle,EM_FORMATRANGE,1,longint(@fr));
RE.Height:=Trunc(screen.Pixelsperinch*fr.rc.bottom/1440)+8;
Sendmessage(RE.handle,WM_VSCROLL,SB_TOP,0);
k:=SG.Row;
SG.RowHeights[k]:= RE.Height;
b.Destroy;
end;

procedure TForm1.REExit(Sender: TObject);
begin
SG.Cells[SG.Col,SG.Row] := RE.Text;
  RE.Visible := False;
  SG.SetFocus;
end;

procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
  State: TGridDrawState);
var
  Format: Word;
  C : array[0..255] of Char;
begin
 case ACol mod 3 of
  0:Format:= DT_Center;
  1:Format:= DT_Center;
  2:Format:= DT_Left;
 end;
  Format := Format OR DT_WORDBREAK;
  Inc(Rect.Left,3);
  (Sender as TStringGrid).Canvas.FillRect(Rect);
  StrPCopy(C, (Sender as TStringGrid).Cells[ACol, ARow]);
  WinProcs.DrawText((Sender as TStringGrid).Canvas.Handle, C, StrLen(C), Rect, Format);
end;

procedure TForm1.SGSelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
var
R:TRect;
begin
 if ACol = 2 then
  begin
R:=SG.CellRect(ACol, ARow);
R.Left:= R.Left+SG.Left;
R.Top:=R.Top+SG.top;
RE.left:=R.Left+2;
RE.Top:=R.Top+2;
RE.Width:=SG.ColWidths[ACol];
RE.Height:= SG.RowHeights[ARow];
RE.Visible:= True;
RE.SetFocus;
RE.Text:=SG.Cells[ACol, ARow];
  end;
  CanSelect:=True;
   end;
end.
В SG goColSizing выставляю в True
Заранее благодарен!!!
Ответить с цитированием
  #2  
Старый 15.03.2012, 23:09
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

"Прошагай" событие REChange и посмотри результат строки:
Код:
  RE.Height := Trunc(Screen.PixelsPerInch * rc.bottom / 1440) + 8;
Если заблокировать данное событие, то все косяки исчезают.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 15.03.2012 в 23:14.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
bambooshoot (16.03.2012)
  #3  
Старый 16.03.2012, 06:25
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

спасибо земляк))) прошагал я... Буду думать. Как исправлю, выложу код может быть кому-нибудь пригодиться)
Ответить с цитированием
  #4  
Старый 11.04.2012, 14:44
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Думал, что проблема решена, ан нет... Проблема заключается в строке:
Код:
RE.Height:=Trunc(screen.Pixelsperinch*fr.rc.bottom/1440)+8;
В первом проходе для fr.rc.bottom возвращается значение 195 после чего все остальное работает так как и должно. При втором проходе значение не возвращается и идет нарастание высоты ячейки. Ничего не могу понять. Объясните пожалуйста, что не так
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter