Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.049 c
6-1147845759
BanderLog
2006-05-17 10:02
2006.10.15
Использование TIdSync в Indy10


15-1159110530
olenevod_Bildiev
2006-09-24 19:08
2006.10.15
компиляция кода на delphii2006 в delphi7


2-1158926772
did_elena
2006-09-22 16:06
2006.10.15
вычисление даты


15-1158872352
Eraser
2006-09-22 00:59
2006.10.15
Просьба протестировать сайт


2-1159692706
Fantasy
2006-10-01 12:51
2006.10.15
Message