![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Помогите пожалуйста!
После запуска программы из 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'а.
Можно поиздеваться и сделать так, чтобы сохранялась таблица как-есть (со всеми линиями и т.п.) с помощью псевдографики, но это уже, ИМХО, извращение Только если нужно будет потом этим самым файлом пользоваться. |
|
#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
|
||||
|
||||
|
ищеш в цикле разделители, и читаешь... Вот только с разделителями будет проблемкО, ибо если в ячейке содержится принятый за разделитель символ - он будет воспринят как конец ячейки и начало новой, и прога рухнет. Так что надо думать головой...
|
|
#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
|
||||
|
||||
|
Как вариант (я так раньше делал, надо было в файл массив загнать), за разделитель принять символ, который заведомо не будет использован (или группу символов, что лучше. Например, я сомневаюсь, что юзер будет писать в ячейка "|;|", и эту группу можно взять за разделитель.)
|
|
#13
|
|||
|
|||
|
popyurv, но при этом не удастся воспользоваться атрибутом CommaText... Код станет несколько сложнее.
|
|
#14
|
||||
|
||||
|
Это да... я тогда тоже с разбором маялся, через copy, pos и прочие вручную разбирал...
Как вариант - заюзать символ из невизуальных (#10 как пример). |
|
#15
|
|||
|
|||
|
Как вариант, использовать xml и не париться.
|