361

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

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

Покажіть, будь ласка, який у вас тепер код в TForm2.Button1Click.

Там поки що нічого не змінилось:

procedure TForm2.Button1Click(Sender: TObject);
var
 a: string;
begin
 a := Edit1.Text;
 RichEdit1.Lines.LoadFromStream(DefinitionText(a));
 PlaySound(PChar('S ' + a), 0, SND_RESOURCE or SND_ASYNC);
end;

У вас тут пам'ять тече. TResourceStream, який повертає DefinitionText, після використання треба видалити.

ProgramBandera написав:

Я напевно таку саму умову можу використати і для функції PlaySound: try ... except   on e: EResNotFound do ... end.

PlaySound не кидає виключень, це проста функція, яка повертає звичайний Boolean.

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

362 Востаннє редагувалося ProgramBandera (17.07.2020 23:29:53)

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

Torbins написав:
procedure DefinitionText(Text: String; AMemo: TCustomMemo);
var
 s: TResourceStream;
begin
 s := nil;
 try
  try
   s := TResourceStream.Create(HInstance, 'T ' + Text, RT_RCData);
  except
   on e: EResNotFound do
   begin
    ShowMessage(Text + ' не підтримується');
    Exit;
   end;
  end;
  AMemo.Lines.LoadFromStream(s);
 finally
  s.Free;
 end;
 PlaySound(PChar('S ' + Text), 0, SND_RESOURCE or SND_ASYNC);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 DefinitionText(Edit1.Text, RichEdit1);
end;

Писав писав, і все марно!!!  *WALL*  Мені потрібно щоб воно додавало текст в RichEdit1, а не замінювало на новий.

procedure DefinitionTextPlay(ResourceName: String; Editor: TCustomMemo);
var
 Text: TResourceStream;
 Play: Boolean;
begin
 Text := nil;
 Play := True;
 try
  try
   Text := TResourceStream.Create(HInstance, 'T ' + ResourceName, RT_RCData);
  except
   on e: EResNotFound do
   begin
    Play := False;
    Text := TResourceStream.Create(HInstance, 'T Визначення не знайдено', RT_RCData);
   end;
  end;
  Editor.Lines.LoadFromStream(Text);
 finally
  Text.Free;
 end;
 if Play = True then
  PlaySound(PChar('S ' + ResourceName), 0, SND_RESOURCE or SND_ASYNC)
 else
  PlaySound('S Визначення не знайдено', 0, SND_RESOURCE or SND_ASYNC);
end;

А в редакторі він замінюється на новий. Ввів в Edit1 слово КУБ в RichEdit1 вивело текст ресурсу і озвучило. Ввів Сила визначення куба стерло і вивело текст ресурсу сила. Лаятись вже хочеться!!! І як добитись щоб попередній текст лишався??? %)

363

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

ProgramBandera написав:

Писав писав, і все марно!!!  *WALL*  Мені потрібно щоб воно додавало текст в RichEdit1, а не замінювало на новий.

procedure DefinitionTextPlay(ResourceName: String; Editor: TCustomMemo);
var
 Text: TResourceStream;
 Play: Boolean;
begin
 Text := nil;
 Play := True;
 try
  try
   Text := TResourceStream.Create(HInstance, 'T ' + ResourceName, RT_RCData);
  except
   on e: EResNotFound do
   begin
    Play := False;
    Text := TResourceStream.Create(HInstance, 'T Визначення не знайдено', RT_RCData);
   end;
  end;
  Editor.Lines.LoadFromStream(Text);
 finally
  Text.Free;
 end;
 if Play = True then
  PlaySound(PChar('S ' + ResourceName), 0, SND_RESOURCE or SND_ASYNC)
 else
  PlaySound('S Визначення не знайдено', 0, SND_RESOURCE or SND_ASYNC);
end;

А в редакторі він замінюється на новий. Ввів в Edit1 слово КУБ в RichEdit1 вивело текст ресурсу і озвучило. Ввів Сила визначення куба стерло і вивело текст ресурсу сила. Лаятись вже хочеться!!! І як добитись щоб попередній текст лишався??? %)

Можна й додавати, але якщо в ресурсах форматований текст, то потрібен буде проміжний TRichEdit:

procedure DefinitionTextPlay(ResourceName: String; Editor: TCustomMemo);
var
 Res: TResourceStream;
 RTFBuf: TRichEdit;
 Play: Boolean;
begin
 Res := nil;
 RTFBuf := nil;
 Play := True;
 try
  try
   Res := TResourceStream.Create(HInstance, ResourceName, RT_RCData);
  except
   on e: EResNotFound do
   begin
    Play := False;
    Res := TResourceStream.Create(HInstance, 'T Визначення не знайдено', RT_RCData);
   end;
  end;
  RTFBuf := TRichEdit.Create(Editor.Owner);
  RTFBuf.Visible := False;
  RTFBuf.Parent := Editor.Parent;
  RTFBuf.Lines.LoadFromStream(Res);
  RTFBuf.SelectAll;
  RTFBuf.CutToClipboard;
  Editor.PasteFromClipboard;
 finally
  RTFBuf.Free;
  Res.Free;
 end;
 if Play = True then
  PlaySound(PChar('S ' + ResourceName), 0, SND_RESOURCE or SND_ASYNC)
 else
  PlaySound('S Визначення не знайдено', 0, SND_RESOURCE or SND_ASYNC);
end;
Подякували: ProgramBandera1

364 Востаннє редагувалося ProgramBandera (23.07.2020 23:16:34)

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

Torbins написав:

Можна й додавати, але якщо в ресурсах форматований текст, то потрібен буде проміжний TRichEdit:

procedure DefinitionTextPlay(ResourceName: String; Editor: TCustomMemo);
var
 Res: TResourceStream;
 RTFBuf: TRichEdit;
 Play: Boolean;
begin
 Res := nil;
 RTFBuf := nil;
 Play := True;
 try
  try
   Res := TResourceStream.Create(HInstance, ResourceName, RT_RCData);
  except
   on e: EResNotFound do
   begin
    Play := False;
    Res := TResourceStream.Create(HInstance, 'T Визначення не знайдено', RT_RCData);
   end;
  end;
  RTFBuf := TRichEdit.Create(Editor.Owner);
  RTFBuf.Visible := False;
  RTFBuf.Parent := Editor.Parent;
  RTFBuf.Lines.LoadFromStream(Res);
  RTFBuf.SelectAll;
  RTFBuf.CutToClipboard;
  Editor.PasteFromClipboard;
 finally
  RTFBuf.Free;
  Res.Free;
 end;
 if Play = True then
  PlaySound(PChar('S ' + ResourceName), 0, SND_RESOURCE or SND_ASYNC)
 else
  PlaySound('S Визначення не знайдено', 0, SND_RESOURCE or SND_ASYNC);
end;

Пане Torbins десь в процедурі вище є помилка. Процедура не копіює текст в RTFBuf!
Я спробував так:

procedure DefinitionTextPlay(ResourceName: String; Editor: TCustomMemo);
var
 Text: TResourceStream;
 Play: Boolean;
 Buffer: TRichEdit;
begin
 Text := nil;
 Play := True;
 try
  try
   Text := TResourceStream.Create(HInstance, 'T ' + ResourceName, RT_RCData);
  except
   on e: EResNotFound do
   begin
    Play := False;
    Text := TResourceStream.Create(HInstance, 'T Визначення не знайдено', RT_RCData);
   end;
  end;
  Buffer.Create(Buffer.Owner);
  Buffer.Visible := True;
  Buffer.Lines.LoadFromStream(Text);
  Editor.Lines.Add(Buffer.Text);
 finally
  Buffer.Free;
  Text.Free;
 end;
 if Play = True then
  PlaySound(PChar('S ' + ResourceName), 0, SND_RESOURCE or SND_ASYNC)
 else
  PlaySound('S Визначення не знайдено', 0, SND_RESOURCE or SND_ASYNC);
end;

Та думаю я не правильно створив об'єкт Buffer.Create(Buffer.Owner); в мене видає помилку. У вас коли ставити RTFBuf.Visible := True; та викинути рядок RTFBuf.Free; було видно що створюється об'єкт, а в мене зразу видає помилку.
Підкажіть будь-ласка як правильно переписати ось цей рядок. Buffer.Create(Buffer.Owner);

365 Востаннє редагувалося ProgramBandera (26.07.2020 14:49:40)

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

Доброго дня панове! Підкажіть відповідь на 3 питання.

1. Як винести процедуру в окремий модуль, в якому не має форми?

procedure DefinitionTextPlay(ResourceName: String; Editor: TCustomMemo);
var
 Text: TResourceStream;
 Play: Boolean;
 Buffer: TRichEdit;
begin
 Buffer := Nil;
 Text := Nil;
 Play := True;
 try
  try
   Text := TResourceStream.Create(HInstance, 'T ' + ResourceName, RT_RCData);
  except
   on e: EResNotFound do
   begin
    Play := False;
    Text := TResourceStream.Create(HInstance, 'T Визначення не знайдено', RT_RCData);
   end;
  end;
  Buffer := TRichEdit.Create(Form2);
  Buffer.Parent := Form2;
  Buffer.Visible := False;
  Buffer.Lines.LoadFromStream(Text);
  Editor.Lines.Add(Buffer.Text);
  Editor.Lines.Add('');
 finally
  Buffer.Free;
  Text.Free;
 end;
 if Play = True then
  PlaySound(PChar('S ' + ResourceName), 0, SND_RESOURCE or SND_ASYNC)
 else
  PlaySound('S Визначення не знайдено', 0, SND_RESOURCE or SND_ASYNC);
end;

Цікавить як тоді записати ось цих два рядка коду, якщо форми 2 в ньому не має?

Buffer := TRichEdit.Create(Form2);
  Buffer.Parent := Form2;

2. Які функції та процедури використовуються для ресурсів зображень. (Дайте назви, а я почитаю в інтеренеті про них.). Потрібно вивести таблицю хімічних елементів в програмі.

3. При наведенні миші на компонент потрібно щоб виводилась текстова підказка. Яка властивість за це відповідає?

366

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

  1. Можна використати Editor.Owner і Editor.Parent. Інший варіант додати в uses назву модуля, який містить Form2.

  2. Можна використати той самий TResourceStream. Ви уже вмієте працювати з TPicture, замініть LoadFromFile на LoadFromStream.

  3. В Hint вписуєте текст, і потім ShowHint ставите True.

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

367

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

Усім привіт! Підкажіть будь-ласка що ожначає в коді делфі символ песика @  ??? Або можливо хтось має посилання де можна про це почитати.

Наприклад, є стандартна функція Pos і там використовується цей символ, поясніь що він означає.

function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;
{$IFDEF PUREPASCAL}
var
  I, LIterCnt, L, J: Integer;
  PSubStr, PS: _PAnsiChr;
begin
  L := _PStrLen(SubStr);
  { Calculate the number of possible iterations. Not valid if Offset < 1. }
  LIterCnt := _PStrLen(Str) - Offset - L + 1;

  { Only continue if the number of iterations is positive or zero (there is space to check) }
  if (Offset > 0) and (LIterCnt >= 0) and (L > 0) then
  begin
    PSubStr := @SubStr[1];
    PS := @Str[1];
    Inc(PS, Offset - 1);

    for I := 0 to LIterCnt do
    begin
      J := 0;
      while (J >= 0) and (J < L) do
      begin
        if PS[I + J] = PSubStr[J] then
          Inc(J)
        else
          J := -1;
      end;
      if J >= L then
        Exit(I + Offset);
    end;
  end;

  Result := 0;
end;

Що Написано в цих двох рядках

 PSubStr := @SubStr[1];
    PS := @Str[1];

368

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

@ - це вказівник на змінну.

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

369

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

Доброго вечора панове! Підкажіть будь ласка, якщо я створюю клас, в окремому модулі, то прямо в конструкторі класу я можу створити та визвати нову форму з деякими компонентами? Щось типу як це робиться процедурою Click?

procedure TForm1.BitBtn9Click(Sender: TObject);
begin
 Form4.ShowModal;
end; 

Потрібно щоб користувач зразу задав значення в поля.

370

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

Доброго вечора панове! Підкажіть будь ласка, якщо я створюю клас, в окремому модулі, то прямо в конструкторі класу я можу створити та визвати нову форму з деякими компонентами в ній? Щось типу як це робиться процедурою Click?

procedure TForm1.BitBtn9Click(Sender: TObject);
begin
 Form4.ShowModal;
end; 

Тобто потрібно створити форму та два ComboBox і один Edit зразу в ній.
Потрібно щоб користувач зразу задав значення в поля.

371

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

Можете, просто додайте модуль з формою в uses в секцію interface чи implementation. Головне, щоб ваш конструктор не виконався до Application.Initialize в файлі проекту, чи до створення іще чогось потрібного.

Form4.ShowModal;

- в даному випадку форма уже існує, ви просто показуєте її на екрані. Якщо треба створити, то якось так:

Form := TForm4.Create(Nil);
try
  Form.ShowModal;
finally
  Form.Free;
end;
Подякували: ProgramBandera1

372

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

Torbins написав:

В даному випадку форма уже існує, ви просто показуєте її на екрані. Якщо треба створити, то якось так:

Form := TForm4.Create(Nil);
try
  Form.ShowModal;
finally
  Form.Free;
end;

А якщо форма не існує? Якщо її потрібно створити з нуля, не в основному модулі. Як діяти в такому випадку. Додавати її до проєкту і описувати її в другорядному модулю. Є основний модуль а класи описані в другому модулю. І от в другому модулю описаний конструктор в якому потрібно створити нову форму з компонентами. Який найпростіший шлях вирішення задачі?

373

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

Додайте модуль з формою до другорядного модуля, і потім користуйтеся прикладом з другого куска коду моєї попередньої відповіді.

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

374

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

Тоді треба відв'язуватися від форм. Вашим класам, швидше за все, потрібні лише дані з інших форм і, можливо, функції - колбеки. Для цього форми не потрбіні.

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

375

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

Вітаю панове. Чи можливо задати перераховуємий тип ось таким чином?:

Type
  TSIPrefixes = (yocto = 'Йокто', zepto = 'Зепто', atto = 'Ато', femto = 'Фемто',
                 pico = 'Піко', nano = 'Нано', µicro = 'Мікро', milli = 'Мілі',
                 centi = 'Санти', deci = 'Деци', deca = 'Дека', hecto = 'Гекто',
                 kilo = 'Кіло', Mega = 'Мега', Giga = 'Гіга', Tera = 'Тера',
                 Peta = 'Пета', Exa = 'Екса', Zetta = 'Зета', Yotta = 'Йота');
Type
  TimeInterval = (Second = 'Секунд', Minute = 'Хвилин', Hour = 'Годин',
                  Day = 'Днів', Week = 'Тижнів', Month = 'Місяців', Year = 'Років');

І чи можливо з цих типів витягнути текстові значення в якусь змінну? Наприклад МегаСекунд.

376

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

Який тип? Як так можна писати, не знаючи про що
ні, про інше п'єса
тож *RTFM*

377 Востаннє редагувалося koala (27.12.2020 12:58:24)

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

Запустити компілятор швидше, ніж спитати на форумі.
Єдиний стандартний метод перетворення переліченого типу в string - це через RTTI, некрасиво, довго і незручно.
Зате ви легко можете проголосити масив стрічок з перелічених індексом, і з нього витягати відповідні назви.

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

378 Востаннє редагувалося ProgramBandera (27.12.2020 13:04:19)

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

ur_naz написав:

Який тип? Як так можна писати, не знаючи про що
ні, про інше п'єса
тож *RTFM*

Не знаю що таке *RTFM*, та можна було написати що тип Integer та тип String несумісні. Та всеодно дякую! Підем Іншим шляхом, через Case.. Of

Function TPhysicalTime.SetUnitsPhysicalQuantity(Units: String): String;
Type
  TSIPrefixes = (yocto(*йокто*), zepto(*зепто*), atto(*ато*), femto(*фемто*),
                 pico(*піко*), nano(*нано*), µicro(*мікро*), milli(*мілі*),
                 centi(*санти*), deci(*деци*), deca(*дека*), hecto(*гекто*),
                 kilo(*кіло*), Mega(*Мега*), Giga(*Гіга*), Tera(*Тера*),
                 Peta(*Пета*), Exa(*Екса*), Zetta(*Зета*), Yotta(*Йота*));
  TimeInterval = (Second(*Секунд*), Minute(*Хвилин*), Hour(*Годин*), Day(*Днів*),
                  Week(*Тижнів*), Month(*Місяців*), Year(*Років*));
Begin
{В значенні Задати два вибора по тайм_інтервал та СІ_Префікс}
  case TimeInterval of
    Second: Begin
              Result := 'Секунд';
            End;

    Minute: Begin
              Result := 'Хвилин';
            End;

    Hour:   Begin
              Result := 'Годин';
            End;

    Day:    Begin
              Result := 'Днів';
            End;

    Week:   Begin
              Result := 'Тижнів';
            End;

    Month:  Begin
              Result := 'Місяців';
            End;

    Year:   Begin
              Result := 'Років';
            End;
  end;
End;

379

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

ProgramBandera написав:

Не знаю що таке *RTFM*

STFW

ProgramBandera написав:

тип Integer та тип String несумісні.

А до чого тут Integer?

ProgramBandera написав:

Підем Іншим шляхом, через Case.. Of

Цей код:
1. не працює;
2. не робить того, що вам треба;
3. явно надмірний;
4. все одно імітує роботу константного масиву.

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

380

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

Мене тут звинуватили у агресії, але я ще не починав...
тож скажу таке. варіант з масивом є милицею. Він простий, але призводить до помилок і батхерту при зневадженні. бо воно як ракова пухлина розповзеться по коду і випиляти або бодай знайти, що не так, буде вкрай складно.
НІКОЛИ, повторюю, НІКОЛИ не треба так робити.
Що ж треба робити? <тут повинна була б реклама курсу з алгоритмів та структур даних, але ні>. В Delphi є такий тип даних TDictionary. Словник ідеально підходить для такої ситуації. Є ключ і є відповідне значення. Додавати можна без будь яких наслідків що і скільки завгодно. При видаленні елемента випадатиме експшн, що чітко вкаже на причину - відсутність ключа.
пс отакі тут поради...

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