Sample Application: DelayRenderDIBTest.dpr

Project source
Form source (Pascal)
Form source (DFM)

Design-time form image
Project source: DelayRenderDIBTest.dpr

program DelayRenderDIBTest;

{Example application for UnitOOPS OLE Drag and Drop Components}
uses
  Forms,
  fmDelayRenderDIBTest in 'fmDelayRenderDIBTest.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Back to top
Form source: fmDelayRenderDIBTest.pas

unit fmDelayRenderDIBTest;

{ Example for UnitOOPS OLE Drag and Drop Components.  Demonstrates how to
  drag a bitmap in DIB format, and only have the data rendered at drop-time (when
  it's actually needed) to avoid large memory allocations until needed.

  Last modified:  11/10/99
}
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, uoole;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Panel1: TPanel;
    Image1: TImage;
    UOTextSource1: TUOTextSource;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure UOTextSource1RenderCustomFormat(Sender: TObject;
      const formatName: String; var formatContent: String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
// OnMouseDown - detect the drag.
begin
  if DragDetect(Panel1.Handle, POINT(X,Y)) then
  begin
    // We have a drag.
    with UOTextSource1, CustomFormatData do
    begin
      // Clear out the custom format list,
      Clear;

      // Advertise that we can supply DIB's, but send no data.
      // At drop time we'll be asked for this in OnRenderCustomFormat
      AddFormat(IntToStr(CF_DIB), '');

      // Do the drag
      Execute;
    end;    // with

  end;
end;


procedure TForm1.UOTextSource1RenderCustomFormat(Sender: TObject;
  const formatName: String; var formatContent: String);
// We've been asked to render the custom format formatName.
// We may get called multiple times here.
var
  aMS: TStringStream;
begin
  // Have we been asked for DIB?
  if (formatName = IntToStr(CF_DIB)) then
  begin
    // Use a TStringStream to get the data on a string easily
    aMS := TStringStream.create('');
    try
      // Put the bitmap from our TImage on the stream
      Image1.Picture.Bitmap.SaveToStream(aMS);
      // Grab the contents as a string
      formatContent := aMS.DataString;
      // Remove the file header to get a standalone DIB
      Delete(formatContent, 1, sizeOf(TBitmapFileHeader));
    finally // wrap up
      aMS.free;
    end;    // try/finally
  end;
end;

end.
Back to top
Form source: fmDelayRenderDIBTest.dfm

object Form1: TForm1
  Left = 192
  Top = 194
  Width = 538
  Height = 173
  Caption = 'Test of delay-rendering DIB'#39's'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 8
    Top = 8
    Width = 311
    Height = 13
    Caption = 
      'Drag the image .  It will be delay-rendered as CF_DIB in the tar' +
      'get.'
  end
  object Panel1: TPanel
    Left = 8
    Top = 30
    Width = 511
    Height = 107
    AutoSize = True
    Caption = 'Panel1'
    TabOrder = 0
    object Image1: TImage
      Left = 1
      Top = 1
      Width = 509
      Height = 105
      AutoSize = True
      Picture.Data = {
        07544269746D6170EE720200424DEE720200000000003600000028000000FD01
        0000690000000100180000000000B87202000000000000000000000000000000
        0000F7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFF
        F7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FF
        FFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7
        FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFF
        ...omitted for brevity...
        F7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FF
        FFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7
        FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFF
        F7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FF
        FFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFFF7FFFF00}
      OnMouseDown = Image1MouseDown
    end
  end
  object UOTextSource1: TUOTextSource
    OnRenderCustomFormat = UOTextSource1RenderCustomFormat
    DropEffects = [deCopy]
    MouseButton = mbLeft
    Left = 456
    Top = 8
  end
end
Back to top

Back to the examples page