Как узнать количество строк в StringGrid?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как узнать количество строк в StringGrid?

Сообщение GAMER » 22.11.2008 01:25:02

Сохраняю StringGrid у файл. Потом его с файла читаю. Как узнать количество строк? Дело в том, что StringGrid.RowCount показывает неправильное значение, то есть из файла не перечитывает.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Как узнать количество строк в StringGrid?

Сообщение Logo » 22.11.2008 07:38:30

Работает оно. У меня в проекте интенсивно StringGrid используется. Нужно учитывать серые строки, они в RowCount включены. Лучше выложи небольшой пример с проблемой, а то сильно расплывчасто. Как зачитывается файл, как загружается в таблицу??? Каждая строка в цикле загружается из файла?
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Как узнать количество строк в StringGrid?

Сообщение GAMER » 22.11.2008 11:57:32

StringGrid загружаю с файла.
Код: Выделить всё
SGbuf:=TStringGrid.Create(nil);
SGbuf.ColCount:=1;
SGbuf.LoadFromFile('History.buf');
Memo1.Text:=SGbuf.Cells[0,0];
Caption := IntToStr(SGbuf.RowCount);


Сам файл:
Код: Выделить всё
<?xml version="1.0"?>
<CONFIG>
  <grid version="3">
    <saveoptions create="False" content="True" position="False"/>
    <content>
      <cells cellcount="16">
        <cell1 row="0" text="set names utf8" column="0"/>
        <cell2 row="1" text="select * from glob" column="0"/>
        <cell3 row="2" text="select * from glob" column="0"/>
        <cell4 row="3" text="set names utf8" column="0"/>
        <cell5 row="4" text="select * from glob" column="0"/>
        <cell6 row="5" text="select * from glob" column="0"/>
        <cell7 row="6" text="use ksall" column="0"/>
        <cell8 row="7" text="select * from test" column="0"/>
        <cell9 row="8" text="use test" column="0"/>
        <cell10 row="9" text="0rty" column="0"/>
        <cell11 row="10" text="select * from test" column="0"/>
        <cell12 row="11" text="use test" column="0"/>
        <cell13 row="12" text="use test" column="0"/>
        <cell14 row="13" text="use ksall" column="0"/>
        <cell15 row="14" text="use test" column="0"/>
        <cell16 row="15" text="use test" column="0"/>
      </cells>
    </content>
  </grid>
</CONFIG>
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Как узнать количество строк в StringGrid?

Сообщение Logo » 22.11.2008 21:04:21

Понятно. В этом случае придется взять данные из файла и присвоить в StringGrid
Код: Выделить всё
//Берем количество строк и колонок из файла
procedure TForm1.GetRowColCount(var r{RowCount}, c{ColCount}: Integer; f{ileName}: String);
var
  xmlf: TXMLConfig; // unit XMLCfg
  vers, cl: Integer;
begin
  if not FileExistsUTF8(f) then Exit; //Если файл не тот - выход

  xmlf:=TXMLConfig.Create(nil);
  try
    xmlf.Filename := f;
    Vers := xmlf.GetValue('grid/version',-1);
    if Vers = -1 then Exit; //Если версия файла не та - выход

     cl :=  xmlf.getValue('grid/content/cells/cellcount', 0); //Количество ячеек
     c := Succ(xmlf.GetValue('grid/content/cells/cell'+IntToStr(cl)+'/column', -1)); //количество колонок
     r := Succ(xmlf.GetValue('grid/content/cells/cell'+IntTostr(cl)+'/row', -1)); //количество строк
  finally
    FreeThenNil(xmlf); //из unit LCLProc - освобождаем память
  end;
end;

//Примерно так делаем вызов
procedure TForm1.BitBtn2Click(Sender: TObject);
var r, c: Integer;
begin
  GetRowColCount(r, c, 'grd1.test');
  StringGrid1.RowCount := r;
  StringGrid1.Colcount := c;
  StringGrid1.LoadFromFile('grd1.test');
end;


Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Как узнать количество строк в StringGrid?

Сообщение GAMER » 22.11.2008 21:59:45

Спасибо. Но все же я считаю, что это недоделка для LoadFromFile. Может пофиксят со временем?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Как узнать количество строк в StringGrid?

Сообщение Logo » 23.11.2008 02:33:06

Спасибо.

Будьласка :)
Но все же я считаю, что это недоделка для LoadFromFile. Может пофиксят со временем?

В коде умышлено введена проверка на существующие ячейки. Какая идеология развития этого метода, я не знаю, на мой взгляд нужно добавить свойство, например, AutomakeCells : Boolean, которое будет разрешать или запрещать, создавать ячейки если их нет. Нужно Павла Ишенина спросить.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Как узнать количество строк в StringGrid?

Сообщение Vadim » 23.11.2008 12:08:01

Logo
Там в файле есть опция create = True/False. Я думал, может она влияет на создание ячеек, но ошибся. Видимо смысл её намного глубже. :)
GAMER
Не забудьте перед записью в файл поставить опции записи:
Код: Выделить всё
StringGrid1.SaveOptions:=[soDesign, soContent];

тогда в файл запишется количество строк и количество колонок.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как узнать количество строк в StringGrid?

Сообщение GAMER » 23.11.2008 14:04:16

Вроде работает и без этих опций. Видать они включены по умолчанию.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Как узнать количество строк в StringGrid?

Сообщение Logo » 23.11.2008 14:50:51

Вот процедура загрузки таблицы из файла:
Код: Выделить всё
procedure TCustomStringGrid.LoadContent(Cfg: TXMLConfig; Version:Integer);
var
  ContentSaved: Boolean;
  i,j,k: Integer;
begin
  inherited LoadContent(Cfg, Version); //Здесь просто формируется таблица, во время дизайна, по умолчанию

  if soContent in FSaveOptions then begin
    ContentSaved:=Cfg.GetValue('grid/saveoptions/content', false);
    if ContentSaved then begin
      k:=cfg.getValue('grid/content/cells/cellcount', 0);

// Сюда и можно вставить код для установки правильного количества строк и столбцов

      while k>0 do begin
        i:=cfg.GetValue('grid/content/cells/cell'+IntToStr(k)+'/column', -1);
        j:=cfg.GetValue('grid/content/cells/cell'+IntTostr(k)+'/row',-1);
        if (j>=0)and(j<=rowcount-1)and(i>=0)and(i<=Colcount-1) then // Проверка на существующие ячейки
          Cells[i,j]:=cfg.GetValue('grid/content/cells/cell'+IntToStr(k)+'/text','');
        Dec(k);
      end;
    end;
  end;
end;

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

Добавлено спустя 12 минут 41 секунду:
Vadim писал(а):Logo
Там в файле есть опция create = True/False. Я думал, может она влияет на создание ячеек, но ошибся. Видимо смысл её намного глубже. :)

Поэтому я хочу знать мнение разработчиков по этому поводу, код вписать не проблемно, а вот какая концепция использования этого метода???
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Как узнать количество строк в StringGrid?

Сообщение GAMER » 23.11.2008 15:24:14

Усли использовать SGbuf.SaveOptions := soALL; то в файле сохраняется намного больше информации. Но все же мне не удается ее выудить от туда стандартным способом.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Как узнать количество строк в StringGrid?

Сообщение Vadim » 23.11.2008 15:47:51

GAMER писал(а):Вроде работает и без этих опций. Видать они включены по умолчанию.

Работать, безусловно, работает, но по умолчанию в файл скидывается только контент, без указания кол-ва строк и столбцов.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как узнать количество строк в StringGrid?

Сообщение GAMER » 23.11.2008 15:50:14

Vadim писал(а):
GAMER писал(а):Вроде работает и без этих опций. Видать они включены по умолчанию.

Работать, безусловно, работает, но по умолчанию в файл скидывается только контент, без указания кол-ва строк и столбцов.

Прошу прощения, смотрю в форум - вижу фигу. Конечно же, с этой опцией пишется намного больше информации. Сам же ее нашел, и только сейчас увидел, что это одна и та же опция :)

Добавлено спустя 7 минут 1 секунду:
Вопрос снят. перед записью в файл нужно делать SGbuf.SaveOptions := [soDesign, soContent, soAttributes];
Тогда читает коректное значение строк.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Как узнать количество строк в StringGrid?

Сообщение Logo » 23.11.2008 21:03:20

GAMER писал(а):Вопрос снят. перед записью в файл нужно делать SGbuf.SaveOptions := [soDesign, soContent, soAttributes];
Тогда читает коректное значение строк.


Да, действительно все логично и корректно, только одно замечание:
SGbuf.SaveOptions := [soDesign, soContent, soAttributes];
Нужно выставить и при чтении из файла, иначе не сработает. Это то, что я и не усек :oops:

Спасибо GAMER, а то бы я так и зачитывал параметры отдельно.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

Рейтинг@Mail.ru