mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-22 17:59:22 +02:00
IDE: designer: improved error messages
git-svn-id: trunk@15228 -
This commit is contained in:
parent
a75241f932
commit
0f56af6dc6
@ -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;
|
||||||
|
@ -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:
|
||||||
|
@ -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];
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user