Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 7 из 7
  1. #1
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±

    "Система" пролистывания страниц

    Здравствуйте. Каким образом лучше реализовать систему страниц? Например я делаю сейчас систему бизнесов, соответственно в /gps -> Бизнесы, сами бизнесы пополняются, и их уже более 100, но стринга не хватает, но выделять больше уже не хочется, так вот, каким образом лучше реализовать "систему" этих самых страниц? То есть, чтобы открылся диалог и там были бизнесы 0..19, и 20 listitem кнопка "Далее >>>", потом открывался этот же диалог, но уже с бизнесами 20..39 (их номер), и 20 listitem опять кнопка "Далее >>>"

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Заводишь переменную, которая бы означала номер страницы.
    После делаешь такую функцию:
    PHP код:
    stock ShowBusinessList(playeridpagemax_page 20)
    {
        if(
    page <= 0)
            
    page 1;
        
        static
            
    string[4096+1];
        new 
    last_iter page*max_page+1,// У page минимальное значение должно быть не меньше 1 (указывай 1 при открытии диалога, а не 0)
            
    last_iter-max_page-1;
            
        if(
    last_iter sizeof(BizInfo))
            
    last_iter sizeof(BizInfo);

        
    string[0] = '\0';
        for(; 
    last_iteri++)
        {
            
    format(stringsizeof(string), "%sБизнес %s бла бла бла\n"stringBizInfo[i][bizName]);
        }

        if(
    last_iter sizeof(BizInfo))// Если максимальный ID итерации меньше числа бизнесов
        
    {
            
    strcat(string"\nДалее");//Добавим кнопку "Далее"
        
    }
        if(
    page 1)// Если страница больше одной
        
    {
            
    strcat(string"\nНазад");//Добавим кнопку "Назад"
        
    }
        
    ShowPlayerDialog(playerid, ..., DIALOG_STYLE_LIST"Бизнесы"string"Выбрать""Закрыть");
        
    SetPVarInt(playerid"BizPage"page);
        return 
    1;

    И в обработке делаешь так:
    PHP код:
    if(dialogid == ...)
    {
        if(!
    response)
            return 
    DeletePVar(playerid"BizPage");
        if(!
    strcmp(inputtext"Далее"))
        {
            
    ShowBusinessList(playeridGetPVarInt(playerid"BizPage")+1);
        }
        else if(!
    strcmp(inputtext"Назад"))
        {
            
    ShowBusinessList(playeridGetPVarInt(playerid"BizPage")-1);
        }
        else
        {
            
    listitem listitem*page;// Узнаём ID бизнеса и записываем его в переменную listitem
            // Тут делаем все нужные действия с бизнесом
        
    }
        return 
    1;

    Общий принцип таков
    Последний раз редактировалось DeimoS; 21.02.2018 в 09:57.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    StevenH (24.06.2017)
  4. #3
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Заводишь переменную, которая бы означала номер страницы.
    После делаешь такую функцию:
    PHP код:
    stock ShowBusinessList(playeridpagemax_page 20)
    {
        if(
    page <= 0)
            
    page 1;
        
        static
            
    string[4096+1];
        new 
    last_iter page*max_page+1,// У page минимальное значение должно быть не меньше 1 (указывай 1 при открытии диалога, а не 0)
            
    last_iter-max_page-1;
            
        if(
    last_iter sizeof(BizInfo))
            
    last_iter sizeof(BizInfo);

        
    string[0] = '\0';
        for(; 
    last_iteri++)
        {
            
    format(stringsizeof(string), "%sБизнес %s бла бла бла\n"stringBizInfo[i][bizName]);
        }

        if(
    last_iter sizeof(BizInfo))// Если максимальный ID итерации меньше числа бизнесов
        
    {
            
    strcat(string"\nДалее");//Добавим кнопку "Далее"
        
    }
        if(
    page 1)// Если страница больше одной
        
    {
            
    strcat(string"\nНазад");//Добавим кнопку "Назад"
        
    }
        
    ShowPlayerDialog(playerid, ..., DIALOG_STYLE_LIST"Бизнесы"string"Выбрать""Закрыть");
        
    SetPVarInt(playerid"BizPage"page);
        return 
    1;

    И в обработке делаешь так:
    PHP код:
    if(dialogid == ...)
    {
        if(!
    response)
            return 
    DeletePVar(playerid"BizPage");
        if(!
    strcmp(inputtext"Далее"))
        {
            
    ShowBusinessList(playeridGetPVarInt(playerid"BizPage")+1);
        }
        else if(!
    strcmp(inputtext"Далее"))
        {
            
    ShowBusinessList(playeridGetPVarInt(playerid"BizPage")-1);
        }
        else
        {
            
    listitem listitem*page;// Узнаём ID бизнеса и записываем его в переменную listitem
            // Тут делаем все нужные действия с бизнесом
        
    }
        return 
    1;

    Общий принцип таков
    Благодарю, но "узнать ид" работает некорректно, скорее всего неправильно составлена у тебя "формула":
    PHP код:
            case dGPSBusiness:
            {
                if(!
    response) return cmd::gps(playerid), DeletePVar(playerid"BusinessPage");
                if(
    listitem == 20) return ShowBusinessList(playeridGetPVarInt(playerid"BusinessPage")+1);
                new 
    page GetPVarInt(playerid"BusinessPage");
                new 
    id listitem*page;
                
    printf("page - %d, listitem - %d | id - %d"pagelistitemid);
                
    SetPlayerCheckpoint(playerid,gBusiness[id][busiX],gBusiness[id][busiY],gBusiness[id][busiZ],4.0);
                
    pTemp[playerid][pGPS] = true;
                
    SendClientMessage(playeridCRED"Метка {"#cWHITE"}установлена у Вас на радаре. Чтобы снять метку напишите {"#cINFO"}/gps");
                
    DeletePVar(playerid"BusinessPage");
                return 
    1;
            } 
    - - - Добавлено - - -

    Таким образом, если page (страница) равняется например двум, то там соответственно у меня бизнесы 21..40 (в массиве gBusiness это у меня получается 20..39), и если я на второй странице выберу 4 бизнес, то получается что?
    PHP код:
    // formul: new id = listitem*page;
    new id 3*2// 3 т.к. 0,1,2,3 (4 по счету) | 2 соответственно страница
    // получается результат: 6, а должен быть 24-1 = 23 из массива gBusiness 

  5. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    PHP код:
    listitem = (page-1)*20+listitem
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. Пользователь сказал cпасибо:
    StevenH (24.06.2017)
  7. #5
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
    listitem = (page-1)*20+listitem
    Спасибо большое, почти все работает, но есть 1 заминка..

    - - - Добавлено - - -

    В /gps -> бизнесы все показывает, все хорошо, но проблема следующая: если перейти на последнюю страницу, не показывает последний бизнес, код:
    PHP код:
    stock ShowBusinessList(playeridpagemax_page 20)
    {
        if(
    page <= 0)
            
    page 1;

        
    global_string[0] = EOS;

        new 
    last_iter page*max_page+1,
            
    last_iter-max_page-1;

        if(
    last_iter gBusinessCount)
            
    last_iter gBusinessCount;

        for(; 
    last_iter-1i++)
        {
            
    format(global_stringsizeof(global_string), "%s{FFFF80}%d.{"#cW"} %s\n", global_string, i+1, gBusiness[i][busiName]);
        
    }

        if(
    last_iter gBusinessCount)
            
    strcat(global_string"\n{FF9900}Далее >>>"); // Добавим кнопку "Далее"

        
    ShowPlayerDialog(playeriddGPSBusiness2"{FFFF80}Бизнесы"global_string"Отметить""Назад");
        
    SetPVarInt(playerid"BusinessPage"page);
        return 
    1;
        
    // by DeimoS

    В принципе, проблема понятна где:
    PHP код:
    for(; last_iter-1i++) // из-за -1 
    Но, если убрать -1, тогда будет показываться ОДИН лишний бизнес на всех страницах, и он же будет первым (повторяться) уже на следующей странице
    Последний раз редактировалось StevenH; 24.06.2017 в 20:00.

  8. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    PHP код:
    stock ShowBusinessList(playeridpagemax_page 20)
    {
        if(
    page <= 0)
            
    page 1;

        
    global_string[0] = EOS;

        new 
    last_iter page*max_page,
            
    last_iter-max_page;

        if(
    last_iter gBusinessCount)
            
    last_iter gBusinessCount+1;

        for(; 
    last_iteri++)
        {
            
    format(global_stringsizeof(global_string), "%s{FFFF80}%d.{"#cW"} %s\n", global_string, i+1, gBusiness[i][busiName]);
        
    }

        if(
    last_iter gBusinessCount)
            
    strcat(global_string"\n{FF9900}Далее >>>"); // Добавим кнопку "Далее"

        
    ShowPlayerDialog(playeriddGPSBusiness2"{FFFF80}Бизнесы"global_string"Отметить""Назад");
        
    SetPVarInt(playerid"BusinessPage"page);
        return 
    1;
        
    // by DeimoS

    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. Пользователь сказал cпасибо:
    StevenH (24.06.2017)
  10. #7
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
    stock ShowBusinessList(playeridpagemax_page 20)
    {
        if(
    page <= 0)
            
    page 1;

        
    global_string[0] = EOS;

        new 
    last_iter page*max_page,
            
    last_iter-max_page;

        if(
    last_iter gBusinessCount)
            
    last_iter gBusinessCount+1;

        for(; 
    last_iteri++)
        {
            
    format(global_stringsizeof(global_string), "%s{FFFF80}%d.{"#cW"} %s\n", global_string, i+1, gBusiness[i][busiName]);
        
    }

        if(
    last_iter gBusinessCount)
            
    strcat(global_string"\n{FF9900}Далее >>>"); // Добавим кнопку "Далее"

        
    ShowPlayerDialog(playeriddGPSBusiness2"{FFFF80}Бизнесы"global_string"Отметить""Назад");
        
    SetPVarInt(playerid"BusinessPage"page);
        return 
    1;
        
    // by DeimoS

    Все работает, тему можно закрывать, огромное спасибо!)

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •