Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 512
1

Как сделать так чтобы при закрытии окна сохранялся текстовый файл

18.09.2012, 20:57. Показов 4442. Ответов 15
Метки нет (Все метки)

]Здраствуйте, я решил создать свой текстовый редактор. Создал меню и написал код чтобы выводило сообщение сохранять ли файл? Все работает нормально. Но когда его копирую в события формы OnClose и OnCloseQuery и пытаюсь закрыть и сохранить происходит зацикливание программы.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
unit Unit2;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls;
type
  TForm2 = class(TForm)
    Memo1: TMemo;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    FontDialog1: TFontDialog;
    procedure N4Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
If MessageDlg('Сохранить файл перед выходом?', mtConfirmation, [mbYes,mbNo], 0) = mrYes   then   begin
 Memo1.Lines.SaveToFile('d:/Безымяный.txt');
Close
 end
 else
 Close;
end;
procedure TForm2.N4Click(Sender: TObject);
var
f:TextFile;
begin
 AssignFile(f,'d:/text1.txt');
 Rewrite(f);
 Writeln(f);
 CloseFile(f);
end;
procedure TForm2.N7Click(Sender: TObject);
begin
If MessageDlg('Сохранить файл перед выходом?', mtConfirmation, [mbYes,mbNo], 0) = mrYes   then   begin
 Memo1.Lines.SaveToFile('d:/Безымяный.txt');
Close
 end
 else
 Close;
end;
end.
P.S Спасибо за понимание.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2012, 20:57
Ответы с готовыми решениями:

Как мне сделать так, чтобы данный текстовый файл был открыт один раз при запуске программы и закрыт при закрытии программы?
Привет! Возник следующий вопрос. Программа состоит из основного окна Form1 и нескольких Unit. По...

как в программе при открытии формы сделать так, чтобы сразу выводился текстовый файл в memo?
как в программе при открытии формы сделать так, чтобы сразу выводился текстовый файл в memo?

Как сделать, чтобы при закрытии окна открывался браузер?
Всем привет, только начинаю поэтому незнаю. Подскажите я хочу что бы когда человек нажимал на...

Как сделать так, чтобы при закрытии клиента закрывался и сервер?
Допустим есть две программы... Одна из них сервер вторая клиент... Первая программа(сервер)...

15
Заблокирован
18.09.2012, 21:09 2
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
If MessageDlg('Сохранить файл перед выходом?', mtConfirmation, [mbYes,mbNo], 0) = mrYes   then   begin
 Memo1.Lines.SaveToFile('d:/Безымяный.txt');
Close
 end
 else
 Close;
end;
Вот так пишется делфячий код.
А слабо сохранять вот в такой файл:
Delphi
1
Memo1.Lines.SaveToFile('Безымяный.txt');
0
133 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
18.09.2012, 21:35 3
в FormCloseQuery вместо close; поставь CanClose:=true;
Delphi
1
2
3
4
5
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
...;
CanClose:=true;
end;
либо обработай свой код в событии OnClose;
Delphi
1
2
3
4
5
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
...;
action:=caFree;
end;
Добавлено через 13 минут

Не по теме:

Цитата Сообщение от Саша2 Посмотреть сообщение
Вот так пишется делфячий код.
а где точки с запятой? :)

0
Заблокирован
18.09.2012, 21:37 4
Цитата Сообщение от Ev1l Посмотреть сообщение
Не по теме:
Сообщение от Саша2
Вот так пишется делфячий код.
а где точки с запятой?

Не по теме:

если не слепой увидите

0
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 512
18.09.2012, 21:39  [ТС] 5
спасибо проблема решена
Delphi
1
2
3
4
5
6
If MessageDlg('Сохранить файл перед выходом?', mtConfirmation, [mbYes,mbNo], 0) = mrYes   then   begin
 Memo1.Lines.SaveToFile('d:/Безымяный.txt');
Close
 end
 else
 Close;
это при нажатии на меню
а это при закрытии окна
Delphi
1
2
3
4
5
6
7
 If MessageDlg('Закрыть приложение? Данные будут сохранены', mtConfirmation, [mbYes,mbNo], 0) = mrYes   then   begin
Action:=caFree;
Memo1.Lines.SaveToFile('d:/безымянный.txt')
  end
else
action:=caNone;
end;
0
133 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
18.09.2012, 21:47 6
Цитата Сообщение от pirat2k Посмотреть сообщение
это при нажатии на меню
ненадо этого, просто напиши:
Delphi
1
self.close;
ты два раза обрабатываешь одно условие, в твоем случае запрос будет выползать 2 раза

Добавлено через 3 минуты
обрабатывай сохранение с начала и до конца при закрытии формы, в случае отказа caNone в случае согласия caFree...
0
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 512
18.09.2012, 22:18  [ТС] 7
а как сделать так чтобы запрос выползал 1 раз?
0
133 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
18.09.2012, 22:56 8
по кнопке или меню вызываешь только событие close
дале по тексту:

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
If MessageDlg('Сохранить файл перед выходом?', mtConfirmation, [mbYes,mbNo], 0) = mrYes   then   begin
Memo1.Lines.SaveToFile('d:/Безымяный.txt');
CanClose:=true;
end
else If MessageDlg('Закрыть приложение? Данные не будут сохранены', mtConfirmation, [mbYes,mbNo], 0) = mrYes   
then  CanClose:=true
else CanClose:=false;
end;

если нужно просто сохранение то на кнопку сохранить пишешь:
Delphi
1
Memo1.Lines.SaveToFile('d:/Безымяный.txt');

з.ы. учти я писал процедуру на TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
0
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 512
19.09.2012, 19:07  [ТС] 9
спасибо обязательно попробую

Добавлено через 1 час 55 минут
при нажатии на меню сообщение о выходе выдается два раза а если на крестик то один раз
вот код на крестик причем сохраняется все нормально
Delphi
1
2
if MessageDlg('Вы действительно хотите выйти?. Если да то данные сохранятся', mtConfirmation, [mbYes, mbNo],0) =  mrYes then
Memo1.Lines.SaveToFile('d:/безымяный.txt ');
а вот на меню
Delphi
1
2
3
4
5
6
if MessageDlg('Вы действительно хотите выйти?. Если да то данные сохранятся',mtConfirmation,[mbYes,mbNo],0) = mryes then begin
Memo1.Lines.SaveToFile('d:/безымянsq.txt ');
Self.Close;
end
else
Self.Close;
Добавлено через 1 минуту
в принципе не понимаю как оно может обрабатываться два раза, обьясните нубу
0
133 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
19.09.2012, 19:15 10
элементарно, при нажатии на крестик программа вызывает следующие события по порядку OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy
поэтому когда ты нажал крестик у тебя обработался код номер 1

при нажатии на кнопку или меню ты сперва обработал код номер 2 и из этого кода "програмно нажал на крестик" и понеслось выполнение кода номер 1
0
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 512
19.09.2012, 19:24  [ТС] 11
хорошо а как тогда можно сделать чтобы при нажатии на меню сообщение выводилось 1 раз????
0
133 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
19.09.2012, 19:27 12
выше я уже писал...
если в меню кнопка = "Выход" то пиши в обработчике только
Delphi
1
Self.Close;
если кнопка = "Сохранить" то:
Delphi
1
Memo1.Lines.SaveToFile('d:/Безымяный.txt');
0
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 512
19.09.2012, 20:15  [ТС] 13
можете помочь, немогу сделать так чтобы оно обрабатывло по 1 разу

Добавлено через 24 минуты
Delphi
1
if MessageDlg('Вы действительно хотите выйти?. Если да то данные сохранятся', mtConfirmation, [mbYes, mbNo],0) =  mrYes then
можете подправить код???? я недогоняю как это сделать(((

Добавлено через 30 секунд
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls;
 
type
  TForm2 = class(TForm)
    Memo1: TMemo;
    MainMenu1: TMainMenu;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    FontDialog1: TFontDialog;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N7: TMenuItem;
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure N7Click(Sender: TObject);
 
 
 
 
 
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
 procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageDlg('Вы действительно хотите выйти?. Если да то данные сохранятся', mtConfirmation, [mbYes, mbNo],0) =  mrYes then
Memo1.Lines.SaveToFile('d:/Безымяный.txt')
end;
 
procedure TForm2.N4Click(Sender: TObject);
var
f:TextFile;
begin
  AssignFile(f,'d:/new1.txt');
  Rewrite(f);
  Writeln(f,'Файл создан');
  CloseFile(f);
 
 
end;
 
procedure TForm2.N5Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
  else
 Self.Close;
end;
 
procedure TForm2.N6Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
 
end;
 
 
 
 
 
procedure TForm2.N7Click(Sender: TObject);
begin
 if MessageDlg('Вы действительно хотите выйти?. Если да то данные сохранятся', mtConfirmation, [mbYes, mbNo],0) =  mrNo then
 Self.Close
end;
 
end.
0
133 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
19.09.2012, 20:17 14
На.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls;
 
type
  TForm2 = class(TForm)
    Memo1: TMemo;
    MainMenu1: TMainMenu;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    FontDialog1: TFontDialog;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N7: TMenuItem;
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure N7Click(Sender: TObject);
 
 
 
 
 
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
 procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageDlg('Вы действительно хотите выйти?. Если да то данные сохранятся', mtConfirmation, [mbYes, mbNo],0) =  mrYes then
Memo1.Lines.SaveToFile('d:/Безымяный.txt');
CANCLOSE:=TRUE;
end;
 
procedure TForm2.N4Click(Sender: TObject);
var
f:TextFile;
begin
  AssignFile(f,'d:/new1.txt');
  Rewrite(f);
  Writeln(f,'Файл создан');
  CloseFile(f);
 
 
end;
 
procedure TForm2.N5Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
  else
 Self.Close;
end;
 
procedure TForm2.N6Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
 
end;
 
 
procedure TForm2.N7Click(Sender: TObject);
begin
 //if MessageDlg('Вы действительно хотите выйти?. Если да то данные сохранятся', mtConfirmation, [mbYes, mbNo],0) =  mrNo then
 Self.Close;
end;
 
end.

Не по теме:

если захочешь понять что к чему прочитай этот топик по строчно, а не по диогонали

1
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 512
19.09.2012, 21:15  [ТС] 15
спасибо премного благодарен, все работает

Добавлено через 44 минуты
и еще как написать команду "Вернуть"?? уже все закончил, осталась только эта команда
0
133 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
19.09.2012, 21:26 16
Delphi
1
Memo1.Undo;
но это отменить, повторный вызов - отмена отмены
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2012, 21:26

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Чтобы текст в TextBox сохранялся при закрытии программы
Как закрепить путь к файлу в textbox, чтобы при закрытии или открытии программы он был сохранен и...

Как сделать чтобы результат сохранялся в .txt файл
Приветствую Всех Друзья! Не силен в Пайтоне, но нужно изменить код на автоматическое сохранение в...

Как сделать чтобы файл всегда сохранялся в каталоге с exe-файлом?
… Public REC: TSomeRec procedure LoadFile(Buffer: TMemo; const FileName: TFileName); …...

Сделать так, чтобы при закрытии книги удалялась кнопка
Добрый день! Вопрос, наверное, простой, но я с ним промучалась уже два дня. Как программно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.