Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Работа с StringGrid


Автор: Ярослав 5.7.2009, 20:40

M
dumb
Ярослав, для оформления кода используй кнопку "Код", располагающуюся над полем ввода сообщения. и форматируй код нормально, а не абы как - читать невозможно с твоими хаотичными отступами.


Помогите пожалуйста,уже целый день долбусь с программой и не как не могу добить её до конца.Если посмотреть на рисунок всё понятно.Короче суть такова Необходим код для поиска в StringGrid.Сохранение произвожу вот так:
Код

if(StringGrid1->RowCount==2 &&  StringGrid1->Cells[1][1].IsEmpty()&&
   StringGrid1->Cells[2][1].IsEmpty() &&  StringGrid1->Cells[3][1].IsEmpty()&&
   StringGrid1->Cells[4][1].IsEmpty())
   ShowMessage("Нечего сохранять");

    else
     {
 if (SaveDialog1->Execute())
  {


  TStringList *Files=new    TStringList;
Files->Add(IntToStr(StringGrid1->ColCount)) ;
Files->Add(IntToStr(StringGrid1->RowCount)) ;

for( int cRow=1;  cRow<StringGrid1->RowCount; cRow++)
for( int cCol=1;  cCol<StringGrid1->ColCount; cCol++)
Files->Add(StringGrid1->Cells[cCol][cRow]);

Files->SaveToFile(SaveDialog1->FileName);
delete Files;
    }
 }

А чтение вот так:
Код

if (OpenDialog1->Execute())
 {
  TStringList *Files = new TStringList;
  Files->LoadFromFile (OpenDialog1->FileName);
  AnsiString buff;
  buff=Files->Strings[0];
  Files->Delete(0);
  StringGrid1->ColCount=StrToInt(buff);

  buff=Files->Strings[0];
  Files->Delete(0);
  StringGrid1->RowCount=StrToInt(buff);
  int Stroka=0;

  for( int cRow=1;  cRow<StringGrid1->RowCount; cRow++)
  for( int cCol=1;  cCol<StringGrid1->ColCount; cCol++)
    {
     StringGrid1->Cells[cCol][cRow]=Files->Strings[Stroka];
     Stroka++;
    }
   for( int cRow=1;  cRow<StringGrid1->RowCount; cRow++)
   StringGrid1->Cells[0][0];

   delete Files;
 }


А вот с поиском немогу разобраться.Только важно сделать как на рисунке чтоб результат поиска выводило в Edit-ы

Автор: ИванМ 5.7.2009, 22:47
Так же и делай как ты читал из файла:

Value- Искомое значение.

Код

 for( int cRow=1;  cRow<StringGrid1->RowCount; cRow++)
  for( int cCol=1;  cCol<StringGrid1->ColCount; cCol++)
    {
      if(StringGrid1->Cells[cCol][cRow]==Value)
      {
         Edit1->Text=Value;
         return;
      }
    }


Не понимаю какие тут сложности. Ты же сам все реализовал.

Автор: Ярослав 5.7.2009, 23:42
Да я ещё слаб в программировании.А можно по конкретнее с кодом.Типа нажал кнопку и т.д.

Автор: ИванМ 6.7.2009, 00:06
А ты каким Билдером пользуешься (версия)?

Автор: Ярослав 6.7.2009, 00:57
C++Builder 6

Автор: mrbrooks 6.7.2009, 08:20
Цитата(Ярослав @  5.7.2009,  23:42 Найти цитируемый пост)
А можно по конкретнее с кодом

дык ИванМ тебе пример и привел.

зы. Судя по всему ты делаешь что то на подобии БД, может лучше ее и использовать?

Автор: Aline 6.7.2009, 14:03
Может быть и стоит воспользоваться БД. В примере от ИванаМ найдется только одна запись и цикл прервется. А судя по рисунку, надо в массив запомнить номера строк, где встречается искомое значение, нажав на кнопку "Поиск". Затем по кнопке "Результат поиска" вывести первую запись на экран, а нажимая на кнопки Предыдущая-Следующая перебирать остальные, если они конечно есть. Ну и по кнопке "Поиск" посчитать конечно вообще найденное количество записей.

Автор: ИванМ 6.7.2009, 14:41
Вот, посмотри вложение.

Автор: mrbrooks 6.7.2009, 15:34
Цитата(Aline @  6.7.2009,  14:03 Найти цитируемый пост)
В примере от ИванаМ найдется только одна запись и цикл прервется. А судя по рисунку, надо в массив запомнить номера строк, где встречается искомое значение, нажав на кнопку "Поиск". Затем по кнопке "Результат поиска" вывести первую запись на экран, а нажимая на кнопки Предыдущая-Следующая перебирать остальные, если они конечно есть. Ну и по кнопке "Поиск" посчитать конечно вообще найденное количество записей. 

Никто не запрещает автору самому углубиться и расширить ответ - если он не является абсолютным решением. Готовое здесь никто выкладывать не обязан. 

Автор: Ярослав 6.7.2009, 21:10
Спосибо большое сейчас пришол с работы буду разбираться

Автор: Ярослав 6.7.2009, 21:44
Чет  проект не хочет компилироваться выскакивает  окно

Автор: ИванМ 6.7.2009, 21:54
Попробуй такой вариант

Автор: Ярослав 6.7.2009, 21:59
Опять тоже самое вот фото

Автор: ИванМ 6.7.2009, 22:03
Открой проект. Зайди в меню Project->Edit option source 
и удали там упоминания про dac60.bpi dacvcl60.bpi CRControls60.bpi odac60.bpi odacvcl60.bpi oraprov60.bpi
Или из блокнота открой файл проекта и тоже самое сделай

Автор: Ярослав 6.7.2009, 22:35
Чёт ничего не получается.Я взял ваш код оброботчики вставил в свою программу но выдаёт ошибку current=0; красная линия

Автор: ИванМ 6.7.2009, 22:38
Почитай файл *.h из моего примера. Скопируй от туда то, что у тебя не хватает.
А конкретно:
#include <vector> - в начале заголовка

в private-секции:
std::vector<int> frows;
size_t current;
void __fastcall Fill(); 

и из .cpp скопируй функцию void __fastcall Fill(); 

Автор: Ярослав 6.7.2009, 22:48
Я извиняюсь наверно уже надоел.Ну если Вы говорите что это поможет то возьму  код  на работу завтра разберусь.Ещё раз спасибо.Если Вы не против завтра отпишу Вам. 

Автор: ИванМ 6.7.2009, 22:52
Еще нужно что бы контролы были как у меня.
У меня Edit1- куда вводится строка поиска
Edit2,3,4- куда выводятся результаты
Button1 - начало поиска
Button2,3- вперед/назад (именно в таком порядке)

Отпишись. Не против. Раз уж начал помогать.

Автор: Ярослав 6.7.2009, 23:50
Не выдержал.Проверил всё супер так как я и хотел.С меня пиво.Огромное спасибо.А что на счёт если ввести неполные данные то как делать

Автор: ИванМ 7.7.2009, 00:14
типа такого:
Код

if(AnsiLowerCase(StringGrid1->Cells[cCol][cRow]).Pos(AnsiLowerCase(Edit1->Text)))
      {
        frows.push_back(cRow);
        break;
      }

Заменить аналогичные строки в Button1Click 

Автор: Ярослав 9.7.2009, 22:47
Да есть вопрос и как это организовать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)