Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2012, 00:30   #1
Zuba
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 21
Радость проблема со StringGrid и INI

У меня проблема. есть INI файл со статистикой, его нужно вывести в StringGrid, что бы всё было красивенько, но т.к. я с самого начала не подумал, сделал названия секций в ини не по уму(profil1, profil2, profil3 и т.д.) как логины пользователей(Вася, Петя, Коля и т.п.).
суть в том, что при сохранении названия секции в переменную - мне выдаёт ошибки:
[C++ Error] Unit8.cpp(35): E2034 Cannot convert 'AnsiString' to 'TStrings *'
[C++ Error] Unit8.cpp(35): E2342 Type mismatch in parameter 'Strings' (wanted 'TStrings *', got 'AnsiString')

вот код:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit8.h"
#include "Unit5.h"
#include "IniFiles.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm8 *Form8;
TIniFile *Stat = new TIniFile(ExpandFileName("stat.ini"));
//---------------------------------------------------------------------------
__fastcall TForm8::TForm8(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm8::FormCreate(TObject *Sender)
{Form5->Show();
Form5->Hide();
StringGrid1->Cells[0][0]="лог";
StringGrid1->Cells[1][0]="1";
StringGrid1->Cells[2][0]="2";
StringGrid1->Cells[3][0]="3";
StringGrid1->Cells[4][0]="4";
StringGrid1->Cells[5][0]="5";
StringGrid1->Cells[6][0]="6";
for (int z=0; z< StringGrid1->RowCount; z++)
{if(StringGrid1->Cells[0][z+1]=="")
{
String TD;
Stat->ReadSections(TD);
Stat->ReadSections(StringGrid1->Cells[0][z+1]);
StringGrid1->Cells[6][z+1]=Stat->ReadString(TD,"kmil", "" );
StringGrid1->Cells[1][z+1]=Stat->ReadString(TD,"maxmil", "" );
StringGrid1->Cells[2][z+1]=Stat->ReadString(TD,"obshmil", "" );
StringGrid1->Cells[3][z+1]=Stat->ReadString(TD,"ktime", "" );
StringGrid1->Cells[4][z+1]=Stat->ReadString(TD,"maxtime", "" );
StringGrid1->Cells[5][z+1]=Stat->ReadString(TD,"obshtime", "" );
}}
Выдаёт ошибки на этой строчке:
Stat->ReadSections(TD);



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 29.04.2012 в 00:42.
Zuba вне форума Ответить с цитированием
Старый 29.04.2012, 01:53   #2
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

- ну, правильно выдает. Попробуйте так:
Код:
Stat->ReadSections(StringGrid1->Cols[0]);
Вы пытаетесь в одну строку поместить комбинацию строк; компилятор с этим не соглашается...
nick42 вне форума Ответить с цитированием
Старый 29.04.2012, 16:03   #3
Zuba
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 21
По умолчанию

Цитата:
Сообщение от nick42 Посмотреть сообщение
- ну, правильно выдает. Попробуйте так:
Код:
Stat->ReadSections(StringGrid1->Cols[0]);
Вы пытаетесь в одну строку поместить комбинацию строк; компилятор с этим не соглашается...
вы не поняли, мне ошибки выдаёт ещё до строки Stat->ReadSections(StringGrid1->Cells[0][z+1]);
компилятор не доходит до этой строки.
он выдаёт ошибки на строке:
Stat->ReadSections(TD);
Zuba вне форума Ответить с цитированием
Старый 29.04.2012, 16:13   #4
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

это вы не поняли; такая запись: Stat->ReadSections(TD); это операция присвоения переменной TD значения списка секций. А TD вы определили как строку. Попробуйте набрать Stat->ReadSections( , если подсказки не отключены, то появится ожидаемый тип параметров, а это класс TStrings вместо предложенного вами String. И не в обиду... - вы бы сначала проверили предлагаемый вариант, а потом бросались в теоретические споры...
nick42 вне форума Ответить с цитированием
Старый 01.05.2012, 14:16   #5
Zuba
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 21
По умолчанию

Цитата:
Сообщение от nick42 Посмотреть сообщение
это вы не поняли; такая запись: Stat->ReadSections(TD); это операция присвоения переменной TD значения списка секций. А TD вы определили как строку. Попробуйте набрать Stat->ReadSections( , если подсказки не отключены, то появится ожидаемый тип параметров, а это класс TStrings вместо предложенного вами String. И не в обиду... - вы бы сначала проверили предлагаемый вариант, а потом бросались в теоретические споры...
Спасибо, те ошибки пропали, но после компиляции(компановки) выскакивает ошибка:
"Project Project1.exe raised exeption class EAccessViolation witx message 'Access violation at address 7C913144 in module 'ntdll.dll'. Write of address 40006D09'. Process stopped. Use Step or Run to continue."
Никогда раньше с таким не сталкивался.

код программы:
void __fastcall TForm8::FormCreate(TObject *Sender)
{Form5->Show();
Form5->Hide();
StringGrid1->Cells[0][0]="1";
StringGrid1->Cells[1][0]="2";
StringGrid1->Cells[2][0]="3";
StringGrid1->Cells[3][0]="4";
StringGrid1->Cells[4][0]="5";
StringGrid1->Cells[5][0]="6";
StringGrid1->Cells[6][0]="7";
for (int z=0; z< StringGrid1->RowCount; z++)
{if(StringGrid1->Cells[0][z+1]=="")
{
Stat->ReadSections(StringGrid1->Cols[0]);
StringGrid1->Cells[0][z+1] = TD;
StringGrid1->Cells[6][z+1]=Stat->ReadString(TD,"kmil", "" );
StringGrid1->Cells[1][z+1]=Stat->ReadString(TD,"maxmil", "" );
StringGrid1->Cells[2][z+1]=Stat->ReadString(TD,"obshmil", "" );
StringGrid1->Cells[3][z+1]=Stat->ReadString(TD,"ktime", "" );
StringGrid1->Cells[4][z+1]=Stat->ReadString(TD,"maxtime", "" );
StringGrid1->Cells[5][z+1]=Stat->ReadString(TD,"obshtime", "" );
z++;
}}
Zuba вне форума Ответить с цитированием
Старый 01.05.2012, 23:07   #6
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Код:
{
StringGrid1->Cells[0][0]="1";
StringGrid1->Cells[1][0]="2";
StringGrid1->Cells[2][0]="3";
StringGrid1->Cells[3][0]="4";
StringGrid1->Cells[4][0]="5";
StringGrid1->Cells[5][0]="6";
StringGrid1->Cells[6][0]="7";

Stat->ReadSections(StringGrid1->Cols[0]); 
for (int z=0; z< StringGrid1->RowCount-1; z++)
 if(StringGrid1->Cells[0][z+1].Length()>0)
 {
//StringGrid1->Cells[0][z+1] = TD;
TD = StringGrid1->Cells[0][z+1];
StringGrid1->Cells[6][z+1]=Stat->ReadString(TD,"kmil", "" );
StringGrid1->Cells[1][z+1]=Stat->ReadString(TD,"maxmil", "" );
StringGrid1->Cells[2][z+1]=Stat->ReadString(TD,"obshmil", "" );
StringGrid1->Cells[3][z+1]=Stat->ReadString(TD,"ktime", "" );
StringGrid1->Cells[4][z+1]=Stat->ReadString(TD,"maxtime", "" );
StringGrid1->Cells[5][z+1]=Stat->ReadString(TD,"obshtime", "" );
//z++;
 }        
}
вот это <Stat->ReadSections(StringGrid1->Cols[0]);> заполняет весь нулевой столбец перечнем секций в файле ини; дублировать в цикле не нужно. Анализ лучше строить вот так: <if(StringGrid1->Cells[0][z+1].Length()>0)> - когда ожидается пустая строка, то сравнение с "" некорректно, лучше анализировать длину строки. Увеличивать счетчик цикла <//z++;> не нужно, - это делается в определителе цикла.
nick42 вне форума Ответить с цитированием
Старый 01.05.2012, 23:33   #7
Zuba
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 21
По умолчанию

Цитата:
Сообщение от nick42 Посмотреть сообщение
Код:
{
StringGrid1->Cells[0][0]="1";
StringGrid1->Cells[1][0]="2";
StringGrid1->Cells[2][0]="3";
StringGrid1->Cells[3][0]="4";
StringGrid1->Cells[4][0]="5";
StringGrid1->Cells[5][0]="6";
StringGrid1->Cells[6][0]="7";

Stat->ReadSections(StringGrid1->Cols[0]); 
for (int z=0; z< StringGrid1->RowCount-1; z++)
 if(StringGrid1->Cells[0][z+1].Length()>0)
 {
//StringGrid1->Cells[0][z+1] = TD;
TD = StringGrid1->Cells[0][z+1];
StringGrid1->Cells[6][z+1]=Stat->ReadString(TD,"kmil", "" );
StringGrid1->Cells[1][z+1]=Stat->ReadString(TD,"maxmil", "" );
StringGrid1->Cells[2][z+1]=Stat->ReadString(TD,"obshmil", "" );
StringGrid1->Cells[3][z+1]=Stat->ReadString(TD,"ktime", "" );
StringGrid1->Cells[4][z+1]=Stat->ReadString(TD,"maxtime", "" );
StringGrid1->Cells[5][z+1]=Stat->ReadString(TD,"obshtime", "" );
//z++;
 }        
}
вот это <Stat->ReadSections(StringGrid1->Cols[0]);> заполняет весь нулевой столбец перечнем секций в файле ини; дублировать в цикле не нужно. Анализ лучше строить вот так: <if(StringGrid1->Cells[0][z+1].Length()>0)> - когда ожидается пустая строка, то сравнение с "" некорректно, лучше анализировать длину строки. Увеличивать счетчик цикла <//z++;> не нужно, - это делается в определителе цикла.
Спасибо! вроде всё понял)
Zuba вне форума Ответить с цитированием
Старый 03.05.2012, 12:05   #8
Zuba
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 21
По умолчанию

Цитата:
Сообщение от nick42 Посмотреть сообщение
вот это <Stat->ReadSections(StringGrid1->Cols[0]);> заполняет весь нулевой столбец перечнем секций в файле ини; дублировать в цикле не нужно. Анализ лучше строить вот так: <if(StringGrid1->Cells[0][z+1].Length()>0)> - когда ожидается пустая строка, то сравнение с "" некорректно, лучше анализировать длину строки. Увеличивать счетчик цикла <//z++;> не нужно, - это делается в определителе цикла.
есть одна проблемка, он выводит в таблицу с нулевой строки(шапки), как сделать, что бы он выводил с первой?(ну что бы шапка оставалась)
Zuba вне форума Ответить с цитированием
Старый 03.05.2012, 14:43   #9
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Можно применить "пустую" секцию (самую верхнюю), названную именем самой левой колонки, тогда с шапкой никаких конфликтов не будет. И потом не обязательно же из ини-файла заполнять нулевую колонку значениями; можно использовать виртуальный StringList и из него уже в цикле, например:
Код:
  TStringList *TT = new TStringList();
  Stat->ReadSections(TT);
for (int z=0; z <  StringGrid1->RowCount-1; z++)
 {
 if (z<TT->Count && TT->Strings[z].Length() > 0)
  { 
  TD = TT->Strings[z];
StringGrid1->Cells[0][z+1]=TD;
StringGrid1->Cells[6][z+1]=Stat->ReadString(TD,"kmil", "" );
StringGrid1->Cells[1][z+1]=Stat->ReadString(TD,"maxmil", "" );
StringGrid1->Cells[2][z+1]=Stat->ReadString(TD,"obshmil", "" );
StringGrid1->Cells[3][z+1]=Stat->ReadString(TD,"ktime", "" );
StringGrid1->Cells[4][z+1]=Stat->ReadString(TD,"maxtime", "" );
StringGrid1->Cells[5][z+1]=Stat->ReadString(TD,"obshtime", "" );
  }
 }
nick42 вне форума Ответить с цитированием
Старый 03.05.2012, 14:55   #10
Zuba
Пользователь
 
Регистрация: 09.04.2012
Сообщений: 21
По умолчанию

Цитата:
Сообщение от nick42 Посмотреть сообщение
Можно применить "пустую" секцию (самую верхнюю), названную именем самой левой колонки, тогда с шапкой никаких конфликтов не будет. И потом не обязательно же из ини-файла заполнять нулевую колонку значениями; можно использовать виртуальный StringList и из него уже в цикле, например:
Код:
  TStringList *TT = new TStringList();
  Stat->ReadSections(TT);
for (int z=0; z <  StringGrid1->RowCount-1; z++)
 {
 if (z<TT->Count && TT->Strings[z].Length() > 0)
  { 
  TD = TT->Strings[z];
StringGrid1->Cells[0][z+1]=TD;
StringGrid1->Cells[6][z+1]=Stat->ReadString(TD,"kmil", "" );
StringGrid1->Cells[1][z+1]=Stat->ReadString(TD,"maxmil", "" );
StringGrid1->Cells[2][z+1]=Stat->ReadString(TD,"obshmil", "" );
StringGrid1->Cells[3][z+1]=Stat->ReadString(TD,"ktime", "" );
StringGrid1->Cells[4][z+1]=Stat->ReadString(TD,"maxtime", "" );
StringGrid1->Cells[5][z+1]=Stat->ReadString(TD,"obshtime", "" );
  }
 }
Ура, спасибо! всё вышло как надо)
Zuba вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с ini Zuba C++ Builder 4 26.04.2012 10:28
StringGrid и ini HOOCH94 Общие вопросы Delphi 1 08.11.2010 21:14
Проблема с файлами ini WinMen Общие вопросы Delphi 3 08.11.2010 10:43
Сохранение StringGrid, создание .ini! Nemesisking Общие вопросы Delphi 5 24.09.2007 08:23