41

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

topprogrammer написав:
 textBuffer : string; {змінна рівня форми}
 
 procedure AddTextLine(string text)
 begin
    textBuffer := textBuffer + text + '#13#10';
    RichEdit1.SetTextBuf('{\rtf ' + textBuffer + '}' );
 end;
 
 
 
 case ComboBox9.ItemIndex of
 0   :  begin
         if Pos('=',Edit1.Text)<>0 then
         begin
          case ComboBox15.ItemIndex of
          4: AddTextLine('t = t1');
          5: AddTextLine('t = t2');
          6: AddTextLine('t = t3');
          7: AddTextLine('t = t4');
          8: AddTextLine('t = t5');
          9: AddTextLine('t = t6');
          end;
         end
         else
         begin
          Variables[1,0] := StrToFloat(Edit1.Text);
          if CheckBox1.Checked then
          begin
           Bring_to_Power1;
           Variables[1,0] := Variables[1,0]*st1;
          end;

          case ComboBox15.ItemIndex of
          1: begin
              AddTextLine('t = t*60');
              Time_Minute(Variables[1,0]);
             end;

          2: begin
              AddTextLine('t = t*3600');
              Time_Hour(Variables[1,0]);
             end;
          end;
         end;
         {я додав 10^3 Ви можете змамінити на змінні}
         AddTextLine(ComboBox9.Text + '  ' + '=  ' +  '10'+'\super '+ '3' + '\nosupersub ' + '  ' + 'Секунд');
        end;

Дякую величезне буду пробувати.
Виходить мені потрібно замінити RichEdit1.Lines.Add на AddTextLine

42

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

Функція Format якраз придумана, щоб уникати 1000 і 1 ' та +: замість

'Це число ' + num ' тут написане' 

можна зробити

Format('Це число %d тут написане',[num]);

Коли змінних багато, це значно спрощує сприйняття.
Ну і TRichEdit.SetTextBuf - аналог TRichEdit.Lines та TRichEdit.Text, не слід їх змішувати.

RichEdit1.SetTextBuf(PChar(Format('%s %s{\rtf %s\super %s} = %f Секунд',[ComboBox9.Text, Edit1.Text, Label5.Caption, Edit8.Text, Variables[1,0]])));

Якщо ж треба залишити старий текст і додати новий, то якось так:

var size:integer;
    buffer: PChar;
    txt: string;
size := RichText1.GetTextLen + 1; {1 для нульового символа}
GetMem(buffer, size);
RichText1.GetTextBuf(buffer,size);  {читаємо в буфер, що там було}
txt := buffer + Format('...',[...]);
FreeMem(buffer, size);        {не забуваємо звільнити пам'ять}
RichText1.SetTextBuf(PChar(txt)); {повертаємо оновлений текст на місце}

(код адаптовано з http://docs.embarcadero.com/products/ra … xtBuf.html )

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

43

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

Ну і знову ж таки для лінивих:

          case ComboBox15.ItemIndex of
          4: ЩосьЗробитиЗіСтрічкою('t = t1');
          5: ЩосьЗробитиЗіСтрічкою('t = t2');
          6: ЩосьЗробитиЗіСтрічкою('t = t3');
          7: ЩосьЗробитиЗіСтрічкою('t = t4');
          8: ЩосьЗробитиЗіСтрічкою('t = t5');
          9: ЩосьЗробитиЗіСтрічкою('t = t6');
          end;

значно краще виглядає як

if ComboBox15.ItemIndex in [4..9] then ЩосьЗробитиЗіСтрічкою('t = t'+IntToStr(ComboBox15.ItemIndex-3));

чи

if ComboBox15.ItemIndex in [4..9] then ЩосьЗробитиЗіСтрічкою(Format('t = t%d',[ComboBox15.ItemIndex-3]));
Подякували: topprogrammer, ProgramBandera, root3

44 Востаннє редагувалося ProgramBandera (23.04.2019 17:56:33)

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

Пане Koala підставив ваш рядок на місце мого

RichEdit1.Lines.Add(ComboBox9.Text + '  ' + '=  ' + FloatToStr(Variables[1,0]) + '  ' + 'Секунд');
RichEdit1.SetTextBuf(PChar(Format('%s %s{\rtf %s\super %s} = %f Секунд',[ComboBox9.Text, Edit1.Text, Label5.Caption, Edit8.Text, Variables[1,0]])));

І мені в полі RichEdit1 стерло старий текст і вивело ось це t - Час 2{\rtf *10\super 3} = 2000,00 Секунд

RichText1.GetTextLen

Цей рядок підкреслено чомусь червоним.

45 Востаннє редагувалося ProgramBandera (23.04.2019 18:26:05)

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

Пане koala Давайте розберу на пальцях ваш рядок коду, я його переписав все працює, але я його не розумію.

if ComboBox15.ItemIndex in [4..9] then
RichEdit1.Lines.Add(Format('t = t%d',[ComboBox15.ItemIndex-3]));

Я так зрозумів Якщо КомбоБокс15.ІтемІндекс знаходиться в діапазоні від [4-х до 9-ти] то
до рядків поля РічЕдіт1 додати (Формат('t=t а що означає цей знак? %d' [КомбоБокс15.ІтемІндекс -3 Це перші три ітема не прописуються чи як]));

Розібратися потрібно для розуміння як прописувати наступні фізичні величини Швидкість, Переміщення, Період Частоту і так далі.

46

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

Формат RTF доволі складний, і TRichEdit не дозволяє з ним нормально працювати. Можна звичайно вдавати із себе хакера, і щось там вигадувати, але набагато простіше замінити стандартний TRichEdit на сторонній аналог з ширшими можливостями.

Подякували: Не Зелений, ProgramBandera2

47 Востаннє редагувалося ProgramBandera (23.04.2019 19:49:32)

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

Torbins написав:

Формат RTF доволі складний, і TRichEdit не дозволяє з ним нормально працювати. Можна звичайно вдавати із себе хакера, і щось там вигадувати, але набагато простіше замінити стандартний TRichEdit на сторонній аналог з ширшими можливостями.

Порадьте щось. Правда прийдеться переписати багато коду. Але якщо в майбутньому це спростить написання над- під- рядкового тексту чи формул, грець з ним з тим кодом. Я в принципі нікуди не поспішаю. Хочеться в якесь поле вивести все красиво хоча б так як на скріншоті.
https://replace.org.ua/uploads/images/6671/380a87bda10c0ebde470c753ca562f9f.png

Бо наразі в мене вивід ось такий

23.04.2019 19:34:17
------------
З однієї частини міста до іншої маршрутне таксі, рухаючись зі швидкістю 90 км/год (без зупинок), доїжджає за 15 хв. За скільки
хвилин цю саму відстань подолає велосипедист, рухаючись зі швидкістю 15 м/с?

------------
Знайти
t2 - Час  хв. - Хвилин
 
 
 
------------
Дано
v1 - Швидкість  90  км/год. - Кілометрів за годину
v2 - Швидкість  15  м/с. - Метрів за секунду
t1 - Час  15  хв. - Хвилин
   
   
   
------------
CI
v1 = v1*1000/3600
v1 - Швидкість  =  25  Метрів за секунду
v2  - Швидкість  =  15  Метрів за секунду
t1  =  t1*60
t1  -  Час  = 900  Секунд
______
Розв'язання
s1=v1*t1
s1=25*900=22500 Метрів
s1=s2
t2=s2/v2
t2=22500/15=1500 Секунд
______
Відповідь:
1500 Секунд = 25 Хвилин

48

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

koala написав:

чи

if ComboBox15.ItemIndex in [4..9] then ЩосьЗробитиЗіСтрічкою(Format('t = t%d',[ComboBox15.ItemIndex-3]));

А як тоді вивести на екран????
t1 = t
t2 = t
t3 = t
t4 = t
t5 = t
t6 = t
В мене виникла проблема не виводить просто без цифри t1 = t.

49

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

Переставте %d у стрічці формату.

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

50

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

koala написав:

Переставте %d у стрічці формату.

Як саме я маю змінити код?

if ComboBox15.ItemIndex in [4..9] then
RichEdit1.Lines.Add(Format('t = t%d',[ComboBox15.ItemIndex-3]));

51

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

Тут є приклади http://www.delphibasics.co.uk/RTL.asp?Name=format

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

52

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

Якщо

't = t%d'

в цьому коді видає результат

't = t1'

то яка форматна стрічка видасть результат

't1 = t'

?

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

53

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

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

Формат RTF доволі складний, і TRichEdit не дозволяє з ним нормально працювати. Можна звичайно вдавати із себе хакера, і щось там вигадувати, але набагато простіше замінити стандартний TRichEdit на сторонній аналог з ширшими можливостями.

Порадьте щось. Правда прийдеться переписати багато коду. Але якщо в майбутньому це спростить написання над- під- рядкового тексту чи формул, грець з ним з тим кодом. Я в принципі нікуди не поспішаю.
...

Заходите на https://github.com/project-jedi/jcl
Клікаєте по кнопці Clone or download, потім Download ZIP.
Архів розпаковуєте кудись, де його вміст зможе довго лежати і не заважати вам, але буде доступним, коли ви відкриваєте Делфі.
Потім заходите іще сюди https://github.com/project-jedi/jedi і сюди https://github.com/project-jedi/jvcl, виконуєте ті ж дії.
Файли з папки ...\jedi-master скопіюйте в ...\jcl-master\jcl\source\include\jedi
Закрийте Делфі.
Зайдіть в папку ...\jcl-master\jcl і запустіть файл Install.bat
Запуститься інсталятор, на вкладці MPL 1.1 License поставте галочку, потім клікніть по кнопці Install і декілька разів Yes.
В повідомленні ...finished... клікніть OK, а потім Quit.
Потім зайдіть в папку ...\jvcl-master\jvcl і запустіть файл Install.bat
Всюди клікайте Next, а в кінці Finish.
Коли відкриєте свій проект, то на палітрі компонент у вас з'явиться закладка Jv Edits, киньте звідти на форму TJvRichEdit.
Свій RichEdit1 видаліть, а у нового Name поміняйте на RichEdit1.
Все має працювати як і раніше, але з'являться нові можливості. Отут є демо-проект, де показано, як ними користуватися: ...\jvcl-master\jvcl\examples\JvRichEdit.

Подякували: ProgramBandera, Не Зелений2

54 Востаннє редагувалося topprogrammer (24.04.2019 17:09:53)

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

Крім згаданого вище TJvRichEdit. Можна використати HTML формат, для відображення в Делфі повинен бути компонент браузер. Або формат TeX(LaTeX), він підійшов би найкраще(використовується зокрема для відображення формул на вікіпедії), можливо на просторах інтернету знайдете компонент для відображення.

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

55 Востаннє редагувалося ProgramBandera (24.04.2019 23:53:54)

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

koala написав:

то яка форматна стрічка видасть результат

't1 = t'

?

Пане Koala я не знаю як переробити ту стрічку щоб видала такий результат я ще не розбирався. Поки пишу код як і раніше через Case

          case ComboBox15.ItemIndex of
          25: RichEdit1.Lines.Add('ρ6 = ρ');
          26: RichEdit1.Lines.Add('ρ6 = ρ1');
          27: RichEdit1.Lines.Add('ρ6 = ρ2');
          28: RichEdit1.Lines.Add('ρ6 = ρ3');
          29: RichEdit1.Lines.Add('ρ6 = ρ4');
          30: RichEdit1.Lines.Add('ρ6 = ρ5');
          end;

Цілий день розбирався як ось це правильно перевести в кг/м3 - Кілограм на метр кубічний тут без стрічки є роботи, а з нею іще на пів дня засяду.

мг/мм3 - Міліграм на міліметр кубічний
мг/см3 - Міліграм на сантиметр кубічний
мг/дм3 - Міліграм на дециметр кубічний
мг/м3 - Міліграм на метр кубічний
мг/км3 - Міліграм на кілометр кубічний
г/мм3 - Грам на міліметр кубічний
г/см3 - Грам на сантеметр кубічний
г/дм3 - Грам на дециметр кубічний
г/м3 - Грам на метр кубічний
г/км3 - Грам на кілометр кубічний
кг/мм3 - Кілограм на міліметр кубічний
кг/см3 - Кілограм на сантиметр кубічний
кг/дм3 - Кілограм на дециметр кубічний
кг/км3 - Кілограм на кілометр кубічний
ц/мм3 - Центнер на міліметр кубічний
ц/см3 - Центнер на сантиметр кубічний
ц/дм3 - Центнер на дециметр кубічний
ц/м3 - Центнер на метр кубічний
ц/км3 - Центнер на кілометр кубічний
т/мм3 - Тона на міліметр кубічний
т/см3 - Тона на сантиметр кубічний
т/дм3 - Тона на дециметр кубічний
т/м3 - Тона на метр кубічний
т/км3 - Тона на кілометр кубічний

56

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

topprogrammer написав:

Тут є приклади http://www.delphibasics.co.uk/RTL.asp?Name=format

Пане topprogrammer дякую дуже доречні посилання скидаєте, але іще більше був би вдячний щоб тих два рядка кода показали на прикладі як він має виглядати.

57

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

Добрий вечір панове програмісти.
Мені потрібно якось в поле RichEdit1 виводити фізичні визначення, наприклад

Атом — це найменша частинка речовини, яка є носiєм її хiмiчних властивостей.
Маса — це фізична величина, яка кількісно характеризує інертність тіла.

Щоб не задавати 128 констант типу string і не додавати їх по одній в коді я записав їх в текстовий файл, кожне визначення в окремому рядку.
Підкажіть будь ласка як мені з текстового файлу Definition.txt добавити певні рядки в поле RichEdit1.
Я пробував вже і квадратні дужки ставити і круглі і використовувати змінну типу string[128] всерівно програма не компілюється

procedure TForm1.BitBtn1Click(Sender: TObject);
var
    Definition : Text;
begin
    AssignFile(Definition, 'Definition.txt');
    Reset(Definition);
    RichEdit1.Lines.Add(Definition(0));
end;

Підкажіть будь-даска прикладом як мені правильно оголосити змінну і додавати ці рядки в поде RichEdit.
Наперед всім вдячний за докладний опис того як це робиться!!!

58

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

Ви хочете динамічно читати весь файл при кожній зміні чи краще прочитати один раз на початку роботи програми, а потім звертатися до масиву?
Якщо перше, то

var
    DefinitionLine:string;
...
    AssignFile(Definition, 'Definition.txt');
    Reset(Definition);
    ReadLn(Definition, DefinitionLine); {якщо треба не перший рядок - то в циклі читаєте скільки треба разів}
    RichEdit1.Lines.Add(DefinitionLine);
    FileClose(Definition); {не забуваємо закрити файл}
Подякували: ProgramBandera, leofun01, root3

59 Востаннє редагувалося ProgramBandera (04.05.2019 22:21:17)

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

koala написав:

Ви хочете динамічно читати весь файл при кожній зміні чи краще прочитати один раз на початку роботи програми, а потім звертатися до масиву?
Якщо перше, то

var
 DefinitionLine:string;
...
 AssignFile(Definition, 'Definition.txt');
 Reset(Definition);
 ReadLn(Definition, DefinitionLine); {якщо треба не перший рядок - то в циклі читаєте скільки треба разів}
 RichEdit1.Lines.Add(DefinitionLine);
 FileClose(Definition); {не забуваємо закрити файл}

Добрий вечір пане koala!
Я думав якось так

RichEdit1.Lines.Add(DefinitionLine); {Вказувати номер рядка в файлі}

Наприклад Definition 5 під цим номером рядка в мене іде визначення
Атом — це найменша частинка речовини, яка є носiєм її хiмiчних властивостей.
а Definition 40 в мене іде визначення
Маса — це фізична величина, яка кількісно характеризує інертність тіла.
Рядки в мене пронумеровані в екселі щоб я глянув, ага мені потрібно вивести рядок №5
і я записав RichEdit1.Lines.Add (Definition рядок№5);

60

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

Є такий антипатерн (нерекомендований стиль) програмування - "магічні числа". Кожне число в коді має чітко показувати, що воно означає. Тобто

for skip:=1 to 40 do
  ReadLn(Definition, DefinitionLine); {40 разів читаємо рядок}
RichEdit1.Lines.Add(DefinitionLine); {виводимо останній прочитаний}

це в будь-якому разі поганий стиль, треба робити щось на кшталт

const MASS_DEFINITION_IDX = 40;
for skip:=1 to MASS_DEFINITION_IDX do
  ReadLn(Definition, DefinitionLine);
RichEdit1.Lines.Add(DefinitionLine);

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

Якщо розповісте трохи більше про те, звідки воно береться, як із цим взаємодіє користувач та інші частини програми, то, може, пораджу щось краще.

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