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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 4 808

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

Здравствуйте, эксперты!
Мне необходимо реализовать плей лист в делфи. В моем проигрователе я использую стандартные компоненты и образы. Всё реализовано нехватает бегунка, плейлиста и способа сохранить плейлист. Я надеюсь на вашу помощь, если вам будет не трудно, то помогите пожалуйста.

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

Вопрос задала: Ящерка (статус: Посетитель)
Вопрос отправлен: 11 декабря 2010, 19:07
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 30; последнее сообщение — 24 декабря 2010, 18:51; участников в обсуждении: 6.

Страницы: [« Предыдущая] [1] [2]

Вадим К

Вадим К (статус: Академик), 22 декабря 2010, 14:19 [#21]:

Цитата (mirt.steelwater):

то понятно, но вообще в чем разница - если конструктор до try или после

помещать внутрь - бессмысленно - так как пытаться удалить объект, который не создался. И хотя делфи помогает и в некоторых случаях ничего не будет, но если перед созданием переменную не занулить, то можно получать феерические глюки.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 14:49 [#22]:

Хочу ещё добавить: при создании обновременно двух объектов приходится писать вот так:
try
  Stream1:= TFileStream.Create(FileName1, fmOpenRead or fmShareDenyWrite);
  try
    Stream2:= TFileStream.Create(FileName2, fmOpenWrite or fmShareExclusive);
    try
      // работа тут
    finally
      Stream2.Free()
    end; 
  finally
    Stream1.Free()
  end;
except
  // обработка исключения, выдача сообщения об ошибке.
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
mirt.steelwater

mirt.steelwater (статус: Посетитель), 22 декабря 2010, 15:31 [#23]:

все равно я не понял
OBJ := TMyObject.Create;
// положим объект не создался и не выдал при этом исключения
// не создался втихую и все..
try
    // do something
    // не бесмысленно выполнять эти операции?
finally
    FreeAndNil (OBJ);
    // не бесмысленно уничтожать объект который не создался?
end;

касательно работы с нескоькими объекта - если работа с объектами ведется последовательно, а не одновременно, т.е. есть место, где нам не нужен Stream2, но нужен Stream1, то да - я думаю это правильно. а если нам нужны оба объекта сразу, то что мешает написать так:
try
    Stream1:= TFileStream.Create(FileName1, fmOpenRead or fmShareDenyWrite);
    Stream2:= TFileStream.Create(FileName2, fmOpenWrite or fmShareExclusive);
    // работа тут
finally
    FreeAndNil (Stream2);
    FreeAndNil (stream1);
end;
Ⓐ свобода сопротивление солидарность
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 16:08 [#24]:

Цитата (mirt.steelwater):

положим объект не создался и не выдал при этом исключения не создался втихую и все..

Очень интересно! Напиши пример, моделирующий такую ситуёвину и выложи сюда, поглядим.

Цитата (mirt.steelwater):

касательно работы с нескоькими объекта - если работа с объектами ведется последовательно, а не одновременно, т.е. есть место, где нам не нужен Stream2, но нужен Stream1, то да - я думаю это правильно. а если нам нужны оба объекта сразу, то что мешает написать так:

В твоём примере, если конструктор для Stream1 вывалится в исключение, сразу попадаем на FreeAndNil(Stream2) и получаем по морде от Access violation, т.к. Stream2 указывает куда угодно.
Такая же байда будет, если вывалится конструктор для Stream2. Поэтому в твоём коде конструкция try ... finally вообще не имеет смысла.
Пойми, что при возникновении исключения управление СРАЗУ передаётся на блок finally. B вообще, эта конструкция нужна именно для гарантированной финализации неких действий, производившихся ДО НЕЁ.

Вот из умной книжки:
Program FileIO;
 
uses 
  Classes, Dialogs; 
 
{$APPTYPE CONSOLE}
 
var
  F: TextFile; S: string; 
 
begin
  AssignFile(F, 'FOO.TXT'); 
  try
    Reset(F); 
    try
      ReadLn(F, S); 
    finally
      CloseFile(F); 
    end; 
  except 
    on EInOutError do
      ShowMessage('Error Accessing File!');
  end;
end.

Цитата:


В данном листинге внутренний блок try finally используется для того, чтобы файл был закрыт в любом случае, т.е. независимо от того, была ошибка или нет. На "человеческом" языке это звучит так: "Дружище, выполни код между операторами try и finally. Возникла при этом некоторая ошибка или нет, не имеет значения — в любом случае выполни операторы между finally и end. А теперь, если ошибка была, переходи к следующему блоку обработки ошибок". Это означает, что в нашем случае файл будет закрыт независимо от того, произошла ошибка (и какая именно) или нет.




Операторы после finally в блоке try finally выполняются независимо от того, возникла ли ошибка в процессе выполнения этого блока или нет. При написании этого кода убедитесь, что он не зависит от того, имела ли место некая ошибка или нет. Кроме того, так как оператор finally не прекращает перемещения сообщения об ошибке, выполнение программы продолжится переходом в следующий блок обработки ошибок.




Внешний блок try..except используется для обработки исключительной ситуации, которая может произойти в программе. После закрытия файла во внутреннем блоке finally блок except выводит сообщение об ошибке для пользователя.

Одно из главных преимуществ системы обработки исключительных ситуаций по сравнению с традиционными методами обработки ошибок состоит в отделении процедуры обнаружения ошибки от процедуры ее обработки. Это позволяет сделать код более удобным для чтения и понимания и в каждом случае сосредоточиться на отдельном аспекте работы программы.

Весьма примечателен тот факт, что блок try finally не позволяет перехватывать некоторую конкретную исключительную ситуацию. Помещая в программу блок try finally, программист заботится не об обнаружении некоторой определенной ошибки. Цель состоит в том, чтобы выполнить все необходимые действия для корректного выхода из любой ошибочной ситуации, которая может возникнуть при выполнении этого фрагмента программы. Блок finally является идеальным местом для выполнения действий по освобождению любых распределенных ресурсов, поскольку он выполняется всегда, включая и случай возникновения ошибки. Тем не менее во многих ситуациях обработка ошибок может быть связана с выполнением определенных действий, зависящих от типа возникшей ошибки. Для этой цели предназначен блок try except, пример использования которого показан в листинге 2.4.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
mirt.steelwater

mirt.steelwater (статус: Посетитель), 22 декабря 2010, 16:23 [#25]:

охохох:)
да я понимаю!)))
ну нужно значит так писать:
Stream1 := NIL;
Stream2 := NIL;
try
    Stream1 := TFileStream.Create(FileName1, fmOpenRead or fmShareDenyWrite);
    Stream2 := TFileStream.Create(FileName2, fmOpenWrite or fmShareExclusive);
    // работа тут
finally
    FreeAndNil (Stream2);
    FreeAndNil (Stream1);
end;
пример, когда конструктор не создает объект:
type
    TMyOBJ = class (TObject)
    public
        constructor Create (const aFileName: String);
        class function Load (const aFileName: String) : TMyOBJ;
    end;
 
constructor TMyOBJ.Create (const aFileName: String);
begin
    inherited Create;
    {if ( aFileName = '' ) then
        Free;}
    // do something
end;
 
class function TMyOBJ.Load (const aFileName: String) : TMyOBJ;
begin
    Result := NIL;
    if ( aFileName <> '' ) then
        Result := Create (aFileName);
end;
Ⓐ свобода сопротивление солидарность
Вадим К

Вадим К (статус: Академик), 22 декабря 2010, 16:37 [#26]:

функция TMyOBJ.Load плоха - потому что по сути это конструктор. Так что лучше его и использовать.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 16:49 [#27]:

Цитата (mirt.steelwater):

ну нужно значит так писать:

Конструкция finally не предназначена для отлова исключений. На присваивания = NIL ещё и хинт вылезет, что значение never used.

Цитата (mirt.steelwater):

пример, когда конструктор не создает объект:

Если в примере раскомментировать строки
{if ( aFileName = '' ) then
        Free;}
то конструктор всё равно вернёт непустой указатель на объект, которого уже нет в живых. Зачем вообще такой изврат, с какой целью?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 16:58 [#28]:

Короче, по ссылке, которую я давал ранее, всё написано по-человечески. Процитирую.

Цитата:


Что неправильно в данном коде?
var
  Obj: TSomeClass;
begin
  try
    Obj := TSomeClass.Create;
    // Операции с Obj
  finally
    Obj.Free;
  end;
end;

Весь код конструктора неявно оборачивается компилятором в блок try..finally, и при возникновении исключения в конструкторе деструктор будет вызван автоматически. Переменной Obj при этом не будет присвоено никакого значения, а исключение будет передано из конструктора наружу, что приведёт к срабатыванию блока finally. Это, во-первых, бессмысленно, потому что деструктор к этому моменту уже был выполнен, а во-вторых, с большой вероятностью приводит к ошибке, так как если Obj – локальная переменная, она имеет случайное значение, и вызов метода по такой ссылке, скорее всего, завершится исключением Access violation. Поэтому правильно будет сначала вызвать конструктор, а уже потом начинать блок try..finally.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
mirt.steelwater

mirt.steelwater (статус: Посетитель), 22 декабря 2010, 17:00 [#29]:

та понятно, просто вот, например, и такое бывает..
ок. я понял - основной аргумент - чтоб не было варнинга, согласен, буду писать так))
Ⓐ свобода сопротивление солидарность
Ящерка

Ящерка (статус: Посетитель), 24 декабря 2010, 18:51 [#30]:

Конечно спасибо всем, что поучаствовали, но я написала этот проигрыватель и сегодня сдала курсач. Бегунок я реализовала с помощью TrackBar'a. Да и плей лист был организован отлично, только не хватало то что сохраненный плейлист не может загружаться в библиотеку, то есть не может проигрываться, вот не могли бы вы мне подсказать что стоит прописать для того что бы сохраненный плейлист можно было опять загрузить

Страницы: [« Предыдущая] [1] [2]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 22:35
Выполнено за 0.04 сек.