441

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

https://docwiki.embarcadero.com/Librari … irectories

ForceDirectories('D:\Hello\World')

Перевіряє наявніть вказаного шляху. Якщо відсутній - створює

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

442

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

Взагалі не раджу активно використовувати Get/SetCurrentDir. У якийсь момент можна забути, що і де змінив (або система змінить активний каталог) - звідти означені помилки. Завжди повні шляхи + ParamStr(0), якщо треба танцювати відносно каталога з програмою. І проблем не буде

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

443

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

Як варіант одразу після запуска програми

var
  Form1: TForm;
  WorkDir: string;

...
begin
  WorkDir:= IncludeTrailingPathDelimiter(ParamStr(0)) + 'Фізика';
  ForceDirectories(WorkDir);
end;
...

PROFIT
Працюєш з каталогом WorkDir без GetCurrentDir

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

444

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

Далі

F: TextFile;

Використовується древній паскалевський метод роботи з файлами, тоді як можна однією строкою

Memo.Lines.SaveToFile(WorkDir + '\FileName.txt');

Я не кажу, що цей метод взагалі не можна використовувати нині. Наприклад, якщо треба вести файловий лог з дозаписом інформації "на льоту" - тоді так (відкрив, записав, закрив).

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

445

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

DenNik написав:
IncludeTrailingPathDelimiter(ParamStr(0))

Тут швидше має бути "ExtractFilePath(ParamStr(0))".

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

446

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

Torbins написав:
DenNik написав:
IncludeTrailingPathDelimiter(ParamStr(0))

Тут швидше має бути "ExtractFilePath(ParamStr(0))".

Так, забув

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

447

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

Усім гарного дня панове. Ще раз хочу повернутись до попередньої теми.
Створив я форму з двома компонентами Button та Edit.

procedure TAuxiliaryForms.SetFormInput;
var
  Edit: TNumEdit;
  Button: TButton;
begin
  fForm := TForm.Create(Nil);
  Try
    fForm.BorderStyle := bsDialog;
    fForm.Width := 166;
    fForm.Height := 105;
    fForm.Caption := 'Введіть значення';
    fForm.Font.Size := 16;
    fForm.Font.Name := 'Monotype Corsiva';
    fForm.Position := poMainFormCenter;

    Edit := TNumEdit.Create(fForm);
    Edit.Width := 150;
    Edit.Top := 4;
    Edit.Left := 5;

    Edit.Parent := fForm;

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

    If fForm.ShowModal = mrOK Then
    Begin
      If Edit.Text = '' Then
        Exit
      Else
      Begin
        SetNumValue(StrToFloat(Edit.Text));
        SetStrValue(Edit.Text);
      End;
    End;

  Finally
    fForm.Free;
  End;
end;

Для того щоб в Edit обробити подію KeyPress я зробив такі маніпуляції:

Створив новий тип та перевизначив в ньому подію KeyPress

TNumEdit = Class (TCustomEdit)

    Protected
      Procedure KeyPress(Var Key: Char); Override;

  End;
procedure TNumEdit.KeyPress(var Key: Char);
begin
  inherited;
  case Key of
    '0'..'9', #8, #110: ;
  else
    Key := #0;
  end;
end;

В мене питання чому backspace #8 в мене працює, а не вводиться та крапка decimal point #110 в створеній моїй формі???
Як мені зробити щоб в те поле користувач міг вводити не тільки числа типу Integer а й типу Real та Extended?

448

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

А чому ви вирішили, що крапка - це #110? #110 досі було 'n'. Крапка - #46.
https://uk.wikipedia.org/wiki/ASCII

Подякували: ProgramBandera, leofun012

449

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

koala написав:

А чому ви вирішили, що крапка - це #110? #110 досі було 'n'. Крапка - #46.
https://uk.wikipedia.org/wiki/ASCII

Бо зайшов на ось цей сайт:
https://keycode.inicar.info/KeyCode/1_KeyCode.php

Дякую пане koala там взагалі потрібно кому. З крапкою видає помилку. Не переводить в тип Real, та я згадав що можна ще й так:

procedure TNumEdit.KeyPress(var Key: Char);
begin
  inherited;
  if ((key < '0') or (key > '9')) and (Key <> #8) and (Key <> ',') then
    Key := #0;
end;

450

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

Там - коди клавіш (наприклад, y, Y, н та Н - одна клавіша, код 89). А KeyPress отримує код символу після обробки драйвером клавіатури. Код коми можете подивитися в ASCII, якщо хочете саме кодами. З кодами клавіатури працюють OnKeyDown та OnKeyUp.
А взагалі краще не блокуйте введення, а перевіряйте, чи весь вираз можна перевести в число. Скажімо, 1,2,3 не є числом, але ви дозволяєте таке вводити. Натомість у вас не працює delete та від'ємні числа.

Подякували: ProgramBandera, leofun012

451 Востаннє редагувалося ProgramBandera (21.07.2022 14:57:01)

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

koala написав:

А взагалі краще не блокуйте введення, а перевіряйте, чи весь вираз можна перевести в число. Скажімо, 1,2,3 не є числом, але ви дозволяєте таке вводити. Натомість у вас не працює delete та від'ємні числа.

Так я вже помітив що кому можна ввести декілька разів! А як мені цю проблему вирішити, якщо ось так не працює

procedure TNumEdit.KeyPress(var Key: Char);
begin
  inherited;
  case Key of
    '0'..'9', #8: ;
    ',': if Pos(',',TNumEdit.Text) <> 0  then
           Key := #0;
    '-': if Pos('-',TNumEdit.Text) <> 0  then
           Key := #0;
  else
    Key := #0;
  end;
end;

Пише немає властивості .Text!

452

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

TNumEdit - це якийсь нестандартний компонент? Зверніться до його документації.

453 Востаннє редагувалося ProgramBandera (21.07.2022 16:06:52)

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

koala написав:

TNumEdit - це якийсь нестандартний компонент? Зверніться до його документації.

Для того щоб в Edit обробити подію KeyPress я зробив такі маніпуляції:

Створив новий тип TNumEdit = Class (TCustomEdit)

TNumEdit = Class (TCustomEdit)

    Protected
      Procedure KeyPress(Var Key: Char); Override;

  End;

та перевизначив в ньому подію KeyPress

454

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

В цій події потрібно якось ввести перевірку на кому та знак мінус, тільки от не можу ніяк спроектувати це правильно.
Потрібно щось на кшталт цього:

procedure TNumEdit.KeyPress(var Key: Char);
begin
  inherited;

    if ((key < '0') or (key > '9')) and (Key <> #8) and (Key <> ',') and (Key <> '-') then
    begin
      if (Key <> '-') then
        if ((key < '0') or (key > '9')) and (Key <> #8) and (Key <> ',') then
          Key := #0;
      if (Key <> ',') then
        if ((key < '0') or (key > '9')) and (Key <> #8) then
          Key := #0;
    end;
end;

455

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

Якщо TFloatSpinEdit не підходить, то в TEdit або TCustomEdit є властивість NumbersOnly = True;

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

456

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

leofun01 написав:

Якщо TFloatSpinEdit не підходить, то в TEdit або TCustomEdit є властивість NumbersOnly = True;

Так я знаю, але NumbersOnly = True; ні коми ні знака мінус не вводить! А мені потрібно відємні дійсні числа використовувати також.

457

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

ProgramBandera написав:
procedure TNumEdit.KeyPress(var Key: Char);
begin
  inherited;
  case Key of
    '0'..'9', #8: ;
    ',': if Pos(',',TNumEdit.Text) <> 0  then
           Key := #0;
    '-': if Pos('-',TNumEdit.Text) <> 0  then
           Key := #0;
  else
    Key := #0;
  end;
end;

Замість "TNumEdit.Text" пишіть просто "Text".

Взагалі згодний з leofun01, вам більше підійде TMaskEdit або TNumberBox.

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

458

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

Панове, робимо правильно :)
Далі базовий шаблон для вирішення означених задач щодо вводу "тільки чисел"

procedure TNumEdit.KeyPress(var Key: Char);
begin
  case Key of

    // пропуск дозволених символів
    '0'..'9',#8 {backspace. delete дозволено апріорі, для нього перевірка не потрібна};

    // корекція символа-роздільника. пофіг, що натискати (кома або крапка)
    // дозвіл тільки одного символа.
    // заборона символа на початку строки
    '.',',': if (Pos(FormatSettings.DecimalSeparator,Text) = 0)
             and (SelStart > 0)
             then Key:= FormatSettings.DecimalSeparator else Key:= #0;

    // дозвіл мінуса тільки на початку строки
    '-': if (Pos('-',Text) <> 0) or (SelStart <> 0) then Key:= #0;

    // заборона інших символів
    else Key:= #0;

  end;
end;

Щодо мінуса можна зробити трохи інакше. При вводі мінуса на будь-якій позиції просто пхати йон на початок строки. Але нехай це буде домашнім завданням

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

459

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

Також можна додати перевірку, щоб не можна було ввести щось на кшталт "000123", але це не критично, оскільки конвертація типів це пропустить

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

460

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

Добрий вечір! Підкажіть панове як заповнити посимвольно динамічний масив?

procedure TForm1.Button2Click(Sender: TObject);
Var
  NumberString: Array Of String;  // Створюю динамічний масив
  I, NumberOfDigits: Integer;     // Змінні для лічильника та довжини масиву
Begin

  If Edit2.Text = '' Then      // Якщо Edit порожній то виходимо з процедури
    Abort
  Else     // Інакше визначаємо кількість символів в Edit
    Begin  // Наприклад в Edit '123' введено три символа
      NumberOfDigits := Length(Edit2.Text);
      // задаємо довжину масиву з трьох символів, так як NumberString масив
      // починається з нуля то від довжини віднімаєм одиницю
      SetLength(NumberString, NumberOfDigits-1);
     // Для І починаючи з нуля і до NumberOfDigits(довжини масиву) виконувати
      For I := 0 To NumberOfDigits Do
      Begin
      // кожному елементу масиву присвоюємо символ з рядка Edit починаючи з
      //першого символу рядка: для цього до І додаємо 1
        NumberString[i]:= Edit2.Text[I+1];
        // Виводжу для перевірки в Мемо
        Memo1.Lines.Add(NumberString[i])
      End;
    End;

end;

І при натисканні на кнопку вибиває помилку:

https://replace.org.ua/uploads/images/6671/363e4bc177a23bdd93cced87502ccf73.bmp