Привет сообществу!
Возникла необходимость сделать вложенное меню.
Вынес вывод меню и выбор пункта в функцию.
Происходит зацикливание при выборе любого пункта:
program MenuDemo;
uses font32, sensor, menu32;
type
TMenuItem = record
ImgPath, Hint, Name: string;
end;
var
key, i: integer;
CurrentMenu: array[0..9] of TMenuItem;
CurrentMenuItem: string;
function Menu(ItemsCount: Integer): string;
var
k: Integer;
begin
menu32.init; // инициализация меню
LoadCursor(CreateCursor(GetWidth, 24, 4278190250)); // Создаем курсор
SetMenuWindow(0, 0, GetWidth, GetHeight); // Задаем окно, в котором будет отображаться меню
MenuFonts(0, 1); // Основной и курсорный шрифты
for k := 0 to ItemsCount do //Добавляем элементы меню
AddItem2(LoadImage(CurrentMenu[k].ImgPath), CurrentMenu[k].Hint, CurrentMenu[k].Name);
SetCursor(0); // Выбираем первый пункт
sensor.init;
DrawMenu;
Repaint;
repeat
key := KeyToAction(GetKeyPressed);
//key:=KeyToAction(GetKeyClicked);
if key = GA_DOWN then
begin
if Selected < ItemsCount then
CursorDown
else
SetCursor(0);
DrawMenu;
Repaint;
Delay(100);
end; // Вниз
if key = GA_UP then
begin
if Selected > 0 then
CursorUp
else
SetCursor(ItemsCount);
DrawMenu;
Repaint;
Delay(100);
end; // Вверх
if (pointer_state = 1) then // Если нажали на сенсорный экран
begin
SensorClick(pointer_pressed_x, pointer_pressed_y); // Передаем координаты в меню
DrawMenu;
Repaint;
end;
Delay(5);
Scroll;
Delay(5);
Scroll;
until (key = GA_FIRE) or (SensorState = 1);
Menu := SelectedValue;
for k := ItemsCount downto 0 do
RemoveItem(k);
HideMenu;
Repaint;
end;
begin
font32.init(2);
Font(0);
LoadFont('Verdana_7'); // Основной шрифт
Font(1);
LoadFont('Verdana_7b'); // Такой же шрифт, но утолщенный и белый (для выделенного пункта)
i := 0; //для тестирования
repeat
i := i + 1; //для тестирования
//Основное меню
CurrentMenu[0].ImgPath := '/info.png';
//CurrentMenu[0].Hint:='Информация';
CurrentMenu[0].Hint := 'Информация' + IntegerToString(i); //чтобы было видно зацикливание
CurrentMenu[0].Name := 'info';
CurrentMenu[1].ImgPath := '/profile.png';
CurrentMenu[1].Hint := 'Личные данные';
CurrentMenu[1].Name := 'profile';
CurrentMenu[2].ImgPath := '/connect.png';
CurrentMenu[2].Hint := 'Подключение';
CurrentMenu[2].Name := 'onoff';
CurrentMenu[3].ImgPath := '/exit.png';
CurrentMenu[3].Hint := 'Выход';
CurrentMenu[3].Name := 'exit';
CurrentMenuItem := Menu(3);
if CurrentMenuItem = 'info' then
begin
//
end
else if CurrentMenuItem = 'profile' then
begin
//
end
else if CurrentMenuItem = 'onoff' then
begin
//
end
else if CurrentMenuItem = 'exit' then
Halt;
until False;
end.
Если заменить GetKeyPressed на GetKeyClicked, то при работе с клавишами телефона, от зацикливания можно избавиться. Насколько я могу судить, GetKeyPressed не удаляет данные из буфера ввода (по аналогии с keypressed и readkey в pascal).
Но при работе с сенсором, при нажатии на выделенный пункт меню, так же происходит зацикливание. Т.е. SensorState не сбрасывается.
----
Можно ли исправить эту проблему? Или может я что-то делаю не так?
Проект и используемые либы в аттаче.