Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите решить проблему с ListView и TrackBar

49K
09 ноября 2009 года
-=C@$Per=-
9 / / 09.11.2009
Вопрос: № 1
Я пишу программу будильник, в ней есть такая функция, как воспроизвести музыкальный файл, который тебя и будет утром будить, кнопка такая нажимаешь и прослушиваешь, что ты за песню выбрал. Я нажимаю воспроизвести (кнопка Play), появляется ползунок/бегунок (TrackBar1.Visible := True; ) Запускается таймер с интервалом 1000 миллисекунд, он и меняет положение ползунка каждую секунду и если песня кончилась, то присваивает кнопке плэй, вид и тэг, что она типа уже не плэй, а стоп, меняет положение ползунка на начало и сам себя (таймер) выключает. Теперь сам вопрос, как сделать, чтобы ползунок показывал сколько песни проиграло, сколько осталось. Проще говоря, как получить сколько длиться песня? Как я понимаю когда получу миллисекунды (продолжительность трэка), то мне надо сделать так: (TrackBar1.Max := «Те самые миллисекунды»; ) Воспроизводит звук TMediaPlayer . Да и вообще посоветуйте как это лучше реализовать, если я не правильно придумал?

Вопрос: №2
Я пишу будильник, но уже приличный, там будут напоминания дней рождений, простые напоминания и сами будильники. На форме SettingForm есть ListView, нажимаю кнопку «Новый» (будильник), появляется форма, настраиваю, жму «ОК» и будильник добавляется в список «ListView» Будильник это объект: TClock = class(TObject). Мне надо как то привязать будильник к конкретной строке списка, чтобы когда я выделял в списке нужный будильник и нажимал «Изменить» то он передавал свои параметры той форме про которую я говорил выше. Как передавать я знаю, как привязывать объект и потом его получать не могу понять, объясните кто нибудь пожалуйста. Вот код нажатия на кнопку «Новый», я походу не правильно добавляю объект. Если правильно то как его вызывать?

Код:
procedure TForm1.BtnNewClockClick(Sender: TObject);
var Alarm : TClock;
begin
  FormNewClock := TFormNewClock.Create(self);
  FormNewClock.ReserveVolume := FormNewClock.GetVolume; //зарезервировать текущую громкость звука
 try
  if FormNewClock.ShowModal = mrOK then //если в FormNewClock нажали "ОК" то выполняется код
  begin
    Alarm := TClock.Create;
    FormNewClock.SetData(Alarm); //получить настройки будильника из формы FormNewClock

if (Alarm.FMode = ONE_ALARM) then
begin
    with ListViewAlarm.Items.Add do
    begin
      Caption := Alarm.FTextMessage;
      SubItems.Add(DateToStr(FormNewClock.DatePicker.Date));
      SubItems.Add(TimeToStr(FormNewClock.TimePicker.Time));
      SubItems.Add(Alarm.FPeriodAlarm);//добавляется периодичность срабатывания
      Checked := True;
    end;
end;

if (Alarm.FMode = EVERY_DAY) then
begin
    with ListViewAlarm.Items.Add do
    begin
      Caption := Alarm.FTextMessage;
      DecodeTime(FormNewClock.TimePicker.Time, Alarm.FHour, Alarm.FMin, Alarm.FSec, Alarm.FMilSec);
      if (Alarm.FHour >= HourOf(Now)) and (Alarm.FMin > MinuteOf(Now))
      then SubItems.Add('сегодня ')
      else SubItems.Add('завтра ');
      SubItems.Add(TimeToStr(FormNewClock.TimePicker.Time));
      SubItems.Add(Alarm.FPeriodAlarm);//добавляется периодичность срабатывания
      SubItems.AddObject('Будильник', Alarm);
      Checked := True;
    end;
end;

if (Alarm.FMode = EVERY_WEEK) then
begin

    with ListViewAlarm.Items.Add do
    begin
      Caption := Alarm.FTextMessage;
      SubItems.Add(IntDayWeekToStr(Alarm.FDayOfWeek));
      SubItems.Add(TimeToStr(FormNewClock.TimePicker.Time));
      SubItems.Add(Alarm.FPeriodAlarm);//добавляется периодичность срабатывания
      SubItems.AddObject('Будильник', Alarm);
      Checked := True;
    end;
end;

if (Alarm.FMode = EVERY_HOUR) then
begin
    with ListViewAlarm.Items.Add do
    begin
      Caption := Alarm.FTextMessage;
      DecodeTime(FormNewClock.TimePicker.Time, Alarm.FHour, Alarm.FMin, Alarm.FSec, Alarm.FMilSec);
      SubItems.Add('ежедневно ');
      SubItems.Add(IntToStr(Alarm.FMin)+' мин');
      SubItems.Add(Alarm.FPeriodAlarm);//добавляется периодичность срабатывания
      SubItems.AddObject('Будильник', Alarm);
      Checked := True;
    end;
end;

if (Alarm.FMode = EVERY_MONTH) then
begin
    with ListViewAlarm.Items.Add do
    begin
      Caption := Alarm.FTextMessage;
      SubItems.Add((FormNewClock.EditEveryYear.Text)+'-го числа');
      SubItems.Add(TimeToStr(FormNewClock.TimePicker.Time));
      SubItems.Add(Alarm.FPeriodAlarm);//добавляется периодичность срабатывания
      SubItems.AddObject('Будильник', Alarm);
      Checked := True;
    end;
end;

if (Alarm.FMode = EVERY_YEAR) then
begin
    with ListViewAlarm.Items.Add do
    begin
      Caption := Alarm.FTextMessage;
      SubItems.Add((FormNewClock.EditEveryYear.Text)+'-го '+IntMonthToStr(Alarm.FMonth));
      SubItems.Add(TimeToStr(FormNewClock.TimePicker.Time));
      SubItems.Add(Alarm.FPeriodAlarm);//добавляется периодичность срабатывания
      SubItems.AddObject('Будильник', Alarm);
      Checked := True;
    end;
end;

  end; //чтобы в дальнейшем их сохранить и добавить запись в ListView
 finally
   FormNewClock.Free;
   waveOutSetVolume(WAVE_MAPPER, FormNewClock.ReserveVolume); //востановить громкость из резерва
 end;
end;
14
09 ноября 2009 года
Phodopus
3.3K / / 19.06.2008
1. Залезьте в справку, прочитайте про все св-ва TMediaPlayer. Типа .Length и т.д.
2. У TListItem есть такое св-во как Data. Хоть оно и Pointer, сохранять в нем можно и соразмерные числовые величины путем приведения типов.
49K
09 ноября 2009 года
-=C@$Per=-
9 / / 09.11.2009
Цитата:
1. Залезьте в справку, прочитайте про все св-ва TMediaPlayer. Типа .Length и т.д.


Конечно спасибо. Но я по английски не очень шарю, так много слов знаю но не до такой степени, что бы читать. Лазил пытался прочитать, переводил переводчиком, ничё не понял. Особенно в медиа плеере, где там храниться продолжительность трека не ясно.

Цитата:
сохранять в нем можно и соразмерные числовые величины путем приведения типов


Соразмерные... ладно, одинаковых размеров или в одном диапазоне, чёто типа того. ОК, числовые величины путём приведения типов??? I : integer; I := 3; I = числовая величина, типа integer. Так? Надо не числа, а объекты привязывать. Data вроде переводиться как - данные.
Вообще ничего не понял. Ну хотябы на примере маленьком объясните кто нибудь.

303
10 ноября 2009 года
makbeth
1.0K / / 25.11.2004
Цитата: -=C@$Per=-
Соразмерные... ладно, одинаковых размеров или в одном диапазоне, чёто типа того. ОК, числовые величины путём приведения типов??? I : integer; I := 3; I = числовая величина, типа integer. Так? Надо не числа, а объекты привязывать. Data вроде переводиться как - данные.
Вообще ничего не понял. Ну хотябы на примере маленьком объясните кто нибудь.


Говоря соразмерные, Phodopus имел в виду, что тип свойства Data является указателем - по сути числом, размерность которого зависит от того, под какую платформу собрано приложение: 32 или 64 бит. (Говоря о делфи имеем 32 бит). Соответственно этому полю мы можем путем приведения типов присвоить любое значение типа размером до 32х бит.
В твоем случае, ссылка на объект класса TClock также является указателем. Поэтому ее можно смело присвоить свойству Data:

Код:
with ListViewAlarm.Items.Add do
    begin
        //...
        Data := Pointer(Alarm);
        //...
    end;
   
    // и наоборот
   
    //...
    Alarm := TClock(ListItem.Data);
    //...
49K
10 ноября 2009 года
-=C@$Per=-
9 / / 09.11.2009
Цитата: makbeth
Говоря соразмерные, Phodopus имел в виду, что тип свойства Data является указателем - по сути числом, размерность которого зависит от того, под какую платформу собрано приложение: 32 или 64 бит. (Говоря о делфи имеем 32 бит). Соответственно этому полю мы можем путем приведения типов присвоить любое значение типа размером до 32х бит.
В твоем случае, ссылка на объект класса TClock также является указателем. Поэтому ее можно смело присвоить свойству Data:
Код:
with ListViewAlarm.Items.Add do
    begin
        //...
        Data := Pointer(Alarm);
        //...
    end;
   
    // и наоборот
   
    //...
    Alarm := TClock(ListItem.Data);
    //...



Спасибо!!! Единственный человек объяснил, этот вопрос я задал на 5-ти форумах. Я конечно пока не пробовал, но попробую скоро, думаю соображу. И ещё, на Delphi можно писать программы для 64 битных систем (Windows 7, Vista, XP)?

49K
10 ноября 2009 года
-=C@$Per=-
9 / / 09.11.2009
Всё работает!!! На будущее мож кому пригодиться:

Код:
procedure TForm1.BtnChancgeClockClick(Sender: TObject);
var
    Alarm : TClock;
    SavedIndex : integer;
begin
    FormNewClock := TFormNewClock.Create(self);
    FormNewClock.ReserveVolume := FormNewClock.GetVolume;
    try
    with ListViewAlarm do [COLOR="Red"]Alarm := TClock(ListViewAlarm.Items.Item[ItemIndex].Data);[/COLOR]
      FormNewClock.GetData(Alarm);
      if FormNewClock.ShowModal = mrOK then
      begin
        FormNewClock.SetData(Alarm); //получить настройки будильника из формы FormNewClock
        with ListViewAlarm do
        begin
          SavedIndex := ItemIndex;

if (Alarm.FMode = ONE_ALARM) then
begin
    ListViewAlarm.Items.Item[ItemIndex].SubItems.Clear; //Очищаем строку
    with ListViewAlarm.Items.Item[ItemIndex] do
    begin
      Caption := Alarm.FTextMessage;
      SubItems.Add(DateToStr(FormNewClock.DatePicker.Date));
      SubItems.Add(TimeToStr(FormNewClock.TimePicker.Time));
      SubItems.Add(Alarm.FPeriodAlarm);//добавляется периодичность срабатывания
      Checked := True;
    end;

end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог