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

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

Я хочу изменить способ отображения текста в TEdit, как?


Страницы:   1 2

Kolan ©   (2007-02-09 21:20:00) 

Здравствуйте,
 Хочу написать наследника TEditи изменть рисование текста. Какой метод пререкрыть?
 Например у TStringGridесть DrawGridCell, а что у TEdit?


Kolan   (2007-02-10 22:09:00) [1]

Вот что вышло у меян.
unit KInsideHintEdit;

interface

uses
 SysUtils, Classes, Controls, StdCtrls, Graphics, Messages;

type
 TInsideHintEdit = class(TEdit)
 private
   { Private declarations }
   FInsideHint: string;
   FInsideHintColor: TColor;
   FControlCanvas: TControlCanvas;
   FIsEntered: Boolean;
   FIsClearOnEnter: Boolean;
   procedure SetInsideHintColor(const Value: TColor);
   procedure SetInsideHint(const Value: string);
 protected
   { Protected declarations }
   procedure DrawInsideHint; virtual;
   procedure Change; override;
   procedure DoEnter; override;
   procedure DoExit; override;
   procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
   procedure FillInsideHintRect;
 public
   { Public declarations }
 published
   { Published declarations }
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   property InsideHint: string read FInsideHint write SetInsideHint;
   property InsideHintColor: TColor read FInsideHintColor write SetInsideHintColor;
   property IsClearOnEnter: Boolean read FIsClearOnEnter write FIsClearOnEnter;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('KSoftWare', [TInsideHintEdit]);
end;

{ TInsideHintEdit }

procedure TInsideHintEdit.Change;
begin
 inherited;              
 if Text = '' then
   DrawInsideHint;  
end;

procedure TInsideHintEdit.FillInsideHintRect;
begin
 FControlCanvas.Brush.Color := Color;
 FControlCanvas.FillRect(ClientRect);
end;

constructor TInsideHintEdit.Create(AOwner: TComponent);
begin
 inherited;
 FControlCanvas := TControlCanvas.Create;
 FControlCanvas.Control := Self;
 FInsideHint := '';
 FInsideHintColor := clLtGray;
 FIsEntered := False;
 FIsClearOnEnter := False;
 FControlCanvas.Brush.Color := Color;
end;

destructor TInsideHintEdit.Destroy;
begin
 FControlCanvas.Free;
 inherited;
end;

procedure TInsideHintEdit.DoEnter;
begin
 inherited;
 if FIsClearOnEnter then
   FillInsideHintRect;
 FIsEntered := True;
end;

procedure TInsideHintEdit.DoExit;
begin
 inherited;
 FIsEntered := False;
 if Text = '' then
   DrawInsideHint;
end;

procedure TInsideHintEdit.DrawInsideHint;
var
 ALeft: Integer;
begin
 if (FInsideHint <> '') and ((not FIsEntered) or (not FIsClearOnEnter)) then
 begin
   FillInsideHintRect;
   ALeft := ClientRect.Left + 2;
   FControlCanvas.Font.Color := FInsideHintColor;
   FControlCanvas.Font.Size := Font.Size;
   FControlCanvas.TextRect(ClientRect, ALeft, 1, FInsideHint);
 end;
end;

procedure TInsideHintEdit.SetInsideHint(const Value: string);
begin
 FInsideHint := Value;
 if Text = '' then
   DrawInsideHint;
end;

procedure TInsideHintEdit.SetInsideHintColor(const Value: TColor);
begin
 FInsideHintColor := Value;
 if Text = '' then
   DrawInsideHint;
end;

procedure TInsideHintEdit.WMPaint(var Message: TWMPaint);
begin
 inherited;
 if Text = '' then
   DrawInsideHint;  
end;

end.

Зы
Это кстати первый мой компонент, который я установил в ИДЕ(из своих я имею ввиду) :)


sniknik   (2007-02-10 21:51:00) [2]

> 2 Эдита необходимы?
только для того чтобы был переход между компонентами, можно любой другой (кнопка, мемо, т.д.), или несколько, естественно могущих принимать фокус (хоть один из них).
при только одном, он будет всегда активным, следовательно всегда активным будет редактирующий эдит, а "хинтового" не будет видно никогда.


Kolan   (2007-02-10 21:23:00) [3]

«(ворой эдит это чтобы видеть, переходить между ними…)»

Если честно не понял как работает. 2 Эдита необходимы?


sniknik   (2007-02-10 20:49:00) [4]

пример реализации, без оформления в виде компонента, если компонентом то можно использовать нормальные переменные, сделать нормальные методы, ну и события использовать не пользовательские...

unit Unit1;

interface

uses
 Forms, Graphics, Classes, Controls, StdCtrls, SysUtils;

type
 TMyEdit = class(TEdit);

 TForm1 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   procedure FormCreate(Sender: TObject);
   procedure Edit1Enter(Sender: TObject);
 private
   procedure doExit(Sender: TObject);
 public
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit1.Font.Color:= clInactiveCaption;
 Edit1.Text:= 'Hint';

 Edit1.Tag:= Integer(TEdit.Create(Edit1));
 with TEdit(Edit1.Tag) do begin
   ParentFont:= false;
   Parent:= Edit1;
   BorderStyle:= bsNone;
   Left:= 1;
   Top := 1;
   Width := Edit1.ClientWidth;
   Height:= Edit1.ClientHeight;
   Visible:= false;
   onExit:= doExit;
 end;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
 with TEdit(TEdit(Sender).Tag) do begin
   Visible:= true;
   SetFocus;
 end;
end;

procedure TForm1.doExit(Sender: TObject);
begin
 with TEdit(Sender) do
   if Trim(Text) = '' then Visible:= false;
end;

end.


(ворой эдит это чтобы видеть, переходить между ними...)


Kolan   (2007-02-10 20:34:00) [5]

«Вот чесслово, для этого нет необходимости добавлять канву
edit'у и на ней рисовать…
Не убедил :)»

Ну а как предлогай…


RASkov   (2007-02-10 20:01:00) [6]

> Нет, ну может быть автор сможет убедить в обратном...

> [23] Kolan ©   (10.02.07 15:49)
Работает так: Если в эдите ничего нет, то в нем появляется надпись(1) с цветом (2).
Если что-то набрать она исчезает :)

Вот чесслово, для этого нет необходимости добавлять канву edit'у и на ней рисовать...
Не убедил :)


Kolan   (2007-02-10 15:49:00) [7]

Вообщем получилось все что я хотел.
Добавил в Эдит 3 свойства:
1. Подсказка
2. Цвет
3. Стирать при входе.

Работает так: Если в эдите ничего нет, то в нем появляется надпись(1) с цветом (2).
Если что-то набрать она исчезает :)
Если надо кому вышлю :)


Kolan   (2007-02-10 10:19:00) [8]

> ЗЫ Но и коверкать компоненты, тоже не есть дело.:)

Почему коверкать? Я хочу расширить функциональность. Пишу наследника. Где и что я исковеркал?


Kolan   (2007-02-10 10:19:00) [9]

> Ну зачем в окне ввода и редактирования текста что-то рисовать!
> :(

Видел на сайтах поля ввода в которых серым написана подсказка?
- Вот я также хочу сделать. Выводить её в Text смысла нет имхо, и менять цвет шрифта.
Кроме того логика сильно усложняется..
Поэтому я её просто рисую..


unknown   (2007-02-10 02:44:00) [10]


> RASkov   (10.02.07 02:29) [19]
> (Это не тебе:)

ИШШо бы мне.... Моя, обидевшись, может и на послать  =)))


RASkov   (2007-02-10 02:29:00) [11]

> [18] unknown ©   (10.02.07 02:17)

Заставил меня задуматься :) Хотя
> Коверкать Русский язык не надо.
- Это я согласен.

ЗЫ Но и коверкать компоненты, тоже не есть дело.:) (Это не тебе:)


unknown   (2007-02-10 02:17:00) [12]


> RASkov   (10.02.07 01:46) [16]

Извини, [17] - не к тебе. Не в ту ветку ответил. =((


unknown   (2007-02-10 02:08:00) [13]


> RASkov   (10.02.07 01:46) [16]
>
> > [14] unknown ©   (10.02.07 01:39)
>
> Наше ПО самое пэостое пэо:)

Коверкать Русский язык не надо.
p.s.
Ленин был. БЫЛ. Не надо путать.
p.p.s
Идиотами, видимо, рождаются....


RASkov   (2007-02-10 01:46:00) [14]

> [14] unknown ©   (10.02.07 01:39)

Наше ПО самое пэостое пэо:)


RASkov   (2007-02-10 01:44:00) [15]

> [13] Германн ©   (10.02.07 01:27)

Во-во и я о том же, нафиг пайнтбоксы там всякие, лэйблы придумали....
Кстати, другим, наоборот хочется в лэбле, например, изменять текст как в эдите...
Изобретатели:)
Нет, ну может быть автор сможет убедить в обратном...


unknown   (2007-02-10 01:39:00) [16]


> Германн ©   (10.02.07 01:27) [13]
> Ну зачем в окне ввода и редактирования текста что-то рисовать!
>  :(

Умом Россию не понять... Сказали надо - значит надо =)))


Германн   (2007-02-10 01:27:00) [17]


> RASkov   (10.02.07 01:18) [12]

А я не понимаю, для чего над эдитом издеваться так:
> Kolan ©   (09.02.07 21:39) [4]
>
> Вот что я хочу:
> Допустим при изменении(Change) проверять флаг и если влаг
> стоит, то вывести в Эдит надпись.
> Но вывести не с помошью Text, а просто нарисовать на конве.
>  Как сие сделать?
>

Ну зачем в окне ввода и редактирования текста что-то рисовать! :(


RASkov   (2007-02-10 01:18:00) [18]

> [7] Kolan ©   (09.02.07 21:45)

Вот чес слово не пойму, для чего над едитом так издеваться?:)


Kolan   (2007-02-09 22:44:00) [19]

«А почему бы не реализовать свой TSuperEdit?»

Да мне там чуть чуть подправить… :)


Kolan   (2007-02-09 22:44:00) [20]

«Edit1.Font.Color — глянь реализацию.»

Извени не понял. Там и смотреть то нечего… У TFont же смотреть нодо было, так?

Использовал подход из [7], работает так как я хочу. Толкь вот как теперь понять как это работает. ОБъясните?


Страницы:   1 2

Наверх

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