Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выделение текста после события Тав [Delphi, Windows]


RusSun ©   (2009-10-14 21:05:00) 

Доброе время суток, форумчане.
Как правильно сделать выделение текста Editbox'a при
переходе после эмуляции Tab?
что-то с sender'ом не так.
Вот мой код:

procedure KeyDown(Dummy : Pointer; Sender: PControl; var Key: Integer;Shift: Cardinal);
begin
if key=VK_UP then begin
//ShowMessage('верх');
keybd_event(VK_SHIFT,0,0,0);
keybd_event(9,0,0,0);
keybd_event(9,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
                end;
if key =VK_DOWN then begin
  Key := 0;
form.GotoControl(9);
  sender.Focused:=true;
  sender.SelStart:=0;
 sender.SelLength:=sender.TextSize;
                              end;
end;


RusSun   (2009-11-08 14:54:00) [1]

Огромное спасибо! Всё работает. У меня сейчас инета нет поэтому так припознился с ответом.


Дмитрий К   (2009-10-28 17:15:00) [2]

Sender в данном случае - контрол, с которого уходите. Естественно, двойной щелчок возвращает ему фокус. Для выделения после перехода отлавливайте WM_SETFOCUS.
program tabemul;

uses
 Windows,
 Messages,
 KOL;

var
 Form: PControl;
 Edit1: PControl;
 Edit2: PControl;

function EditMessage(Sender: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
begin
 Result := False;
 if Msg.message = WM_SETFOCUS then
 begin
   Sender.SelStart := 0;
   Sender.SelLength := -1;
 end;
end;

procedure EditKeyDown(Dummy, Sender: PControl; var Key: Integer; Shift: Cardinal);
begin
 if key = VK_UP then
 begin
   Key := 0;
   keybd_event(VK_SHIFT, 0, 0, 0);
   Form.GotoControl(VK_TAB);
   keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
 end;
 if key = VK_DOWN then
 begin
   Key := 0;
   Form.GotoControl(VK_TAB);
 end;
end;

begin
 Form := NewForm(nil, 'Form1').Tabulate;
 Edit1 := newEditBox(Form, []);
 Edit2 := newEditBox(Form, []).PlaceUnder;
 Edit1.OnKeyDown := TOnKey(MakeMethod(nil, @EditKeyDown));
 Edit2.OnKeyDown := TOnKey(MakeMethod(nil, @EditKeyDown));
 Edit1.OnMessage := TOnMessage(MakeMethod(Edit1, @EditMessage));
 Edit2.OnMessage := TOnMessage(MakeMethod(Edit2, @EditMessage));

 Run(Form);
end.


RusSun   (2009-10-28 16:52:00) [3]

Немного уточняю свой вопрос
Дело в следующем этот вопрос не стоял бы, но
невыходит продолжение
В Vcl
При переходе от Editbox'са к Editbox'су
при включённом свойстве autoselect
происходит выделение.
В Kol не аналога подходящего мне
вот и пишу отсебятину:
//область для процедур
procedure KeyDown(Dummy : Pointer; Sender: PControl; var Key: Integer;Shift: Cardinal);
begin
//pcontrol(sender).LookTabKeys:= [tkTab,tkUpDown];
//pcontrol(sender).TabStop:= true ;
if key=VK_UP then begin
//ShowMessage('верх');
keybd_event(VK_SHIFT,0,0,0);
keybd_event(9,0,0,0);
keybd_event(9,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
                end;
if key =VK_DOWN then begin
Key := 0;
form.GotoControl(9);
                    end;
if key = VK_TAB then        begin
 sender.Perform(WM_LBUTTONDBLCLK,0,0);
{sender.SelStart:=0;
sender.SelLength:=editbox1.TextSize; }
                              end;
end;

Вообщем работает она как-то странно :crazy:
Сперва проходим прямо, затем в обратном направлении
и только в третий раз начинает выделять, то что нужно
как сделать нормально чтобы работало? :wall:
Кстати в 2.88 почему-то свойство VK_UP
работает также как и VK_DOWN стоит пререйти на более
старую версию работает нормально.


Наверх

Титульная страница Поиск, карта сайта Написать письмо