logotype

A developer library to enhance Flash ActiveX features

What is F-IN-BOX?

F-IN-BOX is a Delphi / Builder / VCL component to enhance Macromedia / Adobe Flash Player ActiveX features. It does not use its own engine to display movies but provide a wrapper around official swflash.ocx/flash.ocx code instead. Thus it is possible to avoid certain Macromedia / Adobe Flash Player ActiveX limitations.

Delphi 3 - Delphi XE2 and Builder 3 - Builder XE2 are supported. Macromedia / Adobe Flash Player ActiveX 3 - 11 are supported.

Features

Load flash movies directly from any source (no temporary files!). Protect your flash movies.
Create flash-enabled applications which are ready to work even when the Macromedia / Adobe Flash Player ActiveX is not installed!
Transparency is fully supported!
Ability to play Flash Video (FLV) from stream
Enable/disable flash sounds
Adjust audio volume
Get a snap image of the current flash movie frame
Write code which is compatible with any version of Macromedia / Adobe Flash Player ActiveX (3, 4, 5, 6, 7, 8, 9, 10).
Flash External API
Streaming

Load flash movies directly from any source (no temporary files!). Protect your flash movies.

Download sample code

It is known fact that the Flash Player ActiveX is able to load movies at certain URLs only. You have to save the movie to a temporary location from your application's resource before you can load it. You'll have to generate a corresponding link that you can pass to the Flash Player ActiveX and then delete the movie after. You'll have to admit that this is extremely inconvenient. Apart from being inconvenient there is a chance you'll fail when you try to create a temporary file if you don't have the appropriate permission or don't have access to a temporary folder. It is definitely not an appropriate approach when security is an issue since your movie can be easily intercepted. There is a solution! F-IN-BOX uses a different approach of swflash.ocx/flash.ocx code loading. It is able to load your movies directly to the ActiveX thereby avoiding the temporary file step. Load flash movies from any TStream descendant (TResourceStream, TMemoryStream, etc.)! The advantages are pretty obvious. And you can also protect your movies from unauthorized access using your favourite software protection application.

Using the component you can load any flash movie from any stream object. Just use the LoadMovieFromStream and PutMovieFromStream methods. No temporary files! Load any flash movie on-the-fly from any supported source. For example, you can put one or more flash movies in the resource section of your application and then load it from the exe! That's the portability and power of F-IN-BOX!

If you need to play a big SWF or the speed is not very good, read about Streaming feature.

Here's an example of how to load a flash movie from a resource:

Download sample code

[ Delphi ]
{$RESOURCE 'res\movie.res'} 
...
type 
   TMainForm = class(TForm) 
     FlashPlayerControl1: TFlashPlayerControl; 
...
  end; 
...

procedure TMainForm.FormCreate(Sender: TObject); 
var 
   ResourceStream: TResourceStream; 
begin 
   ResourceStream := TResourceStream.Create(0, 'EmbeddedMovie', 'FLASH'); 
   FlashPlayerControl1.PutMovieFromStream(ResourceStream); 
   ResourceStream.Free; 
end;

Download sample code

[ Builder C++ ]
#pragma resource "res\\movie.res" 
...
class TMainForm : public TForm 
{ 
__published: 
     void __fastcall FormCreate(TObject *Sender); 
...
}; 
...
void __fastcall TMainForm::FormCreate(TObject *Sender) 
{ 
   TResourceStream* ResourceStream = new TResourceStream(0, "EmbeddedMovie", "FLASH"); 
   FlashPlayerControl1->PutMovieFromStream(ResourceStream); 
   delete ResourceStream; 
}

Download sample code

Back to top | Ask a question

Create flash-enabled applications which are ready to work even when the Macromedia / Adobe Flash Player ActiveX is not installed!

Download sample code

One of the biggest problem using the Flash Player ActiveX is the mandatory component registration. The common approach is to save swflash.ocx/flash.ocx code to temporary files and then register them. The disadvantages are the same as above mentioned - insufficient permissions to save and register an swflash.ocx/flash.ocx. Now you can forget about these problems! F-IN-BOX is able to use swflash.ocx/flash.ocx from any source. For example, you can put an swflash.ocx/flash.ocx code inside of your application's resources and instruct F-IN-BOX to use it. It is important to note that F-IN-BOX does not use temporary files and swflash.ocx/flash.ocx registration but loads and uses the code directly. No more user management rights problems - no more temporary files and no more component registrations. It is up to you to decide what swflash.ocx/flash.ocx to use - by default already registered component is used.

Traditionally, there are many obstacles or annoyances that one will encounter when using Macromedia / Adobe Flash Player ActiveX in a Delphi / Builder / VCL application.

The Application...

  1. needs swflash.ocx/flash.ocx installed in the system before it will work.
  2. has to work flawlessly with the already installed version of the Macromedia / Adobe Flash Player ActiveX.
  3. has no easy way to prevent flash movies from being abused.

TF-IN-BOX to the rescue. It solves these problems and more!

By default, the component will use the swflash.ocx/flash.ocx that's already installed on the system. The component can alternatively use any swflash.ocx/flash.ocx that you would like to provide it with using any supported source. An example of this how you can embed the flash.ocx into the resource section of your application's exe file and then load it at runtime. Using this method, your application will work even if Macromedia / Adobe Flash Player ActiveX doesn't exist on the target system. Just use FlashPlayerControl.LoadFlashOCXCodeFromStream method! With F-IN-BOX, hassling around with Macromedia / Adobe Flash Player ActiveX installation issues are a thing the past! It's so easy to do! There are even demos provided which come complete with source code to prove it!

Here's an example of how to load swflash.ocx/flash.ocx code from a resource:

Download sample code

[ Delphi ]
{$RESOURCE 'res\flash.res'} 
...
var 
   FlashCodeStream: TResourceStream; 

initialization 
   FlashCodeStream := TResourceStream.Create(0, 'FlashOCXCode', 'BIN'); 
   FlashPlayerControl.LoadFlashOCXCodeFromStream(FlashCodeStream); 
   FlashCodeStream.Free;

Download sample code

[ Builder C++ ]
#pragma resource "res\\flash_ocx.res" 
...
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{ 
...
   Application->Initialize(); 
   TResourceStream* FlashCodeStream = new TResourceStream(0, "FlashOCXCode", "BIN"); 
   Flashplayercontrol::LoadFlashOCXCodeFromStream(FlashCodeStream); 
   delete FlashCodeStream; 
...
}

Download sample code

Here's an example of how to load swflash.ocx/flash.ocx code from a file:

Download sample code

[ Delphi ]
var 
   FlashCodeStream: TFileStream; 

initialization 
   FlashCodeStream := TFileStream.Create('flash.ocx', fmOpenRead or fmShareDenyNone); 
   FlashPlayerControl.LoadFlashOCXCodeFromStream(FlashCodeStream); 
   FlashCodeStream.Free;

Download sample code

[ Builder C++ ]
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{ 
...
   Application->Initialize(); 

   TFileStream* FlashCodeStream = 
      new TFileStream("flash.ocx", fmOpenRead | fmShareDenyNone); 
   Flashplayercontrol::LoadFlashOCXCodeFromStream(FlashCodeStream); 
   delete FlashCodeStream; 
...
}

Download sample code

Back to top | Ask a question

Transparency is fully supported!

Download sample code

Using FlashPlayerControl you are able to create applications based on transparent flash movies. You can create applications with translucency non-rectangle forms (windows). Use Flash to make applications with modern user interface, make a business logic using Delphi or Builder C++.

Use TTransparentFlashPlayerControl Component to work with transparency.

  1. Put TTransparentFlashPlayerControl on a form.
  2. Set MakeParentTransparent property to True. That's all!

Please note that form transparency is supported only under Win2k (or higher), 16 / 32 bpp display mode. To check if the transparency is supported use global function IsFormTransparentAvailable:

Download sample code

[ Delphi ]
if Not IsFormTransparentAvailable then 
begin 
   ShowMessage('Translucency based on Flash is not available'); 
end;

Download sample code

[ Builder C++ ]
if (!Flashplayercontrol::IsFormTransparentAvailable()) 
{ 
   ShowMessage("Translucency based on Flash is not available"); 
}

Download sample code

Back to top | Ask a question

Ability to play Flash Video (FLV) from stream

Download sample code

Using FlashPlayerControl you are able to play Flash Video (FLV) from external files, URL or directly from a TStream. When TFlashPlayerControl loads Flash Video no temporary files are created everything runs directly from memory. You can encrypt your video and put into application's resource - TFlashPlayerControl loads FLV without ever saving or extracting the file to disk. If you need to play a big FLV or the speed is not very good, read about Streaming feature.

To play Flash Video from stream you should create flash movie that loads Flash Video from "private" URL (http://FLV/FlashVideo.flv). Flash Movie uses the following code to load Flash Video (put this in under a button in your Swf Flash Movie):

Download sample code

[ ActionScript ]
var netConn:NetConnection = new NetConnection(); 

netConn.connect(null); 

var netStream:NetStream = new NetStream(netConn); 

my_video.attachVideo(netStream); 

netStream.setBufferTime(0); 

netStream.play("http://FLV/FlashVideo.flv");

Download sample code

When Flash tries to load Flash Video from http://FLV/FlashVideo.flv, TFlashPlayerControl provides content of FLV. Use global procedure SetGlobalOnLoadExternalResourceHandler to set handle the external resources and provide them to Flash. See the code:

Download sample code

[ Delphi ]
type 
  TMainForm = class(TForm) 
    procedure FormCreate(Sender: TObject); 
...
  private 
    procedure OnGlobalLoadExternalResource(const URL: String; Stream: TStream); 
...
end; 
...
procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    SetGlobalOnLoadExternalResourceHandler(OnGlobalLoadExternalResource); 
end; 
...
procedure TMainForm.OnGlobalLoadExternalResource(const URL: String; Stream: TStream); 
var 
  ResourceStream: TResourceStream; 
begin 
    if URL = 'http://FLV/FlashVideo.flv' then 
    begin 
        ResourceStream := TResourceStream.Create(0, 'FlashVideo', 'FLV'); 
        ResourceStream.SaveToStream(Stream); 
        ResourceStream.Free; 
    end; 
end;

Download sample code

[ Builder C++ ]
class TMainForm : public TForm 
{ 
__published: 
   void __fastcall FormCreate(TObject *Sender); 
...
private: 
   void __fastcall OnGlobalLoadExternalResource(const AnsiString URL, 
                                                Classes::TStream* Stream); 
...
} 
...
void __fastcall TMainForm::FormCreate(TObject *Sender) 
{ 
   SetGlobalOnLoadExternalResourceHandler(OnGlobalLoadExternalResource); 
} 
...
void __fastcall TMainForm::OnGlobalLoadExternalResource(
   const AnsiString URL, 
   Classes::TStream* Stream) 
{ 
   if (URL == "http://FLV/FlashVideo.flv") 
   { 
      TResourceStream* ResourceStream = 
         new TResourceStream(0, "FlashVideo", "FLV"); 

      ResourceStream->SaveToStream(Stream); 

      delete ResourceStream; 
   }
}

Download sample code

Back to top | Ask a question

Enable/disable flash sounds

Download sample code

Using the component you can turn on/off all sounds in all loaded flash movies.

  1. Use global procedure SetAudioEnabled to enable/disable the sounds.
  2. Use GetAudioEnabled to get current status of sounds enabling.

Download sample code

[ Delphi ]
procedure TMainForm.Mute; 
begin 
  if FlashPlayerControl.GetAudioEnabled then 
    FlashPlayerControl.SetAudioEnabled(False); 
end;

Download sample code

[ Builder C++ ]
void __fastcall TMainForm::Mute() 
{ 
  if (Flashplayercontrol::GetAudioEnabled()) 
    Flashplayercontrol::SetAudioEnabled(false); 
}

Download sample code

Back to top | Ask a question

Adjust audio volume

Download sample code

You can set sound volume. Use the global procedure FlashPlayerControl.SetAudioVolume with a value 0 - 100 to set audio volume. Use FlashPlayerControl.GetAudioVolume to get current audio volume.

Download sample code

[ Delphi ]
FlashPlayerControl.SetAudioVolume(TrackBarSoundVolume.Position);

Download sample code

[ Builder C++ ]
Flashplayercontrol::SetAudioVolume(TrackBarSoundVolume->Position);

Download sample code

Back to top | Ask a question

Get a snap image of the current flash movie frame

Download sample code

You can get a bitmap image from the current frame of a flash movie. It means you are able create applications that can coverts Flash movies to a series of bitmaps, JPEGs and others. Also you can build generated images to make an AVI video for example.

Download sample code

[ Delphi ]
procedure TMainForm.ButtonSaveAsBitmapClick(Sender: TObject); 
var 
  Bitmap: TBitmap; 
  Picture: TPicture; 
begin 
  Picture := TPicture.Create; 
  Bitmap := FlashPlayerControl1.CreateFrameBitmap; 
  Picture.Bitmap := Bitmap; 

  Picture.SaveToFile('Frame.bmp'); 

  Bitmap.Free; 
  Picture.Free; 
end;

Download sample code

[ Builder C++ ]
void __fastcall TMainForm::ButtonSaveAsBitmapClick(TObject *Sender) 
{ 
  TPicture* Picture = new TPicture; 
  Graphics::TBitmap* Bitmap = FlashPlayerControl1->CreateFrameBitmap(); 
  Picture->Bitmap = Bitmap; 

  Picture->SaveToFile("Frame.bmp"); 

  delete Bitmap; 
  delete Picture; 
}

Download sample code

Back to top | Ask a question

Write code which is compatible with any version of Macromedia / Adobe Flash Player ActiveX (3, 4, 5, 6, 7, 8, 9, 10).

Download sample code

One of the problem with Macromedia / Adobe Flash Player ActiveX programming is that you have to control what version of Macromedia / Adobe Flash Player ActiveX you are using. For example, the property "Stacking" exists only in Macromedia / Adobe Flash Player ActiveX 5 but doesn't exist in later revisions. TFlashPlayerControl automatically detects what Macromedia / Adobe Flash Player ActiveX version is being used and prevents failure if access to non existant properties/methods is attempted. Applications using TFlashPlayerControl are not only compatible with Macromedia / Adobe Flash Player ActiveX 3, 4, 5, 6, 7, 8, 9, 10, but are also "smart" about how Macromedia / Adobe Flash Player ActiveX control is used. This makes your application more robust which can result in fewer technical support issues.

Back to top | Ask a question

Flash External API

Download sample code

FlashPlayerControl supports External API. You can call functions of a movie and a movie is able to get data from an application synchronously (instead of fscommand).

Call an ActionScript function from an application

Register your function using ExternalInterface.addCallback:

Download sample code

[ ActionScript ]
import flash.external.*; 

ExternalInterface.addCallback("CallMeFromApplication", this, InternalFunction); 

function InternalFunction(str: String): String { 
   TextArea1.text = str; 
   return "The function was called successfully"; 
}

Download sample code

Use method CallFunction:

Download sample code

[ Delphi ]
var 
   Response: WideString; 
begin 
   Response := 
FlashPlayerControl1.CallFunction(
   '<invoke name="CallMeFromApplication" returntype="xml">
    <arguments>
    <string>Some text for TFlashPlayerControl</string>
    </arguments>
    </invoke>');

   ShowMessage(Format('The function returned: %s', [ Response ] )); 
end;

Download sample code

[ Builder C++ ]
WideString Response = 
    FlashPlayerControl1->CallFunction("<invoke name=\"CallMeFromApplication\""
                                      "returntype=\"xml\"><arguments><string>"
                                      "Some text for F-IN-BOX"
                                      "</string></arguments></invoke>"); 

ShowMessage("The function returned: " + Response);

Download sample code

Call an application function from a flash script

Use flash.external.ExternalInterface.call:

Download sample code

[ ActionScript ]
on (click) { 
   _root.TextArea1.text = flash.external.ExternalInterface.call("SomeFunction"); 
}

Download sample code

Handle the event OnFlashCall:

Download sample code

[ Delphi ]
procedure TMainForm.FlashPlayerControl1FlashCall(ASender: TObject; 
  const request: WideString); 
begin 
   FlashPlayerControl1.SetReturnValue('<string>Current time is: ' + 
                                      TimeToStr(Time) + 
                                      '</string>'); 
end;

Download sample code

[ Builder C++ ]
void __fastcall TMainForm::FlashPlayerControl1FlashCall(TObject *ASender, 
      const WideString request) 
{ 
   FlashPlayerControl1->SetReturnValue("<string>Current time is: " + 
                                       TimeToStr(Time()) + 
                                       "</string>"); 
}

Download sample code

Back to top | Ask a question

Streaming

Download sample code

Streaming is an ability to load the content in the asynchronous mode. If you load a movie using LoadMovieFromStream, the movie is loaded into LoadMovieFromStream. If your movie is large, it may take some time. Another example: you have encoded an SWF/FLV file and want to load it into the player. If you use LoadMovieFromStream, the player will play the file only after all of the data is decoded . That's why the ability to provide content in the asynchronous mode is important.

Remarks:

  • to load a movie or another resource data (*.flv, *.jpg, *.mp3, *.xml etc.) you should use a stream (AStream). To provide content, write to this stream (AStream.Write);
  • if you write data in a separate thread, call AStream.Write using Synchronize;
  • if AStream.Write returns 0, loading has been cancelled (for example, another movie is being loaded);
  • free AStream (AStream.Free) when loading is finished (even if loading has been cancelled);

There are few use cases:

Loading a movie in the asynchronous mode

Download sample code

Use LoadMovieUsingStream or PutMovieUsingStream.

Remarks:

  • use a movie stream to load a movie. To provide movie content, write to this stream;
  • if you write data in a separate thread, call Write (of the movie stream) using Synchronize;
  • if Write returns 0, loading has been cancelled (for example, another movie is being loaded);
  • free the movie stream when loading is finished (even if loading has been cancelled);

Download sample code

[ Delphi ]
   MovieStream: TStream; 
begin 
   FlashPlayerControl1.LoadMovieUsingStream(0, MovieStream); 
   ContentProviderThread := 
      TContentProviderThread.Create(MovieStream); 
end; 
...

TContentProviderThread = class(TThread) 
private 
   FMovieStream: TStream; 
   FBuffer: TMemoryStream; 
...
end; 
...
procedure TContentProviderThread.DoWrite; 
var 
   nWrittenBytes: integer; 
begin 
   nWrittenBytes := FMovieStream.Write(FBuffer.Memory^, FBuffer.Size); 

   if nWrittenBytes = 0 then 
      // Write returns 0, if loading was cancelled by some reason 
      FStop := true; 
end; 
...
procedure TContentProviderThread.Execute; 
begin 
   while not FStop do 
   begin 
      // preparing buffer 
      PrepareBuffer; 

      if FBuffer.Size > 0 then 
         // always call DoWrite using Synchronize! 
         Synchronize(DoWrite); 
   end; 

   // free the stream after providing all amount of data! 
   FMovieStream.Free; 
end;

Download sample code

[ Builder C++ ]
TStream* MovieStream; 

FlashPlayerControl1->LoadMovieUsingStream(0, MovieStream); 

TContentProviderThread* ContentProviderThread = 
   new TContentProviderThread(MovieStream); 
...
class TContentProviderThread : public TThread 
{ 
   private: 
      TStream* FMovieStream; 
      TMemoryStream* FBuffer; 
...
}; 
...

void __fastcall TContentProviderThread::DoWrite() 
{ 
   int nWrittenBytes = FMovieStream->Write(FBuffer->Memory, FBuffer->Size); 

   if (0 == nWrittenBytes) 
      FStop = true; 
} 
...
void __fastcall TContentProviderThread::Execute() 
{ 
   while (!FStop) 
   { 
      // preparing buffer 
      PrepareBuffer(); 

      if (FBuffer->Size > 0) 
      Synchronize(DoWrite); 
   } 

   // free the stream after providing all amount of data! 
   FMovieStream->Free(); 
}

Download sample code

Loading an external resource (*.flv - flash video, *.swf, *.jpg, *.mp3) by full path (i.e. beginning with http://) in the asynchronous mode

Download sample code

Instruction:

  1. set the global resource handler. Use the global procedure FlashPlayerControl.SetGlobalOnLoadExternalResourceHandlerEx;
  2. a movie loads a flash video from a "private" URL ( http://FLV/FlashVideo.flv);
  3. the handler is called. You compare the passed URL with "http://FLV/FlashVideo.flv". If they are equal, set bHandled to "true" and use the passed Stream to write the content of FLV;
  4. after all the data has been provided, free the stream;

Remarks:

  • you get a stream assigned with a resource in a handler. Set the handler using the global FlashPlayerControl.SetGlobalOnLoadExternalResourceHandlerEx procedure;
  • if you write data in a separate thread, call Write using Synchronize;
  • if Write returns 0, loading has been cancelled (for example, another movie is being loaded);
  • free the stream when loading is finished. Even if loading has been cancelled;

Download sample code

[ Delphi ]
var 
   MovieStream: TStream; 
begin 
   // set global handler 
   SetGlobalOnLoadExternalResourceHandlerEx(ContentProvider); 
   FlashPlayerControl1.LoadMovieFromStream(0, MovieStream); // load movie 
...
procedure TMainForm.ContentProvider(const URL: string; 
         Stream: TStream; 
         out bHandled: Boolean); 
var 
   ContentProviderThread: TContentProviderThread; 
begin 
   if URL = 'http://FLV/FlashVideo.flv' then 
   begin 
      ContentProviderThread := TContentProviderThread.Create(Stream); 

      bHandled := true; 
   end; 
end; 
...
TContentProviderThread = class(TThread) 
private 
   FResourceStream: TStream; 
   FBuffer: TMemoryStream; 
...
end; 
...
procedure TContentProviderThread.DoWrite; 
var 
   nWrittenBytes: integer; 
begin 
   nWrittenBytes := FResourceStream.Write(FBuffer.Memory^, FBuffer.Size); 

   if nWrittenBytes = 0 then 
      // Write returns 0, if loading was cancelled by some reason 
      FStop := true; 
end; 
...
procedure TContentProviderThread.Execute; 
begin 
   while not FStop do 
   begin 
      // preparing buffer 
      PrepareBuffer; 

   if FBuffer.Size > 0 then 
      // always call DoWrite using Synchronize! 
         Synchronize(DoWrite); 
   end; 

   // free the stream after providing all amount of data! 
   FResourceStream.Free; 
end;

Download sample code

[ Builder C++ ]
TStream* MovieStream; 

FlashPlayerControl1->LoadMovieUsingStream(0, MovieStream); 

TContentProviderThread* ContentProviderThread = 
   new TContentProviderThread(MovieStream); 
...
class TContentProviderThread : public TThread 
{ 
   private: 
      TStream* FResourceStream; 
      TMemoryStream* FBuffer; 
...
}; 
...
void __fastcall TContentProviderThread::DoWrite() 
{ 
   int nWrittenBytes = FResourceStream->Write(FBuffer->Memory, FBuffer->Size); 

   if (0 == nWrittenBytes) 
      FStop = true; 
} 
...
void __fastcall TContentProviderThread::Execute() 
{ 
   while (!FStop) 
   { 
      // preparing buffer 
      PrepareBuffer(); 

      if (FBuffer->Size > 0) 
         Synchronize(DoWrite); 
   } 

   // free the stream after providing all amount of data! 
   FResourceStream->Free(); 
}

Download sample code

A movie is loaded using LoadMovieFromStream, PutMovieFromStream, LoadMovieUsingStream or PutMovieUsingStream. A movie loads an external resource (*.swf, *.jpg, *.mp3, but except *.flv - flash video) by relative path (i.e. something like "images/image1.jpg"). You should provide the resource in the asynchronous mode

Download sample code

In this case you should handle the event OnLoadExternalResourceEx.

Remarks:

  • you get stream assigned with a resource in a handler of the OnLoadExternalResourceEx event. Check the passed URL and if you are ready to provide the content, set bHandled, passed as a reference, to true, use the passed Stream to write the content;
  • if you write data in a separate thread, call Write using Synchronize;
  • if Write returns 0, loading has been cancelled (for example, another movie is being loaded). Don't forget to free the stream!
  • free the stream when all the content has been written;
  • Builder C++ only: sometimes Builder C++ creates OnLoadExternalResourceEx event handler with bool bHandled instead of bool& bHandled. If it happened, change bool to bool& in a header file and in a source file;

Here is an example how to provide content of an image:

Download sample code

[ Delphi ]
procedure TMainForm.FlashPlayerControl1LoadExternalResourceEx( 
   ASender: TObject; 
   const URL: String; 
   Stream: TStream; 
   var bHandled: Boolean); 
var 
   ContentProviderThread: TContentProviderThread; 
begin 
   if URL = 'images/embedded_image1.jpg' then 
   begin 
      ContentProviderThread := TContentProviderThread.Create(Stream); 

      bHandled := true; 
   end; 
end; 
...
TContentProviderThread = class(TThread) 
private 
   FResourceStream: TStream; 
   FBuffer: TMemoryStream; 
...
end; 
...
procedure TContentProviderThread.DoWrite; 
var 
   nWrittenBytes: integer; 
begin 
   nWrittenBytes := FResourceStream.Write(FBuffer.Memory^, FBuffer.Size); 

   if nWrittenBytes = 0 then 
      // Write returns 0, if loading was cancelled by some reason 
      FStop := true; 
end; 
...
procedure TContentProviderThread.Execute; 
begin 
   while not FStop do 
   begin 
      // preparing buffer 
      PrepareBuffer; 

      if FBuffer.Size > 0 then 
         // always call DoWrite using Synchronize! 
         Synchronize(DoWrite); 
   end; 

   // free the stream after providing all amount of data! 
   FResourceStream.Free; 
end;

Download sample code

[ Builder C++ ]
// Sometimes Builder C++ creates event handler with bool bHandled 
// instead of bool& bHandled. If it happened, change bool 
// to bool& in a header file and in a source file 
void __fastcall TMainForm::FlashPlayerControl1LoadExternalResourceEx( 
      TObject *ASender, 
      const AnsiString URL, 
      TStream *Stream, 
      bool& bHandled) 
{ 
   if (URL == "images/embedded_image1.jpg") 
   { 
      TContentProviderThread* ContentProviderThread = 
         new TContentProviderThread(Stream); 

      bHandled = true; 
   } 
} 
...
class TContentProviderThread : public TThread 
{ 
   private: 
      TStream* FResourceStream; 
      TMemoryStream* FBuffer; 
...
}; 
...
void __fastcall TContentProviderThread::DoWrite() 
{ 
   int nWrittenBytes = FResourceStream->Write(FBuffer->Memory, FBuffer->Size); 

   if (0 == nWrittenBytes) 
      FStop = true; 
} 
...
void __fastcall TContentProviderThread::Execute() 
{ 
   while (!FStop) 
   { 
      // preparing buffer 
      PrepareBuffer(); 

      if (FBuffer->Size > 0) 
         Synchronize(DoWrite); 
   } 

   // free the stream after providing all amount of data! 
   FResourceStream->Free(); 
}

Download sample code

Back to top | Ask a question

Copyright © 2004 – 2012 Softanics. All rights reserved.
F-IN-BOX ® is a trademark of Softanics and Artem A. Razin
Delphi is a trademark of Embarcadero Technologies, Inc.. Macromedia and Shockwave Flash are trademarks of Adobe, Inc.