Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2012, 23:49   #1
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию StringGrid Сохранение в файл в виде таблицы.

Здравствуйте!

Подскажите пожалуйста, как сохранять из StringGrid в текстовый файл,
чтобы в тхт файле был такой же вид таблицы, как и в StringGrid ?



Заранее благодарю!
werrey вне форума Ответить с цитированием
Старый 23.04.2012, 02:22   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а Вы сможете привести пример подобного TXT файла?

а вообще, если подходить строго, то
Цитата:
чтобы в тхт файле был такой же вид таблицы, как и в StringGrid ?
это нереально, ибо в текстовом файле нельзя обеспечить точно такой же вид, как в StringGrid!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.04.2012, 02:42   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Код:
function tir(n: integer): string;
var
  i: integer;
  s: string;
begin
  s := '';
  for i := 1 to n do
    s := s + '-';
  tir := s;
end;

function adder(s: string; n: integer): string;
var
  i: integer;
  tmp: string;
begin
  tmp := '';
  for i := 1 to n - length(s) do
    tmp := tmp + ' ';
  adder := tmp + s;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: array of integer;
  i, j, dl: integer;
  s1, s2: string;
  str: tstringlist;
begin
  str := tstringlist.create;
  setlength(a, stringgrid1.ColCount);
  for i := 0 to stringgrid1.ColCount - 1 do
  begin
    a[i] := 0;
    for j := 0 to stringgrid1.rowcount - 1 do
      if length(stringgrid1.Cells[i, j]) > a[i] then
        a[i] := length(stringgrid1.Cells[i, j]);
  end;
  dl := 0;
  for i := 0 to stringgrid1.ColCount - 1 do
    dl := dl + a[i];
  s1 := tir(dl + stringgrid1.ColCount + 1);
  str.Append(s1);
  for i := 0 to stringgrid1.rowcount - 1 do
  begin
    s2 := '|';
    for j := 0 to stringgrid1.colcount - 1 do
      s2 := s2 + adder(stringgrid1.Cells[j, i], a[j]) + '|';
    str.Append(s2);
    str.Append(s1);
  end;
  str.SaveToFile('1.txt');
  setlength(a, 0);
  str.free;
end;
Получается вот такая таблица:
Код:
----------------------------------------
|привет|      |   тоже|     |          |
----------------------------------------
|   как|хорошо|отлично|     |    чем-то|
----------------------------------------
|  дела|     а|       |нужно| заполнить|
----------------------------------------
|      |     у|       |     |таблицу :)|
----------------------------------------
|      |  тебя|       |     |          |
----------------------------------------
Чуть укороченный вариант:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  a: array of integer;
  i, j, dl: integer;
  f: textfile;
  s1: string;
begin
  assignfile(f, '2.txt');
  rewrite(f);
  setlength(a, stringgrid1.ColCount);
  dl := 0;
  for i := 0 to stringgrid1.ColCount - 1 do
  begin
    a[i] := 0;
    for j := 0 to stringgrid1.rowcount - 1 do
      if length(stringgrid1.Cells[i, j]) > a[i] then
        a[i] := length(stringgrid1.Cells[i, j]);
    dl := dl + a[i];
  end;
  s1 := '';
  for i := 1 to dl + stringgrid1.ColCount + 1 do
    s1 := s1 + '-';
  write(f, s1);
  for i := 0 to stringgrid1.rowcount - 1 do
  begin
    writeln(f);
    write(f, '|');
    for j := 0 to stringgrid1.colcount - 1 do
      write(f, stringgrid1.Cells[j, i]: a[j], '|');
    writeln(f);
    write(f, s1);
  end;
  closefile(f);
  setlength(a, 0);
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 23.04.2012 в 03:11.
BDA вне форума Ответить с цитированием
Старый 23.04.2012, 07:18   #4
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Код:
Function LoadTableFormFile(Table:TStringGrid;Filename:string;StartRow:integer=0):boolean;
var t,l,x,y:integer;
    s2,s:string;
    f:textfile;
begin
if fileage(Filename)>0 then begin
  assignfile(f,Filename);
  reset(F);
y:=StartRow-1;

  repeat
  readln(f,s);
  y:=y+1;
  if y>=Table.RowCount then Table.RowCount:=y+1;
  l:=length(s);
  s2:='';
  t:=0;
  x:=1;
  while x<l do begin
       if s[x]='#' then begin
     s2:=s2+chr(strtoint(copy(s,x+1,2)));
     x:=x+3; end;
     if (s[x]=';') or (x=l) then begin
     if x=l then if s[x]<>';' then s2:=s2+s[x];


     Table.Cells[t,y]:=s2;
     t:=t+1;
     if t> Table.ColCount then Table.ColCount:=t+1;
     s2:='';
     end else
     begin
      s2:=s2+s[x];
     end;
      x:=x+1;
    end;

  until eof(f);
  closefile(f);
  end;
end;


Function SaVeTabelToCSV(Table:TStringGrid;Filename:string):integer;
  var x,y:integer;
      s:string;
      F:Textfile;

      function ecran(s:string):string;
      var s2:string;i:integer;
      begin
      s2:='';

      if pos(';',s)>0 then begin
        for I:=1 to length(s) do if (s[i]<>';') or (ord(s[i])<32) then s2:=s2+s[i] else s2:=s2+'#'+inttostr(ord(s[I]));
        end else s2:=s; result:=s2;
      end;
begin
Rewrite(f,Filename);
for y:=0 to Table.RowCount-1 do begin
  s:='';
  for X:=0 to Table.ColCount-1 do
  s:=s+ecran(Table.Cells[x,y])+';';
  writeln(f,s);
end;
 closefile(F);
end;
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype

Последний раз редактировалось denisbrain; 23.04.2012 в 12:39.
denisbrain вне форума Ответить с цитированием
Старый 23.04.2012, 10:43   #5
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Спасибо всем, я наверно вопрос не слишком правильно поставил.

Есть StringGrid, к примеру 10 х 20 ячеек, с разными числами.
Надо, чтобы эти числа записывались в текстовый файл, в таком же виде, без переносов и тд.
То есть, если я открою тхт файл, я увижу такую же как-бы таблицу, как и в StringGrid. Желательно разделить числа в файле символом '|'
werrey вне форума Ответить с цитированием
Старый 23.04.2012, 11:03   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
То есть, если я открою тхт файл, я увижу такую же как-бы таблицу, как и в StringGrid. Желательно разделить числа в файле символом '|'
А пост #3 от BDA разве не это делает?!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.04.2012, 11:44   #7
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
А пост #3 от BDA разве не это делает?!!
Его код немного не то делает, там фиг разберёшься.
Я сохранение через мемо сделал.

Код:
procedure TForm1.Button3Click(Sender: TObject);
Var
i,j,n: integer;
str:string;
begin

for j:=0 to StringGrid1.RowCount -1 do
for i:=0 to StringGrid1.ColCount -1 do
if StringGrid1.Cells[i,j] = '' then StringGrid1.Cells[i,j] := '0';
//StringGrid1.Cells[i,j] := format('0',[i,j]) ;

Memo1.Clear;

for i:=0 to StringGrid1.RowCount -1 do
begin
if i>0 then
memo1.Lines.Add('');
for j:=0 to StringGrid1.ColCount -1 do
memo1.seltext:=(''+StringGrid1.Cells[j,i]+'|');
end;


for n:=0 to StringGrid1.ColCount -1 do  begin
str:=memo1.lines[n]; delete(str,Length(str),30); memo1.lines[n]:=str;

end; //end;

 Memo1.Lines.SaveToFile('Тест.txt');

end;


Теперь загвоздка, как загрузить этот тхт файл в виде матрицы обратно в стринггрид, чтобы все записалось в свои ячейки.
werrey вне форума Ответить с цитированием
Старый 23.04.2012, 11:46   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Как писал, так и грузить. Парси файл.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.04.2012, 11:48   #9
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Ну тогда уже не мемо, а хотябы TStringList. А то мемо уж сильно по топорному.
=master= вне форума Ответить с цитированием
Старый 23.04.2012, 12:05   #10
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Код:
LoadTableFormFile
SaVeTabelToCSV
чем тебе не вариант ?
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сохранение StringGrid в нетип. файл. Delphi PianeR Помощь студентам 0 31.01.2011 20:39
Сохранение таблицы из dbgrid в файл (oracle, delphi) blr_spy БД в Delphi 8 26.07.2010 13:59
Как настроить эксель, чтобы он открывал в виде таблицы тхт файл с разделителем в виде точки с запятой xhour Microsoft Office Excel 1 05.05.2009 14:17
Как вывести содержимое StringGrid на принтер именно в виде таблицы program123 Компоненты Delphi 4 14.02.2009 16:24
сохранение результата выборки из DBF файла в DBF файл с такой же структурой таблицы GazimagomedovM БД в Delphi 5 06.11.2007 17:58