IDE: fixup references when dropping a frame onto a form

git-svn-id: trunk@22260 -
This commit is contained in:
mattias 2009-10-22 13:56:11 +00:00
parent 2265922f51
commit 29ea3fdaa5
5 changed files with 35 additions and 17 deletions

View File

@ -1820,8 +1820,12 @@ var
ParentCI,NewComponentClass,'',
NewLeft,NewTop,NewWidth,NewHeight));
if NewCI=nil then exit;
Modified;
NewComponent:=NewCI.Component;
TheFormEditor.FixupReferences(NewComponent); // e.g. frame references a datamodule
// modified
Modified;
// set initial properties
if NewComponent is TControl then begin

View File

@ -1772,7 +1772,7 @@ end;
procedure TJITComponentList.ReaderReferenceName(Reader: TReader;
var RefName: Ansistring);
begin
// debugln('[TJITComponentList.ReaderReferenceName] Name='''+RefName+'''');
debugln('[TJITComponentList.ReaderReferenceName] Name='''+RefName+'''');
end;
procedure TJITComponentList.ReaderAncestorNotFound(Reader: TReader;

View File

@ -45,7 +45,7 @@ uses
// IDEIntf
PropEdits, ObjectInspector, IDECommands, FormEditingIntf,
// IDE
LazarusIDEStrConsts, Project, JITForms,
LazarusIDEStrConsts, Project, JITForms, MainIntf,
CustomNonFormDesigner, NonControlDesigner, FrameDesigner,
ComponentReg, IDEProcs, ComponentEditors, KeyMapping, EditorOptions,
EnvironmentOpts, DesignerProcs;
@ -270,6 +270,7 @@ each control that's dropped onto the form
function CreateChildComponentFromStream(BinStream: TStream;
ComponentClass: TComponentClass; Root: TComponent;
ParentControl: TWinControl): TIComponentInterface; override;
function FixupReferences(AComponent: TComponent): TModalResult;
procedure WriterFindAncestor(Writer: TWriter; Component: TComponent;
const Name: string;
var Ancestor, RootAncestor: TComponent);
@ -1909,6 +1910,11 @@ begin
Result:=CreateComponentInterface(NewComponent,true);
end;
function TCustomFormEditor.FixupReferences(AComponent: TComponent): TModalResult;
begin
Result:=MainIDEInterface.DoFixupComponentReferences(AComponent,[]);
end;
procedure TCustomFormEditor.WriterFindAncestor(Writer: TWriter;
Component: TComponent; const Name: string; var Ancestor,
RootAncestor: TComponent);

View File

@ -639,8 +639,9 @@ type
function FindBaseComponentClass(const AComponentClassName,
DescendantClassName: string;
out AComponentClass: TComponentClass): boolean;
function DoFixupComponentReferences(AnUnitInfo: TUnitInfo;
OpenFlags: TOpenFlags): TModalResult;
function DoFixupComponentReferences(
RootComponent: TComponent;
OpenFlags: TOpenFlags): TModalResult; override;
function DoLoadAncestorDependencyHidden(AnUnitInfo: TUnitInfo;
const DescendantClassName: string;
OpenFlags: TOpenFlags;
@ -5744,7 +5745,7 @@ begin
AnUnitInfo.AddRequiresComponentDependency(AncestorUnitInfo,[ucdtAncestor]);
if NewComponent<>nil then begin
// component loaded, now load the referenced units
Result:=DoFixupComponentReferences(AnUnitInfo,OpenFlags);
Result:=DoFixupComponentReferences(AnUnitInfo.Component,OpenFlags);
if Result<>mrOk then begin
DebugLn(['TMainIDE.DoLoadLFM DoFixupComponentReferences failed']);
exit;
@ -5856,10 +5857,10 @@ begin
Result:=true;
end;
function TMainIDE.DoFixupComponentReferences(AnUnitInfo: TUnitInfo;
OpenFlags: TOpenFlags): TModalResult;
function TMainIDE.DoFixupComponentReferences(
RootComponent: TComponent; OpenFlags: TOpenFlags): TModalResult;
var
AnUnitInfo: TUnitInfo;
UsedUnitFilenames: TStrings;
ComponentNameToUnitFilename: TStringList;
@ -5984,21 +5985,25 @@ var
i: Integer;
RefRootName: string;
begin
CurRoot:=AnUnitInfo.Component;
if CurRoot=nil then exit(mrOk);
CurRoot:=RootComponent;
while CurRoot.Owner<>nil do
CurRoot:=CurRoot.Owner;
AnUnitInfo:=Project1.UnitWithComponent(CurRoot);
if AnUnitInfo=nil then exit(mrOk);
UsedUnitFilenames:=nil;
ComponentNameToUnitFilename:=nil;
ReferenceRootNames:=TStringList.Create;
ReferenceInstanceNames:=TStringList.Create;
try
GetFixupReferenceNames(CurRoot,ReferenceRootNames);
GetFixupReferenceNames(RootComponent,ReferenceRootNames);
Result:=mrOk;
for i:=0 to ReferenceRootNames.Count-1 do begin
RefRootName:=ReferenceRootNames[i];
ReferenceInstanceNames.Clear;
GetFixupInstanceNames(CurRoot,RefRootName,ReferenceInstanceNames);
GetFixupInstanceNames(RootComponent,RefRootName,ReferenceInstanceNames);
DebugLn(['TMainIDE.DoFixupComponentReferences BEFORE loading ',i,' ',dbgsName(CurRoot),' RefRoot=',RefRootName,' Refs="',Trim(ReferenceInstanceNames.Text),'"']);
DebugLn(['TMainIDE.DoFixupComponentReferences BEFORE loading ',i,' Root=',dbgsName(RootComponent),' RefRoot=',RefRootName,' Refs="',Trim(ReferenceInstanceNames.Text),'"']);
// load the referenced component
Result:=LoadDependencyHidden(RefRootName);
@ -6013,11 +6018,11 @@ begin
end;
ReferenceInstanceNames.Clear;
GetFixupInstanceNames(CurRoot,RefRootName,ReferenceInstanceNames);
DebugLn(['TMainIDE.DoFixupComponentReferences AFTER loading ',i,' ',dbgsName(CurRoot),' RefRoot=',RefRootName,' Refs="',Trim(ReferenceInstanceNames.Text),'"']);
GetFixupInstanceNames(RootComponent,RefRootName,ReferenceInstanceNames);
DebugLn(['TMainIDE.DoFixupComponentReferences AFTER loading ',i,' ',dbgsName(RootComponent),' RefRoot=',RefRootName,' Refs="',Trim(ReferenceInstanceNames.Text),'"']);
// forget the rest of the dangling references
RemoveFixupReferences(CurRoot,RefRootName);
RemoveFixupReferences(RootComponent,RefRootName);
if Result<>mrOk then begin
// ToDo: give a nice error message and give user the choice between

View File

@ -161,6 +161,9 @@ type
const SrcDirectory, DestDirectory: string
): TModalResult; virtual; abstract;
function DoFixupComponentReferences(RootComponent: TComponent;
OpenFlags: TOpenFlags): TModalResult; virtual; abstract;
procedure UpdateWindowMenu; virtual; abstract;
procedure SaveEnvironment; virtual; abstract;
procedure UpdateHighlighters(Immediately: boolean = false); virtual; abstract;