分页与控制台

时间:2012-12-25 21:20:23

标签: c++ visual-c++ pagination

是否可以对控制台用户界面进行分页?假设我有30个员工记录,我只想显示10.用户按箭头按钮,他们可以看到下一个10个列表。有可能吗?

EXEC SQL DECLARE EmployeeReportCursorJawatan CURSOR FOR
        SELECT EMP_ID, NAMA, IC, JAWATAN, GAJI_ASAS, TEL_RUMAH, TEL_BIMBIT, ALAMAT FROM PEKERJA WHERE upper(JAWATAN) LIKE upper(:str);

    EXEC SQL OPEN EmployeeReportCursorJawatan;
    /* loop through the cursor and break the loop when end*/
    EXEC SQL WHENEVER NOT FOUND DO break;
    while (1)
    {
        /* fetch the data from cursor and display*/
        EXEC SQL FETCH EmployeeReportCursorJawatan INTO :emp_idSearch, :namaSearch, :icSearch, :jawatanSearch, :gajiSearch, :homeSearch, :mobileSearch, :alamatSearch;

    cout<<"\nID\t\t: " << emp_idSearch;
    cout<<"\nName\t\t: " << namaSearch;
    cout<<"\nIC\t\t: " << icSearch;
    cout<<"\nPost\t\t: " << jawatanSearch;
    cout<<"\nSalary\t\t: RM " << gajiSearch;
    cout<<"\nPhone number (H): " << homeSearch;
    cout<<"\nPhone number (M): " << mobileSearch;
    cout<<"\nAddress\t: " << alamatSearch;
    cout<<"\n---------------------------------------------------------\n";

        totalCustomer++;
    }

2 个答案:

答案 0 :(得分:0)

是的,它实际上比你想象的容易得多。这是我编写的程序中的一段代码,正是这样做,最重要的是创建一个静态变量来表示&#39; page&#39;用户已开启。破败

  • 使用静态变量表示页码
  • 使用迭代器和std :: advance将迭代器推送到当前页码
  • 循环从页面的第一个元素开始到最后一个元素(在这个程序中我使每个页面显示了我的lsit的10个元素

void ExList::Display()
{
    using std::setw; //save time
    //begin iter starts at page number * 10 since each page has 10 elements
    list<Workout>::iterator PageNum = wrkout.begin(); std::advance(PageNum, AdvanceVar * 10);
    //advance the iter 10 places past PageNum so the loop will run 10 times
    list<Workout>::iterator iterEnd = PageNum; std::advance(iterEnd, 10);
    //formatting for my 'exercise tracker' program
    std::cout << setw(20) << "Page: " << AdvanceVar + 1 << "/" << (((int) wrkout.size()) /  10) + 1
     << std::endl << std::endl;
    std::cout << std::left          //left justified
    << setw(TAB) << "Date"          //print titles
    << setw(TAB) << "Type"
    << setw(TAB) << "Distance"
    << setw(TAB) << "Units"
    << setw(TAB) << "Additional Comments\n"
    << "---------------------------------------------------------------------\n";
    //loop through 10 times displaying the proper elements
    for(PageNum; PageNum != iterEnd && PageNum != wrkout.end(); PageNum++)
    {
        std::cout << std::left
        << setw(TAB) << PageNum->Date
        << setw(TAB) << ConvertEnum(PageNum->TYPE)
        << setw(TAB) << PageNum->distance
        << setw(TAB) << PageNum->units
        << setw(TAB) << "Select to review\n";
    }

    std::cout << "---------------------------------------------------------------------\n";


}

如果您希望查看整个程序以获得更深入的程序,请向我发送电子邮件

答案 1 :(得分:0)

逻辑解决方案是在机器上安装more,并且 让用户通过它管道输出。但事实并非如此 难以实施。基本上,你决定了多少行或 您将放在一个页面上的条目,然后跟踪索引 目前的页面顶部。然后输出如下内容:

int currentTop = 0;
bool finished = false;
while ( !finished ) {
    clearScreen();
    for ( int i = 0; i < maxOnPage && i + currentTop < entryCount; ++ i ) {
        displayEntry( i + currentTop );
    }
    std::cout << "Continue: ";
    std::string command;
    std::cin >> command;
    switch ( parseCommand( command ) ) {
    case advanceOneLine:
        ++ currentTop;
        break;

    case advanceOnePage:
        currentTop += maxOnPage;
        break;

    case finish:
        finished = true;
        break;

    default:
        //  ???
        break;
    }
}