|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как записать содержимое StringGrid в файл?
Помогите пожалуйста!
После запуска программы из Edit заполняется таблица StringGrid. Нужно записать содержимое StringGrid в файл, сохранить его на жестком диске, а затем при запуске программы таблица заполняется из этого файла. Я начинающий совсем, и инфу об этом не нашел... Можно ли записать в файл *.csb или нужет обязательно *.txt ? |
#2
|
|||
|
|||
Независимо от формата, в котором вы будете сохранять, реализовать программно придется самостоятельно, т.к., насколько я знаю, в объекте TStringGrid не предусмотрены методы сохранения в файл и загрузки из файла.
|
#3
|
||||
|
||||
может тогда сохранить содержимое в стоке или например в Мemo, а уже от туда в файл?
Но я так и не понял как записать в файл из Memo... вот в чем моя беда)) если это в двух словах не объяснить, можно хотябы пример кода и ссылку, где можно об этом прочитать? Зараннее благодарен! |
#4
|
|||
|
|||
rasamaha, начнем с простого... =))
Записать текстовый файл из Memo можно единственной строчкой кода: Код:
Memo1.Lines.SaveToFile('C:\Directory\File.txt'); Код:
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; Последний раз редактировалось Nyctos Kasignete, 31.03.2009 в 18:52. |
#5
|
|||
|
|||
Не знаю, как удалить случайно продублированное сообщение =(
Потом отредактирую новым ответом, что-ли?! Последний раз редактировалось Nyctos Kasignete, 31.03.2009 в 18:51. |
#6
|
|||
|
|||
Да, написать цикл в цикле, я так раньше и сохранял данные из StringGrid'а.
Можно поиздеваться и сделать так, чтобы сохранялась таблица как-есть (со всеми линиями и т.п.) с помощью псевдографики, но это уже, ИМХО, извращение Только если нужно будет потом этим самым файлом пользоваться. Auta i Lome... |
#7
|
|||
|
|||
Кстати, 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
|
||||
|
||||
Спасибо огромное! Я этим неделю парился...
Вы мне помогли понять, что именно я еще очень плохо знаю)) Теперь: книгу в зубы и вперед!!) |
#9
|
||||
|
||||
С сохранением получилось, даже больше))))
Сначала сохраняло только File.csv, а иначи все валилось... заменил 'File.csv' на SaveDialog1.FileName - сохраняет и *.csv под любым именем и *.txt как его не назови.... Цитата:
.... а вот с загрузкой таблицы из файла проблема... Подскажите, пожалуйста... |
#10
|
||||
|
||||
ищеш в цикле разделители, и читаешь... Вот только с разделителями будет проблемкО, ибо если в ячейке содержится принятый за разделитель символ - он будет воспринят как конец ячейки и начало новой, и прога рухнет. Так что надо думать головой...
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#11
|
|||
|
|||
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; _________ Я исправила немного!! Была ошибка Delete(FirstStr, 1, i); И лучше внять совету popyurv ниже и использовать вместо атрибута CommaText другое свойство — DelimitedText, предварительно устанавливая в циклах для каждой строки нужное значение разделителя, например: StringGrid1.Rows[i].Delimiter := '|'; Последний раз редактировалось Nyctos Kasignete, 06.04.2009 в 18:15. |
#12
|
||||
|
||||
Как вариант (я так раньше делал, надо было в файл массив загнать), за разделитель принять символ, который заведомо не будет использован (или группу символов, что лучше. Например, я сомневаюсь, что юзер будет писать в ячейка "|;|", и эту группу можно взять за разделитель.)
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#13
|
|||
|
|||
popyurv, но при этом не удастся воспользоваться атрибутом CommaText... Код станет несколько сложнее.
|
#14
|
||||
|
||||
Это да... я тогда тоже с разбором маялся, через copy, pos и прочие вручную разбирал...
Как вариант - заюзать символ из невизуальных (#10 как пример). Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#15
|
|||
|
|||
Как вариант, использовать xml и не париться.
|