Форум программистов, компьютерный форум CyberForum.ru

обращение к члену связного списка - C++

Восстановить пароль Регистрация
 
soadpol
0 / 0 / 0
Регистрация: 19.09.2009
Сообщений: 16
03.11.2011, 21:46     обращение к члену связного списка #1
Прошу помощи в решении

Стоит задача обращения к члену связного списка(того списка что выводится на экран файлового менеджера),затем с этим членом св.списка(это имя файла,папки-длинное имя-) производится
такая операция-он указывается как член другого связного списка(по строке) чтобы вывести целиком длинное имя
и посчитать символы если=250 то вывести имено эти имена(максимальной длинны)

Для начала приведу две независимые функции

№1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//выводит список файлов на panel с указателя Ptr
//в направлении Directly (0-вниз, 1-вверх)
//если выводится на экран новая директория, передается флаг FlagFirst
void DrawList(int panel, ListNode far *Ptr, int Directly, int FlagFirst)
{
    int kol=0, x, y, flag=1, can;
    char s[37];
 
    if (panel==LEFT) x=12;
     else x=331;
    if (Directly==DOWN) y=30; else y=282;
    setcolor(LIGHTGREEN);
 
    NewPtr=Ptr;
    while (NewPtr != NULL && kol<19)
    {
        if (NewPtr->attrib != 0x0F) //здесь ставлю ==
        {
            if (CAN(NewPtr))
            {
                if (FlagFirst && flag)
                    if (panel==LEFT) {CurPtrL=NewPtr; flag=0;}
                     else {CurPtrR=NewPtr; flag=0;}
                movedata(FP_SEG(NewPtr->Data), FP_OFF(NewPtr->Data), FP_SEG(s), FP_OFF(s), 37);
                outtextxy(x,y,s);
                if (Directly) y-=14; else y+=14;
                kol++;
            }
        }
        if (Directly) NewPtr = NewPtr->PrevPtr;
         else NewPtr = NewPtr->NextPtr;
    }
}
после замены в строке 14 != на == ф.DrawList выводит на панель
чтото вроде

Мои документы
Program Files
sistema_siste
ma_sistema_
sistema_siste
ma

короче фигачит длинные имена по 13 симв построчно(там задано при обработке длинных имен)

вот функция №2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void ShowLongName()
{
    char s[37]="", rez[100]="";
 
    NewPtr=CurPtr->PrevPtr;
    while (NewPtr->attrib==0x0F)
    {
        movedata(FP_SEG(NewPtr->Data), FP_OFF(NewPtr->Data),
                 FP_SEG(s), FP_OFF(s), 37);
        strcat(rez,s);
        NewPtr=NewPtr->PrevPtr;
    }
    setfillstyle(SOLID_FILL, FON);
    bar(110,319,632,329);
    setcolor(LIGHTCYAN);
    if (strlen(rez)>65) rez[68]=0x0;
    outtextxy(112,321,rez);
}
эта функция при наведении строчного курсора в определенном месте показывает длинное имя целиком
sistema_sistema_sistema_sistema_sistema

я такую создал функцию

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void DrawList2(int panel, ListNode far *Ptr, int Directly, int FlagFirst)
{
      int kol=0, x, y, flag=1, can;
          char s[37]="", rez[255]="";
      if (panel==LEFT) x=12;
      else x=331;
      if (Directly==DOWN) y=30; else y=282;
      setcolor(LIGHTGREEN);
 
 
      NewPtr=Ptr;
      while (NewPtr != NULL && kol<19)
      {
    if (CAN(NewPtr))
       {
         if (NewPtr->attrib == 0x0F)
          {
 
            if (FlagFirst && flag)
            if (panel==LEFT) {CurPtrL=NewPtr; flag=0;}
            else {CurPtrR=NewPtr; flag=0;}
           
                    
                   NewPtr=CurPtr->PrevPtr;
                while (NewPtr->attrib==0x0F)
              {      
            movedata(FP_SEG(NewPtr->Data), FP_OFF(NewPtr->Data),
                    FP_SEG(s), FP_OFF(s), 37);
               strcat(rez,s);
               NewPtr=NewPtr->PrevPtr;
          }
 
                if (strlen(rez)==250)
                 outtextxy(x,y,rez);
 
              if (Directly) y-=14; else y+=14;
        kol++;
            }
        }
        if (Directly) NewPtr = NewPtr->PrevPtr;
         else NewPtr = NewPtr->NextPtr;
    }
}
так вот она при вызове работает но не так как требуется-она не делает поиск
по членам списка отдельно в цикле,а только лишь принаведении строчного курсора
на длиное имя и вызове функции (предусмотрена кнопка) она для этой строки(имени файла папки)
соединяет куски длинного имени в строку и считает ==250(?)
а требуется открыть диск С,D либо папку- нажатие кнопки-и функция выводит найденное
длинное имя=250
надеюсь все подробно объяснил
прошу помочь если что весь код проги есть для Borland C++3.1

 Комментарий модератора 
Используйте теги форматирования кода!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2011, 21:46     обращение к члену связного списка
Посмотрите здесь:

C++ Реализация связного списка
Обращение к приватному члену класса внутри пространства имён C++
Сортировка связного списка C++
сортировка пузырьком связного списка C++
C++ сортировка связного списка
C++ Реализация связного списка
C++ Обращение к члену protected
Обращение потока к функции-члену класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.11.2011, 06:12     обращение к члену связного списка #2
Цитата Сообщение от soadpol
Стоит задача обращения к члену связного списка(того списка что выводится на экран файлового менеджера),затем с этим членом св.списка(это имя файла,папки-длинное имя-) производится
такая операция-он указывается как член другого связного списка(по строке) чтобы вывести целиком длинное имя
и посчитать символы если=250 то вывести имено эти имена(максимальной длинны)
пиши ясно

Цитата Сообщение от soadpol
C++
1
2
3
4
5
6
          int kol=0, x, y, flag=1, can;
          char s[37]="", rez[255]="";
          if (panel==LEFT) x=12;
          else x=331;
          if (Directly==DOWN) y=30; else y=282;
          setcolor(LIGHTGREEN);
не пиши в одну строчку

так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    int kol, x, y, flag, can;
    char s[37] = "", rez[255] = "";
 
    kol = 0;
    flag = 1;
    
    if (panel == LEFT)
        x = 12;
    else
        x = 331;
    
    if (Directly == DOWN)
        y = 30;
    else
        y = 282;
    
    setcolor(LIGHTGREEN);
или так:
C++
1
2
3
4
5
6
7
8
9
10
    int kol, x, y, flag, can;
    char s[37] = "", rez[255] = "";
 
    kol = 0;
    flag = 1;
    
    x = (panel == LEFT) ? 12 : 331;
    y = (Directly == DOWN) ? 30 : 282;
    
    setcolor(LIGHTGREEN);
Yandex
Объявления
04.11.2011, 06:12     обращение к члену связного списка
Ответ Создать тему
Опции темы

Текущее время: 21:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru