Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.03.2009, 17:50
Аватар для rasamaha
rasamaha rasamaha вне форума
Прохожий
 
Регистрация: 28.03.2009
Сообщения: 19
Репутация: 10
Вопрос Как записать содержимое StringGrid в файл?

Помогите пожалуйста!
После запуска программы из Edit заполняется таблица StringGrid.
Нужно записать содержимое StringGrid в файл, сохранить его на жестком диске, а затем при запуске программы таблица заполняется из этого файла.
Я начинающий совсем, и инфу об этом не нашел...
Можно ли записать в файл *.csb или нужет обязательно *.txt ?
Ответить с цитированием
  #2  
Старый 31.03.2009, 18:00
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Независимо от формата, в котором вы будете сохранять, реализовать программно придется самостоятельно, т.к., насколько я знаю, в объекте TStringGrid не предусмотрены методы сохранения в файл и загрузки из файла.
Ответить с цитированием
  #3  
Старый 31.03.2009, 18:13
Аватар для rasamaha
rasamaha rasamaha вне форума
Прохожий
 
Регистрация: 28.03.2009
Сообщения: 19
Репутация: 10
По умолчанию

может тогда сохранить содержимое в стоке или например в Мemo, а уже от туда в файл?
Но я так и не понял как записать в файл из Memo...
вот в чем моя беда))
если это в двух словах не объяснить, можно хотябы пример кода и ссылку, где можно об этом прочитать?
Зараннее благодарен!
Ответить с цитированием
  #4  
Старый 31.03.2009, 18:48
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

rasamaha, начнем с простого... =))
Записать текстовый файл из Memo можно единственной строчкой кода:
Код:
Memo1.Lines.SaveToFile('C:\Directory\File.txt');
Загружать в Memo так:
Код:
Memo1.Lines.LoadFromFile('C:\Directory\File.txt');

Проблема-то не в этом. Вам придется вытаскивать значения из ячеек StringGrid'а. Это уже менее приятно. Вот такая процедурка заполняет Memo значениями из ячеек StringGrid'а:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, LastRow: Integer;
begin
  LastRow := StringGrid1.RowCount - 1;
  for i := 0 to LastRow do
    Memo1.Lines.Add(StringGrid1.Rows[i].CommaText);
end;
С записью из Memo в StringGrid тоже подумаю, если хотите.

Последний раз редактировалось Nyctos Kasignete, 31.03.2009 в 18:52.
Ответить с цитированием
  #5  
Старый 31.03.2009, 18:49
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Не знаю, как удалить случайно продублированное сообщение =(
Потом отредактирую новым ответом, что-ли?!

Последний раз редактировалось Nyctos Kasignete, 31.03.2009 в 18:51.
Ответить с цитированием
  #6  
Старый 31.03.2009, 18:54
BloodFooria BloodFooria вне форума
Новичок
 
Регистрация: 30.10.2008
Адрес: Улан-Удэ
Сообщения: 81
Репутация: 10
По умолчанию

Да, написать цикл в цикле, я так раньше и сохранял данные из StringGrid'а.
Можно поиздеваться и сделать так, чтобы сохранялась таблица как-есть (со всеми линиями и т.п.) с помощью псевдографики, но это уже, ИМХО, извращение Только если нужно будет потом этим самым файлом пользоваться.
__________________
Auta i Lome...
Ответить с цитированием
  #7  
Старый 31.03.2009, 18:59
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Кстати, Memo использовать необязательно!! Можно записывать строки из StringGrid'а в переменную типа TStringList, а ее уже сохранять в файл:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, LastRow: Integer;
  SList: TStringList;
begin
  SList := TStringList.Create;
  LastRow := StringGrid1.RowCount - 1;
  try
    for i := 0 to LastRow do
      SList.Add(StringGrid1.Rows[i].CommaText);
    SList.SaveToFile('C:\Directory\File.csv');
  finally
    SList.Free;
  end;
end;
Ответить с цитированием
  #8  
Старый 31.03.2009, 22:46
Аватар для rasamaha
rasamaha rasamaha вне форума
Прохожий
 
Регистрация: 28.03.2009
Сообщения: 19
Репутация: 10
По умолчанию

Спасибо огромное! Я этим неделю парился...
Вы мне помогли понять, что именно я еще очень плохо знаю))
Теперь: книгу в зубы и вперед!!)
Ответить с цитированием
  #9  
Старый 06.04.2009, 14:48
Аватар для rasamaha
rasamaha rasamaha вне форума
Прохожий
 
Регистрация: 28.03.2009
Сообщения: 19
Репутация: 10
По умолчанию

С сохранением получилось, даже больше))))
Сначала сохраняло только File.csv, а иначи все валилось...
заменил 'File.csv' на SaveDialog1.FileName - сохраняет и *.csv под любым именем и *.txt как его не назови....

Цитата:
{Сохраняем таблицу в файл *.txt}

{Меню "Список > Сохранить"}
procedure TForm1.N3Click(Sender: TObject);
begin
SaveDialog1.Execute;
end;

{Показываем диалог сохранения файла. Сохраняем файл}
procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
var
i, LastRow: Integer;
SList: TStringList;
begin
SList := TStringList.Create;
LastRow := StringGrid1.RowCount - 1;
try
for i := 0 to LastRow do
SList.Add(StringGrid1.Rows[i].CommaText);
SList.SaveToFile(SaveDialog1.FileName);
finally
SList.Free;
end;
end;

.... а вот с загрузкой таблицы из файла проблема...
Подскажите, пожалуйста...
Ответить с цитированием
  #10  
Старый 06.04.2009, 14:57
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

ищеш в цикле разделители, и читаешь... Вот только с разделителями будет проблемкО, ибо если в ячейке содержится принятый за разделитель символ - он будет воспринят как конец ячейки и начало новой, и прога рухнет. Так что надо думать головой...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #11  
Старый 06.04.2009, 15:48
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

rasamaha, вот посмотрите. Загрузка из ранее сохраненного файла в StringGrid.
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  i, LastRow, CommaPos: Integer;
  FirstStr: string;
  SList: TStringList;
begin
  if not OpenDialog1.Execute then Exit;
  SList := TStringList.Create;
  try
    SList.LoadFromFile(OpenDialog1.FileName);
    StringGrid1.RowCount := SList.Count;
    FirstStr := SList.Strings[0];
    i := 0; CommaPos := Pos(',', FirstStr);
    while CommaPos <> 0 do
    begin
      Delete(FirstStr, 1, CommaPos);
      Inc(i);
      CommaPos := Pos(',', FirstStr);
    end;
    StringGrid1.ColCount := i + 1;
    LastRow := StringGrid1.RowCount - 1;
    for i := 0 to LastRow do
      StringGrid1.Rows[i].CommaText := SList.Strings[i];
  finally
    SList.Free;
  end;
end;
Сказанное popyurv остается в силе. Как вариант можно перед сохранением производить проверку ячеек на наличие в них символа-разделителя, заменяя его, скажем, на какой-нибудь безопасный символ. А при загрузке заменять его обратно.

_________

Я исправила немного!! Была ошибка Delete(FirstStr, 1, i); И лучше внять совету popyurv ниже и использовать вместо атрибута CommaText другое свойство — DelimitedText, предварительно устанавливая в циклах для каждой строки нужное значение разделителя, например: StringGrid1.Rows[i].Delimiter := '|';

Последний раз редактировалось Nyctos Kasignete, 06.04.2009 в 18:15.
Ответить с цитированием
  #12  
Старый 06.04.2009, 16:22
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Как вариант (я так раньше делал, надо было в файл массив загнать), за разделитель принять символ, который заведомо не будет использован (или группу символов, что лучше. Например, я сомневаюсь, что юзер будет писать в ячейка "|;|", и эту группу можно взять за разделитель.)
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #13  
Старый 06.04.2009, 16:25
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

popyurv, но при этом не удастся воспользоваться атрибутом CommaText... Код станет несколько сложнее.
Ответить с цитированием
  #14  
Старый 06.04.2009, 16:35
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Это да... я тогда тоже с разбором маялся, через copy, pos и прочие вручную разбирал...
Как вариант - заюзать символ из невизуальных (#10 как пример).
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #15  
Старый 06.04.2009, 16:46
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Как вариант, использовать xml и не париться.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter