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

 

ImageEn Forum
Profile    Join    Active Topics    Forum FAQ    Search this forumSearch
 All Forums
 ImageEn Library for Delphi, C++ and .Net
 ImageEn and IEvolution Support Forum
 Layer Notify Event seems to be causing problems

Note: You must be registered in order to post a reply.
To register, click here. Registration is FREE!

View 
UserName:
Password:
Format  Bold Italicized Underline  Align Left Centered Align Right  Horizontal Rule  Insert Hyperlink   Browse for an image to attach to your post Browse for a zip to attach to your post Insert Code  Insert Quote Insert List
   
Message 

 

Emoji
Smile [:)] Big Smile [:D] Cool [8D] Blush [:I]
Tongue [:P] Evil [):] Wink [;)] Black Eye [B)]
Frown [:(] Shocked [:0] Angry [:(!] Sleepy [|)]
Kisses [:X] Approve [^] Disapprove [V] Question [?]

 
Check here to subscribe to this topic.
   

T O P I C    R E V I E W
yogiyang Posted - Dec 28 2013 : 07:48:23
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
1   L A T E S T    R E P L I E S    (Newest First)
w2m Posted - Jan 02 2014 : 13:02:59
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