ImageEn for Delphi and C++ Builder ImageEn for Delphi and C++ Builder

 

ImageEn Forum
Profile    Join    Active Topics    Forum FAQ    Search this forumSearch
Forum membership is Free!  Click Join to sign-up
Username:
Password:
Save Password
Forgot your Password?

 All Forums
 ImageEn Library for Delphi, C++ and .Net
 ImageEn and IEvolution Support Forum
 Layer Notify Event seems to be causing problems
 New Topic  Reply to Topic
Author Previous Topic Topic Next Topic  

yogiyang

India
727 Posts

Posted - Dec 28 2013 :  07:48:23  Show Profile  Reply
I am stuck again.

I have coded LayerNotification event as:
procedure TMDIChild.ImageEnView2LayerNotify(Sender: TObject; layer: Integer;
  event: TIELayerEvent);
var
  l, imgCount: Integer;
  NewLayerInfo: array of TLayerInfo;
  diffLayerInfo: TLayerInfo;
begin

  //Set size/length of Array to nuber of layers in ImageEn
  SetLength(OrgLayerInfo, ImageEnView1.LayersCount);

  if event = ielSelected then
  begin
    if MainForm.iemLayers.MultiSelectedImagesCount = 1 then
    begin
      MainForm.iemLayers.SelectedImage := layer;
      MainForm.RefreshControls;
      exit;
    end
    else
    begin
      // we store the position & Size of all layers
      for l:= 0 to ImageEnView1.LayersCount - 1 do
      begin
        if MainForm.iemLayers.IsSelected(l) then
        begin
          OrgLayerInfo[l].MyX := ImageEnView1.Layers[l].PosX;
          OrgLayerInfo[l].MyY := ImageEnView1.Layers[l].PosY;
          OrgLayerInfo[l].MyWidth := ImageEnView1.Layers[l].Width;
          OrgLayerInfo[l].MyHeight := ImageEnView1.Layers[l].Height;
          OrgLayerInfo[l].MyRotation := ImageEnView1.Layers[l].Rotate;
        end;
      end;
      //Store Current layer's current position, size, rotation
      LastX := ImageEnView1.CurrentLayer.PosX;
      LastY := ImageEnView1.CurrentLayer.PosY;
      LastWidth := ImageEnView1.CurrentLayer.Width;
      LastHeight := ImageEnView1.CurrentLayer.Height;
      LastRotation := ImageEnView1.CurrentLayer.Rotate;
    end;
  end;  //if event = ielSelected then

  try
    if (event = ielMoving) then
    begin
      //Calculate New Position and Size
      diffLayerInfo.MyX := ImageEnView1.CurrentLayer.PosX - LastX;
      diffLayerInfo.MyY := ImageEnView1.CurrentLayer.PosY - LastY;
      diffLayerInfo.MyWidth := ImageEnView1.CurrentLayer.Width - LastWidth;
      diffLayerInfo.MyHeight := ImageEnView1.CurrentLayer.Height - LastHeight;

      //Set new Position and Size to each selected Layer skipping current layer
      for l:= 1 to ImageEnView1.LayersCount - 1 do
      begin
        if l <> layer then
        begin
          if MainForm.iemLayers.IsSelected(l) then
          begin
            ImageEnView1.Layers[l].PosX := OrgLayerInfo[l].MyX + diffLayerInfo.MyX;
            ImageEnView1.Layers[l].PosY := OrgLayerInfo[l].MyY + diffLayerInfo.MyY;
          end;
        end;
      end;
    end;  //if (event = ielMoved) then

    if (event = ielResizing) then
    begin
      //Calculate New Position and Size
      diffLayerInfo.MyX := ImageEnView1.CurrentLayer.PosX - LastX;
      diffLayerInfo.MyY := ImageEnView1.CurrentLayer.PosY - LastY;
      diffLayerInfo.MyWidth := ImageEnView1.CurrentLayer.Width - LastWidth;
      diffLayerInfo.MyHeight := ImageEnView1.CurrentLayer.Height - LastHeight;

      //Set new Position and Size to each selected Layer
      for l:= 1 to ImageEnView1.LayersCount - 1 do
      begin
        if l <> layer then
        begin
          if MainForm.iemLayers.IsSelected(l) then
          begin
            ImageEnView1.Layers[l].PosX := OrgLayerInfo[l].MyX + diffLayerInfo.MyX;
            ImageEnView1.Layers[l].PosY := OrgLayerInfo[l].MyY + diffLayerInfo.MyY;
            ImageEnView1.Layers[l].Width := OrgLayerInfo[l].MyWidth + diffLayerInfo.MyWidth;
            ImageEnView1.Layers[l].Height := OrgLayerInfo[l].MyHeight + diffLayerInfo.MyHeight;
          end;
        end;
      end;
    end;  //if (event = ielResized) then
  finally
    ImageEnView1.Update;
  end;
end;


This code is to allow for user to select multiple Layers and then user resized or moves a layer then all selected layers also resized or moved.

What is wrong with this code?

This seems to cause the ImageEnMView control to automatically select multiple thumbnails even if I just click on one single image in the view.


Yogi Yang

w2m

USA
1990 Posts

Posted - Jan 02 2014 :  13:02:59  Show Profile  Reply
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
Go to Top of Page
  Previous Topic Topic Next Topic  
 New Topic  Reply to Topic
Jump To: