Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 119

/ вопрос открыт /

Здравствуйте, эксперты!
Учу Delphi 7, совмещаю теорию с практикой.Разбираюсь с MP3 плейером по учебнику Культина.В нем есть пример листинга, но компилятор не хочет воспринимать вот эти строки :
Label1.Caption := ListBox1.Items[ListBox1.ItemIndex]; Когда я меняю вот на такое Label1.Caption := ListBox1.Items.Text; программа начинает работать нормально - Я делаю что-то не по логике?Или это сделано специально чтобы ученики думали?
И еще - не могу ни где найти для чего применяются квадратные скобки?За ранее спасибо!

Приложение:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3. PlayList('');
  4. ListBox1.ItemIndex := 0;
  5. Label1.Caption := ListBox1.Items[ListBox1.ItemIndex];
  6. TrackBar1.Position :=10;
  7. volume := (TrackBar1.Position - TrackBar1.Max+1)*$FFFF;
  8. volume := volume+ (volume shl 16);
  9. waveOutSetVolume(WAVE_MAPPER,volume);
  10. end;
  11. procedure TForm1.PlayList(Path: string);
  12. var
  13. SearchRec: TSearchRec;
  14. begin
  15. ListBox1.Clear;
  16. if FindFirst(path +'*.mp3',faAnyFile,SearchRec) =0 then
  17. begin
  18. ListBox1.Items.Add(SearchRec.Name);
  19. while (FindNext(SearchRec)=0) do
  20. ListBox1.Items.Add(SearchRec.Name);
  21. end;
  22. ListBox1.ItemIndex := 0;
  23. end;
  24. procedure TForm1.ListBox1Click(Sender: TObject);
  25. begin
  26. if SpeedButton2.Tag = 0 then
  27. Label1.Caption :=ListBox1.Items[ListBox1.ItemIndex]
  28. else
  29. Form1.Play;
  30. end;


igoriy Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: igoriy (статус: Посетитель)
Вопрос отправлен: 25 августа 2009, 13:12
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 18; последнее сообщение — 25 августа 2009, 15:39; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 25 августа 2009, 13:34 [#1]:

код правдоподобный и должен работать. Квадратные скобки - это обращение к элементу массива. Только в данном случае это обращение "симулируется".
Какую ошибку выдает компилятор? (подсказка - если её выделить внизу и нажать Ctrl+C, то можно скопировать в буфер обмена).
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 25 августа 2009, 13:42 [#2]:

Дружно включаем телепаторы, чтобы угадать, что не нравится компилятору.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 25 августа 2009, 13:43 [#3]:

Сейчас даже не компилятор выдал ошибку а система остановила :
Project Player2.exe raised exception class EStrlngUstError with message 'List Index out of bounds (-!)'. Process stopped. Use Step or Run to continue.
Вадим К

Вадим К (статус: Академик), 25 августа 2009, 13:57 [#4]:

Ну тогда другое дело. Что то мне подсказывает, что листбокс пустой на этот момент. Предлагаю заменить строки
ListBox1.ItemIndex := 0;
Label1.Caption := ListBox1.Items[ListBox1.ItemIndex];
на
if ListBox1.Items.Count > 0 then begin
  ListBox1.ItemIndex := 0;
  Label1.Caption := ListBox1.Items[0];
end;
P.S. никогда не рекомендую учиться по книгам русскоязычных авторов. не встречал ни одной нормальной.
Галочка "подтверждения прочтения" - вселенское зло.
igoriy

igoriy (статус: Посетитель), 25 августа 2009, 14:06 [#5]:

Ага именно вот это я уже и успел сделать,но все равно я сомневался.А при написании этой строки ,почему не выдается подсказка?Потому что эмуляция?И вот моя строка Label1.Caption := ListBox1.Items.Text;является ошибочной или нет,ведь по сути вроде выполняет ту же роль.А лисбокс в это время действительно пустой- это запуск программы
min@y™

min@y™ (статус: Доктор наук), 25 августа 2009, 14:16 [#6]:

Строка Label1.Caption := ListBox1.Items.Text для компилятора ошибочной не является. Это логическая ошибка программиста.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 25 августа 2009, 14:17 [#7]:

Label1.Caption := ListBox1.Items.Text; - как бы и не ошибка. Синтаксически это точно не ошибка, а вот логически - скорее всего да.
Подсказка не выдается - иногда делфовский подсказчик забывает о некоторых методах. Рекомендую переходить на 2007 делфи. он там поумнее. Да и работать приятнее. Если конечно компьютер мощьнее чем 600Мгц.
Галочка "подтверждения прочтения" - вселенское зло.
igoriy

igoriy (статус: Посетитель), 25 августа 2009, 14:26 [#8]:

А если не трудно объясните ошибку логики.Ведь я вроде бы беру из листбокса одну строку текста и вставляю в лабел да и программа при этом работает? И еще вот добавил полный листинг- черновик так сказать https://www.delphi-int.ru/code/f736e5ba не пойму происходящую вещь программа как то не устойчиво работает ,тоесть может работать час-два а потом на клике по любому элементу : Button или ListBox просто закрывается.Сижу и не понимаю
min@y™

min@y™ (статус: Доктор наук), 25 августа 2009, 14:43 [#9]:

Label1.Caption := ListBox1.Items.Text - это ты берёшь весь текст из ListBox (все строки сразу + символы конца строки и переноса #13#10).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 25 августа 2009, 14:43 [#10]:

ListBox1.Items.Text берет не одну строку, а все строки.
А вот когда обращаемя по индексу к одной строке, а её там нет.... вот тут и происходит веселье.
Посмотрел код. Глупостей хватает, можно переписать в раза два короче.
Как минимум рекомендую добавить проверку перед доступом по индексу.

SoundPath: string[255]; это тоже так в книге написано? дело в том, что путь может занимать до 260 символов. угадайте, что будет, если путь окажеться длиной 257 символов?
Галочка "подтверждения прочтения" - вселенское зло.
igoriy

igoriy (статус: Посетитель), 25 августа 2009, 14:57 [#11]:

В листинге точно все как в книге.Вот я и говорю-может автором специально допущены ошибки чтобы ученики думали?

""SoundPath: string[255]; это тоже так в книге написано? дело в том, что путь может занимать до 260 символов. угадайте, что будет, если путь окажеться длиной 257 символов?"" А вот это для меня действительно еще очень не понятно так как я только только все это начинаю.Понятно что програмиста из меня не получится - поздно начал,но просто мне это очень интересно когда своими руками .И еще вопросик только что появился : при использовании WinAPI выскакивает предупреждение :Что специфическая функция и т д , но все работает.Что этим мне говорит компилятор?
Вадим К

Вадим К (статус: Академик), 25 августа 2009, 15:08 [#12]:

будет переполнение - это может дать самые разнообразные ошибки времени выполнения. Но скорее всего в данном случае программа сможет выдать ошибку и завершиться.
"при использовании WinAPI выскакивает предупреждение..."
Какое сообщение. Телепаты на отдыхе.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 25 августа 2009, 15:12 [#13]:

Цитата (igoriy):


Про такую книгу можно смело сказать "КГ/АМ"!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 25 августа 2009, 15:18 [#14]:

[Warning] Player1.pas(51): Unit 'FileCtrl' is specific to a platform вот такое сообщение.И второе
Сделал вот так SoundPath: string[260];Компилятор ответил вот так [Error] Player1.pas(56): String literals may have at most 255 elements
Вадим К

Вадим К (статус: Академик), 25 августа 2009, 15:23 [#15]:

ну логично.
первое - можно не обращать внимания. это дань кросплатформенности.
второе - конечно так нельзя. лучше просто оставить string.
Галочка "подтверждения прочтения" - вселенское зло.
igoriy

igoriy (статус: Посетитель), 25 августа 2009, 15:29 [#16]:

Ага спасибо.А это играет большую роль?И как насчет неустойчивости работы - потому что коряво?И заметил что закрывается по определенной закономерности-при третьем нажатии на кнопку или листбокс
igoriy

igoriy (статус: Посетитель), 25 августа 2009, 15:31 [#17]:

А еще мне кажется вот эта часть то же неправильно.Ведь если листбокс пустой то то же ошибка?
procedure TForm1.Play;
begin
Timer1.Enabled := True;
Label1.Caption := ListBox1.Items.Text;
MediaPlayer1.FileName :=
SoundPath + ListBox1.Items[ListBox1.ItemIndex];
try
MediaPlayer1.Open;
except
on EMCIDeviceError do
begin
ShowMessage('Îøèáêà îáðàùåíèÿ ê ôàéëó ' +
ListBox1.Items[ListBox1.ItemIndex]);
Exit;
end;
end;
Вадим К

Вадим К (статус: Академик), 25 августа 2009, 15:39 [#18]:

да, конечно. более того, если лист пустой, то ListBox1.ItemIndex будет равным -1.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.03 сек.