⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teeditor.pas

📁 Do your applications look a little boring? Would you like to get spectacular yet easy to use visual
💻 PAS
字号:
unit teEditor;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls,
  TransEff, FormCont, teTrEfEd, Buttons, ExtCtrls, teForm,Dialogs;

{$INCLUDE teDefs.inc}

type
  TTransitionEditor = class(TForm)
    FormContainer: TFormContainer;
    LabelTransitions: TLabel;
    ComboBoxTransitions: TComboBox;
    BitBtnPreview: TButton;
    Bevel: TBevel;
    FormTransitions: TFormTransitions;
    ImageBk: TImage;
    ImageB: TImage;
    ImageA: TImage;
    procedure ComboBoxTransitionsChange(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure BitBtnPreviewClick(Sender: TObject);
  private
    TempTransition: TTransitionEffect;
  protected
    AllowTransitionChange: Boolean;
    EditorForm: TTransitionEffectEditor;
    OriginalTransition: PTransitionEffect;
    CurrentTransition: TTransitionEffect;

    procedure ShowEditor(Transition: TTransitionEffect);
    procedure Initialize(Transition: PTransitionEffect);
  public
    procedure InitializeForChange(var Transition: TTransitionEffect);
    procedure InitializeForEdition(Transition: TTransitionEffect);
    procedure Apply;
  end;
Type
  TTEEditorInit = procedure(First: Boolean);
  TTEVerifyDescription = function(Description: String): String;

var
  TransitionEditor: TTransitionEditor;

const
  TEEditorInit: TTEEditorInit = Nil;
  TEVerifyDescription: TTEVerifyDescription = Nil;

  function ChangeTransition(var Transition: TTransitionEffect): Boolean;
  function EditTransition(Transition: TTransitionEffect): Boolean;

implementation

{$R *.DFM}

uses teModEdit, teRender;

type
  TTransitionHack = class(TTransitionEffect);

function ChangeTransition(var Transition: TTransitionEffect): Boolean;
begin
  TransitionModalEditor := TTransitionModalEditor.Create(Application);
  try
    TransitionModalEditor.InitializeForChange(Transition);
    If Assigned(TEEditorInit) Then          //V34
      TEEditorInit(True);
    Result:=TransitionModalEditor.ShowModal = mrOk;
    if Result then
      TransitionModalEditor.Apply;

  finally
    TransitionModalEditor.Free;
  end;
end;

function EditTransition(Transition: TTransitionEffect): Boolean;
begin
  TransitionModalEditor := TTransitionModalEditor.Create(Application);
  try
    TransitionModalEditor.InitializeForEdition(Transition);
    If Assigned(TEEditorInit) Then          //V34
      TEEditorInit(True);
    Result:=TransitionModalEditor.ShowModal = mrOk;
    if Result then
      TransitionModalEditor.Apply;
  finally
    TransitionModalEditor.Free;
  end;
end;

procedure TTransitionEditor.FormDestroy(Sender: TObject);
begin
  CurrentTransition.Free;
end;

procedure TTransitionEditor.ShowEditor(Transition: TTransitionEffect);
var
  EditorClass: TCustomFormClass;
{$ifdef D6UP}
  OldGroup: TPersistentClass;
{$endif D6UP}
begin
  {$ifdef D6UP}
  OldGroup := ActivateClassGroup(TControl);
  try
  {$endif D6UP}
    EditorClass := TCustomFormClass(FindClass(Transition.GetEditor));
  {$ifdef D6UP}
  finally
    ActivateClassGroup(OldGroup);
  end;
  {$endif D6UP}
  EditorForm := TTransitionEffectEditor(FormContainer.CreateForm(EditorClass));
  TransitionEffectEditor:=EditorForm;    //V34
  EditorForm.Left := 0;                  //V34
  EditorForm.Top := 0;                   //V34

  EditorForm.Color := Color;
  EditorForm.Initialize(Transition);
  EditorForm.ReadValues;
  If Assigned(TEEditorInit) Then         //V34
    TEEditorInit(False);
  FormContainer.ShowFormEx(EditorForm,True,Nil,Nil,fcfaNone); //V34

end;

procedure TTransitionEditor.Initialize(Transition: PTransitionEffect);
var
  i: Integer;
  TransitionEffectClass: TTransitionEffectClass;
{$ifdef D6UP}
  OldGroup: TPersistentClass;
{$endif D6UP}
  R: TRect;
  Bmp: TBitmap;
  Description: String;
begin
  If Not Assigned(TEEditorInit) Then   //V34
  Begin
    Bmp:=TBitMap.Create;
    Try
    AdjustBmpForTransition(Bmp, {$ifndef CLX}0,{$endif CLX} ImageA.Width,
      ImageA.Height, pf4bit);
    Bmp.Canvas.Font.Name:='Times New Roman';
    Bmp.Canvas.Font.Size:=110;
    Bmp.Canvas.Font.Style:=[fsBold];
    Bmp.Canvas.Brush.Color:=clYellow;
    Bmp.Canvas.Brush.Style:=bsSolid;
    R:=ImageA.ClientRect;
    Bmp.Canvas.FillRect(R);
    DrawText(BMP.Canvas.Handle,'A',1,R,DT_SINGLELINE or DT_VCENTER or DT_CENTER);
    ImageA.Picture.Assign(BMP);

    Bmp.Canvas.Brush.Color:=clRed;
    Bmp.Canvas.FillRect(R);
    DrawText(BMP.Canvas.Handle,'B',1,R,DT_SINGLELINE or DT_VCENTER or DT_CENTER);
    ImageB.Picture.Assign(BMP);
    Bmp.Canvas.Brush.Color:=clTeal;
    Bmp.Canvas.FillRect(R);
    Bmp.Canvas.Font.Size:=80;
    Bmp.Canvas.Font.Style:=[];
    DrawText(BMP.Canvas.Handle,'Bk',2,R,DT_SINGLELINE or DT_VCENTER or DT_CENTER);
    ImageBk.Picture.Assign(BMP);
    Finally
      BMP.Free;
    End;

  End;
  if TERegisteredTransitions.IndexOf(Transition^.ClassType) = -1
  then ComboBoxTransitions.Enabled := False
  else ComboBoxTransitions.Enabled := AllowTransitionChange;

  if ComboBoxTransitions.Enabled then
  begin
    {$ifdef D6UP}
    OldGroup := ActivateClassGroup(TControl);
    try
    {$endif D6UP}
      for i:=0 to TERegisteredTransitions.Count-1 do
        if GetClass(TTransitionEffectClass(TERegisteredTransitions[i]).GetEditor) <> nil then
        Begin
          Description:=TTransitionEffectClass(TERegisteredTransitions[i]).Description;
         If Assigned(TEVerifyDescription) Then
           Description:=TEVerifyDescription(Description);
           If Description<>'' Then
          ComboBoxTransitions.Items.AddObject(Description,TERegisteredTransitions[i]);
        End;
    ComboBoxTransitions.Sorted := True;
    {$ifdef D6UP}
    finally
      ActivateClassGroup(OldGroup);
    end;
    {$endif D6UP}
  end
  else
  begin
    Description:=Transition^.Description;
    If Assigned(TEVerifyDescription) Then
      Description:=TEVerifyDescription(Description);
    ComboBoxTransitions.Items.AddObject(Description,
                                        TObject(Transition^.ClassType));
  end;

  CurrentTransition  := nil;
  OriginalTransition := Transition;
  for i:=0 to ComboBoxTransitions.Items.Count-1 do
  Begin
    If TTransitionEffectClass(ComboBoxTransitions.Items.Objects[i]).ClassName = TObject(Transition^).ClassName Then
    begin
      ComboBoxTransitions.ItemIndex := i;
      TransitionEffectClass         :=
        TTransitionEffectClass(ComboBoxTransitions.Items.Objects[i]);
      CurrentTransition             := TransitionEffectClass.Create(nil);
      CurrentTransition.Assign(Transition^);
      break;
    end;
  End;
  ShowEditor(CurrentTransition);  //EROC itnA
end;

procedure TTransitionEditor.InitializeForChange(
  var Transition: TTransitionEffect);
begin
  AllowTransitionChange := True;
  Initialize(@Transition);
end;

procedure TTransitionEditor.InitializeForEdition(Transition: TTransitionEffect);
begin
  TempTransition := Transition;
  AllowTransitionChange := False;
  Initialize(@TempTransition);
end;

procedure TTransitionEditor.Apply;
var
  OriginalBak: TTransitionEffect;
  TransitionEffectClass: TTransitionEffectClass;
  Name: TComponentName;
  TheOwner: TComponent;
  Index: Integer;
begin
  if OriginalTransition^.ClassType = CurrentTransition.ClassType
  then
  begin
    EditorForm.WriteValues;
    OriginalTransition^.Assign(CurrentTransition);
  end
  else
  begin
    Name     := OriginalTransition^.Name;
    TheOwner := OriginalTransition^.Owner;
    Index    := OriginalTransition^.Index;

    EditorForm.WriteValues;
    TransitionEffectClass := TTransitionEffectClass(CurrentTransition.ClassType);
    OriginalBak           := OriginalTransition^;
    OriginalTransition^   := TransitionEffectClass.Create(TheOwner);
    OriginalTransition^.TransitionList     := OriginalBak.TransitionList;
    OriginalTransition^.OnStartTransition  := OriginalBak.OnStartTransition;
    OriginalTransition^.OnEndTransition    := OriginalBak.OnEndTransition;
    OriginalTransition^.OnBeforeTransition := OriginalBak.OnBeforeTransition;
    OriginalTransition^.OnAfterTransition  := OriginalBak.OnAfterTransition;
    OriginalTransition^.OnAbortQuery       := OriginalBak.OnAbortQuery;
    OriginalTransition^.Assign(CurrentTransition);
    OriginalTransition^.Index := Index;

    // Destroy transition but maintain links to new one
    try
      OldTransition    := OriginalBak;
      NewTransition    := OriginalTransition^;
      OriginalBak.Free;
    finally
      OldTransition    := nil;
      NewTransition    := nil;
    end;

    OldTransition := nil;
    NewTransition := nil;
    if Name <> '' then
      OriginalTransition^.Name := Name;
  end;
end;

procedure TTransitionEditor.ComboBoxTransitionsChange(Sender: TObject);
var
  TransitionEffectClass: TTransitionEffectClass;
  aux: TTransitionEffect;
begin
  EditorForm.WriteValues;
  TransitionEffectClass := TTransitionEffectClass(
    ComboBoxTransitions.Items.Objects[ComboBoxTransitions.ItemIndex]);

  aux := TransitionEffectClass.Create(nil);
  if CurrentTransition <> nil then
    aux.Assign(CurrentTransition);
  CurrentTransition.Free;
  CurrentTransition := aux;

  ShowEditor(CurrentTransition);
end;

procedure TTransitionEditor.BitBtnPreviewClick(Sender: TObject);
var
  CursorBak: TCursor;
  AVisible,
  BVisible: Boolean;
begin
  CursorBak := Screen.Cursor;
  Screen.Cursor := crHourglass;
  try
    EditorForm.WriteValues;
    CurrentTransition.Prepare(Self, ImageA.BoundsRect);
    if TTransitionHack(CurrentTransition).NeedDstImage then
    begin
      AVisible := ImageA.Visible;
      BVisible := ImageB.Visible;

      if CurrentTransition.Passes = 2 then
      begin
        ImageA.Visible := False;
        ImageB.Visible := False;
        CurrentTransition.Prepare2ndPass;
      end;

      ImageA.Visible := not AVisible;
      ImageB.Visible := not BVisible;
    end;

    if CurrentTransition.Prepared then
      CurrentTransition.Execute;
  finally
    Screen.Cursor := CursorBak;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -