Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.
https://docwiki.embarcadero.com/Librari … irectories
ForceDirectories('D:\Hello\World')
Перевіряє наявніть вказаного шляху. Якщо відсутній - створює
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Pascal/Delphi → Програма розв'язування задач з фізики! Для учнів 7-го класу.
Сторінки Попередня 1 … 21 22 23 24 25 26 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
https://docwiki.embarcadero.com/Librari … irectories
ForceDirectories('D:\Hello\World')
Перевіряє наявніть вказаного шляху. Якщо відсутній - створює
Взагалі не раджу активно використовувати Get/SetCurrentDir. У якийсь момент можна забути, що і де змінив (або система змінить активний каталог) - звідти означені помилки. Завжди повні шляхи + ParamStr(0), якщо треба танцювати відносно каталога з програмою. І проблем не буде
Як варіант одразу після запуска програми
var
Form1: TForm;
WorkDir: string;
...
begin
WorkDir:= IncludeTrailingPathDelimiter(ParamStr(0)) + 'Фізика';
ForceDirectories(WorkDir);
end;
...
PROFIT
Працюєш з каталогом WorkDir без GetCurrentDir
Далі
F: TextFile;
Використовується древній паскалевський метод роботи з файлами, тоді як можна однією строкою
Memo.Lines.SaveToFile(WorkDir + '\FileName.txt');
Я не кажу, що цей метод взагалі не можна використовувати нині. Наприклад, якщо треба вести файловий лог з дозаписом інформації "на льоту" - тоді так (відкрив, записав, закрив).
IncludeTrailingPathDelimiter(ParamStr(0))
Тут швидше має бути "ExtractFilePath(ParamStr(0))".
DenNik написав:IncludeTrailingPathDelimiter(ParamStr(0))
Тут швидше має бути "ExtractFilePath(ParamStr(0))".
Так, забув
Усім гарного дня панове. Ще раз хочу повернутись до попередньої теми.
Створив я форму з двома компонентами 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?
А чому ви вирішили, що крапка - це #110? #110 досі було 'n'. Крапка - #46.
https://uk.wikipedia.org/wiki/ASCII
А чому ви вирішили, що крапка - це #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;
Там - коди клавіш (наприклад, y, Y, н та Н - одна клавіша, код 89). А KeyPress отримує код символу після обробки драйвером клавіатури. Код коми можете подивитися в ASCII, якщо хочете саме кодами. З кодами клавіатури працюють OnKeyDown та OnKeyUp.
А взагалі краще не блокуйте введення, а перевіряйте, чи весь вираз можна перевести в число. Скажімо, 1,2,3 не є числом, але ви дозволяєте таке вводити. Натомість у вас не працює delete та від'ємні числа.
А взагалі краще не блокуйте введення, а перевіряйте, чи весь вираз можна перевести в число. Скажімо, 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!
TNumEdit - це якийсь нестандартний компонент? Зверніться до його документації.
TNumEdit - це якийсь нестандартний компонент? Зверніться до його документації.
Для того щоб в Edit обробити подію KeyPress я зробив такі маніпуляції:
Створив новий тип TNumEdit = Class (TCustomEdit)
TNumEdit = Class (TCustomEdit)
Protected
Procedure KeyPress(Var Key: Char); Override;
End;
та перевизначив в ньому подію KeyPress
В цій події потрібно якось ввести перевірку на кому та знак мінус, тільки от не можу ніяк спроектувати це правильно.
Потрібно щось на кшталт цього:
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;
Якщо TFloatSpinEdit не підходить, то в TEdit або TCustomEdit є властивість NumbersOnly = True;
Якщо TFloatSpinEdit не підходить, то в TEdit або TCustomEdit є властивість NumbersOnly = True;
Так я знаю, але NumbersOnly = True; ні коми ні знака мінус не вводить! А мені потрібно відємні дійсні числа використовувати також.
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.
Панове, робимо правильно
Далі базовий шаблон для вирішення означених задач щодо вводу "тільки чисел"
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;
Щодо мінуса можна зробити трохи інакше. При вводі мінуса на будь-якій позиції просто пхати йон на початок строки. Але нехай це буде домашнім завданням
Також можна додати перевірку, щоб не можна було ввести щось на кшталт "000123", але це не критично, оскільки конвертація типів це пропустить
Добрий вечір! Підкажіть панове як заповнити посимвольно динамічний масив?
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;
І при натисканні на кнопку вибиває помилку: