свій tedit

свій TEdit

Пошукав я, пошукав, але нічого путнього не знайшов.
Вже довгий час у мене мрія зробити свій TEdit, з власної прорисовкой вмісту.

Велика потреба у ньому виникає, коли наприклад потрібно редагувати елемент таблиці, оформленої в якомусь стилі, з бекграундом, артшріфтамі, нерівним становищем тексту і т.д.







Я в принципі все це зможу зробити, але мене бентежить те, що це віндовий контрол, і я не дуже добре знаю специфіку його роботи, тобто я хочу сказати, що не знаю, як зробити, що-б він працював так-же добре , як і звичайний TEdit.

Наприклад як причепити до нього стандартне меню, що випадає правки, які події обробляти на вставку, видалення, вирізання, як правильно зробити миготливий курсор- через внутрішній екземпляр TTimer, або по іншому, як правильно відстежувати втрату і отримання фокусу, і взагалі якими особливостями володіє цей компонент .

Я хотів би попросити Майстрів, у яких є напрацювання в цій галузі, трохи допомогти мені порадами 8)))

(Жирним виділені питання)
Я вирішив, що TMyEdit повинен успадковуватися від # XA0; class (TGraphicControl).
Додав йому властивість
# XA0; # XA0; Property Text: string read FText write SetText;

Думаю для початку, потрібно зробити, що-б мій компонент хоч як-небудь відображався. Не довго жумая знаходжу першого-ліпшого спадкоємця від того ж класу, ним виявився
# XA0; TGauge = class (TGraphicControl)
з панелі Samples. Дивимося, як він промальовується. ніби все просто

але виникає питання-Навіщо створюються два бітмапами. Який сенс в малюванні на OverlayImage, а не на TheImage?

Завтра продовжу о 20:00 закінчується інет

Див. В msdn розділ User Controls.
Але, чесно кажучи, важке це справа - писати контроли з самого нуля.

# XA0; # XA0;
# XA0; public
// # XA0; # XA0; procedure CutToClipboard;
# XA0; # XA0; constructor Create (AOwner: TComponent); override;
# XA0; # XA0; destructor Destroy; override;
# XA0;
# XA0; published
# XA0; # XA0; property Color;
# XA0; # XA0; property ParentColor;
# XA0; # XA0;
# XA0; end;
.

procedure TCustomAditor.WMKillFocus (var Msg: TWMKillFocus);
begin
# XA0; inherited;
# XA0; Windows.HideCaret (Handle);
# XA0; Windows.DestroyCaret;
end;

procedure TCustomAditor.WMSetFocus (var Msg: TWMSetFocus);
var cw, ch: integer;
begin
# XA0; cw: = 2;
# XA0; ch: = 14;
# XA0; CreateCaret (Handle, 0, cw, ch);
# XA0; ShowCaret (Handle);
// # XA0; UpdateCaret;
end;


Вище також показано, як працювати з Коретко. Правдо, потрібно додати, щоб каретка встовала свого положеніе.Насчет фокуса при натисканні мишкою по компоненту йому потрібно встановити фокус # XA0; Windows.SetFocus (Handle);






Ти пошол TGauge, а це візуальний компонент. Для того, щоб прогрессбар НЕ кліпав використовують подвійну буфірізацію. По-цьому там малює на OverlayImage.


> Але помойму потрібно робити від іншого класу.

Вчора переосмислив роботу майбутнього компонента, дійсно, потрібно робити батьком або TWinControl, або TCustomEdit.

Для проби створив від TCustomEdit, додав Pen, Brush, Canvas, перевизначив:
# XA0; # XA0; procedure WMPaint (var Message: TWMPaint); message WM_PAINT;

procedure TMyEdit2.WMPaint (var Message: TWMPaint);
var
# XA0; X, Y, W, H, S: Integer;
begin
# XA0; with FCanvas do
# XA0; begin
# XA0; # XA0; Pen: = FPen;
# XA0; # XA0; Brush: = FBrush;
# XA0; # XA0; X: = Pen.Width div 2;
# XA0; # XA0; Y: = X;
# XA0; # XA0; W: = Width - Pen.Width + 1;
# XA0; # XA0; H: = Height - Pen.Width + 1;
# XA0; # XA0; if Pen.Width = 0 then
# XA0; # XA0; begin
# XA0; # XA0; # XA0; Dec (W);
# XA0; # XA0; # XA0; Dec (H);
# XA0; # XA0; end;
# XA0; # XA0; if W # XA0; # XA0; Inc (X, (W - S) div 2);
# XA0; # XA0; Inc (Y, (H - S) div 2);
# XA0; # XA0; W: = S;
# XA0; # XA0; H: = S;
# XA0; # XA0; Ellipse (X, Y, X + W, Y + H);
# XA0; end;
end;

Хммм. Я і не знав, що WM_PAINT викликається постійно. виявляю посеред едіта постійно миготливий еліпс, в іншому все працює як в Едіті.
Питання до майстрів - Paint так і повинен постійно викликатися і без кінця перемальовувати контрол, або я щось забуваю зробити, може мені потрібно встановити який-небудь прапор в messege, або щось в цьому роді, що-б просигналити про те, що перерисовка проведена?

Спробував поміняти батька на TWinControl. залишився тільки мерехтливий еліпс.

Хмм. якщо я перевантажив WM_Paint, то чому ж нащадок TCustomEdit продовжує малювати фрейм, і навіть літери. Поколупався в батьках, знайшов
# XA0; # XA0; procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;

переобумовленої, ставлю все той-же код елліпса,
хмм. вже краще. маємо білий прямокутник, і все той-же мерехтливий еліпс, букв не видно. Думаємо, як позбутися від білого прямокутника.

Помилочка - букви і раніше промальовувалися.
До того ж виявляємо неприємний ефект - Дельфи починає страшно гальмувати через постійну перемальовування.

Довго сидів, і розглядав роботу TCustomEdit. з'являються сумніви в тому, що я зможу повністю перевизначити перерисовку цього контрола. Він створює віндовий Едіт, і спілкується з ним за допомогою повідомлень. хоча може можна зробити віндовий Едіт, приховати його, залишивши при цьому в робочому стані, і малювати самому, знову-таки обмінюючись з ним повідомленнями.
Схоже доведеться робити рдітелем TWinControl, той крайнього заходу нічого не малює

Шановні майстри - висловіть будь ласка свою думку, від якого батька краще створювати такий контрол, і чому


> Paint так і повинен постійно викликатися і без кінця перемальовувати
> контрол

Так, обробники повідомлень автоматично викликаються, коли контрол отримує відповідне повідомлення. А перерисовка відбувається у відповідь практично на всі дії користувача.

umbra - спасибі 8))

Поки робив іншу роботу натрапив на наступне:
TCustomControl
Цей клас походить від класу TWinControl. Він вводить концепцію канви і містить метод Paint (), що надає розширений контроль над зовнішнім виглядом вашого компонента. Цей клас використовується в основному для створення користувацьких віконних елементів

Але тоді все, що стосується тексту треба буде писати з нуля

Якщо потрібно змінити тільки промальовування вмісту, то спадщини від TCustomEdit, а промальовування робіть за прикладом TDBEdit в обробнику WM_PAINT.

вилучено модератором
Примітка: Offtopic







Схожі статті