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

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

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

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

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

Сообщение Kir955 »

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

Сообщение xchgeaxeax »

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

Сообщение Seenkao »

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

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

Kir955, это не обвинение. Просто код предоставь что сделал. Здесь даже полностью проект можно выложить: архивируешь проект и нажимаешь "добавить вложения".
Kir955
незнакомец
Сообщения: 8
Зарегистрирован: 01.03.2024 15:58:48

Сообщение 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 секунд:
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.

Вот так?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Kir955 единственное - я не уверен что на момент события FormCreate компонент Memo1 уже создан. Я бы этот код лучше засунул в событие FormShow.
xchgeaxeax
постоялец
Сообщения: 198
Зарегистрирован: 11.05.2023 02:51:40

Сообщение 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';
А присваивать сообщение переменной будет дед пихто?

Пока это все замечания
Kir955
незнакомец
Сообщения: 8
Зарегистрирован: 01.03.2024 15:58:48

Сообщение Kir955 »

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, которое отвечает за возможность изменения текста в этом компоненте.
Последнее замечание не понял, можно поподробнее?)
xchgeaxeax
постоялец
Сообщения: 198
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

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)
Kir955
незнакомец
Сообщения: 8
Зарегистрирован: 01.03.2024 15:58:48

Сообщение 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 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
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

У меня все работает ... ( А вот править пост после ответа на вопрос это малость скажем мягко "моветон" ... )
Kir955
незнакомец
Сообщения: 8
Зарегистрирован: 01.03.2024 15:58:48

Сообщение Kir955 »

Alex2013 писал(а):У меня все работает ... ( А вот править пост после ответа на вопрос это малость скажем мягко "моветон" ... )
Я просто ошибку понял свою :D
xchgeaxeax
постоялец
Сообщения: 198
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Не хватает одной мелочи. Тэгов
Kir955
незнакомец
Сообщения: 8
Зарегистрирован: 01.03.2024 15:58:48

Сообщение Kir955 »

xchgeaxeax писал(а):Не хватает одной мелочи. Тэгов
Это чего такое и куда? :?:
xchgeaxeax
постоялец
Сообщения: 198
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Это форумом пользоваться надо правильно, чтобы другие могли читать код, а не полотенце.
Seenkao
энтузиаст
Сообщения: 568
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

Я ему уже писал, что можно было просто весь проект скинуть архивом. А сюда можно было просто выложить какой-то кусок кода, если это необходимо.
Ответить