Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

StringGrid

10K
04 апреля 2005 года
vlad44b
4 / / 04.04.2005
Подскажите, как реализовать визуальное представление окрашиванием фона в колонке
StringGrid в которой находятся цифры. В зависимости от цифры окрашивается фон
ячейки, чем больше цифра, тем больше площадь закрашивания ячейки. Для ясности
вопроса прилагаю нарисованный мною рисунок по адресу: http://www.vlad44design.narod.ru/pic.gif
Очевидно, надо использовать событие StringGrid1DrawCell, но не знаю, как его
организовать.
Не знаю как привязать параметр закрашивания если использовать FillRect к цифре в ячейке. Каким образом вычислять площадь закрашивания?
Например, в одной ячейке цифра 456, а в другой цифра 5 и т.д. Как алгоритм закрашивания написать в зависимости от цифры в ячейке?

Спасибо.
2.0K
05 апреля 2005 года
WidowMaker
212 / / 05.04.2005
Цитата:
Originally posted by vlad44b
Подскажите, как реализовать визуальное представление окрашиванием фона в колонке
StringGrid в которой находятся цифры. В зависимости от цифры окрашивается фон
ячейки, чем больше цифра, тем больше площадь закрашивания ячейки. Для ясности
вопроса прилагаю нарисованный мною рисунок по адресу: http://www.vlad44design.narod.ru/pic.gif
Очевидно, надо использовать событие StringGrid1DrawCell, но не знаю, как его
организовать.
Не знаю как привязать параметр закрашивания если использовать FillRect к цифре в ячейке. Каким образом вычислять площадь закрашивания?
Например, в одной ячейке цифра 456, а в другой цифра 5 и т.д. Как алгоритм закрашивания написать в зависимости от цифры в ячейке?

Спасибо.



Ну если дело только в размерах, то тут все просто:

 
Код:
TSize size=TextExtend(StringGrid1->Cells[0][0]);
//возвращает структуру с елементами LONG cx и LONG cy (ширина и высота).
310
05 апреля 2005 года
fellow
853 / / 17.03.2003
Ширина ячейки известна, ширину текстовой метки получаешь вышеописанным способом. Находишь максимальное значение в столбце и, соответственно, максимальную ширину текстовой метки. Из ширины столбца вычитаешь максимальную ширину текстовой метки (ведь ты же не хочешь, чтобы рисование наползало на цифры) и получаешь максимальную ширину области рисования. А дальше всё просто: расчитываешь ширину области рисования для каждой ячейки пропорционально величине каждого числа относительно максимального значения по столбцу.
Как работает обработчик OnDrawCell смотри справку.
10K
05 апреля 2005 года
vlad44b
4 / / 04.04.2005
Спасибо. Буду ковырять в этом направлении.
11K
06 апреля 2005 года
daylady
3 / / 06.04.2005
И еще такой вопрос:
Можно ли из StringGrid данные сразу в файл сохранить, минуя засовывание данных в массив?
Что-нибудь типа:
StringGrid->....?
488
06 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by daylady
И еще такой вопрос:
Можно ли из StringGrid данные сразу в файл сохранить, минуя засовывание данных в массив?
Что-нибудь типа:
StringGrid->....?

А они уже "засовываны" в массив по имени Cells

 
Код:
for(int i=0;i<StringGrid->RowCount;i++)
  {
    for(int j=0;j<StringGrid->ColCount;j++)
    {
      // запись ячейки StringGrid->Cells[j]
    }
  }
2.0K
06 апреля 2005 года
WidowMaker
212 / / 05.04.2005
Не парься ты с массивами а записуй построчно( или там даже методы есть для сохранения всей таблицы, но я не помню, а сижу в клубе рублюсь в CS:))

Table->Cols->... не помню...SaveToFile(...)
Вот.
(ну де там мой калаш...)
11K
06 апреля 2005 года
daylady
3 / / 06.04.2005
Вот-вот, как раз оно!!!
Если вспомнишь, буду благодарна.

Все-таки не хочется делать это:
//-------------------------------------
for(int i=0;i<StringGrid->RowCount;i++)
{
for(int j=0;j<StringGrid->ColCount;j++)
{
// запись ячейки StringGrid->Cells[j]
}
}
//-------------------------------------
2.0K
06 апреля 2005 года
WidowMaker
212 / / 05.04.2005
Цитата:
Originally posted by daylady
Вот-вот, как раз оно!!!
Если вспомнишь, буду благодарна.

Все-таки не хочется делать это:
//-------------------------------------
for(int i=0;i<StringGrid->RowCount;i++)
{
for(int j=0;j<StringGrid->ColCount;j++)
{
// запись ячейки StringGrid->Cells[j]
}
}
//-------------------------------------


Ну все отбилось совсем желание играть:(
Если срочно, то кажется так:
for(int j=0;j<StringGrid->RowCount;j++)
{
StringGrid->Cols->Strings->SaveToFile(....);
//или без Strings(юзай на здровье:))
}

488
06 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by WidowMaker
for(int j=0;j<StringGrid->RowCount;j++)
{
StringGrid->Cols->Strings->SaveToFile(....);
//или без Strings(юзай на здровье:))
}


Три ошибки, но если было б правильно написано, все равно j+1 строка перезаписывала бы значение j-й строки. Т.е. таким образом можно записать в файл только одну строку.

 
Код:
TStringList *s = new TStringList;
  for(int i=0;i<StringGrid->RowCount;i++)
  {
    s->AddStrings(StringGrid->Rows);
  }
  s->SaveToFile("C:\\h.txt");
  delete s;
Чтение данных в StringGrid
Код:
TStringList *s = new TStringList;
  s->LoadFromFile("C:\\h.txt");
  int k = 0;
  for(int i=0;i<StringGrid->RowCount;i++)
  {
    for(int j=0;j<StringGrid->ColCount;j++)
    {
      StringGrid->Cells[j] = s->Strings[k++];
    }
  }
  delete s;
Если размер grid-a может меняться, тогда можно в имя файла записать кол-во строк и столбцов Grid-а. Напр. h0505.txt, и перед загрузкой менять RowCount и ColCount (если нужно)
2.0K
07 апреля 2005 года
WidowMaker
212 / / 05.04.2005
Кошмар!:o(было первое,что я сказал когда опять заглянул на форум)
Ума не приложу, как я мог Такое написать!
Спасибо, что исправили...
(урок:не шататься по форумам за игрой вCS):(
Полностью согласен с исправлениями(лучше не придумаешь), но надо хоть как-то реабилитироваться:
можно использовать явное окончание данных и писать строку в одну строку(ну и товтология) через свойство Strings::CommaText,
 
Код:
TStringList *s = new TStringList;
  for(int i=0;i<StringGrid->RowCount;i++)
  {
    s->Add(StringGrid->Rows->CommaText+",");
  }
  s->SaveToFile(FileName);
  delete s;

Пр и загрузке разбивать можно конечно и strtok для AnsiString, но тут я привел свою:
 
Код:
AnsiString GTFS(AnsiString String,int num,AnsiString delim =",")
{
  AnsiString T=String;
  for (int i=1;i<num;i++)T=T.Delete(1,T.Pos(delim));
  return T.SubString(1,T.Pos(delim)-1);
}//да,да лишние повторения, но она у меня :-?используется уже давно и не совсеи для этих целей

загрузка:
Код:
TStringList *SL = TStringList;
   AnsiString Line;
   SL->LoadFromFile(jk);
   Grid->RowCount=SL->Count;
   for(int i=0;i<SL->Count;i++)
   {
      int k=0;
      while((Line=GTFS(SL->strings,k+1,","))!="")
      {
        if(k+1>Grid->ColCount)  Grid->ColCount++;
        Grid->Cell[k]=Line;
        k++;
      }
   }
   delete SL;

Ну это конечно уже ходьба вокруг да около...
11K
09 апреля 2005 года
daylady
3 / / 06.04.2005
Это просто чудо - форум какой-то!!!
Большое спасибо вам!!!
Лучше час потратить на форум, чем 2 часа возиться с компонентами Builder
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог