341

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

Другий параметр TResourceStream.Create - назва ресурсу, не файлу ('SКуб', здається, ви писали)

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

342

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

koala написав:

Другий параметр TResourceStream.Create - назва ресурсу, не файлу ('SКуб', здається, ви писали)

На жаль ні, не допомогло, все та ж помилка ресурс не знайдено

S := TResourceStream.Create(HInstance, 'SКуб', RT_RCDATA);

Ось коди конструкторів:

constructor TResourceStream.Create(Instance: THandle; const ResName: string;
  ResType: PChar);
begin
  inherited Create;
  Initialize(Instance, PChar(ResName), ResType);
end;

constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer;
  ResType: PChar);
begin
  inherited Create;
  Initialize(Instance, PChar(ResID), ResType);
end;

Я вже не розумію чому воно не находить ні файлу ресурсу ні самого ресурсу. Остання надія, можливо документи *.txt потрібно англійськими писати SКуб.txt => SKube.txt І тільки тоді в рестораторі створювати файл GeometryText.res

343

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

Вибачте, так файл зветься 'SКуб' чи 'SКуб.txt'?

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

344

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

koala написав:

Вибачте, так файл зветься 'SКуб' чи 'SКуб.txt'?

Текстові файли мали розширення .txt як і звукові файли мали розширення .wav, але функцією

PlaySound('Куб', 0, SND_RESOURCE or SND_ASYNC);

ресурс 'Куб' я викликаю без розширення .wav. Я думаю і текстовий файл так само потрібно викликати просто вказавши 'SКуб'. Я створюю файл *res в програмі Restopator там в усіх файлах (наприклад) з розширенням *wav розширення пропадає і лишається тільки назва ресурсу Куб, а в текстових відповідно SКуб. Та навіть якщо я прописую

S := TResourceStream.Create(HInstance, 'SКуб. txt', RT_RCDATA);

все рівно не знаходить ресурсу.

345

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

А він точно з пробілом називається?

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

346

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

koala написав:

А він точно з пробілом називається?

Пробіл тільки я тут написав в програмі його не має.
Я спробую тест провести не в Delphi 10.3, а не в 7-й версії можливо там вийде щось з ресурсу.

347 Востаннє редагувалося Droid 77 (03.07.2020 18:48:55)

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

Якщо з пробілом, тоді повне ім'я буде у вигляді: SКуб. txt.txt

ProgramBandera написав:

Я спробую тест провести не в Delphi 10.3, а не в ...

Гадаю зміна версій не допоможе.
Чи здатна функція PlaySound програвати файли через ресурс?

приклад

Use PlaySound function. For example:

procedure TForm1.Button1Click(Sender: TObject);
begin
  PlaySound(PChar('yes.wav'), 0, SND_SYNC);
end;

джерело

348

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

Droid 77 написав:

Чи здатна функція PlaySound програвати файли через ресурс?

Звичайно здатна. І розширення там зникає, його не потрібно писати.

PlaySound('Куб', 0, SND_RESOURCE or SND_ASYNC);

349

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

А якщо так:

PlaySound('Куб', HInstance, SND_RESOURCE or SND_ASYNC);

або навіть так:

PlaySound('S2', HInstance, SND_RESOURCE or SND_ASYNC);

може кирилицю не розуміє?

350

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

В ресурсах немає ніяких розширень, а є лише секції. Декілька типів секцій є спеціалізованими, наприклад для іконок, картинок, курсорів, wav-файлів. А для усього іншого є секція RCDATA. Тому вказувати ім'я ресурсу треба без розширення.
res-файли є проміжним сховищем для даних. Коли ви компілюєте програму, то весь вміст res-файлу копіюється в exe-файл. Відкрийте своїм редактором ресурсів готовий exe, і самі усе побачите.

Подякували: koala, leofun01, ProgramBandera3

351

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

Torbins написав:

Відкрийте своїм редактором ресурсів готовий exe, і самі усе побачите.

Дякую пане Torbins!!! Дійсьно коли робив GeometryText.res файл я закидав туди текстові файли з розширенням *txt. Редактор робив в файлі GeometryText.res папку ТХТ і в ній вже були ресурси з текстовими файлами. Проблема була в назві папки ТХТ який стандартно створював редактор. Переназвавши папку ТХТ на RCData все стало на свої місця.

352 Востаннє редагувалося ProgramBandera (15.07.2020 23:21:32)

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

Вечір добрий панове! Підкажіть будь-ласка як прописати функцію DefinitionText на випадок якщо користувач ввів в Edit1 текст який не співпвдає з назвою ресурсу. Як в такому випадку прописати умову?

implementation

{$R *.dfm}
{$R GeometryText.res}
{$R PhysicsText.res}
{$R GeometrySound.res}
{$R PhysicsSound.res}

Function DefinitionText(Text: String): TResourceStream;
var
 s: TResourceStream;
begin
 try
  s := TResourceStream.Create(HInstance, 'T ' + Text, RT_RCData);
  result := s;
 finally
  s.Free;
  s.Destroy;
 end;
end;

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;

P.S Наприклад користувач ввів слово температура, а це явище вивчається не в сьомому класі а в восьмому. Програма видасть помилку: Ресурс не знайдено!

353

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

ProgramBandera написав:

Вечір добрий панове! Підкажіть будь-ласка як прописати функцію DefinitionText на випадок якщо користувач ввів в Edit1 текст який не співпвдає з назвою ресурсу. Як в такому випадку прописати умову?

Function DefinitionText(Text: String): TResourceStream;
var
 s: TResourceStream;
begin
 try
  s := TResourceStream.Create(HInstance, 'T ' + Text, RT_RCData);
  result := s;
 finally
  s.Free;
  s.Destroy;
 end;
end;

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;

У вас тут зараз є використання об'єкта після його видалення. Рядок "result := s;" не копіює сам об'єкт, а лише посилання на той самий об'єкт. В кінці функції у вас об'єкт уже видалений через "s.Free;" і result містить посилання кудись у космос. У багатьох випадках програма іще не встигла повторно використати ту пам'ять, тому воно працюватиме, але інколи буде глючити.
Якщо виправити цю помилку, і додати перевірку на існування ресурсу, то має бути щось таке:

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;
Подякували: ProgramBandera1

354

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

1. Обробка помилок. Це окрема велика тема, тут не лише про виключні ситуації (try - except - finally).
Код функції TForm2.Button1Click (ви людські назви колись об'єктам даватимете?) взагалі не передбачає можливості помилки; загалом, це може бути правильним рішенням, виключні ситуації для цього й придумали. Але тоді виходить, що ви обробляєте виключну ситуацію "немає ресурсу" в DefinitionText, а потім даєте результат (який може бути неправильним!) у TForm2.Button1Click. У цьому випадку, гадаю, оптимальний варіант - пропустити виключну ситуацію, хай її стандартний обробник жує (він табличку показує).
2. Обробка того, що вводить користувач.
Ви дозволяєте користувачам вводити імена ресурсів. Не треба так робити. Я вже мовчу про регістр (великі-маленькі літери); але уявіть собі, що ви колись додасте тести в програму, і хтось дізнається імена назв ресурсів цих тестів. Ви даєте користувачу інтерфейс для сканування ресурсів вашої програми. Хоча б перевіряйте, що введено, і трохи перетворюйте (викидайте пробіли, робіть всі літери маленькими і т.д.)
3. finally. Схоже, ви скопіювали код деінде і не розбиралися, що там таке. finally означає "виконати в будь-якому випадку, була виключна ситуація чи ні" і потрібен, зокрема, щоб гарантовано знищити ресурс перед завершенням функції - тоді він виглядає десь так. Але ж ваша функція не має знищувати ресурс, навпаки, вона має його повернути.

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

355 Востаннє редагувалося ProgramBandera (16.07.2020 17:33:46)

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

Пане koala в функції DefinitionText потрібно було скласти умову якщо назва ресурсу не співпадає з вхідним текстом то вивести ресурс з текстом: Визначення не знайдено! От і все! А на рахунок людських назв об'єктів, це тестова програма. Не варто гаяти час на придумування назв об'єкттів. В самій функції немає ніяких назв об'єктів, туда передається тільки текст і не ваєживо з відки він чи з Edit1, Edit2 чи навіть з Memo1, RichEdit1 або Label1.
І до речі наскільки я тестував цю функцію, регістр тут не важливий.

356 Востаннє редагувалося ProgramBandera (16.07.2020 19:02:02)

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;

Пане Torbins а якщо у випадку незнайденого ресурсу результату функції присвоювати текст: (Визначення не знайдено!). Це можливо якось зробити? Можливо так я уникну помилки в роботі програми?

Function DefinitionText(Text: String): TResourceStream;
var
 s: TResourceStream;
begin
 s := Nil;
 try
   s := TResourceStream.Create(HInstance, 'T ' + Text, RT_RCData);
   Result := s;
 except
  on e: EResNotFound do
   begin

    {Якщо ресурс не знайдено тут потрібно результату функції присвоїти
    текст: (Визначення не знайдено!). Як це прописати кодом???}

    // s := 'Визначення не знайдено!';
    // Result := s;

    {Так буде не правильно, тому що не сумісні типи String та Stream}

   end;
 end;
end;

P.S Поки пропустимо процедуру PlaySound.

357 Востаннє редагувалося ProgramBandera (16.07.2020 22:44:28)

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

Питання знято по функції Function DefinitionText(Text: String): TResourceStream;
Здається вже нічого не глючить. Ввів додатковий ресурс (T Визначення не знайдено) з текстом Визначення не знайдено! зараз коли ресурсу не знаходить результату функції присвоюється цей текст.

Function DefinitionText(Text: String): TResourceStream;
var
 s: TResourceStream;
begin
 s := Nil;
 try
   s := TResourceStream.Create(HInstance, 'T ' + Text, RT_RCData);
   Result := s;
 except
  on e: EResNotFound do
   begin
    s := TResourceStream.Create(HInstance, 'T Визначення не знайдено', RT_RCData);
    Result := s;
    Exit;
   end;
 end;
end;

А процедура PlaySound взагалі не видає ніякої помилки коли немає відповідного ресурсу.

358

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

ProgramBandera написав:

Пане Torbins а якщо у випадку незнайденого ресурсу результату функції присвоювати текст: (Визначення не знайдено!). Це можливо якось зробити? Можливо так я уникну помилки в роботі програми?

Function DefinitionText(Text: String): TResourceStream;
var
 s: TResourceStream;
begin
 s := Nil;
 try
   s := TResourceStream.Create(HInstance, 'T ' + Text, RT_RCData);
   Result := s;
 except
  on e: EResNotFound do
   begin

    {Якщо ресурс не знайдено тут потрібно результату функції присвоїти
    текст: (Визначення не знайдено!). Як це прописати кодом???}

    // s := 'Визначення не знайдено!';
    // Result := s;

    {Так буде не правильно, тому що не сумісні типи String та Stream}

   end;
 end;
end;

Якщо хочете повернути з функції рядок, то так і пишіть: "Function DefinitionText(Text: String): String". І, відповідно, потім

RichEdit1.Lines.Add(DefinitionText(s));
ProgramBandera написав:

Питання знято по функції Function DefinitionText(Text: String): TResourceStream;
Здається вже нічого не глючить. Ввів додатковий ресурс (T Визначення не знайдено) з текстом Визначення не знайдено! зараз коли ресурсу не знаходить результату функції присвоюється цей текст.

Function DefinitionText(Text: String): TResourceStream;
var
 s: TResourceStream;
begin
 s := Nil;
 try
   s := TResourceStream.Create(HInstance, 'T ' + Text, RT_RCData);
   Result := s;
 except
  on e: EResNotFound do
   begin
    s := TResourceStream.Create(HInstance, 'T Визначення не знайдено', RT_RCData);
    Result := s;
    Exit;
   end;
 end;
end;

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

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

359 Востаннє редагувалося ProgramBandera (17.07.2020 06:30:14)

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

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;

360

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

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