421 Востаннє редагувалося ProgramBandera (10.05.2022 00:57:02)

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Доброї ночі панове!
Потрібна ваша допомога!

Мені потрібно написати функцію для знаходження середньої швидкості.
Формула: vс = L1 + L2 + L3 + ... Ln / t1 + t2 + t3 + ... tn.

Так як кількість Ln - переміщень і tn - проміжків часу невідома я створив два динамічних масиви.

P, T: Array Of Extended;

Далі я створив функцію типу: Extended, яка на вхід приймає два динамічні масиви того ж типу:

Function TForm1.PhysicalInstantSpeed(Path_Or_Moving, Time: Array Of Extended):Extended;
Var
  I: Integer;
  Sum_Path_Or_Moving, Sum_Time: Extended;
Begin
  For I := 0 To High(Path_Or_Moving) Do
    Sum_Path_Or_Moving := Sum_Path_Or_Moving + Path_Or_Moving[i];

  For I := 0 To High(Time) Do
    Sum_Time := Sum_Time + Time[i];

  PhysicalInstantSpeed := Sum_Path_Or_Moving / Sum_Time;
{
Тимчасові рядки для перевірки заповненості масиву. Після перевірки функції
рядки потрібно обовязково прибрати з функції
}
  Label3.Caption := 'Час = ' + FloatToStr(Sum_Time);
  Label4.Caption := 'Шлях = ' + FloatToStr(Sum_Path_Or_Moving);
  Label5.Caption := 'Середня швидкість = ' + FloatToStr(Sum_Path_Or_Moving / Sum_Time);
  // Кінець тимчасових рядків
End;

В мене прохання. Гляньте будь ласка своїм професійним поглядом чи функція буде працювати.

Іще питання. Для того щоб перевірити функцію я створив форму куди закинув 6 - Edit, пару Label та кнопку. Та щось не можу зрозуміти як мені з 1, 2, 3-го Edit загнати в мій динамічний масив Р числові значення, і з 4-го по 6-й Edit в масив Т, для перевірки функції???

Ось повний код тестової програми.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Function PhysicalInstantSpeed(Path_Or_Moving, Time: Array Of Extended):Extended;
  end;

var
  Form1: TForm1;
  P, T: Array Of Extended;

implementation

{$R *.dfm}
Function TForm1.PhysicalInstantSpeed(Path_Or_Moving, Time: Array Of Extended):Extended;
Var
  I: Integer;
  Sum_Path_Or_Moving, Sum_Time: Extended;
Begin
  For I := 0 To High(Path_Or_Moving) Do
    Sum_Path_Or_Moving := Sum_Path_Or_Moving + Path_Or_Moving[i];

  For I := 0 To High(Time) Do
    Sum_Time := Sum_Time + Time[i];

  PhysicalInstantSpeed := Sum_Path_Or_Moving / Sum_Time;
{
Тимчасові рядки для перевірки заповненості масиву. Після перевірки функції
рядки потрібно обовязково прибрати з функції
}
  Label3.Caption := 'Час = ' + FloatToStr(Sum_Time);
  Label4.Caption := 'Шлях = ' + FloatToStr(Sum_Path_Or_Moving);
  Label5.Caption := 'Середня швидкість = ' + FloatToStr(Sum_Path_Or_Moving / Sum_Time);
  // Кінець тимчасових рядків
End;

procedure TForm1.Button1Click(Sender: TObject);
begin         // Як заповнити масиви з Edit????
  SetLength(P, Length(P) + 1);
  P[Length(P)] := StrToFloat(Edit1.Text);
  P[Length(P)] := StrToFloat(Edit2.Text);
  P[Length(P)] := StrToFloat(Edit3.Text);
  SetLength(T, Length(T) + 1);
  T[Length(T)] := StrToFloat(Edit4.Text);
  T[Length(T)] := StrToFloat(Edit5.Text);
  T[Length(T)] := StrToFloat(Edit6.Text);
  Label5.Caption := 'Середня швидкість = ' + FloatToStr(PhysicalInstantSpeed(P,T));
end;

end.

422 Востаннє редагувалося ProgramBandera (10.05.2022 14:02:13)

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ProgramBandera написав:

В мене прохання. Гляньте будь ласка своїм професійним поглядом чи функція буде працювати.

Іще питання. Для того щоб перевірити функцію я створив форму куди закинув 6 - Edit, пару Label та кнопку. Та щось не можу зрозуміти як мені з 1, 2, 3-го Edit загнати в мій динамічний масив Р числові значення, і з 4-го по 6-й Edit в масив Т, для перевірки функції???


Так: функція працює в ось такому вигляді -

Function PhysicalInstantSpeed(Path_Or_Moving, Time: Array Of Extended):Extended;
Var
  I: Integer;
  Sum_Path_Or_Moving, Sum_Time: Real;
Begin
  For I := 0 To High(Path_Or_Moving) Do
    Sum_Path_Or_Moving := Sum_Path_Or_Moving + Path_Or_Moving[i];

  For I := 0 To High(Time) Do
    Sum_Time := Sum_Time + Time[i];

  PhysicalInstantSpeed := Sum_Path_Or_Moving / Sum_Time;
End;

Потрібно було замінити тип даних з Extended на Real в ось цьому рядку:

Sum_Path_Or_Moving, Sum_Time: Real;

А перевірив я її ось так кривобоко процедурою procedure TForm1.Button1Click(Sender: TObject);

procedure TForm1.Button1Click(Sender: TObject);
Var
  I: Integer;
begin
  SetLength(T,3);

   T[0] := StrToFloat(Edit1.Text);
   T[1] := StrToFloat(Edit2.Text);
   T[2] := StrToFloat(Edit3.Text);

  SetLength(P,3);
   P[0] := StrToFloat(Edit4.Text);
   P[1] := StrToFloat(Edit5.Text);
   P[2] := StrToFloat(Edit6.Text);


  Label5.Caption := 'Середня швидкість = ' + FloatToStr(PhysicalInstantSpeed(P,T));
end;

Усім дякую!

423

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ProgramBandera написав:

Потрібно було замінити тип даних з Extended на Real в ось цьому рядку:

Sum_Path_Or_Moving, Sum_Time: Real;

Проблема була явно не в цьому. Скоріше за все, ви просто не задали початкові значення для цих змінних:

Sum_Path_Or_Moving := 0;
Sum_Time := 0;

В результаті вони у вас містили якісь випадкові числа, до початку підрахунку сум.

Подякували: ProgramBandera1

424

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Слава Україні панове програмісти!!!

В моєму окремому модулі є ось такий в класі метод SetDefinition(Definition: String);. Він витягує з файла Визначення.ini якусь текстову інформацію за відповідним ключем. Ключ передається параметром Definition.

procedure TDEFINITION.SetDefinition(Definition: String);
Var
  DefinitionDatabase: TIniFile;
begin
  if Visibil_Definition = True then
    Begin
      DefinitionDatabase := TIniFile.Create(ExtractFilePath(Application.ExeName)
                                                            + 'Визначення.ini');
      fDefinition := #13#10 + DefinitionDatabase.ReadString('Визначення',
                                        Definition, 'Визначення не знайдено!!');
      DefinitionDatabase.Free
    End;
end;

Щоб витягти шлях до файлу я мушу прописати ось цей рядок коду:

DefinitionDatabase := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Визначення.ini');

відповідно підключивши в свій модуль, іще один модуль Vcl.Forms, для того щоб вказати шлях до виконуваного файлу (Application.ExeName).

В мене питання: А можливо якось вказати шлях по іншому, щоб не підключати до мого модуля непотрібний Vcl.Forms???

P.S Файл Визначення.ini лежить, як ви вже здогадались, в теці з виконуваним файлом програми.

425

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ProgramBandera написав:

Слава Україні панове програмісти!!!

В моєму окремому модулі є ось такий в класі метод SetDefinition(Definition: String);. Він витягує з файла Визначення.ini якусь текстову інформацію за відповідним ключем. Ключ передається параметром Definition.

procedure TDEFINITION.SetDefinition(Definition: String);
Var
  DefinitionDatabase: TIniFile;
begin
  if Visibil_Definition = True then
    Begin
      DefinitionDatabase := TIniFile.Create(ExtractFilePath(Application.ExeName)
                                                            + 'Визначення.ini');
      fDefinition := #13#10 + DefinitionDatabase.ReadString('Визначення',
                                        Definition, 'Визначення не знайдено!!');
      DefinitionDatabase.Free
    End;
end;

Щоб витягти шлях до файлу я мушу прописати ось цей рядок коду:

DefinitionDatabase := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Визначення.ini');

відповідно підключивши в свій модуль, іще один модуль Vcl.Forms, для того щоб вказати шлях до виконуваного файлу (Application.ExeName).

В мене питання: А можливо якось вказати шлях по іншому, щоб не підключати до мого модуля непотрібний Vcl.Forms???

P.S Файл Визначення.ini лежить, як ви вже здогадались, в теці з виконуваним файлом програми.



ParamStr(0) - Шлях до вашої аплікації, фул пач
А ми робили так,

iniFileFullPath := ExtractFilePath(ParamStr(0)) + 'Визначення.ini'

п.с. не раджу використовувати кирилицю в назвах файлів і тек, можуть виникати проблеми, намучитесь.
п.с.с на дельфі вже 7 років не писав ніц, тому можу десь затупив
https://docwiki.embarcadero.com/Librari … m.ParamStr
https://docwiki.embarcadero.com/Librari … ctFilePath

Подякували: ProgramBandera1

426

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Chemist-i написав:

ParamStr(0) - Шлях до вашої аплікації, фул пач
А ми робили так,

iniFileFullPath := ExtractFilePath(ParamStr(0)) + 'Визначення.ini'

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

Не працює так:

DefinitionDatabase := TIniFile.Create(ParamStr(0) + 'Визначення.ini');

427

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ProgramBandera написав:

Не працює так:

DefinitionDatabase := TIniFile.Create(ParamStr(0) + 'Визначення.ini');

цитата з мого коду, працюває.

ini:= TIniFile.Create( ExtractFileDir(ParamStr(0))+'\setting.ini' );
Подякували: ProgramBandera1

428

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Гарного дня панове! Можливо хтось онлайн, і підкаже мені скоріше.

Скажіть, Функція може повертати масив рядків? Чи то я вже перегнув?

Function GetPrefixName: Array Of String;

Бо щось не компілюється програма, видає помилку:
[dcc32 Error] CONVERTER.pas(41): E2029 Identifier expected but 'ARRAY' found
[dcc32 Error] CONVERTER.pas(41): Очікується ідентифікатор E2029, але знайдено "МАСИВ"

429

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Можливо у новіших паскалях (у вас ніби якийсь з більш-менш останніх Delphi?), якщо проголосити тип:

type ArrayOfString = Array Of String;
Function GetPrefixName: ArrayOfString; //має спрацювати

Якщо ні - то var-параметр вас урятує.

Подякували: ProgramBandera1

430

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Доброго дня, панове з України.

Який синтаксис створення динамічно форми, з прив'язкою до неї пару компонентів?
Пробую ось так:

procedure TForm1.CreateFormClick(Sender: TObject);
Var
  ConverterForm: TForm;
  NewEdit: Tedit;
begin
  ConverterForm := TForm.Create(Self);
  ConverterForm.Width := 250;
  ConverterForm.Height := 200;
  ConverterForm.Visible := True;
  NewEdit := TEdit.Create(ConverterForm);
  NewEdit.Width := 100;
  NewEdit.Height := 25;
  NewEdit.Top := 50;
  NewEdit.Left := 5;
  NewEdit.Visible := True;
  //NewEdit.Free;
  //ConverterForm.Free
end;

та не зовсім виходить, форма створюється а Едіт чомусь ні.

P.S: І ще питання: чи можливо в окремому (власному) модулі описати клас та метод в цьому класі, який буде створювати цю форму?

431

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Загалом ідея Delphi у тому, що ви не створюєте форму по елементу - ви робите дизайн форми (нащадка TForm), а потім динамічно створюєте всю форму. Якщо вам так кортить погратися в динаміку - є методи InsertControl та RemoveControl, але в документації прямо зазначено, що їх не варто прямо викликати.

Подякували: leofun01, ProgramBandera2

432

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ProgramBandera написав:

Який синтаксис створення динамічно форми .. ?

  ConverterForm := TForm.Create(Self);

Правильно. А потім її можна показати.

  ConverterForm.Show;
ProgramBandera написав:

та не зовсім виходить, форма створюється а Едіт чомусь ні.

після внесеня котролів у форму, можна викликати

  ConverterForm.Invalidate;

але в мене і без того працює (в мене не Delphi).

ProgramBandera написав:

чи можливо в окремому (власному) модулі описати клас та метод в цьому класі, який буде створювати цю форму?

Можна.

Подякували: ProgramBandera1

433 Востаннє редагувалося ProgramBandera (12.07.2022 18:07:31)

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Іще питання по останній темі. Створив я динамічно форму та два компоненти в ній. Там можна було використати методи InsertControl та RemoveControl як пропонував пан koala:

RemoveControl(Edit);
  ConverterForm.InsertControl(Edit);
  RemoveControl(Button);
  ConverterForm.InsertControl(Button);

вони працюють. Та я використав властивість Parent

procedure TForm1.CreateFormClick(Sender: TObject);
Var
  ConverterForm: TForm;
  Edit: Tedit;
  Button: TButton;
begin
  ConverterForm := TForm.Create(Self);
  ConverterForm.BorderStyle := bsDialog;
  ConverterForm.Width := 250;
  ConverterForm.Height := 200;
  ConverterForm.Show;
  Edit := TEdit.Create(ConverterForm);
  Edit.Width := 100;
  Edit.Height := 25;
  Edit.Top := 50;
  Edit.Left := 75;
  Edit.Visible := True;
  Edit.Parent := ConverterForm;
  Button := TButton.Create(ConverterForm);
  Button.Width := 100;
  Button.Height := 35;
  Button.Top := 82;
  Button.Left := 75;
  Button.Caption := 'Значення';
  Button.Parent := ConverterForm;
  //With Button.OnClick do;
  //Begin
  //  Memo1.Lines.Add(Edit.Text);
  //End;
  //RemoveControl(Edit);
  //ConverterForm.InsertControl(Edit);
  //RemoveControl(Button);
  //ConverterForm.InsertControl(Button);
  //NewEdit.Free;
  //Button.Free;
  //ConverterForm.Free
end;

Але постало ще одне важливе питання: як використати в створеній кнопці Button подію OnClick??? Тобто потрібно якось з Edit передати кудись значення для подальшого його використання. Ну ось так спробував

With Button.OnClick do;
  Begin
    Memo1.Lines.Add(Edit.Text);
  End;

не компілюється програма.
Memo1 знаходиться на головній формі.

434

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Створіть процедуру і присвойте її адресу відповідним полям.

procedure ButtonClick(Sender: TObject); //скажімо, у TForm1
begin
...
end;

//у конструкторі
Button.OnClick = TForm1.ButtonClick;

435

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

koala написав:

Створіть процедуру і присвойте її адресу відповідним полям.

procedure ButtonClick(Sender: TObject); //скажімо, у TForm1
begin
...
end;

//у конструкторі
Button.OnClick = TForm1.ButtonClick;

Вибачте пане koala, але я заплутався. Дивіться я поки що не створював окремий модуль і не описував в ньому клас в якому створюватиметься ця форма з компонентами Edit та Button. Для експеременту я створив новий VCL проект в якому є Form1.
На Form1 я закинув поле редагування Memo1 та кнопку CreateForm. І ось я в події OnClick кнопки CreateForm яка знаходиться на головній формі визиваю створену форму з її компонентами Edit та Button. І от в формі яка створюється разом з компонентами мені потрібно опрацювати подію створеної кнопки OnClick. Тобто не має в мене іще конструктора.

От я і хочу щоб ви панове підказали мені синтаксис коду як мені зі створеного компонента Edit передати через подію (ОnClick створеного компонента Button) текст в Memo1 головної форми.
Тобто це все поки що без нового модуля, нового класу прописаного в цьому модулі. Про це я буду запитувати пізніше.

436

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Добре, замість конструктора хай буде TForm1.CreateFormClick.

437

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Якщо користувачу обов'язково треба розібратися з формою, перш ніж він зможе робити щось інше, то можна використати модальні форми:

procedure ChangeLines(Lines: TStrings);
Var
  ConverterForm: TForm;
  Edit: Tedit;
  ButtonOk, ButtonCancel: TButton;
begin
  ConverterForm := TForm.Create(nil);
  try
    ConverterForm.BorderStyle := bsDialog;
    ConverterForm.Width := 250;
    ConverterForm.Height := 200;
    ConverterForm.Position := poMainFormCenter;

    Edit := TEdit.Create(ConverterForm);
    Edit.Width := 200;
    Edit.Height := 25;
    Edit.Top := 40;
    Edit.Left := 25;
    Edit.Parent := ConverterForm;

    ButtonOk := TButton.Create(ConverterForm);
    ButtonOk.Width := 90;
    ButtonOk.Height := 35;
    ButtonOk.Top := 82;
    ButtonOk.Left := 30;
    ButtonOk.Caption := 'Значення';
    ButtonOk.ModalResult := mrOk;
    ButtonOk.Parent := ConverterForm;

    ButtonCancel := TButton.Create(ConverterForm);
    ButtonCancel.Width := 90;
    ButtonCancel.Height := 35;
    ButtonCancel.Top := 82;
    ButtonCancel.Left := 130;
    ButtonCancel.Caption := 'Відміна';
    ButtonCancel.ModalResult := mrCancel;
    ButtonCancel.Parent := ConverterForm;

    if ConverterForm.ShowModal = mrOk then //Виконати дію лише якщо було натиснуто кнопку "Значення"
      Lines.Text := Edit.Text;
  finally
    ConverterForm.Free; //Форма видалить кнопки і едіт
  end;
end;

procedure TForm1.CreateFormClick(Sender: TObject);
begin
  ChangeLines(Memo1.Lines);
end;

Хоча я усе таки зробив би окрему форму, і тоді у мене було б:

procedure ChangeLines(Lines: TStrings);
Var
  ConverterForm: TConverterForm;
begin
  ConverterForm := TConverterForm.Create(nil);
  try
    if ConverterForm.ShowModal = mrOk then //Виконати дію лише якщо було натиснуто кнопку "Значення"
      Lines.Text := ConverterForm.Edit1.Text;
  finally
    ConverterForm.Free;
  end;
end;

procedure TForm1.CreateFormClick(Sender: TObject);
begin
  ChangeLines(Memo1.Lines);
end;
Подякували: ProgramBandera, leofun012

438

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Torbins написав:

Якщо користувачу обов'язково треба розібратися з формою, перш ніж він зможе робити щось інше, то можна використати модальні форми:

Дякую пане Torbins!!! Саме те що я хотів досягнути! Трішки підкорегував імена об'єктів і все чудово працює!

procedure TForm1.CreateFormClick(Sender: TObject);
Var
  FormValueInput: TForm;
  Edit: Tedit;
  Button: TButton;
begin
  FormValueInput := TForm.Create(Nil);
  Try
    FormValueInput.BorderStyle := bsDialog;
    FormValueInput.Width := 166;
    FormValueInput.Height := 105;
    FormValueInput.Caption := 'Введіть значення';
    FormValueInput.Font.Size := 16;
    FormValueInput.Font.Name := 'Monotype Corsiva';
    FormValueInput.Position := poMainFormCenter;

    Edit := TEdit.Create(FormValueInput);
    Edit.Width := 150;
    Edit.Height := 20;
    Edit.Top := 4;
    Edit.Left := 5;
    Edit.Parent := FormValueInput;

    Button := TButton.Create(FormValueInput);
    Button.Width := 150;
    Button.Height := 35;
    Button.Top := 40;
    Button.Left := 5;
    Button.Caption := 'OK';
    Button.ModalResult := mrOk;
    Button.Parent := FormValueInput;

  If FormValueInput.ShowModal = MrOk Then
    Memo1.Lines.Add(Edit.Text);

  Finally
    FormValueInput.Free;
  End;
end;

Зараз буду пробувати в окремий модуль перенести цей код у власний клас. Щоб за допомогою методів викликати цю та ще декілька інших форм.

Дякую!!!

439 Востаннє редагувалося ProgramBandera (17.07.2022 16:08:53)

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Вітаю панове!
Потрібно при кліку на кнопку перевірити чи створена в папці з ЕХЕ файлом папка Фізика. Якщо ні то створити в папці з файлом програми нову папку Фізика. Далі потрібно в ній створювати текстові файли з відповідною назвою і текстовими даними.
Скажіть будь-ласка чи є функція (процедура) яка поверне мене до каталогу з ЕХЕ файлом, в обробнику події Button1Click?

procedure TForm1.Button1Click(Sender: TObject);
Var
  F: TextFile;                              // Оголошуємо Змінну F типу TextFile
begin
  If TDirectory.Exists('Фізика') = False Then // Якщо підкаталог не існує то ...
    MkDir('Фізика');                                // Створює новий підкаталог.
  AssignFile(F, Edit1.Text + '.txt');         //Призначає ім'я зовнішнього файлу
{$I-}                          // Вимкнути контроль операцій введення-виведення;
  ChDir('Фізика');                                 // Перехід в каталог 'Фізика'
  ReWrite(F);                 // Створює новий файл для запису та відкриває його
{$I+}                         // Увімкнути контроль операцій введення-виведення;
  if IOResult = 0 then                    // Якщо файл створено успішно то - ...
  Begin
    Write(F, Memo1.Text);                                 // Записує у файл дані
    CloseFile(F);                                             // Закриваємо файл
    Edit1.Clear;
    Memo1.Clear;
  End;

end;

Проблема в тому що при першому кліку по кнопці в каталозі Фізика створюється текстовий файл з назвою та текстом. Та коли вношу другі дані в поле Edit (для назви файлу) та Memo (для запису в файл) і клікаю по кнопці, то вже існуючій папці фізика створюється нова папка фізика і вже в ній створюється новий файл і так створюється цикл.
А потрібно у вже існуючій папці просто створювати новий файл.

440

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ProgramBandera написав:

Проблема в тому що при першому кліку по кнопці в каталозі Фізика створюється текстовий файл з назвою та текстом. Та коли вношу другі дані в поле Edit (для назви файлу) та Memo (для запису в файл) і клікаю по кнопці, то вже існуючій папці фізика створюється нова папка фізика і вже в ній створюється новий файл і так створюється цикл.
А потрібно у вже існуючій папці просто створювати новий файл.

Все розібрався. Потрібно було ввести змінну яка буде тримати в собі шлях назад і за допомогою функції GetCurrentDir записати туди шлях повернення.

procedure TForm1.Button1Click(Sender: TObject);
Var
  F: TextFile;                              // Оголошуємо Змінну F типу TextFile
  S: String;
begin
  S := GetCurrentDir;
  If TDirectory.Exists('Фізика') = False Then // Якщо підкаталог не існує то ...
    MkDir('Фізика');                                // Створює новий підкаталог.
  AssignFile(F, Edit1.Text + '.txt');         //Призначає ім'я зовнішнього файлу
{$I-}                          // Вимкнути контроль операцій введення-виведення;
  ChDir('Фізика');                                 // Перехід в каталог 'Фізика'
  ReWrite(F);                 // Створює новий файл для запису та відкриває його
{$I+}                         // Увімкнути контроль операцій введення-виведення;
  if IOResult = 0 then                    // Якщо файл створено успішно то - ...
  Begin
    Write(F, Memo1.Text);                                 // Записує у файл дані
    CloseFile(F);                                             // Закриваємо файл
    Edit1.Clear;
    Memo1.Clear;
  End;
  ChDir(S);
end;