-
Доброе время суток, форумчане.
Как правильно сделать выделение текста 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 © (28.10.09 16:52) [1]Немного уточняю свой вопрос
Дело в следующем этот вопрос не стоял бы, но
невыходит продолжение
В 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 стоит пререйти на более
старую версию работает нормально. -
Дмитрий К © (28.10.09 17:15) [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 © (08.11.09 14:54) [3]Огромное спасибо! Всё работает. У меня сейчас инета нет поэтому так припознился с ответом.