Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

Совместное использование процедур юнита и компонента   Найти похожие ветки 

 
ProgRAMmer Dimonych   (2006-09-30 22:56) [0]

Пишу свою замену TMediaPlayer. Кто-нибудь, подскажите, плз, как из процедуры, не являющейся методом TMyMediaPlayer, вызвать метод самого TMyMediaPlayer. Заранее спс.


 
ProgRAMmer Dimonych   (2006-09-30 23:01) [1]

Или хотя бы к его полю FFile:TMemoryStream. Или придётся этот Stream убрать из компонента (или перенести из private в public)?


 
Джо ©   (2006-09-30 23:03) [2]

Private methods никак не вызвать. Они видны только в том же юните, где объявлен класс компонента.


 
ProgRAMmer Dimonych   (2006-09-30 23:05) [3]

А к MemoryStream"у как-нибудь можно добраться? (См. [1])


 
Джо ©   (2006-09-30 23:08) [4]

> [3] ProgRAMmer Dimonych   (30.09.06 23:05)
> А к MemoryStream"у как-нибудь можно добраться? (См. [1])

Что значит "добраться"? Повторю, более расширено: "Private members видны только в том же юните, где объявлен класс компонента".


 
Джо ©   (2006-09-30 23:09) [5]

Тьфу, не "компонента" конечно же, а вообще "класс".


 
ProgRAMmer Dimonych   (2006-09-30 23:15) [6]

Только, кажись, private"ом дело не ограничивается: в public"е тоже не находит. Можно с этим как-то бороться?


 
Loginov Dmitry ©   (2006-09-30 23:17) [7]

Без телепатии не обойтись...


 
ProgRAMmer Dimonych   (2006-09-30 23:20) [8]

Запасаемся валерьянкой...

unit MMPlayer;

interface

uses
 SysUtils, Classes, MMSystem;

type
 TShortInt=array [0..1] of ShortInt;
 PShortInt=^TShortInt;
 //
 DWord=LongWord;
 TMMPlayer = class(TComponent)
 private
   //Common
   FFileName:ANSIString;
   //For WAVE
   FmtChunk,DataChunk:Int64;
   WaveFmt:TWAVEFORMATEX;
   WO:HWAVEOUT;
   WOState:Boolean;
   sndHdr:array [boolean] of TWaveHdr;
   sndData:array [boolean] of PShortInt;
   sndPlay:Boolean;
   CurrPosition:Int64;
   //Special
   FErrorList:TStringList;
   { Private declarations }
 protected
   procedure ReLoad;
   procedure CheckAndPack(FormatChunk:Int64);
   function ReadString(Count:Integer; Stream:TStream):ANSIString;
   procedure LookForChunk(ChunkID:ANSIString; Stream:TStream; var Position:Int64);
   procedure Close;
   procedure Open;
   { Protected declarations }
 public
   FFile:TMemoryStream;
   constructor Create(AOwner:TComponent); override;
   destructor Destroy; override;
   //
   property FileName:ANSIString read FFileName;
   property Errors:TStringList read FErrorList;
   //
   procedure LoadFromFile(FileName:ANSIString);
   procedure LoadFromStream(Stream:TStream);
   { Public declarations }
 published
   { Published declarations }
 end;

procedure Register;
procedure Ready(hW:HWAVEOUT; uMsg,dwInstance,dwParam1,dwParam2:DWord); stdcall;
procedure PlayNext;

implementation

procedure Register;
begin
 RegisterComponents("My controls", [TMMPlayer]);
end;

constructor TMMPlayer.Create(AOwner:TComponent);
begin
//Create
inherited Create(AOwner);
//Common
FFile:=TMemoryStream.Create;
//Special
FErrorList:=TStringList.Create;
//
WOState:=False;
end;

destructor TMMPlayer.Destroy;
begin
//
Close;
//Special
FErrorList.Free;
//Common
FFile.Free;
//Destroy
inherited Destroy;
end;

procedure TMMPlayer.LoadFromFile(FileName:ANSIString);
var
Tmp:Integer;
begin
FFileName:=FileName;
FFile.LoadFromFile(FileName);
FErrorList.Add("Loading from the file "+FileName+"...");
Tmp:=FErrorList.Count;
ReLoad;
if Tmp=FErrorList.Count then Exit;
FErrorList.Add("Loading failed!!!");
end;

procedure TMMPlayer.LoadFromStream(Stream:TStream);
var
Tmp:Integer;
begin
FFileName:="*** Stream ***";
FFile.LoadFromStream(Stream);
FErrorList.Add("Loading form the stream...");
Tmp:=FErrorList.Count;
ReLoad;
if Tmp=FErrorList.Count then Exit;
FErrorList.Add("Loading failed!!!");
end;

procedure TMMPlayer.ReLoad;
var
D:DWord;
begin
Close;
FFile.Position:=0;
if ReadString(4,FFile)<>"RIFF" then
begin
 FErrorList.Add("Not a RIFF file...");
 Exit;
end;
FFile.Read(D,4);
if FFile.Size-8<>D then
begin
 FErrorList.Add("Irregular file size of file size info.");
 Exit;
end;
if ReadString(4,FFile)<>"WAVE" then
begin
 FErrorList.Add("Not a WAVE file...");
 Exit;
end;
LookForChunk("fmt ",FFile,FmtChunk);
LookForChunk("data",FFile,DataChunk);
CheckAndPack(FmtChunk);
end;

procedure TMMPlayer.CheckAndPack(FormatChunk:Int64);
var
D:DWord;
begin
FFile.Position:=FormatChunk+4;
FFile.Read(D,4);
if D<>16 then
begin
 FErrorList.Add("Unsupported format chunk: compressed or unknown sound format...");
 Exit;
end;
FFile.Read(WaveFmt.wFormatTag,2);
FFile.Read(WaveFmt.nChannels,2);
FFile.Read(WaveFmt.nSamplesPerSec,4);
FFile.Read(WaveFmt.nAvgBytesPerSec,4);
FFile.Read(WaveFmt.nBlockAlign,2);
FFile.Read(WaveFmt.wBitsPerSample,2);
WaveFmt.cbSize:=SizeOf(TWAVEFORMATEX);
if WaveFmt.wFormatTag<>1 then
begin
 FErrorList.Add("Unsupported chunk size: compressed or extended format...");
 Exit;
end;
if WaveFmt.nAvgBytesPerSec<>WaveFmt.nSamplesPerSec*WaveFmt.nBlockAlign then
begin FErrorList.Add("Bad format info..."); Exit; end;
if WaveFmt.nBlockAlign<>WaveFmt.nChannels*(WaveFmt.wBitsPerSample/8) then
begin FErrorList.Add("Bad format info..."); Exit; end;
end;

function TMMPlayer.ReadString(Count:Integer; Stream:TStream):ANSIString;
var
i:Integer;
b:Byte;
begin
Result:="";
for i:=1 to Count do
begin
 FFile.Read(b,1);
 Result:=Result+Chr(b);
end;
end;

procedure TMMPlayer.LookForChunk(ChunkID:ANSIString; Stream:TStream; var Position:Int64);
var
D:DWord;
CurrChunk:ANSIString;
begin
Position:=Stream.Position;
CurrChunk:="";
while (CurrChunk<>ChunkID) and (Stream.Position<Stream.Size) do
begin
 CurrChunk:=ReadString(4,Stream);
 if CurrChunk=ChunkID then
 begin
  Stream.Read(D,4);
  Stream.Position:=Stream.Position-8;
  Position:=Stream.Position;
  Exit;
 end;
 Stream.Read(D,4);
 Stream.Position:=Stream.Position+D;
end;
end;

procedure TMMPlayer.Close;
var
b:Boolean;
begin
if not(WOState) then Exit;
for b:=False to True do
begin
 waveOutUnprepareHeader(WO,@sndHdr[b],SizeOf(sndHdr[b]));
 FreeMem(sndData[b],WaveFmt.nAvgBytesPerSec);
end;
waveOutClose(WO);
end;

procedure TMMPlayer.Open;
var
b:Boolean;
begin
if WOState then Exit;
if waveOutOpen(@WO,WAVE_MAPPER,@WaveFmt,DWORD(@Ready),0,CALLBACK_FUNCTION)<>MMSYSER R_NOERROR then
begin
 FErrorList.Add("Unable to open HWAVEOUT device!!!");
 Exit;
end;
for b:=False to True do
begin
 GetMem(sndData[b],WaveFmt.nAvgBytesPerSec);
 sndHdr[b].lpData:=@sndData[b][0];
 sndHdr[b].dwBufferLength:=WaveFmt.nAvgBytesPerSec;
 waveOutPrepareHeader(WO,@sndHdr[b],SizeOf(sndHdr[b]));
end;
sndPlay:=False;
WOState:=True;
end;

procedure Ready(hW:HWAVEOUT; uMsg,dwInstance,dwParam1,dwParam2:DWord); stdcall;
begin
if uMsg=WOM_DONE then
begin
 PlayNext;
end;
end;

procedure PlayNext;
begin
 
end;

end.

Просто хочется самому всей этой фигнёй пострадать, а waveOutOpen для callback"а метод класса не берёт: ему обычную процедуру подавай!


 
Джо ©   (2006-09-30 23:47) [9]

> Просто хочется самому всей этой фигнёй пострадать, а waveOutOpen
> для callback"а метод класса не берёт: ему обычную процедуру
> подавай!

И причем здесь тогда вообще вся тема? Вот и подавай ему обычную процедуру.


 
Сергей М. ©   (2006-09-30 23:56) [10]


> waveOutOpen для callback"а метод класса не берёт: ему обычную
> процедуру подавай


Ну так и подай !
К чему вся эта шняга, что ты привел  ?

Заметь, что колбэк-ф-ции как правило имеют одним из параметров произвольное пользовательское значение, которое ты волен использовать как твоей душеньке угодно, в дан.случае - для передачи ссылки на свой объект


 
guav ©   (2006-10-01 00:02) [11]

Есть такая возможность.
http://kladovka.net.ru/index.cgi?pid=dir&rid=8&ppn=2 здесь найти makeinstance.zip и скачать.

Однако обычно без этого можно обойтись. У waveOutOpen есть параметр dwCallbackInstance куда можно передать Self. в "обычной функции" можно сразу же вызвать соответствц метод и тогда почти весь код будет в классе.

Примеров на эту тему в VCL хватает, хотя бы TThread и ThreadProc.


 
ProgRAMmer Dimonych   (2006-10-01 00:23) [12]

При добавлении Handle надо что-то добавлять в конструктор (или другой метод) моего TComponent или просто написать

private
FHandle:THandle;
published
Handle:THandle read FHandle;?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.036 c
3-1155627561
Death
2006-08-15 11:39
2006.10.15
Создание индексов в THalcyonDataSet


2-1159263703
e_u_
2006-09-26 13:41
2006.10.15
структура


2-1159128425
Vovan#1
2006-09-25 00:07
2006.10.15
И всё-таки он бажный (про одно предупреждение)


2-1159183346
vitv
2006-09-25 15:22
2006.10.15
FIBPlus


3-1155633615
Arm79
2006-08-15 13:20
2006.10.15
Доступ к значениям в ConnectionString





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский