Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: Образование, Работа и Бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование на Delphi (выпуск 89)
Программирование на DELPHI
Рассылка сайта www.delphi.int.ru
Выпуск #89 (29 июля 2010 г.)
Наиболее значимым событием прошедших месяцев стало открытие на сайте форума. На форуме Вы можете обсуждать интересующие темы, в т.ч. и касающиеся нашего сайта. Основной акцент планируется делать на темы о программировании и об информационных технологиях, но это не запрещает вести дискуссии и на сторонние темы. Форум НЕ призван отвлечь внимание от экспертной системы — она вполне сформирована и удовлетворяет потребности пользователей. Поэтому, все конкретные вопросы следует как и ранее задавать в Delphi.int.ru Expert. Форум — это именно обсуждения, не подразумевающие точного ответа. Именно на форуме Вы можете высказать свои пожелания и предложения относительно портала. С июня начал вручаться ежемесячный кубок «Форумчанин месяца». Первым его обладателем стал DNK за высокую активность на форуме в течение месяца. Участнику serox была вручена юбилейная медаль «4000-ый участник сайта», а участнику min@y™ — «4000-ый вопрос на сайте». В начале каждого месяца подводятся итоги голосования «лучший вопрос» и «лучший ответ» месяца — они выбираются на основе тех оценок, которые давали посетители сайта. Каждый из вопросов и ответов может быть оценён по пятибалльной шкале. Лучшими становятся те, за которые было отдано большее количество голосов и которые имеют наивысший средний балл. Победители получают почётные кубки. За июнь-2010 кубки получили: Amidamaru (лучший ответ) и zloy_nub (лучший вопрос). Последние достижения среди экспертов: 18 июля 2010, 21:54: Паникаровский Евгений Алексеевич стал экспертом и теперь имеет статус 1-ый класс (прежний статус: Посетитель). В раздел статистики добавлена новая страница — Географический портрет. На ней приведена разбивка зарегистрированных пользователей по странам. Delphi.int.ru Expert — общение, помощь, обмен опытом Новости портала | Участники и Эксперты | Информация и правила | Тематические разделы | Задать вопрос | Статистика Сегодня Вашему вниманию представляется подборка вопросов из раздела «Мультимедийные приложения». Вопрос # 1 145 Приветствую, уважаемые эксперты! Есть ли в Delphi функция управления громкостью динамиков?
Ответ #1. Отвечает эксперт: min@y™ Почитай хэлп по функции из модуля mmsystem.pas: function auxSetVolume; external mmsyst name 'auxSetVolume'; В Delphi World есть несколько примеров её использования. Вот один из них: procedure SetVolume(X: Word); var iErr: Integer; i: integer; a: TAuxCaps; begin for i := 0 to auxGetNumDevs do begin auxGetDevCaps(i, Addr(a), SizeOf(a)); if a.wTechnology = AUXCAPS_CDAUDIO then break; end; // Устанавливаем одинаковую громкость для левого и правого каналов. // VOLUME := LEFT*$10000 + RIGHT*1 iErr := auxSetVolume(i, (X * $10001)); if (iErr‹›0) then ShowMessage('No audio devices are available!'); end;
Ответ #2. Отвечает эксперт: Feniks Здравствуйте, Leonardo! Приложение:
Вопрос # 1 990 Доброго времени суток, уважаемые эксперты!
Ответ #1. Отвечает эксперт: min@y™ Надо создать список этих файлов в памяти (например, TStringList), чтобы поочерёдно подсовывать их имена медиаплееру в свойство FileName.
Ответ #2. Отвечает эксперт: Feniks Здравствуйте, Вечперик! Приложение:
Вопрос # 2 042 Доброго времени суток, уважаемые эксперты! Приложение:
Ответ #1. Отвечает эксперт: Feniks Здравствуйте, Вечперик! procedure TForm1.FormCreate(Sender: TObject); begin MediaPlayer1.Notify := True; MediaPlayer1.OnNotify := NotifyProc; end; procedure TForm1.NotifyProc(Sender: TObject); begin with Sender as TMediaPlayer do begin case Mode of mpStopped: // Проигрывание остановлено, значит берем следующий трек end; //must set to true to enable next-time notification Notify := True; end; end;Что тут не понятного ? В чем у вас сложности ? P.S. Желаю удачи.
Ответ #2. Отвечает эксперт: min@y™ Надо использовать событие TMediaPlayer.OnNotify. Оно генерируется при возникновении любого события, связанного с воспроизведением: (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, Resume, Rewind, StartRecording, Step, Stop), причём свойство TMediaPlayer.Notify должно быть установлено в True. Имей в виду ещё, что это свойство сбрасывается в False при каждом вызове OnNotify и его в обработчике этого события надо снова ставить в True, чтобы следующее событие OnNotify вызвало его обработчик. procedure TForm1.MediaPlayer1Notify(Sender: TObject); begin if MediaPlayer1.Mode = mpStopped then begin MediaPlayer1.Close(); MediaPlayer1.FileName:= 'Следующее_имя_файла.mp3'; MediaPlayer1.Open(); MediaPlayer1.Play(); end; Notify:= True; // Чтобы вызвалось следующее событие end; “Цитата” Это, конечно, возможно, но рекомендуется только мазохистам. :)) Относительно большие куски кода мне вставлять не разрешают, поэтому смотри приложение. З.Ы. Никак не вкурю, что такого СТРАШНОГО в TStringList? Обясни на форуме, плиз. Приложение:
Вопрос # 1 461 Здравствуйте! У меня такой вопрос:
Ответ #1. Отвечает эксперт: Бубырь Александр Николаевич Здравствуйте, Дмитрий С. - 1148! Приложение:
Ответ #2. Отвечает эксперт: Feniks Здравствуйте, Дмитрий С. - 1148! Приложение:
Вопрос # 2 143 Здравствуйте!
Ответ #1. Отвечает эксперт: Блазер Здравствуйте, Вечперик! procedure ExtractRes(ResType, ResName, ResNewName : String); var Res : TResourceStream; Begin Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType)); Res.SavetoFile(ResNewName); Res.Free; end; И собственно воспроизведение: ExtractRes('music', 'music', 'music.mp3'); with MediaPlayer1 do begin FileName:='music.mp3'; Open; Play end;Т.e. сначало файл распаковывается в папку с exe, а потом воспроизводится...при выходе из проги его можно удалить... П.с. еще файл ресурса надо подключить, вписав строку {$R music.res} под строкой {$R *.dfm}... Удачи, надеюсь все написал правильно...ибо со звуком давно не работал...если что то не получится, пишите на мф.... (редактировалось 1 раз)
Ответ #2. Отвечает эксперт: Ученый Здравствуйте, Вечперик! Создаете music.RC, точно так как вам сказал Блазер, только писать надо music WAV music.mp3. Далее создаем ресурс music.res, надеюсь в этом вы не затруднитесь.
Вопрос # 1 485 Здравствуйте!
Ответ #1. Отвечает эксперт: Бубырь Александр Николаевич Здравствуйте, Рубин Я.И.!
Ответ #2. Отвечает эксперт: T$imokhin Здравствуйте, Рубин Я.И.!
Вопрос # 1 798 Доброго времени суток, уважаемые эксперты! У меня к Вам такой вопрос: можно ли сделать такую программу, которая бы при нажатии на button воспроизводила бы видео файл (который будет лежать в одной папке с exe файлом программы) не через компонент MediaPlayer а через player, который установлен в винде по умолчанию для данного типа файлов? Спасибо
Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Violina!
Ответ #2. Отвечает эксперт: Бубырь Александр Николаевич Здравствуйте, Violina!
Вопрос # 3 042 Здравствуйте!
Ответ #1. Отвечает эксперт: min@y™ Есть не мало статей с примерами на тему проигрывания звука из ресурсов.
Ответ #2. Отвечает эксперт: Ученый Здравствуйте, Pessimist! unit ResProverka; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MMSystem; type TForm1 = class(TForm) procedure FormClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {$R res.res} procedure TForm1.FormClick(Sender: TObject); begin PlaySound('MyWavFile', Hinstance, SND_RESOURCE); end; end.Компилируешь и вауаля....
Вопрос # 1 988 Здравствуйте, уважаемые эксперты! Моя программа использует avi файл. Подскажите как упаковать этот файл в ресурс, а то приходится указывать путь к нему, а это очень не удобно.
Ответ #1. Отвечает эксперт: Блазер Здравствуйте, Ученый!
Ответ #2. Отвечает эксперт: Feniks Здравствуйте, Ученый! { Генерим имя врменненого файла } function GetTempFile : String; var TempDir, TempFile : packed array [0..MAX_PATH] of Char; begin GetTempPath(MAX_PATH, TempDir); Windows.GetTempFileName(TempDir, 'avi', 0, TempFile); Result := TempFile; end; procedure PlayMyAvi; var ResStream : TResourceStream; tmpFile : String; begin tmpFile := GetTempFile; ResStream := TResourceStream.Create(Handle, '<имя ресурса>', RT_RCDATA); ResStream.SaveToFile(tmpFile); ResStream.Free; { тут проигрываем его с помощью MediaPlayer. Оставляю это за вами. } DeleteFile(tmpFile); end; P.S. Жклаю удачи.
Вопрос # 3 150 Здравствуйте, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, BlackRanger!
Формат файлов RES применительно к BITMAP-ресурсамАвтор: SOA Написать данную статью автора побудило недостаточное количество информации в рунете и за его пределами для написания своего компилятора ресурсов типа BITMAP. Начнём! RES-файл представляет собой файл, в котором записаны поверх друг друга заголовки ресурсов и соответственно сами данные ресурсов: Header (Заголовок) Заголовок из себя представляет некую структуру с полями: typedef struct {
DWORD DataSize;
DWORD HeaderSize;
DWORD TYPE;
DWORD NAME;
DWORD DataVersion;
WORD MemoryFlags;
WORD LanguageId;
DWORD Version;
DWORD Characteristics;
} RESOURCEHEADER;
Но эта структура лишь является эталонной моделью, как в сетях является эталонной моделью модель ISO/OSI. На практике же чаще используется менее ромоздкая конструкция: typedef struct {
DWORD DataSize;
DWORD HeaderSize;
DWORD TYPE;
DWORD NAME;
} RESOURCEHEADER;
Разберемся, что значат поля в этой структуре. DataSize— размер данных ресурса, т.е. данных, копируемых из файла bmp. Он всегда меньше реального размера файла на 14 бит ввиду того, что отбрасываются несколько полей заголовка файла bmp (да-да, у bmp файлов тоже есть заголовок, как впрочем и у всех остальных типов файлов). HeaderSize — размер заголовка ресурса, т.е. размер, занимаемый всей структурой RESOURCEHEADER в байтах. TYPE — тип ресурса, в нашем случае это значение равно FFFF0200, где ключевым числом является 2 т.к. именно оно является числовым эквивалентом типа BITMAP. NAME — официально это поле имеет тип DWORD. MS пишет, что на самом деле это поле является строкой с нулевым окончанием. На практике было выяснено, что в поле NAME записывается по одному коду символа в ASCII кодировке с отделением символов друг от друга нулевым битом, после чего по неизвестному автору алгоритму строка добивается нулевыми битами, после чего ставится ASCII код нуля. Также стоит заметить, что в начале заголовка ставится значение типа DWORD, равное нулю, и в конце заголовка ставится два значения типа DWORD, равные нулю. Рассмотрим, как на практике пишется файл ресурса по смещениям:
Далее, после заголовка записываются данные из bmp-файла, начиная с 14 бита, потому что, как я уже писал, часть заголовка bmp-файла отбрасывается. Ниже приведена программа, записывающая из-bmp файла ресурс. Однако у этой программы есть одно ограничение ввиду того, что, как я уже писал, я не знаю, каким образом высчитывается количество нулевых битов в поле NAME до ASCII значения нуля, поэтому размер имени ресурса не может превышать двух символов. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type Header = Record DataSize:DWORD; HeaderSize:DWORD; Base:DWORD; RcType:DWORD; NAME:String; End; const HearedSizeBase = 4; HeaderSizeOffset = 36; DataSizeOffset = 32; TypeOffset = 40; NameOffset = 44; var Form1: TForm1; MyRes,SrcFile: TFileStream; Heder:Header; NULL: array [0..43] of byte; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:Integer; Buf: BYTE; Count: LongInt; FFFF:DWORD; CHR:WORD; begin for i:=0 to 43 do NULL[i]:=0; i:=FileCreate('Resource.res');//Создаем сам файл ресурса FileClose(i); MyRes:=TFileStream.Create('Resource.res',fmOpenWrite); If OpenDialog1.Execute=true then SrcFile:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead); Heder.NAME:=Edit1.Text;//Имя текущего файла для записи в ресурсы Heder.DataSize:=SrcFile.Size-14;//Размер ресурса (-14 это отбрасываемая часть заголовка файла bmp) Heder.RcType:=$0002FFFF; //ffff0200 тип ресурса //Записываем описание ресурса MyRes.Write(NULL,SizeOf(NULL)); MyRes.Seek(8,soFromBeginning); FFFF:=$0000FFFF; MyRes.Write(FFFF,SizeOf(FFFF));//Не знаю почему но эти биты должны иметь именно такое значение MyRes.Write(FFFF,SizeOf(FFFF)); MyRes.Seek(HearedSizeBase,soFromBeginning); Heder.Base:=32; MyRes.Write(Heder.Base,SizeOf(Heder.Base));//записываем базу заголовка MyRes.Seek(DataSizeOffset,soFromBeginning); MyRes.Write(Heder.DataSize,SizeOf(Heder.DataSize));//записываем размер данных MyRes.Seek(NameOffset-2,soFromBeginning);//Записываем имя ресурса For i:=0 to Length(Heder.Name) do Begin CHR:=Ord(Heder.Name[i]); MyRes.Write(CHR,SizeOf(CHR)); End; buf:=0; //Выравнивание if Length(Heder.Name)=1 Then For i:=1 to 6 do MyRes.Write(buf,SizeOf(buf)) Else Begin FFFF:=$00000000; For i:=1 to 2 do//расчет MyRes.Write(FFFF,SizeOf(FFFF)); End; FFFF:=$00001030; MyRes.Write(FFFF,SizeOf(FFFF)); i:=MyRes.Seek(0,soFromCurrent); MyRes.Seek(TypeOffset,soFromBeginning); MyRes.Write(Heder.RcType,SizeOf(Heder.RcType));//Записываем тип ресурса MyRes.Seek(i,soFromBeginning); FFFF:=$00000000; MyRes.Write(FFFF,SizeOf(FFFF)); MyRes.Write(FFFF,SizeOf(FFFF)); i:=MyRes.Seek(0,soFromCurrent); Heder.HeaderSize:=i-32;//Размер описания ресурса MyRes.Seek(HeaderSizeOffset,soFromBeginning); MyRes.Write(Heder.HeaderSize,SizeOf(Heder.HeaderSize));//записываем разницу между размером и базой заголовка MyRes.Seek(i,soFromBeginning); //пишем сам ресурс Count:=14;//Отбрасываем часть заголовка bmp файла SrcFile.Seek(14,soFromBeginning); While Count<SrcFile.Size do Begin SrcFile.Read(Buf,1); MyRes.Write(Buf,1); Count:=Count+1; End; SrcFile.Free; MyRes.Free; ShowMessage('Готово'); end; end. В данной статье использованы материалы:
При использовании материалов статьи просьба давать ссылку на ресурс и на автора SOA. Оценить статью | Оставить комментарий Как избавиться от компьютера за 10 дней 1. Отключите антивирусные программы, а еще лучше - вообще удалите их из системы. Эти программы нужны только для защиты компьютера от вирусов и более ни на что не годятся. 2. Не устанавливайте последние исправления безопасности для ОС и других программ. Эти исправления устраняют только известные всем ошибки. 3. Всегда открывайте вложения почтовых сообщений. Некоторые неизвестные люди тратят свое время, чтобы послать вам разные файлы. Правила вежливости предписывать чтение этих документов или запуск посланных программ. Кто знает, может быть придет хороший анекдот или полезная утилита? 4. Сделайте общими и открытыми все свои папки и файлы. Позаботьтесь, чтобы любой человек имел на них все необходимые права доступа. Это гораздо проще сложного присваивания разных полномочий для разных файлов. 5. Постарайтесь выбирать самые простые пароли для учетной записи администратора системы. Наилучшим вариантом станет слово «password". Сделайте так, чтобы пароль стал известен всем коллегам по работе. Для этого запишите его на листочке бумаги и прикрепите листок на видном месте корпуса монитора. Сетевым администраторам рекомендуется сразу включить всех пользователей в группу Администраторы (Administrators), чтобы не запоминать сложную схему распределения прав. 6. Немедленно установите клиентскую программу сети однорангового обмена P2P (рекомендуется программа Kazaa), чтобы сразу же начать загрузку разных программ. 7. Если компьютер подключен к Интернету, немедленно отключите брандмауэр, который нужен только для блокирования нежелательного трафика. Неизвестно, что считает нежелательным эта тупая программа. 8. Если не удастся отключить брандмауэр, то хотя бы откройте все порты компьютера, чтобы не пропустить какое-нибудь важное подключение к вашему компьютеру из Интернета. 9. Настройте компьютер для показа скрытых файлов. Если непонятно предназначение появившегося файла, удалите его. Скорее всего, этот файл никому не нужен. Источник: bayanov.net WWW: http://www.delphi.int.ru/ E-mail: admin@delphi.int.ru | support@delphi.int.ru Если Вы хотите где-либо разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с их автором или ведущим рассылки. |
В избранное | ||