301 Востаннє редагувалося ProgramBandera (15.04.2020 20:44:35)

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

koala написав:

У вас, наскільки я пам'ятаю, вже була функція, що повертала число як стрічку, крім 0, де повертала пусту стрічку. Використовуйте її, щоб отримати другий параметр: ('Fтяж%0:d = m%1:dg%1:d', [PVI,f(PVI)]), де f - та функція. Ну, чи проголосіть нову функцію, теж не складно.

Так ось вона:

Function NumberedString(format_string:string; number:integer) : string;
 var number_string : string;
  begin
   if number<>0 then
    number_string:=IntToStr(number)

   else

   number_string:=' ';
   result := Format(format_string, [number_string]);
  end;

Тоді вивід в RichEdit буде ось такий? Вибачайте за питання, наразі не можу вдкомпілювати програму щоб перевірити.

RichEdit1.Lines.Add(NumberedString('Fтяж%s = m%sg%s',PVI));

302

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

А, точно, воно ж було обгорткою над Format.
Ну тоді можна її дещо переробити (тільки треба перевірити, що другий параметр успішно ігнорується, але це 99%, що так):

Function NumberedString(format_string:string; number:integer) : string;
 var number_string : string;
  begin
   if number<>0 then
    number_string:=IntToStr(number)
   else
     number_string:=' ';
   result := Format(format_string, [number_string, number]);
  end;

Тепер

NumberedString('Стрічка з одним %s')

виведе стрічку, як треба було раніше, а

NumberedString('Стрічка з %s і кількома %1:d %1:d %0:s')

підставить замість усіх %1:d число, а замість %0:s - стрічку (можливо пусту).

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

303

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

ProgramBandera написав:

Пири PVI = 0 воно виведе Fтяж0 = m0g0, а потрібно Fтяж= mg.
Тобто мені прийдеться всерівно її два рази записувати
1. RichEdit1.Lines.Add ('Fтяж = mg');
2..7 RichEdit1.Lines.Add (Format('Fтяж%0:d = m%0:dg%0:d', [PVI]));

Є в Делфі така чудова команда, як StringReplace. Вона бере рядок, і заміняє в ньому деякі слова іншими: http://www.delphibasics.co.uk/RTL.asp?N … ingReplace
У вашому випадку буде приблизно так:

function FormulaInd(AFormula: String; AIndex: Integer): String;
begin
  Result := Format(AFormula, [AIndex]);
  if AIndex = 0 then
    Result := StringReplace(Result, '0', '', [rfReplaceAll]);
end;
Подякували: ProgramBandera, leofun012

304 Востаннє редагувалося ProgramBandera (16.04.2020 00:10:54)

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

Torbins написав:
ProgramBandera написав:

Пири PVI = 0 воно виведе Fтяж0 = m0g0, а потрібно Fтяж= mg.
Тобто мені прийдеться всерівно її два рази записувати
1. RichEdit1.Lines.Add ('Fтяж = mg');
2..7 RichEdit1.Lines.Add (Format('Fтяж%0:d = m%0:dg%0:d', [PVI]));

Є в Делфі така чудова команда, як StringReplace. Вона бере рядок, і заміняє в ньому деякі слова іншими: http://www.delphibasics.co.uk/RTL.asp?N … ingReplace
У вашому випадку буде приблизно так:

function FormulaInd(AFormula: String; AIndex: Integer): String;
begin
  Result := Format(AFormula, [AIndex]);
  if AIndex = 0 then
    Result := StringReplace(Result, '0', '', [rfReplaceAll]);
end;

Доброї ночі пане Torbins
А виклик цієї функції який матиме вигляд?

RichEdit1.Lines.Add(FormulaInd('Fтяж = m*g',[PVI]));


Так видає помилку несумісні типи Integer and Set

RichEdit1.Lines.Add(FormulaInd('Fтяж = m*g',PVI));


а так виводить просто Fтяж = m*g хоча PVI присвоєно вже не нуль а наприклад 1, повинно вивести 'Fтяж1 = m1*g1.
Бо зі стрічкою в мене зовсім не виходить.

305 Востаннє редагувалося ProgramBandera (16.04.2020 00:26:09)

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

Колись пан topprogrammer склав функцію:

const
    FloatFmt10:String = '0.##########';
    FloatFmt25:String = '0.#########################';
    FloatNum:String = '%.25g'; //тут символи замість яких буде виводитись число
function VarToString(format: string; const a: array of extended): string;
var
 i, j: integer;
 s: string;
 x: extended;
begin
   s:=format;
   for i := Low(a) to High(a) do
   begin
     j := Pos(FloatNum, s);
     Delete(s, j, Length(FloatNum));
     x := a[i];
     if x>1e18 then
       Insert(FloatToStrF(x, ffFixed, 50, 0), s, j)
     else
       if x<1e-10 then
         Insert(FormatFloat(FloatFmt25, x), s, j)
       else
         Insert(FormatFloat(FloatFmt10, x), s, j)
   end;

   VarToString:=s;
end;

виклик її ось такий

RichEdit1.Lines.Add (VarToString('Fтяж%.25g = m%.25g * g%.25g',
                       [PVI, PVI, PVI]));

В принципі можна користуватися і нею, але коли PVI := 0 то мені виводить Fтяж0 = m0*g0 а потрібно щоб нуль пропускало і виводило просто Fтяж = m*g. Якимось чином її можна переробити.

Ця функція чим вигідна що тут можна вводити будь яку кількість фізичних величин з певним індексом 1, 2, .... і так далі. І все було б чудово якби індекс 0 вона пропускала.

306

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

ProgramBandera написав:
Torbins написав:

Є в Делфі така чудова команда, як StringReplace. Вона бере рядок, і заміняє в ньому деякі слова іншими: http://www.delphibasics.co.uk/RTL.asp?N … ingReplace
У вашому випадку буде приблизно так:

function FormulaInd(AFormula: String; AIndex: Integer): String;
begin
  Result := Format(AFormula, [AIndex]);
  if AIndex = 0 then
    Result := StringReplace(Result, '0', '', [rfReplaceAll]);
end;

Доброї ночі пане Torbins
А виклик цієї функції який матиме вигляд?

RichEdit1.Lines.Add(FormulaInd('Fтяж = m*g',[PVI]));


Так видає помилку несумісні типи Integer and Set

RichEdit1.Lines.Add(FormulaInd('Fтяж = m*g',PVI));


а так виводить просто Fтяж = m*g хоча PVI присвоєно вже не нуль а наприклад 1, повинно вивести 'Fтяж1 = m1*g1.
Бо зі стрічкою в мене зовсім не виходить.

Як бачите, це дуже проста обгортка над Format, тому виклик такий:

RichEdit1.Lines.Add(FormulaInd('Fтяж%0:d = m%0:dg%0:d',PVI));
Подякували: ProgramBandera1

307

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

Torbins написав:
ProgramBandera написав:
Torbins написав:

Є в Делфі така чудова команда, як StringReplace. Вона бере рядок, і заміняє в ньому деякі слова іншими: http://www.delphibasics.co.uk/RTL.asp?N … ingReplace
У вашому випадку буде приблизно так:

function FormulaInd(AFormula: String; AIndex: Integer): String;
begin
  Result := Format(AFormula, [AIndex]);
  if AIndex = 0 then
    Result := StringReplace(Result, '0', '', [rfReplaceAll]);
end;

Доброї ночі пане Torbins
А виклик цієї функції який матиме вигляд?

RichEdit1.Lines.Add(FormulaInd('Fтяж = m*g',[PVI]));


Так видає помилку несумісні типи Integer and Set

RichEdit1.Lines.Add(FormulaInd('Fтяж = m*g',PVI));


а так виводить просто Fтяж = m*g хоча PVI присвоєно вже не нуль а наприклад 1, повинно вивести 'Fтяж1 = m1*g1.
Бо зі стрічкою в мене зовсім не виходить.

Як бачите, це дуже проста обгортка над Format, тому виклик такий:

RichEdit1.Lines.Add(FormulaInd('Fтяж%0:d = m%0:dg%0:d',PVI));

Дякую пане Torbins за підказку в правильному напрямку! Я функцію доробив для PVI > 0 все чудово працює.

function FormulaInd(Formula: String; Index: Integer): String;
var
 s: string;
begin
  s := IntToStr(Index);
  if Index = 0 then
   Result := StringReplace(Formula, '#', '', [rfReplaceAll])
  else
   Result := StringReplace(Formula, '#', s, [rfReplaceAll]);
end;

Виклик функції має вигляд:

RichEdit1.Lines.Add(FormulaInd('Fтяж# = m#*g#',PVI));

Дякую!

308

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

Привіт панове! В YouTube подивився як створювати динамічні бібліотеки DLL. У всіх роликах кажуть що в них можна зберігати файли: картинки, звуки і т.д. . Але не в одному відео я не знайшов щоб хтось це робив. Там прописують якись математичні функцїї на кшталт

Function Matematic(a,b,Index: integer): integer;
begin
 case Index of
  0: Result := a + b;
  1: Result := a - b;
 end;
end;

і розказують як цю бібліотеку підключити:

 Function Matematic(a,b,Index: integer): integer;
 External 'Fizical.dll';

В мене питання. То зберігати в самих файлах DLL інші файли, наприклат .mp3 чи .jpg, можливо? Чи це перебільшення? І можливо я не так щось зрозумів.
Бо якщо це не можливо, а ці файли можна тільки присвоювати якимось змінним, то чим тоді відрізняється динамічна бібліотека від звичайного модуля?

309

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

ProgramBandera написав:

чим тоді відрізняється динамічна бібліотека від звичайного модуля?

Бібліотека DLL (або LIB) і програма EXE відрізняються тим, що в EXE є так звана "точка входу", це звичайна функція, в якої ім'я і параметри задані так, щоб ОС змогла її знайти і викликати.

310 Востаннє редагувалося ProgramBandera (22.05.2020 17:26:56)

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

leofun01 написав:
ProgramBandera написав:

чим тоді відрізняється динамічна бібліотека від звичайного модуля?

Бібліотека DLL (або LIB) і програма EXE відрізняються тим, що в EXE є так звана "точка входу", це звичайна функція, в якої ім'я і параметри задані так, щоб ОС змогла її знайти і викликати.

Це все добре, дякую за інформацію, тільки я мав на увазі не EXE файли а чим відрізняються модулі Unit.pas від бібліотек DLL.
Та і це не голофне питання. Головне питання в тому чи мені фізично потрібно тримати файли Фізика.mp3, Швидкість.mp3, Робота.mp3, і т.д. на диску. Чи їх можна помістити в ***.DLL? Наприклад як картинка загружається в компонент Image1.

311

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

Основна відмінність у першій літері. Модулі (unit) збираються у .exe-файл статично - коли все зібрано до купи, вже не розбереш. DLL - динамічно(!) зв'язувані бібліотеки, їх можна міняти окремо від решти програми. Зокрема, кілька програм можуть використовувати один .DLL файл, бо всі будуть до нього підключатися динамічно, під час виконання.

А те, що ви питаєте, зветься "ресурсами", ресурси можна і в .EXE додавати.  В Delphi є досить зручні функції, щоб це все додавати (прямо в IDE) і витягати, на кшталт TBitMap.LoadFromResourceName. Боюся, більше по конкретно вашій версії Delphi не підкажу.

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

312

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

не треба нічого в exe додавати

313

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

koala написав:

А те, що ви питаєте, зветься "ресурсами", ресурси можна і в .EXE додавати.  В Delphi є досить зручні функції, щоб це все додавати (прямо в IDE) і витягати, на кшталт TBitMap.LoadFromResourceName. Боюся, більше по конкретно вашій версії Delphi не підкажу.

Дякую пане koala! Версія Delphi в мене Embarcadero RAD Studio 10.3.0. Справа в тому що я зараз видаляю код з основного модуля в своїй програмі та переношу його в додаткові модулі Mathematical.pas, Physics.pas, Sounds.pas. Подивившись відео про DLL вирішив що краще цей код переносити в динамічні бібліотеки. Так як в майбутньому їх можна легко доповнювати та оновлювати. В відео вісі кажуть що в цих бібліотеках можна зберігати не тільки код, а навіть якісь файли, та ніде не має відео як це робити.

Наприклад в компонента Image1 є властивість Picture, там нажавши на три крапочки вискакує діалогове вікно за допомогою якого я можу завантажити файл (ресурс) .jpg в компонент. Після того як я скомпілюю програму, я можу файл (ресурс) фізично стерти з жорсткого диску та в програмі він всерівно залишиться. Я не знаю де він там зберігається, але в програмі він є.

От в мене і питання: в бібліотеку DLL можливо так само загрузити файл (ресурс) в форматі .mp3 чи .jpg, як і в компонент "Image1." щоб після компіляції програми я міг видалити всі .mp3 та .jpg з жорсткого диска, які зараз в мене розміщені в різних папках??? Чи це просто контейнер для коду і фізично файлів (ресурсів) він зберігати не може?

В YouTube кажуть що там можливо зберігати навіть звуки, та ніхто не наводить прикладу як це робити.

Вибачайте за багато питань, але краще спочатку розібратися ніж потім знову щось переписувати.

314

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

Вам не потрібні DLL. Якщо у вас буде 4 різних exe-файли зі спільною логікою або 200 МБ дистрибутив, до якого часто буде треба випускати невеликі оновлення (хотфікси, скажімо) - тоді так, DLL ваш вибір. Поки у вас один EXE в кілька мегабайтів - нащо? Тим більше, що ви туди ще й ресурси збираєтеся пхати. Тобто код стане легше змінювати, ніж картинки? А сенс?
Не всі обирають динаміку. Існує, наприклад, дистрибутив Linux без динамічних бібліотек.

В ресурси ви можете викласти будь-який файл і працювати з ним надалі, як із файлом. DLL може містити ресурси так само, як і EXE.
Ну і, звісно, видалити ті файли ви зможете так само, як і джерельний код програми. EXE може працювати без сирців - а якщо міститиме ресурси, то і без тих файлів. Однак для компіляції вони все одно будуть потрібні.

ur_naz, може поділитеся з нами мотивацією своїх глибоких висновків? І так, я все ще чекаю на майстер-клас з використання "оператору enum" для реалізації функції перетворення координат.

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

315

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

koala написав:

В ресурси ви можете викласти будь-який файл і працювати з ним надалі, як із файлом. DLL може містити ресурси так само, як і EXE.
Ну і, звісно, видалити ті файли ви зможете так само, як і джерельний код програми. EXE може працювати без сирців - а якщо міститиме ресурси, то і без тих файлів. Однак для компіляції вони все одно будуть потрібні.

Добре, Якщо можна коротенький код як вкласти в EXE - ресурс, та як потім передати це в MediaPlayer1. Наприклад в мене є файл Атмосферний тиск.mp3.

Що мені далі робити? Напишіть хоч пару прикладів. Щоб побачити яку інформацію далі шукати в інтернеті.
В принципі ці процедури та функції мають вкладати ресурс і в DLL, я так розумію.

316

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

Наскільки я розумію, конкретно TMediaPlayer не підтримує відтворення з ресурсів, лише з файлів. В мережі є приклади, як зберегти ресурс у окремий файл і відтворити його в TMediaPlayer.
Є можливість відтворювати wav-файл з ресурсу функцією PlaySound.

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

317

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

ProgramBandera
Ресурси можна використовувати отак: http://mirsovetov.net/delphi-res.html (російською). Але mp3 напряму з ресурсів стандартним медіаплеєром відтворити не можна, треба буде зберігати у тимчасовий файл. Інший варіант класти у ресурси не mp3, а wav. Цей тип файлу може містити як не стиснуте аудіо у форматі PCM, так і стиснуте у форматі MP3. Як правильно зробити конвертацію, я сподіваюсь, ви самі знайдете інформацію. Відтворення з ресурсів виглядає приблизно так:

PlaySound('<назва русурсу wav>', 0, SND_RESOURCE or SND_ASYNC);
Подякували: ProgramBandera1

318

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

Інформація про конвертацію: https://www.afterdawn.com/glossary/term.cfm/riff-wav

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

319

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

Добрий вечір панове! І ще одне питання по ресурсах.

Я можу створити наприклад три файли зі звуковими ресурсами PhysicsSound.res, GeometrySound.res, MathematicalSound.res та підключити їх в основний модуль? Чи в мене можливий якийсь конфлікт в цій ситуації, і потрібно всі файли .WAV зберігати в одному файлі ресурсу, наприклад Sound.res,?

320 Востаннє редагувалося leofun01 (23.05.2020 20:54:17)

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

В проекті, файлів *.res може бути багато, але кожній сутності (кожному модулю *.pas) потрібно задавати не більше ніж 1 файл ресурсів.

Переглянув деякі проекти. Існують випадки, коли це виправдано.

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