Показать сообщение отдельно
Старый 15.09.2012, 14:19   #94
Gonzo
Оператор ЭВМ
 
Аватар для Gonzo
 
Регистрация: 12.01.2011
Адрес: Воронеж
Сообщений: 32
Написано одно полезное сообщение
Вопрос Ответ: Lib_menu32 - Графическое меню без головной боли

Привет сообществу!
Возникла необходимость сделать вложенное меню.
Вынес вывод меню и выбор пункта в функцию.
Происходит зацикливание при выборе любого пункта:
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 не сбрасывается.
----
Можно ли исправить эту проблему? Или может я что-то делаю не так?
Проект и используемые либы в аттаче.
Вложения
Тип файла: rar MenuDemo.rar (72.9 Кб, 865 просмотров)
(Offline)
 
Ответить с цитированием