Помогите с кодом
Модератор: Модераторы
Помогите с кодом
Здравствуйте, мне нужно, чтобы при нажатии на кнопку (BitButton1) создавался текстовый документ (kirhanoihauzena.txt), и в него сохранялся введенный в Memo текст.
Также нужно, чтобы при открытии формы этот текст автоматически выводился в Memo.
Нюанса два:
Во-первых, я не знаю путь куда должен сохраняться файл, то есть программа сама должна находить путь. Мне нужно, чтобы текстовый файл сохранялся там же, где лежит Exe'шник.
В программе я попробовал это реализовать.
Во-вторых, что наиболее важно, нужно, чтобы если пользователь впервые открывает программу поле Memo было чистым и программа не искала файл, который еще не создан.
Я пробовал запускать программу, но форма не открылась из-за ошибки, связанной с тем, что программа не может найти файл kirhanoihauzena.txt. То есть путь она определяет, а файла там нет, загрузить следовательно нечего, и программа дает сбой.
Помогите пожалуйста решить эту проблему, и если нужно подправьте код.
P.s. Я в Лазарусе и в Паскале чайник
Также нужно, чтобы при открытии формы этот текст автоматически выводился в Memo.
Нюанса два:
Во-первых, я не знаю путь куда должен сохраняться файл, то есть программа сама должна находить путь. Мне нужно, чтобы текстовый файл сохранялся там же, где лежит Exe'шник.
В программе я попробовал это реализовать.
Во-вторых, что наиболее важно, нужно, чтобы если пользователь впервые открывает программу поле Memo было чистым и программа не искала файл, который еще не создан.
Я пробовал запускать программу, но форма не открылась из-за ошибки, связанной с тем, что программа не может найти файл kirhanoihauzena.txt. То есть путь она определяет, а файла там нет, загрузить следовательно нечего, и программа дает сбой.
Помогите пожалуйста решить эту проблему, и если нужно подправьте код.
P.s. Я в Лазарусе и в Паскале чайник
-
xchgeaxeax
- постоялец
- Сообщения: 198
- Зарегистрирован: 11.05.2023 02:51:40
Создайте переменную типа String (в разделе var вне процедуры или в секции private или public у Form1) и при создании формы запишите в нее ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt'
Дальше для проверки на наличие файла можно применить if FileExists(имя переменной) и соответственно Memo.LoadFromFile(имя переменной) при положительном условии. Ну а при нажатии на кнопку уже делаете Memo.SaveToFile(имя переменной) без проверок. Это автоматически пересоздаст файл с текстом из Memo
Дальше для проверки на наличие файла можно применить if FileExists(имя переменной) и соответственно Memo.LoadFromFile(имя переменной) при положительном условии. Ну а при нажатии на кнопку уже делаете Memo.SaveToFile(имя переменной) без проверок. Это автоматически пересоздаст файл с текстом из Memo
xchgeaxeax, видишь человеку не нужна помощь, ему нужен код. Чтоб ему сделали, а он просто им воспользуется.
Если человек ни чего не пытался даже сделать, то смысл в чём-то ему помогать? Либо пусть нанимает людей чтоб сделали, либо делает хоть что-нибудь, чтоб показать что что-то смог сделать, а там люди решат помогать или нет.
Kir955, это не обвинение. Просто код предоставь что сделал. Здесь даже полностью проект можно выложить: архивируешь проект и нажимаешь "добавить вложения".
Если человек ни чего не пытался даже сделать, то смысл в чём-то ему помогать? Либо пусть нанимает людей чтоб сделали, либо делает хоть что-нибудь, чтоб показать что что-то смог сделать, а там люди решат помогать или нет.
Kir955, это не обвинение. Просто код предоставь что сделал. Здесь даже полностью проект можно выложить: архивируешь проект и нажимаешь "добавить вложения".
Ой) Забыл код прикрепить. Вот он собственно, еще не правленныйSeenkao писал(а):xchgeaxeax, видишь человеку не нужна помощь, ему нужен код. Чтоб ему сделали, а он просто им воспользуется.
Если человек ни чего не пытался даже сделать, то смысл в чём-то ему помогать? Либо пусть нанимает людей чтоб сделали, либо делает хоть что-нибудь, чтоб показать что что-то смог сделать, а там люди решат помогать или нет.
Kir955, это не обвинение. Просто код предоставь что сделал. Здесь даже полностью проект можно выложить: архивируешь проект и нажимаешь "добавить вложения".
unit Unit5;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
Buttons;
type
{ TForm5 }
TForm5 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label1: TLabel;
Memo1: TMemo;
Panel: Tpanel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Image3Click(Sender: TObject);
private
public
end;
var
Form5: TForm5;
implementation
{$R *.lfm}
{ TForm5 }
procedure TForm5.Image3Click(Sender: TObject);
begin
close;
end;
procedure TForm5.BitBtn1Click(Sender: TObject);
begin
Memo1.ReadOnly:= True;
Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+ 'kirhanoihauzena.txt');
end;
procedure TForm5.BitBtn2Click(Sender: TObject);
begin
Memo1.ReadOnly:= False;
end;
procedure TForm5.FormShow(Sender: TObject);
begin
end;
end.
Добавлено спустя 18 минут 10 секунд:
unit Unit5;xchgeaxeax писал(а):Создайте переменную типа String (в разделе var вне процедуры или в секции private или public у Form1) и при создании формы запишите в нее ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt'
Дальше для проверки на наличие файла можно применить if FileExists(имя переменной) и соответственно Memo.LoadFromFile(имя переменной) при положительном условии. Ну а при нажатии на кнопку уже делаете Memo.SaveToFile(имя переменной) без проверок. Это автоматически пересоздаст файл с текстом из Memo
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
Buttons;
type
{ TForm5 }
TForm5 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label1: TLabel;
Memo1: TMemo;
Panel: Tpanel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image3Click(Sender: TObject);
private
public
var X: String;
end;
var
Form5: TForm5;
implementation
{$R *.lfm}
{ TForm5 }
procedure TForm5.Image3Click(Sender: TObject);
begin
close;
end;
procedure TForm5.BitBtn1Click(Sender: TObject);
begin
Memo1.ReadOnly:= True;
Memo1.SaveToFile(X)
end;
procedure TForm5.BitBtn2Click(Sender: TObject);
begin
Memo1.ReadOnly:= False;
end;
procedure TForm5.FormCreate(Sender: TObject);
begin
ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt';
if FileExists(X)then
begin
Memo1.LoadFromFile(X)
end;
end;
end.
Вот так?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Kir955 единственное - я не уверен что на момент события FormCreate компонент Memo1 уже создан. Я бы этот код лучше засунул в событие FormShow.
-
xchgeaxeax
- постоялец
- Сообщения: 198
- Зарегистрирован: 11.05.2023 02:51:40
Создан. OnCreate как раз служит для начальной единичной инициализации компонентов формы. Тогда как OnShow может повторяться. Поэтому лучше использовать OnCreate. Если не уверены в этом, тогда можете вызвать inherited Create(Sender); Но это абсолютно точно лишнее.Снег Север писал(а):Kir955 единственное - я не уверен что на момент события FormCreate компонент Memo1 уже создан. Я бы этот код лучше засунул в событие FormShow.
Это же не PascalABC. Слово var тут лишнееKir955 писал(а):var X: String;
Не обязательно делать поле ReadOnly. Пока событие не обработается новое не возникнет. Так работает очередь сообщений. И даже если другая ветвь/процесс отправят сообщение вашему окну, то событие ветвь сможет обработать только зайдя в цикл обработки сообщений. А туда она попадает после Application.ProcessMessages или по окончанию обработки сообщения. Хотя есть еще вариант с прямым вызовом функции окна. Но это можете оставить без обработки т.к. от такого ReadOnly точно не поможет.Kir955 писал(а):Memo1.ReadOnly:= True;
А присваивать сообщение переменной будет дед пихто?Kir955 писал(а):ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt';
Пока это все замечания
ReadOnly - это свойство Memo, которое отвечает за возможность изменения текста в этом компоненте.xchgeaxeax писал(а):Создан. OnCreate как раз служит для начальной единичной инициализации компонентов формы. Тогда как OnShow может повторяться. Поэтому лучше использовать OnCreate. Если не уверены в этом, тогда можете вызвать inherited Create(Sender); Но это абсолютно точно лишнее.Снег Север писал(а):Kir955 единственное - я не уверен что на момент события FormCreate компонент Memo1 уже создан. Я бы этот код лучше засунул в событие FormShow.
Это же не PascalABC. Слово var тут лишнееKir955 писал(а):var X: String;Не обязательно делать поле ReadOnly. Пока событие не обработается новое не возникнет. Так работает очередь сообщений. И даже если другая ветвь/процесс отправят сообщение вашему окну, то событие ветвь сможет обработать только зайдя в цикл обработки сообщений. А туда она попадает после Application.ProcessMessages или по окончанию обработки сообщения. Хотя есть еще вариант с прямым вызовом функции окна. Но это можете оставить без обработки т.к. от такого ReadOnly точно не поможет.Kir955 писал(а):Memo1.ReadOnly:= True;
А присваивать сообщение переменной будет дед пихто?Kir955 писал(а):ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt';
Пока это все замечания
Последнее замечание не понял, можно поподробнее?)
-
xchgeaxeax
- постоялец
- Сообщения: 198
- Зарегистрирован: 11.05.2023 02:51:40
Только те изменения, что будут производиться пользователем. Т.е. произойдут по возникновению какого-либо внешнего события. Для сохранения в файл нет необходимости делать Memo ReadOnly. Оно сохранит текст без изменений т.к. другие события не могут быть обработаны во время обработки события запускающего сохранение данных. А программные изменения оно не блокирует.Kir955 писал(а):ReadOnly - это свойство Memo, которое отвечает за возможность изменения текста в этом компоненте.
Попробуйте вот это.
Код: Выделить всё
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Memo1.LoadFormFile('a.txt');
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Memo1.ReadOnly := True;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Memo1.Lines.Clear;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
Memo1.Lines.Text := 'abracadabra';
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('b.txt');
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
Memo1.ReadOnly := False;
end;
procedure TForm1.BitBtn7Click(Sender: TObject);
begin
Memo1.Lines.SaveToFile('с.txt');
end;В последнем замечании сказано, что не достаточно просто скопировать написанную мной строчку. Надо еще результат работы функции присвоить переменной X, чтобы у нее появилось начальное значение до её применения.Kir955 писал(а):Последнее замечание не понял, можно поподробнее?)
Судя по обработчикам BitBtn1Click и BitBtn2Click что такое присвоение вы знаете. Вот так и тут. У вас есть три функции, которые последовательно передают друг другу некоторые данные. А вот результат последней функции сразу отбрасывается. Его надо сохранить в переменной X.
P.S. Можете заменить ParamStr(0) на Application.ExeName. Но существенным эти изменения не будут. Application.ExeName получает значение как раз вызывая ParamStr(0)
unit Unit5;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
Buttons;
type
{ TForm5 }
TForm5 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label1: TLabel;
Memo1: TMemo;
Panel: Tpanel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image3Click(Sender: TObject);
private
public
x: string;
end;
var
Form5: TForm5;
implementation
{$R *.lfm}
{ TForm5 }
procedure TForm5.Image3Click(Sender: TObject);
begin
close;
end;
procedure TForm5.BitBtn1Click(Sender: TObject);
begin
Memo1.ReadOnly:= True;
Memo1.Lines.SaveToFile(x);
end;
procedure TForm5.BitBtn2Click(Sender: TObject);
begin
Memo1.ReadOnly:= False;
end;
procedure TForm5.FormCreate(Sender: TObject);
begin
x:= ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt';
if FileExists(x) then
begin
Memo1.Lines.LoadFromFile(x);
end;
end;
end.
Все компилируется успешно. Проверьте, пожалуйста, код.
P.s. Насчет ReadOnly, это делается для того, чтобы пользователь не мог редактировать текст.
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
Buttons;
type
{ TForm5 }
TForm5 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label1: TLabel;
Memo1: TMemo;
Panel: Tpanel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image3Click(Sender: TObject);
private
public
x: string;
end;
var
Form5: TForm5;
implementation
{$R *.lfm}
{ TForm5 }
procedure TForm5.Image3Click(Sender: TObject);
begin
close;
end;
procedure TForm5.BitBtn1Click(Sender: TObject);
begin
Memo1.ReadOnly:= True;
Memo1.Lines.SaveToFile(x);
end;
procedure TForm5.BitBtn2Click(Sender: TObject);
begin
Memo1.ReadOnly:= False;
end;
procedure TForm5.FormCreate(Sender: TObject);
begin
x:= ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt';
if FileExists(x) then
begin
Memo1.Lines.LoadFromFile(x);
end;
end;
end.
Все компилируется успешно. Проверьте, пожалуйста, код.
P.s. Насчет ReadOnly, это делается для того, чтобы пользователь не мог редактировать текст.
У меня все работает ... ( А вот править пост после ответа на вопрос это малость скажем мягко "моветон" ... )
Я просто ошибку понял своюAlex2013 писал(а):У меня все работает ... ( А вот править пост после ответа на вопрос это малость скажем мягко "моветон" ... )
-
xchgeaxeax
- постоялец
- Сообщения: 198
- Зарегистрирован: 11.05.2023 02:51:40
Не хватает одной мелочи. Тэгов
Код: Выделить всё
Это чего такое и куда?xchgeaxeax писал(а):Не хватает одной мелочи. ТэговКод: Выделить всё
-
xchgeaxeax
- постоялец
- Сообщения: 198
- Зарегистрирован: 11.05.2023 02:51:40
Это форумом пользоваться надо правильно, чтобы другие могли читать код, а не полотенце.
Я ему уже писал, что можно было просто весь проект скинуть архивом. А сюда можно было просто выложить какой-то кусок кода, если это необходимо.
