Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 8
1

StringGrid FixedRows

11.04.2017, 19:17. Показов 1558. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Недавно начал изучать builder, при написании программы столкнулся с проблемой. Сначала я сделал просто stringGrid и просто вбивал "шапку" в нулевую строку, но тогда у пользователя была возможность её удалить, сделал фиксированную и появилась другая проблема, при загрузке данных в таблицу появляется лишняя строка(RowCount=2, иначе FixedRows не выставить), её можно удалить, но независимо от этого нижняя строка не удаляется никогда.

Код:

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
void __fastcall TForm1::FormShow(TObject *Sender)
{
 
StringGrid1->Cells[0][0]="Фамилия";
StringGrid1->Cells[1][0]="Имя";
StringGrid1->Cells[2][0]="Отчество";
StringGrid1->Cells[3][0]="Дата рождения";
StringGrid1->Cells[4][0]="Телефон";
StringGrid1->Cells[5][0]="Адрес";
StringGrid1->Cells[6][0]="Доктор";
StringGrid1->Cells[7][0]="Диагноз";
StringGrid1->Cells[8][0]="Лечение";
 
 
for (int i=0 ; i<9 ; i++)
ComboBox1->Items->Add(StringGrid1->Cells[i][0]);
// Загрузка из файла
  TStringList *Table = new TStringList;
        Table->LoadFromFile(ExtractFilePath(Application->ExeName)+"dat.txt");
 
        int start = StringGrid1->RowCount;
        int end = start + Table->Count;
        StringGrid1->RowCount += Table->Count;
 
        for(int i = start; i < end; i++)
        {
                //вставка из файла
                StringGrid1->Rows[i]->DelimitedText = Table->Strings[i-start];
                fAutoSizeColSG(StringGrid1);   //выравнивание таблицы
        }
        delete Table;
 
        }
Миниатюры
StringGrid FixedRows  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2017, 19:17
Ответы с готовыми решениями:

Вывести данные из StringGrid-ов на двух формах в StringGrid на третьей форме
Помогите,не разбираюсь,только учусь:(:wall:...Вообщем,имеется программа с 3 формами. На первой из...

Сохранение из StringGrid массива в файл и загрузка из файла в StringGrid
Всем доброго времени суток =) У меня есть загрузка массива из StringGrid на Delphi 2010:...

Как соединить StringGrid с другим StringGrid (Rad xe8)
Здраствуйте. Проблема заключается в следующем: Есть таблица которая указана на 1 изображении ...

Есть 2 StringGrid в С++ Builder, и нужно взять оттуда данные и заполнить ими 3 StringGrid, как бы сложить 2 та
Код C++ void __fastcall TForm1::Button1Click(TObject *Sender) { int i,j; float p,p1; for (i =...

7
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.04.2017, 19:38 2
StringGrid1->RowCount - отображает общее количество строк, а индекс в StringGrid1 начинается с нуля, таким образом индекс никогда не совпадает с RowCount
1
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 8
11.04.2017, 19:42  [ТС] 3
А можно поподробней, что исправить?
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.04.2017, 19:43 4
Хотя бы исправьте чтобы не было пустой второй строки, сместите start на единицу назад
1
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 8
11.04.2017, 19:48  [ТС] 5
C++
1
2
3
        int start = StringGrid1->RowCount;
        start--;
        int end = start + Table->Count;
Исправлял вот так, строка уходит, но последняя строка все равно не удаляется.
0
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.04.2017, 22:31 6
SNV1705,
странная загрузка стринггрида. почему не воспользоваться традиционным методом?
тогда никак не будет появляться последняя строка.

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
StringGrid1->Cells[0][0]="Фамилия";
StringGrid1->Cells[1][0]="Имя";
StringGrid1->Cells[2][0]="Отчество";
StringGrid1->Cells[3][0]="Дата рождения";
StringGrid1->Cells[4][0]="Телефон";
StringGrid1->Cells[5][0]="Адрес";
StringGrid1->Cells[6][0]="Доктор";
StringGrid1->Cells[7][0]="Диагноз";
StringGrid1->Cells[8][0]="Лечение";
 
 
for (int i=0 ; i<9 ; i++)
ComboBox1->Items->Add(StringGrid1->Cells[i][0]);
// Загрузка из файла
  TStringList *Table = new TStringList;
        Table->LoadFromFile(ExtractFilePath(Application->ExeName)+"dat.txt");
//Table->LoadFromFile("dat.txt");
        int Index=0;        
        StringGrid1->RowCount = (Table->Count)/StringGrid1->ColCount;//делим на количество колонок
        for(int i=0;i<StringGrid1->ColCount;i++)
                for(int j=0;j<StringGrid1->RowCount;j++)
                {
                        StringGrid1->Cells[i][j]=Table->Strings[Index];
                        Index++;
                }
        delete Table;
 
        }
Добавлено через 1 час 30 минут
или как в твоем случае - нулевая строка каждый старт программы перезаписывается то можно опустить
C++
1
for(int j=1;j<StringGrid1->RowCount;j++)
но не критично.
только вот запись тоже надо поменять на
C++
1
2
3
4
5
6
7
8
// Запись файла
  TStringList *Table = new TStringList;     
            for(int i=0;i<StringGrid1->ColCount;i++) 
            {
                for(int j=0;j<StringGrid1->RowCount;j++)
                        Table->Add(StringGrid1->Cells[i][j]);
            }
        Table->SaveToFile("dat.txt");
1
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 8
12.04.2017, 20:17  [ТС] 7
не помогает, последняя строка не удаляется

Добавлено через 4 часа 14 минут
Всё решил, исправил функцию удаления(RowCount-2 вместо RowCount-1)
Лишняя строка все равно появляется(удаляю её в коде после ввода, Index=end)

C++
1
2
3
4
5
6
7
8
int Index = end; // Текущая строка
if(Index != StringGrid1->RowCount-2 ) // Если вообще выбрана какая-нибудь строка
  {
  for(int i=Index; i<StringGrid1->RowCount-2; i++) // С текущей строки до последней
    StringGrid1->Rows[i] = StringGrid1->Rows[i+1]; // Затереть текущую строку следующей
 
  StringGrid1->RowCount--; // Удалить последнюю строку
  }
Добавлено через 1 час 21 минуту
Поспешил с решением)
Теперь не удаляется предпоследняя строка, но когда остается две строки можно удалить последнюю тогда предпоследняя становится последней и тоже удаляется
0
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
12.04.2017, 22:49 8
Цитата Сообщение от SNV1705 Посмотреть сообщение
if(Index != StringGrid1->RowCount-2 ) // Если вообще выбрана какая-нибудь строка
совсем ничего не понятно что где и куда?
дай код . трудно гадать и представить какое решение в твоей проге.

Добавлено через 43 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 //**************************************************
 // здесь удаление строки и перемещение строк вверх
 // *************************************************
         int count = StringGrid1->RowCount; // подсчет количества строк
         int row = StringGrid1->Row;  // строка на которой стоит курсор
//..............................................................................
     for ( int i = row; i < count-1; i++ )//начать перемещение с помеченой строки
        {       //перезаписываю нижнюю строку в верхнюю
                StringGrid1->Rows[i] = StringGrid1->Rows[i+1];//перемещение строк вверх
        }
        StringGrid1->RowCount--; // удаляю последнею строку!
        StringGrid1->Rows[count-1]->Clear();// очистка последней строки!!!
// --------------------------------------------------------------------------
1
12.04.2017, 22:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2017, 22:49
Помогаю со студенческими работами здесь

Перенос данных из одного StringGrid в другой StringGrid
Здравствуйте . Есть очередной вопрос с матрицами. Есть два StringGrid. В одном столбце первой...

Возможность вручную писать данные в ячейки StringGrid и заполнение ячеек StringGrid данными из файла после нажатия кнопки
Здравствуйте! Помогите, пожалуйста. Мне необходимо сделать следующее: реализовать возможность...

Свойства FixedCols (FixedRows) и goEditing в StringGrid.
Добрый вечер. Можно ли фиксировать определенные столбцы и/или строки, а также включить опцию...

Подсчитать сумму каждого столбца и каждой строки StringGrid-а и вывести результат в FixedCols и FixedRows
Нужно рандомно заполнить таблицу, считать ее в двумерный массив. Далее подсчитать сумму каждого...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru