Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как-то Poseidon мне подсказал...


Автор: Elv 21.6.2005, 08:25
Как-то Poseidon мне подсказал, что для того чтобы сохранить всю таблицу StringGrid, нужно воспользоваться таким кодом (т.е. при нажатии на кнопочку ToolButton1, нужно сохранить таблицу, а при нажатии на другую ToolButton2, нужно открыть таблицу) smile :
Я делаю так:

Код

procedure TForm1.ToolButton1Click(Sender: TObject);
//далее код сохранения
function SaveGrid(StringGrid: TStringGrid; fileName: string):boolean;
var f:textfile;
x,y:integer;
begin
assignfile (f,fileName);
rewrite (f);
writeln (f,stringgrid.colcount);
writeln (f,stringgrid.rowcount);
For X:=0 to stringgrid.colcount-1 do

For y:=0 to stringgrid.rowcount-1 do
writeln (F, stringgrid.cells[x,y]);
closefile (f);

Result:= True;
end;



Для обратной загрузки

Код

procedure TForm1.ToolButton2Click(Sender: TObject);
//далее код для открытия
function LoadGrid(StringGrid: TStringGrid; fileName: string):Boolean;
var f: textfile;
temp,x,y:integer;
tempstr:string;
begin
assignfile (f,fileName);
reset (f);
readln (f,temp);
stringgrid.colcount:=temp;
readln (f,temp);
stringgrid.rowcount:=temp;
For X:=0 to stringgrid.colcount-1 do

For y:=0 to stringgrid.rowcount-1 do begin
readln (F, tempstr);
stringgrid.cells[x,y]:=tempstr;
end;
closefile (f);

Result:= True;
end;


Я раньше с функциями не общался, в основном процедуры (я пока новичок в программировании и много не знаю). Не знаю где прописывать функции (в процедуре или нет).

Пример вызова:
Этот код, где его нужно прописывать, не пойму.
SaveGrid(StringGrid1, 'File1.txt')

LoadGrid(StringGrid1, 'File1.txt')


C использованием SaveDialog можно так
SaveGrid(StringGrid1, SaveDialog1.FileName)

Автор: Pakshin A. S. 21.6.2005, 08:48
1) Простой способ
Пишешь описалово в секции implementation сверху, до основных процедур
Код

...
implementation

{$R *.DFM} // По-моему так

procedure Proc1...;
begin
end;

function Proc2...;
begin
end;

2) Лучший способ
Описываешь в типе формы
Код

 interface
 TForm1 = TForm...
 private
  function Func1;
  function FUnc2;
 end;

Потом в implemeantion
Код

implementation
function TForm1.Func1;
begin
end;

function TForm1.Func2;
begin
end;

Это под твой пример подойдет

3) Создать отдельный модуль
Код

UnitFuncs;

interface
  function F1;
  funciton F2;

implementation

function F1;
begin
end;

function F2;
begin
end;


В первом и последнем случае нужно будет немного изменить код функций, а во второй ничего не нужно...

P. S.
Я правильно понял вопрос?
Добавлено @ 08:51
Это разумеется отдельные описалова... потом создаешь событие Onclick для каждого Button (в Object Inspector в событиях)
и пишешь:
Код

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
 SaveGrid()
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
 LoadGrid()
end;


Соответственно все параметры запишешь самостоятельно...
Добавлено @ 08:52
А вообще в любом учебнике, который толще 100 страниц подробно все рассказывается... smile

И в нете доков куча!!!
Добавлено @ 08:55
Кстати еще вот так можно записать процедуру:
Код

(*сразу пример тупой*)
function ShowSumIncUnoEach(x,y: integer): integer;
 function Sum: integer; // Вложенная функция
 begin
  Reasul:=x+y
 end;
begn
 inc(x);
 inc(y);
 Result:=Sum
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
 ShowMessage(IntToStr(ShowSumIncUnoEach(1, 2)))
end;

Автор: Elv 21.6.2005, 11:20
Pakshin A. S. , ты прости меня smile но я понять не могу. А молчать думаю не стоит.
В коде:

Код

interface
 TForm1 = TForm... //что за троеточие?
 private
  function Func1;
  function FUnc2;
 end;

А потом:

implementation            
function TForm1.Func1;
begin
// получается здесь нужно порписывать функции?
.
.
.

end;

function TForm1.Func2;
begin
.
.
.

end;

//А после, процедуры для кнопок:

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
LoadGrid(StringGrid1, 'File1.txt')

end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
  SaveGrid(StringGrid1, 'File1.txt')
end;

end.

Ага? Или не ага? smile

Автор: Poseidon 21.6.2005, 11:34
А вот и я smile
Не нужно ничего мудрить, делай так:
Код
function SaveGrid(StringGrid: TStringGrid; fileName: string):boolean;
var f:textfile;
x,y:integer;
begin
assignfile (f,fileName);
rewrite (f);
writeln (f,stringgrid.colcount);
writeln (f,stringgrid.rowcount);
For X:=0 to stringgrid.colcount-1 do

For y:=0 to stringgrid.rowcount-1 do
writeln (F, stringgrid.cells[x,y]);
closefile (f);

Result:= True;
end;

function LoadGrid(StringGrid: TStringGrid; fileName: string):Boolean;
var f: textfile;
temp,x,y:integer;
tempstr:string;
begin
assignfile (f,fileName);
reset (f);
readln (f,temp);
stringgrid.colcount:=temp;
readln (f,temp);
stringgrid.rowcount:=temp;
For X:=0 to stringgrid.colcount-1 do

For y:=0 to stringgrid.rowcount-1 do begin
readln (F, tempstr);
stringgrid.cells[x,y]:=tempstr;
end;
closefile (f);

Result:= True;
end;


procedure TForm1.ToolButton1Click(Sender: TObject);
begin
 SaveGrid(StringGrid1,'file1.txt')
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
 LoadGrid(StringGrid1,'file1.txt')
end;

Автор: Elv 21.6.2005, 11:36
В Инете нашел такие слова:

"Вообще StringGrid нужен только для отображения данных. Поэтому его нет смысла сохранять. Записывать в файл надо структуру, из которой данные подаются в StringGrid. У Вас есть она?"

Для меня это "темный лес". Как возможно записать в файл структуру, а потом подать их в StringGrid?
Структура я понимаю это столбцы, строки, данные находящиеся в таблице. Так?

Автор: Elv 21.6.2005, 11:58
Pakshin A. S., Poseidon, Спасибо smile

Только...

Poseidon, у меня еще один мааааааленький вопросик.
После закрытия формы, обычно сообщение появляется о сохранении документа
здесь можно вот так сделать:

if form1.Close//тут помоему что-то еше нужно написать// then MessageDlg ('Vnimanie',mtWarning,[mbYes, mbNo],1);

Автор: Poseidon 21.6.2005, 12:27
Обрабатывай событие OnClose формы:

Код
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //здесь пищи то, что должно произойти при закрытии, например:
  if SaveDialog1.Execute  then SaveGrid(StringGrid1,SaveDialog1.FileName); 
end;


Добавлено @ 12:30
или так

Код
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  MessageDlg ('Сохранить',mtConfirmation,[mbYes, mbNo],0); 
end;


Но при этом нужно обработать нажатие на кнопку Yes. Но это уже другой вопрос, не касающийся этой темы.

Автор: Pakshin A. S. 21.6.2005, 13:06
А может стоит обработать CanClose... чтобы в случае отказа не дать программе закрыться?

Автор: Poseidon 21.6.2005, 13:13
В случае отказа делаем
Код
Action:= caNone
и все

Автор: Elv 21.6.2005, 17:14
1) Эта код добавляет строку в StringGrid новую строку нажатием Enter

if key=vk_return then StringGrid1.RowCount:=StringGrid1.RowCount+1

Подскажите, что зачит "key=vk_return"?

2)А, какой код на удаление строки, нажатием например, "Delete"? smile

Автор: Girder 21.6.2005, 17:17
М
 
Один топик - один вопрос!
Тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)