PDA

Просмотр полной версии : [Вопрос] "Система" пролистывания страниц



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

DeimoS
24.06.2017, 18:25
Заводишь переменную, которая бы означала номер страницы.
После делаешь такую функцию:

stock ShowBusinessList(playerid, page, max_page = 20)
{
if(page <= 0)
page = 1;

static
string[4096+1];
new last_iter = page*max_page+1,// У page минимальное значение должно быть не меньше 1 (указывай 1 при открытии диалога, а не 0)
i = last_iter-max_page-1;

if(last_iter > sizeof(BizInfo))
last_iter = sizeof(BizInfo);

string[0] = '\0';
for(; i < last_iter; i++)
{
format(string, sizeof(string), "%sБизнес %s бла бла бла\n", string, BizInfo[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;
}

И в обработке делаешь так:

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


Общий принцип таков

StevenH
24.06.2017, 19:27
Заводишь переменную, которая бы означала номер страницы.
После делаешь такую функцию:

stock ShowBusinessList(playerid, page, max_page = 20)
{
if(page <= 0)
page = 1;

static
string[4096+1];
new last_iter = page*max_page+1,// У page минимальное значение должно быть не меньше 1 (указывай 1 при открытии диалога, а не 0)
i = last_iter-max_page-1;

if(last_iter > sizeof(BizInfo))
last_iter = sizeof(BizInfo);

string[0] = '\0';
for(; i < last_iter; i++)
{
format(string, sizeof(string), "%sБизнес %s бла бла бла\n", string, BizInfo[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;
}

И в обработке делаешь так:

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


Общий принцип таков

Благодарю, но "узнать ид" работает некорректно, скорее всего неправильно составлена у тебя "формула":


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


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

Таким образом, если page (страница) равняется например двум, то там соответственно у меня бизнесы 21..40 (в массиве gBusiness это у меня получается 20..39), и если я на второй странице выберу 4 бизнес, то получается что?


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

DeimoS
24.06.2017, 19:47
listitem = (page-1)*20+listitem;

StevenH
24.06.2017, 19:57
listitem = (page-1)*20+listitem;

Спасибо большое, почти все работает, но есть 1 заминка..

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

В /gps -> бизнесы все показывает, все хорошо, но проблема следующая: если перейти на последнюю страницу, не показывает последний бизнес, код:


stock ShowBusinessList(playerid, page, max_page = 20)
{
if(page <= 0)
page = 1;

global_string[0] = EOS;

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

if(last_iter > gBusinessCount)
last_iter = gBusinessCount;

for(; i < last_iter-1; i++)
{
format(global_string, sizeof(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(playerid, dGPSBusiness, 2, "{FFFF80}Бизнесы", global_string, "Отметить", "Назад");
SetPVarInt(playerid, "BusinessPage", page);
return 1;
// by DeimoS
}


В принципе, проблема понятна где:

for(; i < last_iter-1; i++) // из-за -1

Но, если убрать -1, тогда будет показываться ОДИН лишний бизнес на всех страницах, и он же будет первым (повторяться) уже на следующей странице

DeimoS
24.06.2017, 20:18
stock ShowBusinessList(playerid, page, max_page = 20)
{
if(page <= 0)
page = 1;

global_string[0] = EOS;

new last_iter = page*max_page,
i = last_iter-max_page;

if(last_iter > gBusinessCount)
last_iter = gBusinessCount+1;

for(; i < last_iter; i++)
{
format(global_string, sizeof(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(playerid, dGPSBusiness, 2, "{FFFF80}Бизнесы", global_string, "Отметить", "Назад");
SetPVarInt(playerid, "BusinessPage", page);
return 1;
// by DeimoS
}

StevenH
24.06.2017, 20:34
stock ShowBusinessList(playerid, page, max_page = 20)
{
if(page <= 0)
page = 1;

global_string[0] = EOS;

new last_iter = page*max_page,
i = last_iter-max_page;

if(last_iter > gBusinessCount)
last_iter = gBusinessCount+1;

for(; i < last_iter; i++)
{
format(global_string, sizeof(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(playerid, dGPSBusiness, 2, "{FFFF80}Бизнесы", global_string, "Отметить", "Назад");
SetPVarInt(playerid, "BusinessPage", page);
return 1;
// by DeimoS
}

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