Отличная идея, да и на первый взгляд не сложная в реализации.
В грации эпилог пакет с клавишами выглядит следующим образом:
Код:
45 = id
05 00 00 00 = количество используемых клавиш
................
01 00 00 00 =тип клавиши (итем)
00 00 00 00 =позиция (в данном случаи F1)
BC AF 41 10 =ObjectId итема
01 00 00 00 = хз
FF FF FF FF = хз (вроде как количество, но не уверен)
00 00 00 00 = хз
00 00 00 00 = хз
00 00 00 00 = хз
..................
02 00 00 00 =тип клавиши (скил)
01 00 00 00 =позиция (в данном случаи F2)
64 00 00 00 =id скила
0F 00 00 00 =лвл скила
00 = хз
01 00 00 00 = хз
.....................
03 00 00 00 =тип клавиши (действие)
02 00 00 00 =позиция (в данном случаи F3)
00 00 00 00 =id действия (в данном случаи сесть)
01 00 00 00 =хз что, но для всех действий всегда такой
.......................
04 00 00 00 =тип клавиши (макрос)
03 00 00 00 =позиция (в данном случаи F4)
E8 03 00 00 =id макроса
01 00 00 00 = хз что, но для всех макросов всегда такой
Рецептов у меня в сумке не было, так что их я не смотрел. Собственно исходя из выше написанной информации можно написать следующую обработку пакета (в виде массива считаю хорошим решением).
Код:
var
type1,slot,id,lvl,a1,a2,a3,a4,a5,a6,a7,a8,a9:array [0..99] of integer;
//массивы клавиш, 100 значений потому что максимум 100 клавиш.
//массивы а будут использоваться для хранения неизвестных параметров пакета.
//согласен что не оптимально объявлять 9 массивов неизвестных значений:)
procedure ShortCutInit;
var
count,i,number:integer;
begin
number:=2;//позиция "курсора" в пакете
count:=ReadD(2); //количество используемых клавиш
for i:=0 to count do
begin
type1[i]:=ReadD(number); //смотрим тип клавиши
case type1[i] of
1:begin //обрабатываем клавишу с итемом
slot[i]:=ReadD(number+4);
id[i]:=ReadD(number+8);
lvl[i]:=ReadD(number+12);
a1[i]:=ReadD(number+16);
a2[i]:=ReadD(number+20);
a3[i]:=ReadD(number+24);
a4[i]:=ReadD(number+28);
a5[i]:=ReadD(number+32);
number:=number+36; //перемещаем курсор на следующую клавишу
end;
2:begin //обрабатываем клавишу со скилом
slot[i]:=ReadD(number+4);
id[i]:=ReadD(number+8);
lvl[i]:=ReadD(number+12);
a6[i]:=ReadC(number+16);
a7[i]:=ReadD(Number+17);
number:=number+21; //перемещаем курсор на следующую клавишу
end;
3:begin //обрабатываем клавишу с действием
slot[i]:=ReadD(number+4);
id[i]:=ReadD(number+8);
lv[i]l:=ReadD(number+12)
a8[i]:=ReadD(number+16);
number:=number+20;
end;
4:begin // обрабатываем клавишу с макросом
slot[i]:=ReadD(number+4);
id[i]:=ReadD(number+8);
lvl[i]:=ReadD(number+12)
a9[i]:=ReadD(number+16);
number:=number+20;
end;
5:begin
//а тут надо рецепт дописать, но времени нету :)
number:=number+0;
end;
end;
end;
end;
Дальше надо будет изменить пакет что пойдет в главное окно (в принципе получается что вторичное окно надо будет грузить до того как загружено главное). Код примерно такой:
Код:
for i:=1 to count do
case slot[i] of
12:begin {тут изменим клавишу что предлагает сервер, значения возьмем с ранее полученных массивов}end;//если клавиша для F1 второй панельки
13:begin{тут изменим клавишу что предлагает сервер} end;//если клавиша для F2 второй панельки
14:begin{тут изменим клавишу что предлагает сервер} end;//если клавиша для F3 второй панельки
end;
Это уже будем править под себя пакет пакет с главного окна.
PS: не уверен в правильности кода, писал в блокноте