|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вставка 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. Заранее благодарен!!! |
#2
|
||||
|
||||
"Прошагай" событие 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
|
|||
|
|||
спасибо земляк))) прошагал я... Буду думать. Как исправлю, выложу код может быть кому-нибудь пригодиться)
|
#4
|
|||
|
|||
Думал, что проблема решена, ан нет... Проблема заключается в строке:
Код:
RE.Height:=Trunc(screen.Pixelsperinch*fr.rc.bottom/1440)+8; |