This seems to work here:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ExtDlgs,
imageenio, imageenproc, imageenview, ieview, iemview, hyiedefs, hyieutils;
type
TLayerInfo = record
PositionX: Integer;
PositionY: Integer;
Width: Integer;
Height: integer;
Rotation: double;
Transparency: Integer;
end;
type
TForm1 = class(TForm)
Panel1: TPanel;
ImageEnView1: TImageEnView;
ImageEnProc1: TImageEnProc;
ImageEnIO1: TImageEnIO;
StatusBar1: TStatusBar;
ImageEnMViewLayers1: TImageEnMView;
AddLayer1: TButton;
DeleteLayer1: TButton;
OpenPictureDialog1: TOpenPictureDialog;
procedure ImageEnView1LayerNotify(Sender: TObject; layer: Integer;
event: TIELayerEvent);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure AddLayer1Click(Sender: TObject);
procedure DeleteLayer1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
AOrgLayerInfo: array of TLayerInfo;
ALastX: integer;
ALastY: integer;
ALastWidth: integer;
ALastHeight: integer;
ALastRotation: double;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.AddLayer1Click(Sender: TObject);
var
iLayer: integer;
iFileName: string;
begin
if OpenPictureDialog1.Execute then
begin
if FileExists(OpenPictureDialog1.FileName) then
begin
iFileName := OpenPictureDialog1.FileName;
iLayer := ImageEnView1.LayersAdd;
ImageEnView1.LayersCurrent := iLayer;
ImageEnView1.IO.LoadFromFile(iFileName);
ImageEnMViewLayers1.AppendImage;
ImageEnMViewLayers1.SetIEBitmap(ImageEnView1.LayersCurrent, ImageEnView1.IEBitmap);
ImageEnMViewLayers1.UpdateImage(ImageEnView1.LayersCurrent);
ImageEnMViewLayers1.DeSelect;
ImageEnMViewLayers1.SelectImage(iLayer);
end;
end;
end;
procedure TForm1.DeleteLayer1Click(Sender: TObject);
begin
ImageEnMViewLayers1.DeleteImage(ImageEnView1.LayersCurrent);
ImageEnView1.LayersRemove(ImageEnView1.LayersCurrent);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
IERegisterFormats;
OpenPictureDialog1.Filter := GraphicFilter(TGraphic);
ImageEnView1.IEBitmap.Fill(clWhite);
ImageEnMViewLayers1.SetModernStyling(True, 150, 100);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
IEUnregisterFormats;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
ImageEnMViewLayers1.AppendImage;
ImageEnMViewLayers1.SetIEBitmap(ImageEnView1.LayersCurrent, ImageEnView1.IEBitmap);
ImageEnMViewLayers1.UpdateImage(ImageEnView1.LayersCurrent);
end;
procedure TForm1.ImageEnView1LayerNotify(Sender: TObject; layer: Integer;
event: TIELayerEvent);
var
i: integer;
iCount: Integer;
iNewLayerInfo: array of TLayerInfo;
iDiffLayerInfo: TLayerInfo;
begin
//Set size/length of Array to number of layers in ImageEnView
SetLength(AOrgLayerInfo, ImageEnView1.LayersCount);
if event = ielSelected then
begin
if ImageEnMViewLayers1.MultiSelectedImagesCount = 1 then
begin
ImageEnMViewLayers1.SelectedImage := layer;
exit;
end
else
begin
// Store the Position & Size of all layers
for i := 0 to ImageEnView1.LayersCount - 1 do
begin
if ImageEnMViewLayers1.IsSelected(i) then
begin
AOrgLayerInfo[i].PositionX:= ImageEnView1.Layers[i].PosX;
AOrgLayerInfo[i].PositionY:= ImageEnView1.Layers[i].PosY;
AOrgLayerInfo[i].Width := ImageEnView1.Layers[i].Width;
AOrgLayerInfo[i].Height := ImageEnView1.Layers[i].Height;
AOrgLayerInfo[i].Rotation := ImageEnView1.Layers[i].Rotate;
end;
end;
//Store Current layer's current position, size, rotation
ALastX := ImageEnView1.CurrentLayer.PosX;
ALastY := ImageEnView1.CurrentLayer.PosY;
ALastWidth := ImageEnView1.CurrentLayer.Width;
ALastHeight := ImageEnView1.CurrentLayer.Height;
ALastRotation := ImageEnView1.CurrentLayer.Rotate;
end;
end;
try
if (event = ielMoving) then
begin
//Calculate New Position and Size
iDiffLayerInfo.PositionX := ImageEnView1.CurrentLayer.PosX - ALastX;
iDiffLayerInfo.PositionY := ImageEnView1.CurrentLayer.PosY - ALastY;
iDiffLayerInfo.Width := ImageEnView1.CurrentLayer.Width - ALastWidth;
iDiffLayerInfo.Height := ImageEnView1.CurrentLayer.Height - ALastHeight;
//Set new Position and Size to each selected Layer skipping current layer
for i:= 1 to ImageEnView1.LayersCount - 1 do
begin
if i <> layer then
begin
if ImageEnMViewLayers1.IsSelected(i) then
begin
ImageEnView1.Layers[i].PosX := AOrgLayerInfo[i].PositionX + iDiffLayerInfo.PositionX;
ImageEnView1.Layers[i].PosY := AOrgLayerInfo[i].PositionY + iDiffLayerInfo.PositionY;
end;
end;
end;
end;
if (event = ielResizing) then
begin
//Calculate New Position and Size
iDiffLayerInfo.PositionX := ImageEnView1.CurrentLayer.PosX - ALastX;
iDiffLayerInfo.PositionY := ImageEnView1.CurrentLayer.PosY - ALastY;
iDiffLayerInfo.Width := ImageEnView1.CurrentLayer.Width - ALastWidth;
iDiffLayerInfo.Height := ImageEnView1.CurrentLayer.Height - ALastHeight;
//Set new Position and Size to each selected Layer
for i:= 1 to ImageEnView1.LayersCount - 1 do
begin
if i <> layer then
begin
if ImageEnMViewLayers1.IsSelected(i) then
begin
ImageEnView1.Layers[i].PosX := AOrgLayerInfo[i].PositionX + iDiffLayerInfo.PositionX;
ImageEnView1.Layers[i].PosY := AOrgLayerInfo[i].PositionY + iDiffLayerInfo.PositionY;
ImageEnView1.Layers[i].Width := AOrgLayerInfo[i].Width + iDiffLayerInfo.Width;
ImageEnView1.Layers[i].Height :=AOrgLayerInfo[i].Height + iDiffLayerInfo.Height;
end;
end;
end;
end;
finally
ImageEnView1.Update;
end;
end;
end.
William Miller
Adirondack Software & Graphics
Email: w2m@frontiernet.net
EBook: http://www.imageen.com/ebook/
Apprehend: http://www.frontiernet.net/~w2m/index.html