Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2016, 09:26   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию HotKey в ListView

Здравствуйте.
Нужно сделать ListView со стилем LVS_REPORT, чтобы каждый элемент второго или третьего столбца содержал в себе HotKey. При изменении клавиш в хоткее, получать индекс ListView и записывать измененную клавишу в переменную.
куда копать?
Или так (второй вариант): делаем даблклик по строке ListView. Создаем HotKey во втором столбце ListView. Когда HotKey потеряет фокус, уничтожаем его и записываем клавишу в текстовом виде в нужную позицию ListView.
Будет ли это работать? Какой вариант проще сделать?
BLACK_RAIN вне форума Ответить с цитированием
Старый 07.11.2016, 22:45   #2
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

...нет смысла динамически создавать и уничтожать дочерний спецконтрол, задача контрола-родителя всего-лишь заниматься отображением и отслеживанием мест ввода информации.

Подобное делал на базе стринггрида и пары API-процедур:
Безымянный.PNG
но можно приспособить и листфивер.

Даю пример над 4-й колонкой грида. Объявим перехватчик и процедуру преобразования и регистрации динамического набора горячих клавиш:
Код:
protected
    procedure ghotkey(var msg:TMessage); message WM_HOTKEY;
  public
    procedure gl_hook(key1,key2: integer; p: boolean);
  end;


//--- HOTKEY
function strtohotkey(key:string; p: boolean):integer;
begin
 result:= 0;
 if (key = 'Нет')or(key = '') then exit;
 
 if p then begin
  if pos('Alt',key)>0   then result:= 1;
  if pos('Ctrl',key)>0  then result:= 2;
  if pos('Shift',key)>0 then result:= 4
 end else result:= ord(key[length(key)])
end;

function hotkeytostr(Key: Word; shift: TShiftState): string;
begin
 result:= '';
 if (ssctrl in shift)  then result:= 'Ctrl';
 if (ssalt in shift)   then result:= 'Alt';
 if (ssshift in shift) then result:= 'Shift';

 if (key<>16)and(key<>17)and(key<>18) then
 if result = '' then result:= chr(key)
  else result:= result + ' + ' + chr(key);

 if (key = vk_delete)or(result='Ctrl')or(result='Alt')or(result='Shift') then
  result:= 'Нет'
end;

procedure Tdllg1.gl_hook(key1,key2: integer; p: boolean);
var i: integer;
begin
 if p then begin //горячие клавиши-
  setlength(id,length(id)+1);
  id[length(id)-1]:= GlobalAddAtom(pchar('hotkey' + inttostr(length(id)-1)));
  RegisterHotKey(handle,id[length(id)-1],key1,key2);

 end else begin //анрег- горячих клавиш
  for i:=0 to length(id)-1 do UnRegisterHotKey(handle,id[i]);
  setlength(id,1);
 end
end;

procedure Tdllg1.ghotkey(var msg:TMessage);
var i,j,k: integer;
begin
 if not Visible then

 for i:= 1 to sg1.RowCount-1 do
  if (sg1.Cells[4,i]<>'Нет')and(sg1.Cells[4,i]<>'') then begin
   if (msg.LParamLo = strtohotkey(sg1.Cells[4,i],true))and
      (msg.LParamHi = strtohotkey(sg1.Cells[4,i],false)) then begin
       //поиск команды-
       k:=0;
       for j:=0 to cmd.Items.Count-1 do
        if cmd.Items[j]= sg1.Cells[0,i] then begin k:=j;break;end;
       //проверка на выполнение-
       if fileexists(sg1.Cells[0,i]) then begin path_pr:= sg1.Cells[0,i]; k:= 58 end;
       if sg1.Cells[0,i][1]='>'      then begin path_pr:= copy(sg1.Cells[0,i],3,length(sg1.Cells[0,i])); k:= 59 end;
       if k<>0 then vid.icc(k)
   end

  end
end;
Тут отследим колонку ввода новых горячих:
Код:
procedure Tdllg1.sl1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
var R: TRect;
begin
 selc:= ARow;
 selq:= ACol;
...
end;


procedure Tdllg1.sg1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var i: integer;
begin
 if selq = 4 then begin
  sg1.Cells[4,selc]:= hotkeytostr(Key,shift);

  gl_hook(0,0,false);
  for i:= 1 to sg1.RowCount-1 do
   if (sg1.Cells[4,i]<>'Нет')and(sg1.Cells[4,i]<>'') then
    gl_hook(strtohotkey(sg1.Cells[4,i],true),
            strtohotkey(sg1.Cells[4,i],false),
            true)
 end
end;
Заполнение командами и регистрация горячих клавиш по списку:
Код:
procedure Tdllg1.FormCreate(Sender: TObject);
var i,j: integer;
begin
 ...
  //загрузка планировщика-
  for i:=1 to ini.ReadInteger('sh','count',0) do begin //строки
   for j:=0 to sg1.ColCount-1 do   //столбцы
    sg1.Cells[j,i]:= sel_getname(ini.ReadString('sh',inttostr(i),''),j+1);
   sg1.RowCount   := sg1.RowCount+1;
  end;

  //загрузка HOTKEY-
  gl_hook(0,0,false);
  for i:= 1 to sg1.RowCount-1 do
   if (sg1.Cells[4,i]<>'Нет')and(sg1.Cells[4,i]<>'') then
    gl_hook(strtohotkey(sg1.Cells[4,i],true),
            strtohotkey(sg1.Cells[4,i],false),
            true)
 
 end;
...
По сути вся работа сводится к работе с текстовым представлением горячих клавиш (strtohotkey() и hotkeytostr()).

Последний раз редактировалось kutani; 07.11.2016 в 22:48.
kutani вне форума Ответить с цитированием
Старый 18.11.2016, 07:40   #3
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Помогло? )
kutani вне форума Ответить с цитированием
Старый 24.02.2017, 13:10   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от kutani Посмотреть сообщение
Помогло? )
Я , если честно, только сейчас это прочитал
То есть, вы предлагаете вообще не создавать HotKey'и ибо нафиг они не нужны? я правильно понял?
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HotKey на 2 клавиши KoBaL Общие вопросы Delphi 6 27.10.2011 19:32
Hotkey Dalt Общие вопросы C/C++ 2 25.01.2011 22:31
C++ HOTKEY coNsept Общие вопросы C/C++ 7 01.05.2010 10:35
HotKey Simply-Art Win Api 16 15.08.2008 12:10
Потомок от HotKey Alter Компоненты Delphi 4 03.01.2008 15:47