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

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

Edit


Alex01 ©   (2005-02-04 15:46:00) 

Как в Edit'е сделать алигмент текста по правой стороне?
Все свойства проверил, в справке тоже ничего не нашел


Goorus   (2005-02-21 17:17:00) [1]

Тоже недавно понадобилось, вот компонент:

type

 TTransparentEdit = class(TEdit)
 private
   procedure SetTransparent(const Value: Boolean);
   function GetTransparent: Boolean;
   procedure SetAlignment(const Value: TAlignment);
 protected
   FAlignment: TAlignment;
   procedure CreateParams(var Params: TCreateParams); override;
   procedure WndProc(var Message: TMessage); override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property Alignment: TAlignment read FAlignment write SetAlignment;
   property Transparent: Boolean read GetTransparent write SetTransparent;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Goorus', [TTransparentEdit]);
end;

{ TTransparentEdit }

constructor TTransparentEdit.Create(AOwner: TComponent);
begin
 inherited;
 ControlStyle := ControlStyle + [csOpaque];
end;

procedure TTransparentEdit.CreateParams(var Params: TCreateParams);
const
 Alignments: array[TAlignment] of DWORD = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
 inherited CreateParams(Params);
 with Params do
 begin
   Style := Style or Alignments[FAlignment];
//    ExStyle := ExStyle or WS_EX_TRANSPARENT;
 end;
end;

destructor TTransparentEdit.Destroy;
begin
 inherited;
end;

function TTransparentEdit.GetTransparent: Boolean;
begin
 Result := not (csOpaque in ControlStyle);
end;

procedure TTransparentEdit.SetAlignment(const Value: TAlignment);
begin
 if FAlignment <> Value then
 begin
   FAlignment := Value;
   RecreateWnd;
 end;
end;

procedure TTransparentEdit.SetTransparent(const Value: Boolean);
begin
 if Transparent <> Value then
 begin
   if Value then
     ControlStyle := ControlStyle - [csOpaque]
   else
     ControlStyle := ControlStyle + [csOpaque];
   Invalidate;
 end;
end;

procedure TTransparentEdit.WndProc(var Message: TMessage);
begin
 with Message do
 if Msg = WM_ERASEBKGND then
 begin
   if Transparent then
   begin
     Brush.Style := bsSolid;
     SetBkColor(TWMEraseBkGnd(Message).DC, Color);
     SetBkMode(TWMEraseBkGnd(Message).DC, Windows.OPAQUE);
     FillRect(TWMEraseBkGnd(Message).DC, ClientRect, Brush.Handle);
   end
   else
   begin
//      SetBkMode(TWMEraseBkGnd(Message).DC, Windows.OPAQUE);
     Brush.Style := bsSolid;
//      FillRect(TWMEraseBkGnd(Message).DC, ClientRect, Brush.Handle);
   end;
   Result := 0;
   inherited;
 end
 else
 if Msg = WM_PAINT then
 begin
   Brush.Style := bsSolid;
   SetBkColor(TWMEraseBkGnd(Message).DC, Color);
   SetBkMode(TWMEraseBkGnd(Message).DC, Windows.OPAQUE);
   Result := 0;
   inherited;
 end
 else
 inherited;
end;

Просто поудаляй всё, что связано с Transparent, прозрачность у меня так и не получилась :(
Может кто поможет? Дело в том, что елси на WM_ERASEBKGND ставить  Brush.Style := bsClear, то форма за эдитом не перерисовывается, а фон текста всё-равно белый.


ККВ   (2005-02-08 07:26:00) [2]

procedure TMainFrm.RJustifyEdit(var ThisEdit:TEdit);
var
 Left, Width: Integer;
 GString: string;
 Rgn: TRect;
 TheCanvas: TControlCanvas;
begin
 TheCanvas := TControlCanvas.Create;
 try
   TheCanvas.Control := ThisEdit;
   GString := ThisEdit.Text;
   Rgn := ThisEdit.ClientRect;
   TheCanvas.FillRect(Rgn);
   Width := TheCanvas.TextWidth(GString);
   Left := Rgn.Right - Width - 1;
   TheCanvas.TextRect(Rgn, Left, 0, GString);
 finally
   TheCanvas.Free;
 end;
end;


Юрий Зотов   (2005-02-08 06:16:00) [3]

> Petr V. Abramov ©   (08.02.05 01:58) [6]

См. [2]. Для современныз систем ES_MULTILINE уже не требуется.


Petr V. Abramov   (2005-02-08 01:58:00) [4]

> замещаете CreateParams и ставите ES_RIGHT.
 or ES_MULTILINE
 
 "эту хохмочку я уже знаю" :))) От Вас :)))

> Тоже на 10 минут.
 Это Игорю Шевченко на 10 мин. :)))


Cobalt   (2005-02-07 23:55:00) [5]

Alex01   (04.02.05 20:58) [3]
В новой Дельфе (если не ошибаюсь, начиная с 6-ой) надо внимательнеечитать справку.
Это свойство только у CLX-ного контрола.


Юрий Зотов   (2005-02-04 23:46:00) [6]

> Alex01   (04.02.05 20:58) [3]

> Нет, мне не на API надо, а у стандартного TEdit'a

Только что Вы сказали, что хотите иметь стандартный велосипед, но с десятью колесами.

А так не бывает. Либо стандартный, либо с десятью колесами. Одно из двух.

По сабжу - пишете наследника, замещаете CreateParams и ставите ES_RIGHT. Примеров полно в VCL, работы - на 10 минут.

Или используете Get/SetClassLong и все равно ставите ES_RIGHT. Тоже на 10 минут.


Alex01   (2005-02-04 20:58:00) [7]

Нет, мне не на API надо, а у стандартного TEdit'a Ура! Я нашел в справке свойство Aligment
Use Alignment to indicate text alignment in the edit box

taLeftJustify:Align text on the left side in the edit control.
taCenter:Center the text in the edit control.
taRightJustify:Align text on the right side in the edit control.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Все это здорово, но в реальности у ЕДИТА нет такого свойства!!!!
Бред какой-то.
Я знаю, щас вы будете поливать меня грязью, но я просто в отчаянии...


MBo   (2005-02-04 17:41:00) [8]

стиль ES_RIGHT нужно включить при создании.

и ES_MULTILINE при необходимости учесть следующее:
ES_RIGHT
Windows 98/Me, Windows 2000/XP: Right aligns text in a single-line or multiline edit control. Windows 95, Windows NT 4.0 and earlier: Right aligns text in a multiline edit control.


Marser   (2005-02-04 17:26:00) [9]

Ручками


Наверх

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