У TSpinEdit.Button есть дополнительные события, которые не показаны в инспекторе объектов, например, OnUpClick и OnDownClick...

 

Как ограничить длинну текста, вводимого в TEdit, так чтобы ширина текста не превышала

ширину TEdit'а?

 

В примере приведено два способа ограничить длинну текста в TEdit так чтобы она не превышала ширину клиентской области окна TEdit'а и не появлялась прокрутка текста. Первый способ устанавливает свойство TEdit'а MaxLength равным числу букв "W", которые поместятся в TEdit. "W" выбрана потому, что является, наверное, самой широкой буквой в любом шрифте. Этот метод сносно работает для шрифтов с фиксированной шириной букв, но для шрифтов с переменной шириной букв вряд ли сгодится. Второй способ перхватывает событие KeyPress TEdit'а и измеряет ширину уже введенного текста и ширину нового символа. Если ширина больше чем клиентская область TEdit'а новый символ отбрасывается и вызывается MessageBeep.

 

Code:

{

All you have to do is to verride the CreateParams of the class TEdit.

Install the following unit as a component.

}

 

unit AlignEdit;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls;

 

type

 

  TAlign = (eaLeft, eaCenter, eaRight);

 

  TAlignEdit = class(TEdit)

  private

    { Private-Deklarationen }

    FAlign: TAlign;

    procedure SetAlign(const Value: TAlign);

  protected

    { Protected-Deklarationen }

    procedure CreateParams(var Params: TCreateParams); override;

  public

    { Public-Deklarationen }

    constructor Create(AOwner: TComponent); override;

  published

    { Published-Deklarationen }

    property Alignment: TAlign read FAlign write SetAlign default eaLeft;

  end;

 

procedure Register;

 

implementation

 

constructor TAlignEdit.Create(Aowner: TComponent);

begin

  inherited Create(AOwner);

  FAlign := eaLeft;

end;

 

procedure TAlignEdit.SetAlign(const Value: TAlign);

begin

  if FAlign <> Value then

  begin

    FAlign := Value;

    RecreateWnd;

  end;

end;

 

procedure TAlignEdit.CreateParams(var Params: TCreateParams);

begin

  inherited;

  case FAlign of

    eaLeft: Params.Style   := Params.Style or ES_LEFT;

    eaCenter: Params.Style := Params.Style or ES_CENTER;

    eaRight: Params.Style  := Params.Style or ES_RIGHT;

  end;

end;

 

procedure Register;

begin

  RegisterComponents('SwissDelphiCenter', [TAlignEdit]);

end;

 

end.

 

 

 

  

Code:

procedure ClearEdits;

var i : Integer;

begin

for i := 0 to ComponentCount-1 do

if (Components[i] is TEdit) then

   (Components[i] as TEdit).Text := '';

end;

 

 

Code:

procedure DoSomethingWithEditControls;

var

K: Integer;

EditArray: array[0..99] of Tedit;

begin

try

   for K := 0 to 99 do

   begin

     EditArray[K] := TEdit.Create(Self);

     EditArray[K].Parent := Self;

     {Устанавливаем необходимые свойства TEdit}

     SetSomeOtherPropertiesOfTEdit;

     Left := 100;

     Top := K * 10;

     {Что-то делаем при перемещении мыши}

     OnMouseMove := WhatToDoWhenMouseIsMoved;

   end;

   {Делаем все что хотим с полученным массивом Edit-компонентов}

   DoWhateverYouWantToDoWithTheseEdits;

finally

   for K := 0 to 99 do

     EditArray[K].Free;

end;

end;

 

 

 Это можно давольно легко сделать переопределив на форме процедуру CMDialogKey. Чтобы посмотреть как это работает, поместите на форму Edit и введите следующий код:

Code:

{

In this exemple, the only keys allowed are the

same allowed in e-mail adresses.

}

 

procedure TForm1.Edit1KeyPress(Sender: TObject;

  var Key: Char);

const

  AllowedChars: string = 'abcdefghijklmnopq' +

    'rstuvwxyz01234567_.@';

var

  i: Integer;

  Ok: Boolean;

begin

  i  := 0;

  Ok := False;

  { If you erase next line, user won't be able to type backspace }

  if Key = #8 then Ok := True;

  repeat

    i := i + 1;

    if Key = AllowedChars[i] then Ok := True;

  until (Ok) or (i = Length(AllowedChars));

  if not Ok then Key := #0;

end;

 

когда TEdit получает фокус надо вызвать:

Code:

ActivateKeyboardLayout($409, 0);

 

если этого мало тогда почитай про WM_INPUTLANGCHANGE

 

 

В форму добавляются TEditBox и TLabel, при этом TLabel постоянно показывает позицию курсора в элементе редактирования.

Code:

procedure TForm1.Edit1Change(Sender: TObject);

begin

CurPos := Edit1.SelStart;

Label1.Caption := IntToStr(CurPos);

end;

 

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

If Key = VK_LEFT then dec(CurPos);

if Key = VK_RIGHT then inc(CurPos);  

Label1.Caption:= IntToStr(CurPos);

end;

 

 

Code:

{TRichEdit}

 

var

pt: TPoint;

begin

with richedit1 do

begin

   Perform(messages.EM_POSFROMCHAR, WPARAM(@pt), selstart);

   label1.caption := Format('(%d, %d)', [pt.x, pt.y]);

end;

end;

 

{TMemo and TEdit}

 

var

r: LongInt;

begin

with memo1 do

begin

   r := Perform(messages.EM_POSFROMCHAR, selstart, 0);

   if r >= 0 then

   begin

     label1.caption := IntToStr(HiWord(r));

     label2.caption := IntToStr(LoWord(r));

   end;

end;

end;

 

Сегодня поговорим о том, как помочь пользователю ввести в поле ввода текст. Для этого компьютер должен по первым буквам вводимого слова догадаться, что хочет написать пользователь, и предложить ему этот вариант. Один из способов это сделать - дописывать не хватающие буквы к слову, но выделять их.

Нужно решить три задачи:

1. определить вводимые символы,

2. найти слово, начинающееся с этих символов,

3. добавить не хватающие символы и выделить их.

Для решения первой задачи достаточно найти первый символ, не являющийся буквой. Для решения второй задачи можно использовать поиск в StringList. Вставить недостающие символы удобно в специальной переменной типа String.

В этом примере словарь состоит из названий чисел (на английском): от 1 до 10. Иногда словарь можно пополнять, добавляя туда незнакомые слова, вводимые пользователем.