Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как подогнать размеры TRichEdit под текст в нем


Страницы:   1 2

@!!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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо