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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2011, 16:59   #1
ViJey
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 12
По умолчанию Сохранение StringGrid

Помогите, пожалуйста, разобраться, в чем ошибка! Нужно сохранить содержимое элемента StringGrid1 по нажатию пункта меню N5 в текстовый файл. Delphi ругается...
ViJey вне форума Ответить с цитированием
Старый 10.06.2011, 17:00   #2
ViJey
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 12
По умолчанию

Исходный код:

Код:
unit Unit1;

interface

//{$DEFINE DEBUG}

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Grids, ExtCtrls, ComCtrls, xmldom, XMLIntf, msxmldom, XMLDoc,
stack, StdCtrls;

type
man_info=record
  f,i,o:String[50];
  inn:String[12];
  dr:TDate;
  dr_exist:boolean;
  tmp:integer;
end;

TForm_Main = class(TForm)
  Splitter1: TSplitter;
  StringGrid1: TStringGrid;
  MainMenu1: TMainMenu;
  N1: TMenuItem;
  N2: TMenuItem;
  OpenDialog1: TOpenDialog;
  xml: TXMLDocument;
  Memo1: TMemo;
  N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
  procedure N2Click(Sender: TObject);
  procedure process;
  procedure N3Click(Sender: TObject);
  procedure AddToSG(m:man_info);
  procedure FormShow(Sender: TObject);
  procedure FormClearAll;
  procedure N4Click(Sender: TObject);
  procedure GridSave;
  procedure N5Click(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

var
  Form_Main: TForm_Main;
  FileName:String;

implementation
{$R *.dfm}

function is_null(v:Variant;str:String):String;
begin
if (v=null) then
  Result:=str
else
  Result:=v;
end;

procedure TForm_Main.AddToSG(m:man_info);
var j:integer;
begin
j:=StringGrid1.RowCount-1;
StringGrid1.Cells[0,j]:=IntToStr(j);
StringGrid1.Cells[1,j]:=m.f;
StringGrid1.Cells[2,j]:=m.i;
StringGrid1.Cells[3,j]:=m.inn;
if (m.dr_exist) then
  StringGrid1.Cells[4,j]:=FormatDateTime('dd.mm.yyyy',m.dr);
j:=j+1;
StringGrid1.RowCount:=j+1;
end;

procedure TForm_Main.process;
var iNode:IXMLNode;
i,cnt,cnt_usl:integer;
mn:man_info;
Y,M,D,YNOW,MNOW,DNOW:Word;
begin
iNode:=xml.DocumentElement;
push_node(iNode);
cnt:=iNode.ChildNodes.Count;
Memo1.Lines.Add('Кол-во записей о людях: ' + IntToStr(cnt));
cnt_usl:=0;
for i:=0 to cnt-1 do
  begin
  iNode:=iNode.ChildNodes[i];
  push_node(iNode);
  iNode:=iNode.ChildNodes.FindNode('ПолучДох');
  push_node(iNode);
  iNode:=iNode.ChildNodes.FindNode('ИННФЛ');
  if (iNode<>nil) then
    mn.inn:=is_null(iNode.NodeValue,'')
  else
    mn.inn:='';
  iNode:=read_node();
  iNode:=iNode.ChildNodes.FindNode('ФИО');
  push_node(iNode);
  iNode:=iNode.ChildNodes.FindNode('Фамилия');
  mn.f:=iNode.NodeValue;
  iNode:=read_node();
  iNode:=iNode.ChildNodes.FindNode('Имя');
  mn.i:=iNode.NodeValue;
  iNode:=read_node();
  iNode:=iNode.ChildNodes.FindNode('Отчество');
  if (iNode<>nil) then
    mn.o:=is_null(iNode.NodeValue,'')
  else
    mn.o:='';
  iNode:=pop_node();
  iNode:=read_node();
  iNode:=iNode.ChildNodes.FindNode('ДатаРожд');
  if (iNode<>nil) then
    begin
    mn.dr:=StrToDate(iNode.NodeValue);
    mn.dr_exist:=true;
    DecodeDate(mn.dr,Y,M,D);
    end
  else
    mn.dr_exist:=false;
  iNode:=pop_node();
  iNode:=pop_node();
  iNode:=read_node;

DecodeDate(Now,YNOW,MNOW,DNOW);
if (60<=(YNOW-Y)) then
  begin
  AddToSG(mn);
  cnt_usl:=cnt_usl+1;
  end;
end;
iNode:=pop_node();
Memo1.Lines.Add('Из них пенсионного возраста: ' + IntToStr(cnt_usl));
end;

procedure TForm_Main.N2Click(Sender: TObject);
  begin
  {$IFDEF DEBUG}
  OpenDialog1.FileName:='C:\ДОХОД_2НДФЛ.xml';
  {$ELSE}
  if (OpenDialog1.Execute) then
  {$ENDIF}
    begin
    FormClearAll();
    FileName:=OpenDialog1.FileName;
    Form_Main.Caption:='Файл: '+FileName;
    xml.FileName:=FileName;
    try
    xml.Active:=true;
    process();
    except
    on E: EDOMParseError do
    MessageBox(handle,PChar(E.Message),'Файл не обработан',MB_OK
    or MB_ICONSTOP);
    end;
end;
end;

procedure TForm_Main.N3Click(Sender: TObject);
  begin
  Close();
  end;

procedure TForm_Main.FormShow(Sender: TObject);
  begin
  StringGrid1.RowCount:=2;
  StringGrid1.ColCount:=5;
  StringGrid1.Cells[0,0]:='№';
  StringGrid1.Cells[1,0]:='Фамилия';
  StringGrid1.Cells[2,0]:='Имя';
  StringGrid1.Cells[3,0]:='ИНН';
  StringGrid1.Cells[4,0]:='Дата рождения';
  StringGrid1.ColWidths[0]:=20;
  StringGrid1.ColWidths[1]:=100;
  StringGrid1.ColWidths[2]:=100;
  StringGrid1.ColWidths[3]:=120;
  StringGrid1.ColWidths[4]:=100;
  end;

procedure TForm_Main.FormClearAll;
var i,j:integer;
begin
  for i:=1 to StringGrid1.RowCount - 1 do
  for j:= 0 to StringGrid1.ColCount -1 do
  StringGrid1.Cells[j,i]:='';
  StringGrid1.RowCount:=2;
  Memo1.Lines.Clear();
end;
procedure TForm_Main.N4Click(Sender: TObject);
begin
FormClearAll;
end;

procedure GridSave(StringGrid1:TStringGrid; FileName:TFileName);
var t:TextFile; a,b:integer;
begin
  AssignFile(t, FileName);
  Rewrite(t);
  writeln(t, StringGrid1.ColCount);
  writeln(t, StringGrid1.RowCount);
  for a:=0 to StringGrid1.ColCount - 1 do
    for b:=0 to StringGrid1.RowCount - 1 do
      writeln(t, stringgrid1.cells[a, b]);
  CloseFile(t);
end;

procedure TForm_Main.N5Click(Sender: TObject);
begin
GridSave;
end;

end.
ViJey вне форума Ответить с цитированием
Старый 10.06.2011, 18:25   #3
ViJey
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 12
По умолчанию

Вот какую ошибку выдает: Unsatisfied forward or external declaration: 'TForm_Main.GridSave'

ага, с этой ошибкой разобрался, теперь ругается на саму функцию:
Код:
procedure TForm_Main.GridSave(StringGrid1:TStringGrid; FileName:TFileName);
var t:TextFile; a,b:integer;
begin
  AssignFile(t, FileName);
  Rewrite(t);
  writeln(t, StringGrid1.ColCount);
  writeln(t, StringGrid1.RowCount);
  for a:=0 to StringGrid1.ColCount - 1 do
    for b:=0 to StringGrid1.RowCount - 1 do
      writeln(t, stringgrid1.cells[a, b]);
  CloseFile(t);
end;
Реализовал сохранение в текстовый файл вот так:
Код:
procedure TForm_Main.GridSave;
var i,k:integer;
    f:TextFile;
    s:String;
    ss:byte;
begin
  AssignFile(f, FileName+'.txt');
  Rewrite(f);
    for k:=1 to StringGrid1.RowCount - 2 do
  begin
  s:=StringGrid1.Cells[1,k];
  write(f, s);
  for ss:=1 to 15-length(s) do
    write(f, ' ');
  s:=StringGrid1.Cells[2,k];
  write(f, s);
  for ss:=1 to 15-length(s) do
    write(f, ' ');
  s:=StringGrid1.Cells[3,k];
  write(f, s);
  for ss:=1 to 15-length(s) do
    write(f, ' ');
  s:=StringGrid1.Cells[4,k];
  writeln(f, s);
  end;
  CloseFile(f);
  Memo1.Lines.Add('Сохранение в текстовый файл завершено.')
end;
По-другому не сообразил... мне нужно было выравнивание столбцов по левому краю из стринггрид в текстовом файле, поэтому печатаются дополнительные пробелы.

Сам с собой поговорил короче

Последний раз редактировалось Stilet; 11.06.2011 в 16:06.
ViJey вне форума Ответить с цитированием
Старый 11.06.2011, 13:49   #4
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Код:
Procedure CreateFileIndex(form:Tform;filename:string);
var x:integer;
    x1,y1:integer;
    itme:TstringList;

begin
itme:=TstringList.Create;
itme.Clear;
//form2.ListBox1.Items.Clear;
for X:=0 to form.ComponentCount-1 do begin
 if form.Components[x].ClassName='TDateTimePicker' then begin
   itme.Add(form.Components[x].name+'='+datetostr(TDateTimePicker(form.Components[x]).date));
 end;


 if form.Components[x].ClassName='TEdit' then begin
   itme.Add(form.Components[x].name+'='+Tedit(form1.Components[x]).Text);
 end;
 if form.Components[x].ClassName='TComboBox' then begin
   itme.Add(form.Components[x].name+'='+TComboBox(form.Components[x]).Text);
 end;
 if form.Components[x].ClassName='TCheckBox' then begin
    if TCheckBox(form.Components[x]).Checked then
       itme.Add(form.Components[x].name+'=true')
       else itme.Add(form.Components[x].name+'=false');
 end;
  if form.Components[x].ClassName='TRadioButton' then begin
    if TRadioButton(form.Components[x]).Checked then
       itme.Add(form.Components[x].name+'=true')
       else itme.Add(form.Components[x].name+'=false');
 end;
 if form.Components[x].ClassName='TMemo' then begin
       itme.Add(form.Components[x].name);
       itme.Add('<Text>');
       itme.Add(Tmemo(form.Components[x]).Text);
       itme.Add('</Text>');
 end;

 if form.Components[x].ClassName='TListBox' then begin
       itme.Add(form.Components[x].name+'='+inttostr(TListBox(form.Components[x]).itemindex));
 end;

 if form.Components[x].ClassName='TStringGrid' then begin
    itme.Add(form.Components[x].name);
    itme.Add(inttostr(TStringGrid(form1.Components[x]).ColCount));
    itme.Add(inttostr(TStringGrid(form1.Components[x]).rowCount));
    for x1:=0 to TStringGrid(form1.Components[x]).ColCount-1 do
      for y1:=0 to TStringGrid(form1.Components[x]).rowCount-1 do begin
         itme.Add('<cells>');
         itme.Add(TStringGrid(form.Components[x]).Cells[x1,y1]);
         itme.Add('</cells>');
      end;
//      form.ListBox1.Items.Add('</'+form1.Components[x].name+'>');
 end;
end;

itme.SaveToFile(filename{'c:\wintexttoInte.txt'});
itme.Free;
end;
а функция загрузки за бабки 50 рублей )))
шутка - пиши в аську 368254335
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype

Последний раз редактировалось Stilet; 11.06.2011 в 16:06.
denisbrain вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Builder StringGrid сохранение Jack-shade Общие вопросы C/C++ 1 06.04.2011 08:08
сохранение\загрузка в компоненте StringGrid Lorden Помощь студентам 1 07.12.2009 17:11
Сохранение Stringgrid c ColorBOX mazdakilla Компоненты Delphi 3 12.05.2008 17:05
Сохранение StringGrid, создание .ini! Nemesisking Общие вопросы Delphi 5 24.09.2007 08:23