IDE: designer: improved error messages

git-svn-id: trunk@15228 -
This commit is contained in:
mattias 2008-05-25 22:20:58 +00:00
parent a75241f932
commit 0f56af6dc6
4 changed files with 68 additions and 20 deletions

View File

@ -43,7 +43,8 @@ uses
MemCheck, MemCheck,
{$ENDIF} {$ENDIF}
Classes, SysUtils, AvgLvlTree, TypInfo, LCLProc, LResources, Forms, Controls, Classes, SysUtils, AvgLvlTree, TypInfo, LCLProc, LResources, Forms, Controls,
LCLMemManager, LCLIntf, Dialogs, JITForm, IDEProcs, LCLMemManager, LCLIntf, Dialogs,
PropEdits, JITForm, IDEProcs,
BasePkgManager; BasePkgManager;
type type
@ -57,7 +58,8 @@ type
); );
TJITFormErrors = set of TJITFormError; TJITFormErrors = set of TJITFormError;
TJITReaderErrorEvent = procedure(Sender: TObject; ErrorType: TJITFormError; TJITReaderErrorEvent = procedure(Sender: TObject; Reader: TReader;
ErrorType: TJITFormError;
var Action: TModalResult) of object; var Action: TModalResult) of object;
TJITPropertyNotFoundEvent = procedure(Sender: TObject; Reader: TReader; TJITPropertyNotFoundEvent = procedure(Sender: TObject; Reader: TReader;
Instance: TPersistent; var PropName: string; IsPath: boolean; Instance: TPersistent; var PropName: string; IsPath: boolean;
@ -87,10 +89,11 @@ type
FOnPropertyNotFound: TJITPropertyNotFoundEvent; FOnPropertyNotFound: TJITPropertyNotFoundEvent;
protected protected
FCurReadErrorMsg: string; FCurReadErrorMsg: string;
FCurReadJITComponent:TComponent; FCurReadJITComponent: TComponent;
FCurReadClass:TClass; FCurReadClass: TClass;
FCurReadChild: TComponent; FCurReadChild: TComponent;
FCurReadChildClass: TComponentClass; FCurReadChildClass: TComponentClass;
FCurReadStreamClass: TClass;
FOnReaderError: TJITReaderErrorEvent; FOnReaderError: TJITReaderErrorEvent;
FJITComponents: TList; FJITComponents: TList;
FFlags: TJITCompListFlags; FFlags: TJITCompListFlags;
@ -180,6 +183,7 @@ type
property OnFindClass: TJITFindClass read FOnFindClass write FOnFindClass; property OnFindClass: TJITFindClass read FOnFindClass write FOnFindClass;
property CurReadJITComponent: TComponent read FCurReadJITComponent; property CurReadJITComponent: TComponent read FCurReadJITComponent;
property CurReadClass: TClass read FCurReadClass; property CurReadClass: TClass read FCurReadClass;
property CurReadStreamClass: TClass read FCurReadStreamClass;
property CurReadChild: TComponent read FCurReadChild; property CurReadChild: TComponent read FCurReadChild;
property CurReadChildClass: TComponentClass read FCurReadChildClass; property CurReadChildClass: TComponentClass read FCurReadChildClass;
property CurReadErrorMsg: string read FCurReadErrorMsg; property CurReadErrorMsg: string read FCurReadErrorMsg;
@ -620,8 +624,8 @@ end;
destructor TJITComponentList.Destroy; destructor TJITComponentList.Destroy;
begin begin
while FJITComponents.Count>0 do DestroyJITComponent(FJITComponents.Count-1); while FJITComponents.Count>0 do DestroyJITComponent(FJITComponents.Count-1);
FJITComponents.Free; FreeAndNil(FJITComponents);
FErrors.Free; FreeAndNil(FErrors);
inherited Destroy; inherited Destroy;
end; end;
@ -743,7 +747,7 @@ function TJITComponentList.AddJITComponentFromStream(BinStream: TStream;
// returns new index // returns new index
// -1 = invalid stream // -1 = invalid stream
procedure ReadStream(AStream: TStream); procedure ReadStream(AStream: TStream; StreamClass: TClass);
var var
Reader:TReader; Reader:TReader;
DestroyDriver: Boolean; DestroyDriver: Boolean;
@ -752,6 +756,7 @@ function TJITComponentList.AddJITComponentFromStream(BinStream: TStream;
debugln('[TJITComponentList.AddJITComponentFromStream] InitReading ...'); debugln('[TJITComponentList.AddJITComponentFromStream] InitReading ...');
{$ENDIF} {$ENDIF}
FCurReadStreamClass:=StreamClass;
DestroyDriver:=false; DestroyDriver:=false;
InitReading(AStream,Reader,DestroyDriver); InitReading(AStream,Reader,DestroyDriver);
{$IFDEF VerboseJITForms} {$IFDEF VerboseJITForms}
@ -796,7 +801,7 @@ function TJITComponentList.AddJITComponentFromStream(BinStream: TStream;
DebugLn(['TJITComponentList.AddJITComponentFromStream.ReadAncestor ',DbgSName(AClass),' HasStream=',AncestorStream<>nil]); DebugLn(['TJITComponentList.AddJITComponentFromStream.ReadAncestor ',DbgSName(AClass),' HasStream=',AncestorStream<>nil]);
{$ENDIF} {$ENDIF}
if AncestorStream<>nil then if AncestorStream<>nil then
ReadStream(AncestorStream); ReadStream(AncestorStream,AClass);
finally finally
FreeAndNil(AncestorStream); FreeAndNil(AncestorStream);
end; end;
@ -828,7 +833,7 @@ begin
Result:=DoCreateJITComponent('',NewClassName,NewUnitName,ParentClass,Visible); Result:=DoCreateJITComponent('',NewClassName,NewUnitName,ParentClass,Visible);
if Result<0 then exit; if Result<0 then exit;
ReadAncestorStreams; ReadAncestorStreams;
ReadStream(BinStream); ReadStream(BinStream,FCurReadJITComponent.ClassType);
if FCurReadJITComponent.Name='' then begin if FCurReadJITComponent.Name='' then begin
NewName:=FCurReadJITComponent.ClassName; NewName:=FCurReadJITComponent.ClassName;
@ -870,6 +875,7 @@ procedure TJITComponentList.InitReading(BinStream: TStream;
var Reader: TReader; DestroyDriver: Boolean); var Reader: TReader; DestroyDriver: Boolean);
begin begin
FFlags:=FFlags-[jclAutoRenameComponents]; FFlags:=FFlags-[jclAutoRenameComponents];
FErrors.Clear;
MyFindGlobalComponentProc:=@OnFindGlobalComponent; MyFindGlobalComponentProc:=@OnFindGlobalComponent;
RegisterFindGlobalComponentProc(@MyFindGlobalComponent); RegisterFindGlobalComponentProc(@MyFindGlobalComponent);
@ -916,6 +922,7 @@ begin
Result:=-1; Result:=-1;
Instance:=nil; Instance:=nil;
FCurReadClass:=nil; FCurReadClass:=nil;
FCurReadStreamClass:=nil;
FCurReadJITComponent:=nil; FCurReadJITComponent:=nil;
try try
@ -954,6 +961,7 @@ begin
try try
if FCurReadClass<>nil then if FCurReadClass<>nil then
FreeJITClass(FCurReadClass); FreeJITClass(FCurReadClass);
FCurReadStreamClass:=nil;
Instance.Free; Instance.Free;
except except
on E: Exception do begin on E: Exception do begin
@ -1078,6 +1086,7 @@ begin
try try
FCurReadJITComponent:=JITOwnerComponent; FCurReadJITComponent:=JITOwnerComponent;
FCurReadClass:=JITOwnerComponent.ClassType; FCurReadClass:=JITOwnerComponent.ClassType;
FCurReadStreamClass:=FCurReadClass;
FFlags:=FFlags+[jclAutoRenameComponents]; FFlags:=FFlags+[jclAutoRenameComponents];
{$IFDEF VerboseJITForms} {$IFDEF VerboseJITForms}
@ -1556,7 +1565,7 @@ begin
FErrors.Add(-1,ErrorBinPos,nil); FErrors.Add(-1,ErrorBinPos,nil);
end; end;
if Assigned(OnReaderError) then if Assigned(OnReaderError) then
OnReaderError(Self,ErrorType,Action); OnReaderError(Self,Reader,ErrorType,Action);
Handled:=Action in [mrIgnore]; Handled:=Action in [mrIgnore];
FCurUnknownProperty:=''; FCurUnknownProperty:='';
@ -1586,7 +1595,7 @@ end;
procedure TJITComponentList.ReaderCreateComponent(Reader: TReader; procedure TJITComponentList.ReaderCreateComponent(Reader: TReader;
ComponentClass: TComponentClass; var Component: TComponent); ComponentClass: TComponentClass; var Component: TComponent);
{$IFDEF EnableTFrame2} {$IFDEF EnableTFrame}
var var
DestroyDriver: Boolean; DestroyDriver: Boolean;
SubReader: TReader; SubReader: TReader;
@ -1598,7 +1607,7 @@ begin
fCurReadChild:=Component; fCurReadChild:=Component;
fCurReadChildClass:=ComponentClass; fCurReadChildClass:=ComponentClass;
{$IFDEF EnableTFrame2} {$IFDEF EnableTFrame}
if Assigned(OnFindAncestorBinStream) then begin if Assigned(OnFindAncestorBinStream) then begin
BinStream:=nil; BinStream:=nil;
DestroyDriver:=false; DestroyDriver:=false;

View File

@ -133,8 +133,8 @@ each control that's dropped onto the form
procedure SetSelection(const ASelection: TPersistentSelectionList); procedure SetSelection(const ASelection: TPersistentSelectionList);
procedure OnObjectInspectorModified(Sender: TObject); procedure OnObjectInspectorModified(Sender: TObject);
procedure SetObj_Inspector(AnObjectInspector: TObjectInspectorDlg); virtual; procedure SetObj_Inspector(AnObjectInspector: TObjectInspectorDlg); virtual;
procedure JITListReaderError(Sender: TObject; ErrorType: TJITFormError; procedure JITListReaderError(Sender: TObject; Reader: TReader;
var Action: TModalResult); virtual; ErrorType: TJITFormError; var Action: TModalResult); virtual;
procedure JITListPropertyNotFound(Sender: TObject; Reader: TReader; procedure JITListPropertyNotFound(Sender: TObject; Reader: TReader;
Instance: TPersistent; var PropName: string; IsPath: boolean; Instance: TPersistent; var PropName: string; IsPath: boolean;
var Handled, Skip: Boolean); var Handled, Skip: Boolean);
@ -2005,27 +2005,48 @@ begin
end; end;
procedure TCustomFormEditor.JITListReaderError(Sender: TObject; procedure TCustomFormEditor.JITListReaderError(Sender: TObject;
ErrorType: TJITFormError; var Action: TModalResult); Reader: TReader; ErrorType: TJITFormError; var Action: TModalResult);
var var
aCaption, aMsg: string; aCaption, aMsg: string;
DlgType: TMsgDlgType; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; Buttons: TMsgDlgButtons;
HelpCtx: Longint; HelpCtx: Longint;
JITComponentList: TJITComponentList; JITComponentList: TJITComponentList;
StreamClass: TComponentClass;
AnUnitInfo: TUnitInfo;
LFMFilename: String;
ErrorBinPos: Int64;
begin begin
JITComponentList:=TJITComponentList(Sender); JITComponentList:=TJITComponentList(Sender);
aCaption:='Error reading '+JITComponentList.ClassName; aCaption:='Read error';
aMsg:=''; aMsg:='';
DlgType:=mtError; DlgType:=mtError;
Buttons:=[mbCancel]; Buttons:=[mbCancel];
HelpCtx:=0; HelpCtx:=0;
// get current lfm filename
LFMFilename:='';
if (JITComponentList.CurReadStreamClass<>nil)
and (JITComponentList.CurReadStreamClass.InheritsFrom(TComponent)) then begin
StreamClass:=TComponentClass(JITComponentList.CurReadStreamClass);
AnUnitInfo:=Project1.UnitWithComponentClass(StreamClass);
if AnUnitInfo<>nil then begin
LFMFilename:=ChangeFileExt(AnUnitInfo.Filename,'.lfm');
end;
end;
if LFMFilename<>'' then
aCaption:='Error reading '+ExtractFilename(LFMFilename);
with JITComponentList do begin with JITComponentList do begin
aMsg:=aMsg+ClassName+': '; if LFMFilename<>'' then
if CurReadJITComponent<>nil then aMsg:=aMsg+LFMFilename
aMsg:=aMsg+CurReadJITComponent.Name+':'+CurReadJITComponent.ClassName else if CurReadStreamClass<>nil then
aMsg:=aMsg+'Stream='+CurReadStreamClass.ClassName
else else
aMsg:=aMsg+'?'; aMsg:=aMsg+'JITList='+ClassName;
aMsg:=aMsg+': ';
if CurReadJITComponent<>nil then
aMsg:=aMsg+'Root='+CurReadJITComponent.Name+':'+CurReadJITComponent.ClassName;
if CurReadChild<>nil then if CurReadChild<>nil then
aMsg:=aMsg+#13'Component: ' aMsg:=aMsg+#13'Component: '
+CurReadChild.Name+':'+CurReadChild.ClassName +CurReadChild.Name+':'+CurReadChild.ClassName
@ -2033,6 +2054,10 @@ begin
aMsg:=aMsg+#13'Component Class: '+CurReadChildClass.ClassName; aMsg:=aMsg+#13'Component Class: '+CurReadChildClass.ClassName;
aMsg:=aMsg+#13+CurReadErrorMsg; aMsg:=aMsg+#13+CurReadErrorMsg;
end; end;
if (Reader<>nil) and (Reader.Driver is TLRSObjectReader) then begin
ErrorBinPos:=TLRSObjectReader(Reader.Driver).Stream.Position;
aMsg:=aMsg+#13+'Stream position: '+dbgs(ErrorBinPos);
end;
case ErrorType of case ErrorType of
jfeUnknownProperty, jfeReaderError: jfeUnknownProperty, jfeReaderError:

View File

@ -713,6 +713,7 @@ type
function ProjectUnitWithUnitname(const AnUnitName: string): TUnitInfo; function ProjectUnitWithUnitname(const AnUnitName: string): TUnitInfo;
function UnitWithEditorIndex(Index:integer): TUnitInfo; function UnitWithEditorIndex(Index:integer): TUnitInfo;
function UnitWithComponent(AComponent: TComponent): TUnitInfo; function UnitWithComponent(AComponent: TComponent): TUnitInfo;
function UnitWithComponentClass(AClass: TComponentClass): TUnitInfo;
function UnitWithComponentName(AComponentName: String): TUnitInfo; function UnitWithComponentName(AComponentName: String): TUnitInfo;
function UnitComponentInheritingFrom(AClass: TComponentClass; function UnitComponentInheritingFrom(AClass: TComponentClass;
Ignore: TUnitInfo): TUnitInfo; Ignore: TUnitInfo): TUnitInfo;
@ -4150,6 +4151,13 @@ begin
Result:=Result.fNext[uilWithComponent]; Result:=Result.fNext[uilWithComponent];
end; end;
function TProject.UnitWithComponentClass(AClass: TComponentClass): TUnitInfo;
begin
Result:=fFirst[uilWithComponent];
while (Result<>nil) and (Result.Component.ClassType<>AClass) do
Result:=Result.fNext[uilWithComponent];
end;
function TProject.UnitWithComponentName(AComponentName: String): TUnitInfo; function TProject.UnitWithComponentName(AComponentName: String): TUnitInfo;
begin begin
Result := fFirst[uilPartOfProject]; Result := fFirst[uilPartOfProject];

View File

@ -238,6 +238,7 @@ type
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
procedure Clear;
procedure Sort(LFMPositions: Boolean); procedure Sort(LFMPositions: Boolean);
function IndexOf(const Position: int64; LFMPositions: Boolean): integer; function IndexOf(const Position: int64; LFMPositions: Boolean): integer;
function IndexOfRange(const FromPos, ToPos: int64; function IndexOfRange(const FromPos, ToPos: int64;
@ -4309,6 +4310,11 @@ begin
inherited Destroy; inherited Destroy;
end; end;
procedure TLRPositionLinks.Clear;
begin
Count:=0;
end;
procedure TLRPositionLinks.Sort(LFMPositions: Boolean); procedure TLRPositionLinks.Sort(LFMPositions: Boolean);
begin begin
if LFMPositions then if LFMPositions then