📄 teeditor.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 + -