![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Я хочу изменить способ отображения текста в TEdit, как?
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], работает так как я хочу. Толкь вот как теперь понять как это работает. ОБъясните?