
15.03.2012, 10:33
|
Прохожий
|
|
Регистрация: 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
Заранее благодарен!!!
|