Проблема с циклами



  • Всем привет.

    Есть такая задача -- *.xls файл в нем определенное кол-во листов, на листе по 1 странице с однотипными таблицами.
    Пользователь отмечает какие листы и какие строки в таблица нужны - по нажатию кнопки программа все ненужное убирает.

    Я не буду выкладывать все - выложу только цикл
    Мой цикл обходит лист от последнего к первому - если не отмечен на QListWidget удаляется - если отмечен обходятся строки (также отмечаются юзером) от последнего к заданному(шапку оставляем ;) ).

    Проблема в следующем листы удаляются корректно, а строку удаляются только на первом попавшемся листе (если к примеру: пользователь выбрал 2 и 4 лист, то строки удалятся только на 4) :/
    @
    int a = 23; //24-листа
    int b = 0;
    int c = 58; // 59-строк в таблица
    int d = 0;
    while (a >= 0) {
    b = a + 1; // листы в *xls начинаются с 1
    if (!ui.listWidget_list->item(a)->isSelected()) {
    sheets->querySubObject("Item (QVariant&)", b)->dynamicCall("Delete()");
    } else {
    while (c >=0) {
    d= c+12; //шапка в таблице 11 строк
    if (!ui.listWidget_OVD->item(c)->isSelected()){
    QAxObject *list = sheets->querySubObject("Item (QVariant&)", b);
    QAxObject *rows = list->querySubObject("Rows");
    rows->querySubObject("Item (QVariant&)", d)->dynamicCall("Delete()");
    }
    c--;
    }
    }
    a--;
    }
    @

    Заранее благодарю.



  • Еще один вариант этого же цикла
    Если упростить задачу -- обойти только 10 листов и удалить не выбранные листы

    @
    int a = 58;
    for (int i = 1; i<=10; i++){
    while (a >=0) {
    int b= a+12;
    if (!ui.listWidget_OVD->item(a)->isSelected()){
    QAxObject *listA = sheets->querySubObject("Item (QVariant&)", i);
    QAxObject *rows = listA->querySubObject("Rows");
    rows->querySubObject("Item (QVariant&)", b)->dynamicCall("Delete()");
    }
    a--;
    }
    }
    @

    Результат тот же -- строки удалены только на 1 листе.



  • Попробуй поставить:
    @qDebug() << listA;@
    после 6 строки, есть подозрение что по каким-то причинам у тебя возвращается один и тот же лист.



  • После того как я 7 строкой во втором случае поставил
    @
    qDebug("i is %a", i);
    @
    чтобы узнать как изменяется i - результат 0,00000 и так 21 раз - кол-во не отмеченных строк.
    Но нулевого листа в Excel не может быть... его как будто нет вообще.

    Получается что переменная i - не передается во вложенный цикл.



  • ну во-первых для int надо было %d ставить,
    хотя потоковыми операторами все же лучше:

    @qDebug() << "i is " << i;@

    во-вторых, я просил именно посмотреть адреса объектов не совпадают ли у листов.



  • Да, конечно Вы правы
    @
    qDebug() << "i is" << i;
    @
    выдал 1

    @
    qDebug() << "i is" << listA;
    @
    такой результат:
    i is QAxObject(0x9f6e940)
    i is QAxObject(0x9f9d958)
    i is QAxObject(0x9f86ec8)
    i is QAxObject(0x9f5d130)
    i is QAxObject(0x9fda180)
    i is QAxObject(0x9fb5338)
    i is QAxObject(0x9f906e0)
    i is QAxObject(0x9f4fee8)
    i is QAxObject(0x9f73e68)
    i is QAxObject(0x3eb4e8)
    i is QAxObject(0x9fdeda8)
    i is QAxObject(0x9fd3a10)
    i is QAxObject(0x9fbed80)
    i is QAxObject(0x9fa8998)
    i is QAxObject(0x9f8ff78)
    i is QAxObject(0x9f91138)
    i is QAxObject(0x9fceb78)
    i is QAxObject(0x9f6f5a8)
    i is QAxObject(0x9fcd608)
    i is QAxObject(0x9fafb78)
    i is QAxObject(0x9fbd9a8)



  • Предлагаю пойти другим путем и взять пример с простыми переменными, например:
    @
    int a = 5;
    int j = 10;
    for (int i=1; i<=10; i++) {
    while (j >=0 ){
    if (i < a){
    qDebug() << "i -" << i << " j -" << j;
    }
    j--;
    }
    }
    @
    результат:
    i - 1 j - 10
    i - 1 j - 9
    i - 1 j - 8
    i - 1 j - 7
    i - 1 j - 6
    i - 1 j - 5
    i - 1 j - 4
    i - 1 j - 3
    i - 1 j - 2
    i - 1 j - 1
    i - 1 j - 0

    почему цикл не идет дальше?



  • Кстати с таким подходом:
    @
    int a = 5;
    for (int i=1; i<=10; i++) {
    for (int j = 1; j<=10; j++){
    if (i > a){
    qDebug() << "i -" << i << " j -" << j;
    }
    }
    }
    @
    результат правильный
    а с таким:
    @
    int a = 5, i = 10, j = 10;
    while (i>=0) {
    while (j>=0){
    if (i > a){
    qDebug() << "i -" << i << " j -" << j;
    }
    j--;
    }
    i--;
    }
    @
    результат как в посте выше только наоборот(i - 10 j - 10 -> 0);



  • Ладно, так как меня изначально интересовал обратный обход по листам, а затем по строкам, то для выхода использовал конструкцию из for ... в обоих случаях, так как while почему-то не работает (???).
    Итоговый вариант (если кого интересует):
    @
    for (int a = 23; a>=0; a--){
    int b = a + 1;
    if (!ui.listWidget_list->item(a)->isSelected()) {
    sheets->querySubObject("Item (QVariant&)", b)->dynamicCall("Delete()");
    } else {
    for (int c = 58; c >= 0; c--){
    int d= c+12;
    if (!ui.listWidget_OVD->item(c)->isSelected()){
    QAxObject *list = sheets->querySubObject("Item (QVariant&)", b);
    QAxObject *rows = list->querySubObject("Rows");
    rows->querySubObject("Item (QVariant&)", d)->dynamicCall("Delete()");
    }
    }
    }
    }
    @

    Тему можно закрывать, хотя со вложенными while... не понятно.
    Vass спасибо за участие.



  • А почему while должен там срабатывать то? j уже 0, следовательно в тело while не заходит. Вроде все логично, не?



  • Однако как по мне, то результат должен быть
    i – 10 j – 10
    i – 10 j – 9
    i – 10 j – 8
    i – 10 j – 7
    i – 10 j – 6
    i – 10 j – 5
    i – 10 j – 4
    i – 10 j – 3
    i – 10 j – 2
    i – 10 j – 1
    i – 10 j – 0
    i – 9 j – 10
    i – 9 j – 9
    i – 9 j – 8
    i – 9 j – 7
    i – 9 j – 6
    i – 9 j – 5
    i – 9 j – 4
    i – 9 j – 3
    i – 9 j – 2
    i – 9 j – 1
    i – 9 j – 0
    и так далее пока i не достигнет 0

    но судя по всему будет как по Вашему :(



  • Все очень просто, ты забываешь заново иициализировать j в верхнем цикле

    @while (i>=0) {
    j = 10;
    while (j>=0){
    if (i > a){
    qDebug() << "i -" << i << " j -" << j;
    }
    j--;
    }
    i--;
    }@



  • либо просто объявлять j в области видимости цикла, а не выше



  • Благодарю, все действительно просто.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.