Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

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

 
Kolan ©   (2007-02-09 21:20) [0]

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


 
TUser ©   (2007-02-09 21:27) [1]

Edit - его винда рисует.


 
Kolan ©   (2007-02-09 21:29) [2]

«[1] TUser ©   (09.02.07 21:27)
Edit — его винда рисует.»

Ладно. Можно ли как то ловить какое-то сообщение и изменять допустим цвет шрифта? Как?


 
Kolan ©   (2007-02-09 21:33) [3]

«Edit — его винда рисует.»

Как разобраться в том как именно происходит это рисование.


 
Kolan ©   (2007-02-09 21:39) [4]

Вот что я хочу:
Допустим при изменении(Change) проверять флаг и если влаг стоит, то вывести в Эдит надпись.
Но вывести не с помошью Text, а просто нарисовать на конве. Как сие сделать?


 
vasIZmax ©   (2007-02-09 21:40) [5]

имхо, а готовые подобные компоненты не вариант использовать?))


 
Kolan ©   (2007-02-09 21:41) [6]

«[5] vasIZmax ©   (09.02.07 21:40)
имхо, а готовые подобные компоненты не вариант использовать?
))»

Не, не все сам :)


 
Kolan ©   (2007-02-09 21:45) [7]

Вот нашел:
procedure 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;


Правильно? В сторону TControlCanvas копать, да?


 
TUser ©   (2007-02-09 21:46) [8]

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


 
unknown ©   (2007-02-09 22:16) [9]


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

А почему бы не реализовать свой TSuperEdit? Как минимум, реализацию можно подсмотреть в jedi.


 
Kolan ©   (2007-02-09 22:44) [10]

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

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

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


 
Kolan ©   (2007-02-09 22:44) [11]

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

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


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

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

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


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


> RASkov   (10.02.07 01:18) [12]

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

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


 
unknown ©   (2007-02-10 01:39) [14]


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

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


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

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

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


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

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

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


 
unknown ©   (2007-02-10 02:08) [17]


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

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


 
unknown ©   (2007-02-10 02:17) [18]


> RASkov   (10.02.07 01:46) [16]

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


 
RASkov   (2007-02-10 02:29) [19]

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

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

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


 
unknown ©   (2007-02-10 02:44) [20]


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

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


 
Kolan ©   (2007-02-10 10:19) [21]

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

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


 
Kolan ©   (2007-02-10 10:19) [22]

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

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


 
Kolan ©   (2007-02-10 15:49) [23]

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

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


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

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

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

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


 
Kolan ©   (2007-02-10 20:34) [25]

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

Ну а как предлогай&#133


 
sniknik ©   (2007-02-10 20:49) [26]

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

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 21:23) [27]

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

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


 
sniknik ©   (2007-02-10 21:51) [28]

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


 
Kolan ©   (2007-02-10 22:09) [29]

Вот что вышло у меян.
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.

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



Страницы: 1 вся ветка

Текущий архив: 2007.03.04;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.054 c
2-1171563825
Первокласник Вася
2007-02-15 21:23
2007.03.04
Список


15-1170938697
allucard
2007-02-08 15:44
2007.03.04
Win2000 и подключения(удалённая модератором трабла).


15-1170922718
vasIZmax
2007-02-08 11:18
2007.03.04
Дидактические игры?!


15-1170695431
lookin
2007-02-05 20:10
2007.03.04
Можно ли везти с собой ноутбук с нелицензией за границу?


15-1170958693
DemonP
2007-02-08 21:18
2007.03.04
x=3*exp(-3x) решить методом хорд....