![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как подогнать размеры TRichEdit под текст в нем
@!!ex © (2010-01-19 23:52:00)Нужно чтобы TRichEdit занимал ровно столько места, сколько нужно чтобы отобразить весь текст без скролла и без лишней пустоты.
Наиль (2010-01-22 00:19:00) [1]http://www.delphimaster.net/view/7-1072692942
Наиль (2010-01-21 23:40:00) [2]>[0]
Я бы попытался использовать скролы ричедита.
Они точно знают размер вписаного в ричедит текста.
К примеру создать дополнительный ричедит в отрицательных координатах относительно родительского окна (например, на главной форме) размером 100х100. Выводил бы в него свой текст, выяснял бы характеристики скроллаGetScrollInfoи по формуле определял бы размер РичЕдита хинта.
Anatoly Podgoretsky (2010-01-21 12:55:00) [3]> @!!ex (21.01.2010 12:18:29) [29]
Конечно вручную, раз у тебя комбо
@!!ex (2010-01-21 12:18:00) [4]> [28] Anatoly Podgoretsky © (21.01.10 10:32)
Зачем inherited, на этот вопрос сложно ответить, не изучая глубоко код, но принято при наследование сначала вызывать код предка, а потом исполнять свой.
Оригинальный код рисует хинт по своему. Если делать inherited, то хинт начинает мелькать, т.к. сначала рисуется по старому, потому рисуется мной.
> А с консолью разберись, не надо в этом случае указывать,
> что у тебя консольное приложение.
Создать консоль вручную?
Anatoly Podgoretsky (2010-01-21 10:32:00) [5]> @!!ex (21.01.2010 10:15:27) [27]
Зачем inherited, на этот вопрос сложно ответить, не изучая глубоко код, но принято при наследование сначала вызывать код предка, а потом исполнять свой.
А с консолью разберись, не надо в этом случае указывать, что у тебя консольное приложение.
@!!ex (2010-01-21 10:15:00) [6]> [26] Anatoly Podgoretsky © (21.01.10 09:34)
Зачем там inherited? У меня же полностью свой вывод...
> [26] Anatoly Podgoretsky © (21.01.10 09:34)
> Зачем в консоли Хинт? Вроде бы как ее назначение совсем
> другое, особенно чистая консоль.
Ну там же не только консоль, но и куча форм.
Anatoly Podgoretsky (2010-01-21 09:34:00) [7]Не вижу inherrited в TddgHintWindow.Paint;
Зачем в консоли Хинт? Вроде бы как ее назначение совсем другое, особенно чистая консоль.
@!!ex (2010-01-20 19:42:00) [8]Это из-за консоли. Если {$APPTYPE CONSOLE} , то объекты на хинте не рисуются. почему? Я не знаю.
@!!ex (2010-01-20 18:46:00) [9]Неожиданная проблема...
Решил написать с нуля и у меня не отображается TRichEdit на Hint'e.
В старом коде все работало, но я его по глупостью не сохранил когда переписывал...
Вроде бы восстановил, но видимо что-то упустил.
В первый момент TRichEdit виден, но сразу пропадает.
unit HintWindowEx;
interface
uses
Windows, Classes, Controls, Forms, Messages, Graphics, rxRichEd, StdCtrls, ComCtrls,
SysUtils;
type
TddgHintWindow = class(THintWindow)
private
FRichEdit:TRichEdit;
FHintPath:string;
FAdvancedHint:boolean;
Procedure SetHintFile(const Hint:string);
public
Constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
procedure ActivateHint(Rect: TRect; const AHint: string); override;
procedure Paint; override;
procedure CreateParams(var Params: TCreateParams); override;
end;
implementation
destructor TddgHintWindow.Destroy;
begin
inherited Destroy;
end;
constructor TddgHintWindow.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FRichEdit:=TRichEdit.Create(self);
FRichEdit.Parent:=self;
FRichEdit.ParentWindow:=self.Handle;
FRichEdit.Left:=0;
FRichEdit.Top:=0;
FRichEdit.Width:=10;
FRichEdit.Height:=10;
FRichEdit.ScrollBars:=ssNone;
FRichEdit.BorderStyle:=bsNone;
FRichEdit.ReadOnly:=true;
FRichEdit.Visible:=false;
FHintPath:=ExtractFilePath(ParamStr(0))+'\HHelp\';
FAdvancedHint:=false;
end;
procedure TddgHintWindow.Paint;
var
R: TRect;
begin
if FAdvancedHint then begin
//Ничего не делаем, т.к. RichEdit сам нарисуется
end
else begin
R := ClientRect; // get bounding rectangle
Canvas.Font.Color := clInfoText; // set to proper color
{ paint string in the center of the round rect }
DrawText(Canvas.Handle, PChar(Caption), Length(Caption), R, DT_NOPREFIX or DT_WORDBREAK or DT_CENTER or DT_VCENTER);
end;
end;
procedure TddgHintWindow.SetHintFile(const Hint: string);
begin
{ if FileExists(FHintPath+Hint) then begin
FRichEdit.Lines.LoadFromFile(FHintPath+Hint);
end
else begin }
FRichEdit.Lines.Clear();
FRichEdit.Lines.Add('File not found '+Hint);
{ end; }
FRichEdit.Width:=500;
FRichEdit.Height:=500;
ClientWidth:=FRichEdit.Width;
ClientHeight:=FRichEdit.Height;
end;
procedure TddgHintWindow.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style and not ws_Border;
end;
procedure TddgHintWindow.ActivateHint(Rect: TRect; const AHint: string);
begin
FRichEdit.Visible:=false;
inherited ActivateHint(Rect, AHint);
FAdvancedHint:=(Length(AHint)>1) and (AHint[1]='*');
if FAdvancedHint then begin
SetHintFile(Copy(AHint,2,Length(AHint)));
FRichEdit.Visible:=true;
end;
end;
var
OldHintClass: THintWindowClass;
function SetNewHintClass(AClass: THintWindowClass): THintWindowClass;
var
DoShowHint: Boolean;
begin
Result := HintWindowClass; // return value is old hint window
DoShowHint := Application.ShowHint;
if DoShowHint then
Application.ShowHint := False; // destroy old hint window
HintWindowClass := AClass; // assign new hint window
if DoShowHint then
Application.ShowHint := True; // create new hint window
end;
initialization
OldHintClass := SetNewHintClass(TddgHintWindow);
finalization
SetNewHintClass(OldHintClass);
end.
@!!ex (2010-01-20 17:36:00) [10]6900 - это из-за того, что ширина нулевая...
ширину он не хочет указывать...
MBo (2010-01-20 16:31:00) [11]TRxRichEdit выдал три события (ширина контрола другая, наверно, не следил):
50 35 247 1010
50 35 229 1023
50 35 229 1023
@!!ex (2010-01-20 16:25:00) [12]Похоже это косяк TRxRichEdit.... Не хочет размер указывать...
MBo (2010-01-20 16:07:00) [13]richedit1.Lines.LoadFromFile('d:\a.txt');
procedure TForm2.RichEdit1ResizeRequest(Sender: TObject; Rect: TRect);
begin
Memo1.Lines.Add(Format('%d %d %d %d',[rect.Left, rect.Top, rect.Right, rect.Bottom]));
end;
@!!ex (2010-01-20 15:46:00) [14]> [18] MBo © (20.01.10 15:34)
Покажи код? Может я чего упустил.
MBo (2010-01-20 15:34:00) [15]ну вот я загрузил небольшой файл
событие вызвалось два раза
73 18 258 36
73 18 258 998
73 18 - это координаты левого угла RichEdit на форме
@!!ex (2010-01-20 14:58:00) [16]Причем событие вызывается только при открытии файла.
@!!ex (2010-01-20 14:45:00) [17]Сделал OnResizeRequest
приходит Rect размером 0,0,0,6900
MBo (2010-01-20 14:32:00) [18]событие дельфийского компонента TRichEdit.OnResizeRequest, оно есть в инспекторе объектов, использовать нетрудно.
@!!ex (2010-01-20 14:30:00) [19]Может я с константами накосячил??
WM_NOTIFY = $4E;
EM_GETEVENTMASK = WM_USER + 59;
EM_SETEVENTMASK = WM_USER + 69;
ENM_REQUESTRESIZE = $40000;
EN_REQUESTRESIZE = $701;
@!!ex (2010-01-20 13:57:00) [20]Что я делаю не так:
var
RichEdit:TRxRichEdit;
Function MyWndProc(hwnd:integer; Msg:integer; wParam:integer; lParam:integer):integer; stdcall;
var
rResize:TREQSIZE;
MaskHdr:Tnmhdr;
begin
case Msg of
WM_NOTIFY:begin
CopyMemory(@MaskHdr, Pointer(lParam), sizeof(MaskHdr));
if MaskHdr.code = EN_REQUESTRESIZE then begin
CopyMemory(@rResize, Pointer(lParam), sizeof(rResize));
RichEdit.Height:=rResize.rect.Bottom;
RichEdit.Width:=rResize.rect.Right;
end;
end;
end;
Result := CallWindowProc(Pointer(OldWndProc), hwnd, Msg, wParam, lParam);
end;
Procedure NewWindowProc();
begin
OldWndProc := SetWindowLong(RichEdit.Handle, GWL_WNDPROC, Integer(@MyWndProc))
end;
Procedure ResetWindProc();
begin
SetWindowLong(RichEdit.Handle, GWL_WNDPROC, OldWndProc)
end;
Procedure Form.LoadFromFile();
begin
FRichEdit.Lines.LoadFromFile(FileName);
CurrentMask :=SendMessage( FRichEdit.Handle,EM_GETEVENTMASK, 0, 0);
SendMessage( FRichEdit.Handle,EM_SETEVENTMASK, 0, (CurrentMask or ENM_REQUESTRESIZE));
SendMessage( FRichEdit.Handle,EM_REQUESTRESIZE, 0, 0);
end;