Текущий архив: 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 — глянь реализацию.»
Извени не понял. Там и смотреть то нечего… У TFont же смотреть нодо было, так?
Использовал подход из [7], работает так как я хочу. Толкь вот как теперь понять как это работает. ОБъясните?
← →
Kolan © (2007-02-09 22:44) [11]«А почему бы не реализовать свой TSuperEdit?»
Да мне там чуть чуть подправить… :)
← →
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"у и на ней рисовать…
Не убедил :)»
Ну а как предлогай…
← →
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]«(ворой эдит это чтобы видеть, переходить между ними…)»
Если честно не понял как работает. 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