Как узнать количество строк в StringGrid?
Модератор: Модераторы
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
Как узнать количество строк в StringGrid?
Сохраняю StringGrid у файл. Потом его с файла читаю. Как узнать количество строк? Дело в том, что StringGrid.RowCount показывает неправильное значение, то есть из файла не перечитывает.
Работает оно. У меня в проекте интенсивно StringGrid используется. Нужно учитывать серые строки, они в RowCount включены. Лучше выложи небольшой пример с проблемой, а то сильно расплывчасто. Как зачитывается файл, как загружается в таблицу??? Каждая строка в цикле загружается из файла?
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
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>Понятно. В этом случае придется взять данные из файла и присвоить в 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;
Спасибо.
Будьласка
Но все же я считаю, что это недоделка для LoadFromFile. Может пофиксят со временем?
В коде умышлено введена проверка на существующие ячейки. Какая идеология развития этого метода, я не знаю, на мой взгляд нужно добавить свойство, например, AutomakeCells : Boolean, которое будет разрешать или запрещать, создавать ячейки если их нет. Нужно Павла Ишенина спросить.
Logo
Там в файле есть опция create = True/False. Я думал, может она влияет на создание ячеек, но ошибся. Видимо смысл её намного глубже.
GAMER
Не забудьте перед записью в файл поставить опции записи:
тогда в файл запишется количество строк и количество колонок.
Там в файле есть опция create = True/False. Я думал, может она влияет на создание ячеек, но ошибся. Видимо смысл её намного глубже.
GAMER
Не забудьте перед записью в файл поставить опции записи:
Код: Выделить всё
StringGrid1.SaveOptions:=[soDesign, soContent];тогда в файл запишется количество строк и количество колонок.
Вот процедура загрузки таблицы из файла:
Как видно из кода, никакие опции для того, чтобы взять количество строк и столбцов не используются, да и инициализации этих параметров нет и намека.
Добавлено спустя 12 минут 41 секунду:
Поэтому я хочу знать мнение разработчиков по этому поводу, код вписать не проблемно, а вот какая концепция использования этого метода???
Код: Выделить всё
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. Я думал, может она влияет на создание ячеек, но ошибся. Видимо смысл её намного глубже.
Поэтому я хочу знать мнение разработчиков по этому поводу, код вписать не проблемно, а вот какая концепция использования этого метода???
GAMER писал(а):Вроде работает и без этих опций. Видать они включены по умолчанию.
Работать, безусловно, работает, но по умолчанию в файл скидывается только контент, без указания кол-ва строк и столбцов.
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
Vadim писал(а):GAMER писал(а):Вроде работает и без этих опций. Видать они включены по умолчанию.
Работать, безусловно, работает, но по умолчанию в файл скидывается только контент, без указания кол-ва строк и столбцов.
Прошу прощения, смотрю в форум - вижу фигу. Конечно же, с этой опцией пишется намного больше информации. Сам же ее нашел, и только сейчас увидел, что это одна и та же опция
Добавлено спустя 7 минут 1 секунду:
Вопрос снят. перед записью в файл нужно делать SGbuf.SaveOptions := [soDesign, soContent, soAttributes];
Тогда читает коректное значение строк.
GAMER писал(а):Вопрос снят. перед записью в файл нужно делать SGbuf.SaveOptions := [soDesign, soContent, soAttributes];
Тогда читает коректное значение строк.
Да, действительно все логично и корректно, только одно замечание:
SGbuf.SaveOptions := [soDesign, soContent, soAttributes];
Нужно выставить и при чтении из файла, иначе не сработает. Это то, что я и не усек
Спасибо GAMER, а то бы я так и зачитывал параметры отдельно.
