16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
1

StringGrid динамическое добавление строк

12.04.2017, 13:15. Показов 4085. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, есть программа : Выводит на экран имя файла,размер файла,дату создания,контрольную сумму.Но это консольное приложение.Хочу отображать в StringGrid в 4-х ячейках.Как зделать чтоб появлялись динамически строки в зависимости от количества файлов,проста не догоняю как.
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//---------------------------------------------------------------------------
#pragma  hdrstop
#include <stdio.h>
#include <dir.h>
#include <conio.h>
#include <windows.h>
#include <locale>
#include <iostream.h>
#include <math.h>
#include <string.h>
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stdint.h"
uint32_t crc32_bitwise(const void* data,size_t length,uint32_t previousCrc32) {
    unsigned int j;
    uint32_t crc = ~previousCrc32;
    unsigned char* current = (unsigned char*) data;
    while (length--) {
        crc ^= *current++;
        for (j = 0; j < 8; j++)
            crc = ((crc & 1)
              ? (crc >> 1) ^ 0xEDB88320
              : (crc >> 1));
    } 
    return ~crc;
}
 
uint32_t crc32_file(const char* filename) {
    FILE *file;
    int len;
    unsigned char buffer[1024] ;
 
    if ((file = fopen (filename, "rb")) == NULL) {
        printf("'%s' can't be opened\n", filename);
        return 0;
    }
 
    uint32_t crc32 = 0;
    while ((len = fread(buffer, 1, sizeof(buffer), file)) != 0) {
        crc32 = crc32_bitwise(buffer, len, crc32);
    }
    fclose(file);
    return crc32;
}
 
 
 
 
void info(void)
{ setlocale (LC_ALL,".866");
wprintf(L"                               Содержимое каталога: \n");
wprintf(L"|    Имя.Расширения     |    Размер файла(Кб)     |    Время создания    |Контрольная сумма|\n");
printf("|-----------------------|-------------------------|----------------------|-----------------|\n");
}
 
 
void main()
{
clrscr();
struct ffblk f;
int done;
setlocale (LC_ALL,".866");
done = findfirst("**.**", &f, 0);
system("mode con cols=126 lines=59");
info();
while (!done)
{
printf("|%-23s|%-25d|%d:%d:%d %d/%d/%-7d|     %X\n",f.ff_name,f.ff_fsize/1024,f.ff_ftime>>11,(f.ff_ftime>>5)   &0x3f, (f.ff_ftime<<1)
        &0x3f, f.ff_fdate &0x1f, (f.ff_fdate>>5) &0x0f,(f.ff_fdate>>9) + 1980,crc32_file(f.ff_name));
 
printf("|-----------------------|-------------------------|----------------------|-----------------|\n");
done = findnext(&f);
}
system("color F0");
getch();
}
//---------------------------------------------------------------------------
Добавлено через 2 часа 42 минуты
както так наверно

C++
1
2
for (int i=0 ; i<f ; i++)
StringGrid1->Cells[i][0]);
Добавлено через 1 час 5 минут
мда вижу не помогут((((
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2017, 13:15
Ответы с готовыми решениями:

StringGrid: динамическое добавление строк и назначение типа столбцов
Доброго дня! Есть ли StringGrid, которому можно было задать тип конкретной ячейки (или всего...

StringGrid и добавление строк
в StringGrid при добавлении строк всегда остается нижняя пустая строка. точнее заполняется нижняя...

Самая длинная общая подпоследовательность строк/ НОП строк (Динамическое программирование)
Доброго времени суток. Помогите пожалуйста разобраться с алгоритмом НОП строк. Суть алгоритма....

Динамическое событие onDrawCell у StringGrid
Я создал динамический StringGrid. Теперь хочу ему сделать событие OnDrawCell. Функцию с нужными...

14
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
12.04.2017, 13:52 2
Вот так можно динамически добавлять строки
C++
1
StringGrid1->RowCount = StringGrid1->RowCount + 1;
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
12.04.2017, 16:18  [ТС] 3
в моем случии это не поможет)))

Добавлено через 5 минут
в папке же н количество файлов каждый рас, и он должен выделять по строке на каждый файл,вот как это зделать не догоняю
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32584 / 21054 / 8133
Регистрация: 22.10.2011
Сообщений: 36,326
Записей в блоге: 8
12.04.2017, 18:22 4
Цитата Сообщение от Nightwalker Посмотреть сообщение
это не поможет
Еще как поможет. Прямо внутри цикла, перед обработкой очередного файла, увеличиваешь RowCount на 1, заполняешь новую строку, и начинаешь новую итерацию цикла. Кстати, в новых Билдерах findfirst не нужен. В одну строку кода находится список файлов через TDirectory::GetFiles (примеров на форуме я приводил достаточное количество)
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
13.04.2017, 08:25  [ТС] 5
вот смотрите как я зделал,понятно что он мне выдаст толька один файл,так я писал в цикле
StringGrid1->RowCount = StringGrid1->RowCount + 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include <dir.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <string.h>
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stdint.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
struct ffblk f;
int done;
 
done = findfirst("**.**", &f, 0);
system("mode con cols=126 lines=59");
 
while (!done)
{
//printf("|%-23s|%-25d|%d:%d:%d %d/%d/%-7d|     %X\n",f.ff_name,f.ff_fsize/1024,f.ff_ftime>>11,(f.ff_ftime>>5)   &0x3f, (f.ff_ftime<<1)
 //       &0x3f, f.ff_fdate &0x1f, (f.ff_fdate>>5) &0x0f,(f.ff_fdate>>9) + 1980,crc32_file(f.ff_name));
 
 
 
  this->StringGrid1->Cells[1][1] = f.ff_name;
 
   this->StringGrid1->Cells[2][1] = f.ff_fsize/1024;
 
     this->StringGrid1->Cells[3][1] = f.ff_ftime>>11,(f.ff_ftime>>5)   &0x3f, (f.ff_ftime<<1) &0x3f, f.ff_fdate &0x1f, (f.ff_fdate>>5) &0x0f ,(f.ff_fdate>>9) + 1980;
 
      this->StringGrid1->Cells[4][1] = crc32_file(f.ff_name);
 
 
 
 
done = findnext(&f);
 
}
 
}
//---------------------------------------------------------------------------
uint32_t crc32_bitwise(const void* data,size_t length,uint32_t previousCrc32) {
    unsigned int j;
    uint32_t crc = ~previousCrc32;
    unsigned char* current = (unsigned char*) data;
    while (length--) {
        crc ^= *current++;
        for (j = 0; j < 8; j++)
            crc = ((crc & 1)
              ? (crc >> 1) ^ 0xEDB88320
              : (crc >> 1));
    } 
    return ~crc;
}
 
uint32_t crc32_file(const char* filename) {
    FILE *file;
    int len;
    unsigned char buffer[1024] ;
 
    if ((file = fopen (filename, "rb")) == NULL) {
        //printf("'%s' can't be opened\n", filename);
        return 0;
    }
 
    uint32_t crc32 = 0;
    while ((len = fread(buffer, 1, sizeof(buffer), file)) != 0) {
        crc32 = crc32_bitwise(buffer, len, crc32);
    }
    fclose(file);
    return crc32;
}
Добавлено через 11 минут
И я понемаю что я не правельно заполняю для того чтобы отобразить все файлы,это я так проста накидал на билдере,в этом та и вся проблема что тупа не пойму как заполнить этот stringgrid
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32584 / 21054 / 8133
Регистрация: 22.10.2011
Сообщений: 36,326
Записей в блоге: 8
13.04.2017, 08:26 6
C++
1
2
3
4
5
6
7
8
StringGrid1->RowCount = StringGrid1->RowCount + 1;
this->StringGrid1->Cells[1][StringGrid1->RowCount-1] = f.ff_name;
 
   this->StringGrid1->Cells[2][StringGrid1->RowCount-1] = f.ff_fsize/1024;
 
     this->StringGrid1->Cells[3][StringGrid1->RowCount-1] = f.ff_ftime>>11,(f.ff_ftime>>5)   &0x3f, (f.ff_ftime<<1) &0x3f, f.ff_fdate &0x1f, (f.ff_fdate>>5) &0x0f ,(f.ff_fdate>>9) + 1980;
 
      this->StringGrid1->Cells[4][StringGrid1->RowCount-1] = crc32_file(f.ff_name);
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
13.04.2017, 08:35  [ТС] 7
оооо спасибо большое,толька вот он заполняет после заведома созданых ячеек 0 же в инспекторе не пропишешь
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32584 / 21054 / 8133
Регистрация: 22.10.2011
Сообщений: 36,326
Записей в блоге: 8
13.04.2017, 09:36 8
А сколько у тебя прописано в инспекторе? 5 (по умолчанию)?
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
13.04.2017, 09:49  [ТС] 9
да 5
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32584 / 21054 / 8133
Регистрация: 22.10.2011
Сообщений: 36,326
Записей в блоге: 8
13.04.2017, 09:51 10
Сделай вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    done = findfirst("**.**", &f, 0);
    system("mode con cols=126 lines=59");
 
    int k = StringGrid1->FixedRows;
    while (!done)
    {
        StringGrid1->Cells[1][k] = f.ff_name;
        StringGrid1->Cells[2][k] = f.ff_fsize/1024;
        StringGrid1->Cells[3][k] = f.ff_ftime>>11,(f.ff_ftime>>5)   &0x3f, (f.ff_ftime<<1) &0x3f, f.ff_fdate &0x1f, (f.ff_fdate>>5) &0x0f ,(f.ff_fdate>>9) + 1980;
        StringGrid1->Cells[4][k++] = crc32_file(f.ff_name);
        done = findnext(&f);
    }
    StringGrid1->RowCount = k;
(обрати внимание на k++ в 10-ой строке), это и будет задавать переход на новую строку грида
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
13.04.2017, 09:55  [ТС] 11
о щас попробую

Добавлено через 2 минуты
проста прекрасно спасибо большое, а нельзя както узнать размер f.ff_name чтоб подгонять столбец под длину имени ??

Добавлено через 1 минуту
было бы обычноя строка strlen, либо length решил бы проблему а тут ??
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32584 / 21054 / 8133
Регистрация: 22.10.2011
Сообщений: 36,326
Записей в блоге: 8
13.04.2017, 09:58 12
А тут есть StringGrid1->Canvas->TextWidth()
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
13.04.2017, 10:13  [ТС] 13
пишу StringGrid1->Canvas->TextWidth(f.ff_name); и нечего, думал может не туда вставляю но везде попробывал

Добавлено через 45 секунд
а стоп втыкнул не так надо

Добавлено через 5 минут
пробывал чтото типо StringGrid1->Canvas->TextWidth(StringGrid1->Cells[1][1]); тоже не хочет(((

Добавлено через 35 секунд
или я чтото не туда пошол ??
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32584 / 21054 / 8133
Регистрация: 22.10.2011
Сообщений: 36,326
Записей в блоге: 8
13.04.2017, 10:30 14
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Ты бы для начала на чем-нибудь простеньком потренировался, а потом бы уже более сложное делал. Вот это что-ли нужно было?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    int k = StringGrid1->FixedRows;
    int width = 0;
    while (!done)
    {
        StringGrid1->Cells[1][k] = f.ff_name;
        width = Max(width, StringGrid1->Canvas->TextWidth(f.ff_name)); // для использования функции Max нужно #include <Math.hpp>
        StringGrid1->Cells[2][k] = f.ff_fsize/1024;
        StringGrid1->Cells[3][k] = f.ff_ftime>>11,(f.ff_ftime>>5)   &0x3f, (f.ff_ftime<<1) &0x3f, f.ff_fdate &0x1f, (f.ff_fdate>>5) &0x0f ,(f.ff_fdate>>9) + 1980;
        StringGrid1->Cells[4][k++] = crc32_file(f.ff_name);
        done = findnext(&f);
    }
    StringGrid1->RowCount = k;
    StringGrid1->ColWidths[1] = width; // выставляем ширину столбца по максимальной ширине имени файла
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
13.04.2017, 10:35  [ТС] 15
this->StringGrid1->ColWidths[1] = StringGrid1->Canvas->TextWidth(f.ff_name);

Добавлено через 30 секунд
а вы уже написали

Добавлено через 2 минуты
да именно это спасибо огромное!!!! тема закрыта!!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2017, 10:35
Помогаю со студенческими работами здесь

Динамическое добавление вкладок в TPageControl
Возможно ли добавление вкладок в TPageControl во время исполения программы? Если да, то как после...

Динамическое добавление элементов в массив
Требуется создать массив, размерностью в количество десятичных цифр, введенных с клавиатуры и...

Динамическое добавление объектов на форму
Задача такая: Добавить n элементов типа checkBox. n вводится в edit Нашёл на форуме такой код. Вот...

Динамическое удаление строк из StringGrid
Добрый день. подскажите как можно удалить сразу несколько выделенных строк в stringrid. Одну...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru