261

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

Панове програмісти підкажіть чому моя публічна процедура спочатку програє звуковий файл а тоді виводить текст? Дуже потрібно навпаки. Спочатку текст а потім звук! І знову спочатку текст а потім звук!

Procedure TForm1.Definition_Play(d, f: string);
 begin
  RichEdit1.Lines.Add(d);
  RichEdit1.Lines.Add('');
  try
   MediaPlayer1.FileName := ('Медіа\Фізика\'+f);
   MediaPlayer1.Open;
   MediaPlayer1.Wait := True;
   MediaPlayer1.Play;
  finally
   MediaPlayer1.Stop;
   MediaPlayer1.Position := 0;
   MediaPlayer1.Close;
   MediaPlayer1.Wait := False;
  end;
 end;

Виклик процедури:

procedure TForm1.BitBtn7Click(Sender: TObject);
begin
 if AnsiCompareText('Фізика',Edit7.Text)=0 then
 begin
  Definition_Play (FIZIKA1,'Фізика1.mp3');
  Definition_Play (FIZIKA2,'Фізика2.mp3');
 end

 else

 if AnsiCompareText('Альтиметри',Edit7.Text)=0 then
 begin
  Definition_Play (ALTIMETRI,'Альтиметри.mp3');
 end

 else

 if AnsiCompareText('Амплітуда коливань',Edit7.Text)=0 then
.........
......
..........
.....
end;

262

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

Ну от, почалося. Вам треба не лише грати, а й синхронізувати це з іншими об'єктами. А це вже складніше.
Для початку - суть проблеми: перемалювати елемент форми - це складна операція (зокрема, тому, що часто це потребує перемалювати всю форму), тому всі дії, що змінюють форму, не перемальовують її, а лише позначають, що форму треба перемалювати (методом Invalidate, якщо цікаво). Коли наступного разу буде час (тобто після того, як відпрацюють всі процедури), форма буде перемальована, але для вас це запізно. Рішення:
- Можете викликати Refresh чи Repaint на потрібному контролі, щоб його перемалювати примусово (з усіма залежними контролами) або Update (тільки сам контрол, але тоді можливі накладки з іншими контролами). Проблема в тому, що якщо ви це робитимете надто часто, то програма буде лише те й робити, що перемальовуватися замість працювати.
- Можете створити складніший обробник для програвача - наприклад, додати чергу файлів, що їх треба програти. Тоді можна буде прибрати MediaPlayer1.Wait := True;, який і не дає перемалювати форму.

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

263

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

koala написав:

- Можете викликати Refresh чи Repaint на потрібному контролі, щоб його перемалювати примусово (з усіма залежними контролами) або Update (тільки сам контрол, але тоді можливі накладки з іншими контролами). Проблема в тому, що якщо ви це робитимете надто часто, то програма буде лише те й робити, що перемальовуватися замість працювати.

Пане koala ви дуже дуже розумна людина! А можете такому неуку як я показати в процедурі як і де викликати Refresh чи Repaint?

Procedure TForm1.Definition_Play(d, f: string);
 begin
  try
   RichEdit1.Lines.Add(d);
   RichEdit1.Lines.Add('');
   MediaPlayer1.FileName := ('Медіа\Фізика\'+f);
   MediaPlayer1.Open;
   MediaPlayer1.Wait := True;
   MediaPlayer1.Play;
  finally
   MediaPlayer1.Stop;
   MediaPlayer1.Position := 0;
   MediaPlayer1.Wait := False;
   MediaPlayer1.Close;
  end;
 end;

Будь ласка! *SORRY*

264 Востаннє редагувалося ProgramBandera (03.02.2020 02:01:57)

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

І ще одне питання. А можливо MediaPlayer1 в цій процедурі створити динамічно? І після програшу його знищити. Тоді можливо хоча б буде звук текст, звук текст чергуватися?

Procedure TForm1.Definition_Play(d, f: string);
 begin
  try
   RichEdit1.Lines.Add(d);
   RichEdit1.Lines.Add('');
   MediaPlayer1.FileName := ('Медіа\Фізика\'+f);
   MediaPlayer1.Open;
   MediaPlayer1.Wait := True;
   MediaPlayer1.Play;
  finally
   MediaPlayer1.Stop;
   MediaPlayer1.Position := 0;
   MediaPlayer1.Wait := False;
   MediaPlayer1.Close;
  end;
 end;

Як це робиться TForm1.Create (MediaPlayer1: TMediaPlayer;);
І далі MediaPlayer1.Visible := False;
А в кінці процедури MediaPlayer1.Destroy;
Якось так? Чи я цим кодом нічого нового не створив?
Тому що MediaPlayer1.Refresh і MediaPlayer1.Repaint Не допомагає.

265

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

Просто

RichEdit1.Update;

десь після RichEdit1.Lines.Add і перед MediaPlayer1.Play.

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

266

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

Як варіант, можна викликати

Application.ProcessMessages;
Подякували: ProgramBandera1

267

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

koala написав:

Просто

RichEdit1.Update;

десь після RichEdit1.Lines.Add і перед MediaPlayer1.Play.

ДУЖЕ ДУЖЕ дякую. Все синхронізувалось, текст виводиться, а після цього програється файла .mp3.  *YAHOO*

 Procedure TForm1.Definition_Play(d, f: string);
 begin
  try
   RichEdit1.Lines.Add(d);
   RichEdit1.Lines.Add('');
   RichEdit1.Update;
   MediaPlayer1.FileName := ('Медіа\Фізика\'+f);
   MediaPlayer1.Open;
   MediaPlayer1.Wait := True;
   MediaPlayer1.Play;
  finally
   MediaPlayer1.Stop;
   MediaPlayer1.Position := 0;
   MediaPlayer1.Wait := False;
   MediaPlayer1.Close;
  end;
 end;

268 Востаннє редагувалося ProgramBandera (12.02.2020 01:56:28)

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

Доброї ночі панове! Скажіть будь-ласка чи можливо ось такий код як в процедурі PDVMD задати циклом? І якщо так то як його правильно скласти?
Мені потрібно якось ItemIndex прив'язати до двохвимірного масиву

Variables: array [1..56, 0..6] of extended;

Щоб я міг в процедурі записати наприклад:

Variables[FizVel,K1FizVel] := Variables[FizVel,K1FizVel];
Код
Procedure TForm1.PDVMD;
var
 FizVel, K1FizVel: integer;
 begin
  if ComboBox9.ItemIndex = 0 then
   begin
    FizVel := 1;
    K1FizVel := 0;
   end

  else

  if ComboBox9.ItemIndex = 1 then
   begin
    FizVel := 1;
    K1FizVel := 1;
   end

  else

  if ComboBox9.ItemIndex = 2 then
   begin
    FizVel := 1;
    K1FizVel := 2;
   end

  else

  if ComboBox9.ItemIndex = 3 then
   begin
    FizVel := 1;
    K1FizVel := 3;
   end

  else

  if ComboBox9.ItemIndex = 4 then
   begin
    FizVel := 1;
    K1FizVel := 4;
   end

  else

  if ComboBox9.ItemIndex = 5 then
   begin
    FizVel := 1;
    K1FizVel := 5;
   end

  else

  if ComboBox9.ItemIndex = 6 then
   begin
    FizVel := 1;
    K1FizVel := 6;
   end

  else

  if ComboBox9.ItemIndex = 7 then
   begin
    FizVel := 2;
    K1FizVel := 0;
   end

  else

  if ComboBox9.ItemIndex = 8 then
   begin
    FizVel := 2;
    K1FizVel := 1;
   end

  else

  if ComboBox9.ItemIndex = 9 then
   begin
    FizVel := 2;
    K1FizVel := 2;
   end

  else

  if ComboBox9.ItemIndex = 10 then
   begin
    FizVel := 2;
    K1FizVel := 3;
   end

  else

  if ComboBox9.ItemIndex = 11 then
   begin
    FizVel := 2;
    K1FizVel := 4;
   end

  else

  if ComboBox9.ItemIndex = 12 then
   begin
    FizVel := 2;
    K1FizVel := 5;
   end

  else

  if ComboBox9.ItemIndex = 13 then
   begin
    FizVel := 2;
    K1FizVel := 6;
   end

  else

  if ComboBox9.ItemIndex = 14 then
   begin
    FizVel := 3;
    K1FizVel := 0;
   end

  else

  if ComboBox9.ItemIndex = 15 then
   begin
    FizVel := 3;
    K1FizVel := 1;
   end

  else

  if ComboBox9.ItemIndex = 16 then
   begin
    FizVel := 3;
    K1FizVel := 2;
   end

  else

  if ComboBox9.ItemIndex = 17 then
   begin
    FizVel := 3;
    K1FizVel := 3;
   end

  else

  if ComboBox9.ItemIndex = 18 then
   begin
    FizVel := 3;
    K1FizVel := 4;
   end

  else

  if ComboBox9.ItemIndex = 19 then
   begin
    FizVel := 3;
    K1FizVel := 5;
   end

  else

  if ComboBox9.ItemIndex = 20 then
   begin
    FizVel := 3;
    K1FizVel := 6;
   end

  else

  ........
  ..........
  ............
  .............

  if ComboBox9.ItemIndex = 385 then
   begin
    FizVel := 56;
    K1FizVel := 0;
   end

  else

  if ComboBox9.ItemIndex = 386 then
   begin
    FizVel := 56;
    K1FizVel := 1;
   end

  else

  if ComboBox9.ItemIndex = 387 then
   begin
    FizVel := 56;
    K1FizVel := 2;
   end

  else

  if ComboBox9.ItemIndex = 388 then
   begin
    FizVel := 56;
    K1FizVel := 3;
   end

  else

  if ComboBox9.ItemIndex = 389 then
   begin
    FizVel := 56;
    K1FizVel := 4;
   end

  else

  if ComboBox9.ItemIndex = 390 then
   begin
    FizVel := 56;
    K1FizVel := 5;
   end

  else

  if ComboBox9.ItemIndex = 391 then
   begin
    FizVel := 56;
    K1FizVel := 6;
   end;

 end;
  1. Тобто я маю 392 ItemIndex які рахуються від 0 до 391. І коли вибраний певний ItemIndex змінній FizVel присвоювалось певне значення в межах 1 до 56, а змінній K1FizVel присвоювалось певне значення в межах від 0 до 6.

  2. При кожній зміні ItemIndex через сім одиниць, змінній FizVel присвоювалася + одиниця і так від 1 до 56;

  3. В той же час кожний раз при зміні ItemIndex протягом сіми одиниць змінній K1FizVel присвоювалася + одиниця від 0 до 6;

Через if then else це можна зробити так як в коді наведеному вище, але великий код получиться. Можливо це неподобство можна задати якось циклом і хтось надасть приклад коду як в цикл можна прив'язати ComboBox9.ItemIndex.

269 Востаннє редагувалося koala (12.02.2020 10:23:28)

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

Взагалі треба було б на теорію груп послатися, але вам, гадаю, достатньо буде цього.
P.S. цикл - це коли якась дія повторюється, а у вас дія виконується один раз.

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

270 Востаннє редагувалося ProgramBandera (12.02.2020 09:49:09)

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

koala написав:

Взагалі треба було б на теорію груп послатися, але вам, гадаю, достатньо буде цього.
P.S. цикл - це коли якась дія повторюється, а у вас дія виконується один раз.

Дякую пане koala. Посилання чомусь не відкривається.  І ніяк інакше його не можна оптимізувати?

271

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

Виправив посилання.
Вам цього вистачить з головою.

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

272

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

koala написав:

Вам цього вистачить з головою.

Хммм... Як ви там пишите пане koala, коли вам задають не правильно поставлені питання Ви досі думаєте що ми телепати, код в студію якщо я не помиляюсь то я вас процитував. Я не знаю як використати тут div mod. Якщо ви знаєте то підкажіть кодом, і я вам буду дуже вдячний. Якщо ні то просто не відповідайте на це питання.

273

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

FizVel := (ComboBox9.ItemIndex div 7) + 1;
K1FizVel := ComboBox9.ItemIndex mod 7;
Подякували: ProgramBandera, koala2

274 Востаннє редагувалося koala (12.02.2020 16:51:53)

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

Будь ласка, я просто подумав, що вам самому буде цікавіше.

    FizVel := ComboBox9.ItemIndex div 7 + 1;
    K1FizVel := ComboBox9.ItemIndex mod 7;

Перевірка:

ComboBox9.ItemIndex =   0 => FizVel =  1, K1FizVel = 0;
ComboBox9.ItemIndex = 389 => FizVel = 56, K1FizVel = 4.

Все як у вас.

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

275

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

topprogrammer написав:
FizVel := (ComboBox9.ItemIndex div 7) + 1;
K1FizVel := ComboBox9.ItemIndex mod 7;

Дякую пане topprogrammer!!! Я якось задав цикл, хоча пан коала казав що це не цикл, але в мене щось трішки не так вийшло. Тобто другій змінній присвоїло не те значення Чомусь вийшло 14. Якщо є вільна хвилинка можливо підкажете що не так зробив.

Procedure TForm1.PDVMD;
var
 i, j, FizVel, K1FizVel, K2FizVel: integer;
 begin
  FizVel := 1;
  K1FizVel := 0;
   for i := 1 to ComboBox9.ItemIndex do
    begin
     FizVel := FizVel +1;
     for j := 1 to 7 do
      begin
       K1FizVel := K1FizVel + 1;
      end;
    end;
  RichEdit1.Lines.Add(IntToStr(FizVel));
  RichEdit1.Lines.Add(IntToStr(K1FizVel))
 end;

Останні два рядки в процедурі для тесту. В майбутньому вони не будуть потрібні.RichEdit1.Lines.Add(IntToStr(FizVel));
  RichEdit1.Lines.Add(IntToStr(K1FizVel)).

276

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

Procedure TForm1.PDVMD;
var
 FizVel, K1FizVel: integer;
 begin
    FizVel := (ComboBox9.ItemIndex div 7) + 1;
    K1FizVel := ComboBox9.ItemIndex mod 7;
    RichEdit1.Lines.Add(IntToStr(FizVel));
    RichEdit1.Lines.Add(IntToStr(K1FizVel))
 end;
Подякували: koala, ProgramBandera2

277

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

koala написав:

Будь ласка, я просто подумав, що вам самому буде цікавіше.

    FizVel := ComboBox9.ItemIndex div 7 + 1;
    K1FizVel := ComboBox9.ItemIndex mod 7;

Перевірка: ComboBox9.ItemIndex = 0 => FizVel =1, K1FizVel =0; ComboBox9.ItemIndex = 389  => FizVel =56, K1FizVel = 4. Все як у вас.

Ой пане koala велике вам дякую!!! Я звичайно вже наглію, а ви на попередній мій цикл можете глянути?

278

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

     for j := 1 to 7 do
      begin
       K1FizVel := K1FizVel + 1;
      end;

Ця операція, якщо ви не знаєте, зветься множенням, і її зазвичай записуть скорочено:

       K1FizVel := K1FizVel + 1*7;

чи навіть просто, підставивши результат множення,

       K1FizVel := K1FizVel + 7;

Я б не наводив цей код, але ви ж, як бачимо, не телепат.

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

279

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

Викиньте цикл. Ви ним намагаєтеся елементарну математику відтворювати.

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

280

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

koala написав:

Викиньте цикл. Ви ним намагаєтеся елементарну математику відтворювати.

Цикл я написав для того щоб хоч якось підняти самооцінку. Тому що на папері я це за пару секунд роблю. А от кодом записати, на це буває пару днів потрібно. А тут якщо перше значення вийшло правильно, значить я хоч трохи не такий і неук. Ще б за день я і в циклі добився б вірного другого значення. Дякую!