Помогите с кодом

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Помогите с кодом

Сообщение Kir955 » 09.03.2024 15:23:11

Здравствуйте, мне нужно, чтобы при нажатии на кнопку (BitButton1) создавался текстовый документ (kirhanoihauzena.txt), и в него сохранялся введенный в Memo текст.
Также нужно, чтобы при открытии формы этот текст автоматически выводился в Memo.
Нюанса два:
Во-первых, я не знаю путь куда должен сохраняться файл, то есть программа сама должна находить путь. Мне нужно, чтобы текстовый файл сохранялся там же, где лежит Exe'шник.
В программе я попробовал это реализовать.
Во-вторых, что наиболее важно, нужно, чтобы если пользователь впервые открывает программу поле Memo было чистым и программа не искала файл, который еще не создан.
Я пробовал запускать программу, но форма не открылась из-за ошибки, связанной с тем, что программа не может найти файл kirhanoihauzena.txt. То есть путь она определяет, а файла там нет, загрузить следовательно нечего, и программа дает сбой.
Помогите пожалуйста решить эту проблему, и если нужно подправьте код.
P.s. Я в Лазарусе и в Паскале чайник
Kir955
незнакомец
 
Сообщения: 8
Зарегистрирован: 01.03.2024 16:58:48

Re: Помогите с кодом

Сообщение xchgeaxeax » 09.03.2024 16:57:12

Создайте переменную типа String (в разделе var вне процедуры или в секции private или public у Form1) и при создании формы запишите в нее ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt'
Дальше для проверки на наличие файла можно применить if FileExists(имя переменной) и соответственно Memo.LoadFromFile(имя переменной) при положительном условии. Ну а при нажатии на кнопку уже делаете Memo.SaveToFile(имя переменной) без проверок. Это автоматически пересоздаст файл с текстом из Memo
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Помогите с кодом

Сообщение Seenkao » 09.03.2024 17:32:37

xchgeaxeax, видишь человеку не нужна помощь, ему нужен код. Чтоб ему сделали, а он просто им воспользуется.

Если человек ни чего не пытался даже сделать, то смысл в чём-то ему помогать? Либо пусть нанимает людей чтоб сделали, либо делает хоть что-нибудь, чтоб показать что что-то смог сделать, а там люди решат помогать или нет.

Kir955, это не обвинение. Просто код предоставь что сделал. Здесь даже полностью проект можно выложить: архивируешь проект и нажимаешь "добавить вложения".
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: Помогите с кодом

Сообщение Kir955 » 09.03.2024 22:41:46

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 секунд:
xchgeaxeax писал(а):Создайте переменную типа String (в разделе var вне процедуры или в секции private или public у Form1) и при создании формы запишите в нее ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt'
Дальше для проверки на наличие файла можно применить if FileExists(имя переменной) и соответственно Memo.LoadFromFile(имя переменной) при положительном условии. Ну а при нажатии на кнопку уже делаете Memo.SaveToFile(имя переменной) без проверок. Это автоматически пересоздаст файл с текстом из Memo

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
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.

Вот так?
Kir955
незнакомец
 
Сообщения: 8
Зарегистрирован: 01.03.2024 16:58:48

Re: Помогите с кодом

Сообщение Снег Север » 09.03.2024 23:21:07

Kir955 единственное - я не уверен что на момент события FormCreate компонент Memo1 уже создан. Я бы этот код лучше засунул в событие FormShow.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2997
Зарегистрирован: 27.11.2007 16:14:47

Re: Помогите с кодом

Сообщение xchgeaxeax » 09.03.2024 23:32:53

Снег Север писал(а):Kir955 единственное - я не уверен что на момент события FormCreate компонент Memo1 уже создан. Я бы этот код лучше засунул в событие FormShow.

Создан. OnCreate как раз служит для начальной единичной инициализации компонентов формы. Тогда как OnShow может повторяться. Поэтому лучше использовать OnCreate. Если не уверены в этом, тогда можете вызвать inherited Create(Sender); Но это абсолютно точно лишнее.

Kir955 писал(а):var X: String;
Это же не PascalABC. Слово var тут лишнее
Kir955 писал(а):Memo1.ReadOnly:= True;
Не обязательно делать поле ReadOnly. Пока событие не обработается новое не возникнет. Так работает очередь сообщений. И даже если другая ветвь/процесс отправят сообщение вашему окну, то событие ветвь сможет обработать только зайдя в цикл обработки сообщений. А туда она попадает после Application.ProcessMessages или по окончанию обработки сообщения. Хотя есть еще вариант с прямым вызовом функции окна. Но это можете оставить без обработки т.к. от такого ReadOnly точно не поможет.

Kir955 писал(а):ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt';
А присваивать сообщение переменной будет дед пихто?

Пока это все замечания
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Помогите с кодом

Сообщение Kir955 » 10.03.2024 12:56:02

xchgeaxeax писал(а):
Снег Север писал(а):Kir955 единственное - я не уверен что на момент события FormCreate компонент Memo1 уже создан. Я бы этот код лучше засунул в событие FormShow.

Создан. OnCreate как раз служит для начальной единичной инициализации компонентов формы. Тогда как OnShow может повторяться. Поэтому лучше использовать OnCreate. Если не уверены в этом, тогда можете вызвать inherited Create(Sender); Но это абсолютно точно лишнее.

Kir955 писал(а):var X: String;
Это же не PascalABC. Слово var тут лишнее
Kir955 писал(а):Memo1.ReadOnly:= True;
Не обязательно делать поле ReadOnly. Пока событие не обработается новое не возникнет. Так работает очередь сообщений. И даже если другая ветвь/процесс отправят сообщение вашему окну, то событие ветвь сможет обработать только зайдя в цикл обработки сообщений. А туда она попадает после Application.ProcessMessages или по окончанию обработки сообщения. Хотя есть еще вариант с прямым вызовом функции окна. Но это можете оставить без обработки т.к. от такого ReadOnly точно не поможет.

Kir955 писал(а):ExtractFilePath(ExpandFileName(ParamStr(0))) + 'kirhanoihauzena.txt';
А присваивать сообщение переменной будет дед пихто?

Пока это все замечания


ReadOnly - это свойство Memo, которое отвечает за возможность изменения текста в этом компоненте.
Последнее замечание не понял, можно поподробнее?)
Kir955
незнакомец
 
Сообщения: 8
Зарегистрирован: 01.03.2024 16:58:48

Re: Помогите с кодом

Сообщение xchgeaxeax » 10.03.2024 14:00:17

Kir955 писал(а):ReadOnly - это свойство Memo, которое отвечает за возможность изменения текста в этом компоненте.

Только те изменения, что будут производиться пользователем. Т.е. произойдут по возникновению какого-либо внешнего события. Для сохранения в файл нет необходимости делать Memo ReadOnly. Оно сохранит текст без изменений т.к. другие события не могут быть обработаны во время обработки события запускающего сохранение данных. А программные изменения оно не блокирует.

Попробуйте вот это.
Код: Выделить всё
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;
Даже если нажмете на кнопку 2, то при нажатии кнопок 3, 4 и 5 изменения все равно произойдут т.к. это программные изменения. А вот блокироваться будет только то, что вы сами вводите.

Kir955 писал(а):Последнее замечание не понял, можно поподробнее?)

В последнем замечании сказано, что не достаточно просто скопировать написанную мной строчку. Надо еще результат работы функции присвоить переменной X, чтобы у нее появилось начальное значение до её применения.

Судя по обработчикам BitBtn1Click и BitBtn2Click что такое присвоение вы знаете. Вот так и тут. У вас есть три функции, которые последовательно передают друг другу некоторые данные. А вот результат последней функции сразу отбрасывается. Его надо сохранить в переменной X.

P.S. Можете заменить ParamStr(0) на Application.ExeName. Но существенным эти изменения не будут. Application.ExeName получает значение как раз вызывая ParamStr(0)
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Помогите с кодом

Сообщение Kir955 » 11.03.2024 12:33:32

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, это делается для того, чтобы пользователь не мог редактировать текст.
Kir955
незнакомец
 
Сообщения: 8
Зарегистрирован: 01.03.2024 16:58:48

Re: Помогите с кодом

Сообщение Alex2013 » 11.03.2024 12:52:31

У меня все работает ... ( А вот править пост после ответа на вопрос это малость скажем мягко "моветон" ... )
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Помогите с кодом

Сообщение Kir955 » 11.03.2024 13:51:10

Alex2013 писал(а):У меня все работает ... ( А вот править пост после ответа на вопрос это малость скажем мягко "моветон" ... )

Я просто ошибку понял свою :D
Kir955
незнакомец
 
Сообщения: 8
Зарегистрирован: 01.03.2024 16:58:48

Re: Помогите с кодом

Сообщение xchgeaxeax » 11.03.2024 15:44:23

Не хватает одной мелочи. Тэгов [code][/code]
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Помогите с кодом

Сообщение Kir955 » 11.03.2024 23:20:09

xchgeaxeax писал(а):Не хватает одной мелочи. Тэгов [code][/code]

Это чего такое и куда? :?:
Kir955
незнакомец
 
Сообщения: 8
Зарегистрирован: 01.03.2024 16:58:48

Re: Помогите с кодом

Сообщение xchgeaxeax » 12.03.2024 01:18:25

Это форумом пользоваться надо правильно, чтобы другие могли читать код, а не полотенце.
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Помогите с кодом

Сообщение Seenkao » 12.03.2024 06:06:19

Я ему уже писал, что можно было просто весь проект скинуть архивом. А сюда можно было просто выложить какой-то кусок кода, если это необходимо.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 104

Рейтинг@Mail.ru