31
Classes, SysUtils, TypInfo, FileUtil, Forms, Controls, Graphics,
32
Dialogs, ComCtrls, ObjectInspector, PropEdits, Debugger, DebuggerDlg, BaseDebugManager,
33
LazarusIDEStrConsts, IDEWindowIntf, LCLProc, LCLType, Grids, StdCtrls;
31
Classes, SysUtils, Forms, Controls, Graphics,
32
IDEWindowIntf, DebuggerStrConst, ComCtrls, ObjectInspector, PropEdits, Debugger, DebuggerDlg, BaseDebugManager,
33
LazarusIDEStrConsts, LCLType, Grids, StdCtrls, Menus;
48
48
TIDEInspectDlg = class(TDebuggerDlg)
49
49
EditInspected: TEdit;
50
menuClassType: TMenuItem;
50
51
PageControl: TPageControl;
52
PopupMenu1: TPopupMenu;
51
53
StatusBar1: TStatusBar;
52
54
DataPage: TTabSheet;
53
55
PropertiesPage: TTabSheet;
54
56
MethodsPage: TTabSheet;
55
57
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
56
58
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
59
procedure menuClassTypeClick(Sender: TObject);
60
FMethodsGridHook: TPropertyEditorHook;
63
FMethodsGrid: TOIDBGGrid;
62
//FPropertiesGridHook,
63
//FMethodsGridHook: TPropertyEditorHook;
66
//FMethodsGrid: TOIDBGGrid;
64
67
FExpression: ansistring;
65
68
FHumanReadable: ansistring;
66
69
FDBGInfo: TDBGType;
67
70
FGridData: TStringGrid;
68
71
FGridMethods: TStringGrid;
72
FUpdateLock, FUpdateNeeded: Boolean;
69
73
procedure Localize;
70
74
procedure InspectClass;
71
75
procedure InspectRecord;
72
76
procedure InspectVariant;
73
77
procedure InspectSimple;
78
procedure InspectEnum;
74
80
procedure InspectPointer;
75
procedure GridDataSetup;
76
procedure GridMethodsSetup;
81
procedure GridDataSetup(Initial: Boolean = False);
82
procedure GridMethodsSetup(Initial: Boolean = False);
77
83
procedure ShowDataFields;
78
84
procedure ShowMethodsFields;
87
function ColSizeGetter(AColId: Integer; var ASize: Integer): Boolean;
88
procedure ColSizeSetter(AColId: Integer; ASize: Integer);
81
90
constructor Create(AOwner: TComponent); override;
82
91
destructor Destroy; override;
83
92
procedure Execute(const AExpression: ansistring);
101
InspectDlgWindowCreator: TIDEWindowCreator;
104
COL_INSPECT_DNAME = 1;
105
COL_INSPECT_DTYPE = 2;
106
COL_INSPECT_DVALUE = 3;
107
COL_INSPECT_MNAME = 11;
108
COL_INSPECT_MTYPE = 12;
109
COL_INSPECT_MRETURNS = 13;
110
COL_INSPECT_MADDRESS = 14;
112
function InspectDlgColSizeGetter(AForm: TCustomForm; AColId: Integer; var ASize: Integer): Boolean;
114
Result := AForm is TIDEInspectDlg;
116
Result := TIDEInspectDlg(AForm).ColSizeGetter(AColId, ASize);
119
procedure InspectDlgColSizeSetter(AForm: TCustomForm; AColId: Integer; ASize: Integer);
121
if AForm is TIDEInspectDlg then
122
TIDEInspectDlg(AForm).ColSizeSetter(AColId, ASize);
90
125
{ TIDEInspectDlg }
92
127
procedure TIDEInspectDlg.FormClose(Sender: TObject; var CloseAction: TCloseAction);
139
procedure TIDEInspectDlg.menuClassTypeClick(Sender: TObject);
141
menuClassType.Checked := not menuClassType.Checked;
104
145
procedure TIDEInspectDlg.Localize;
106
147
Caption := lisInspectDialog;
107
148
DataPage.Caption := lisInspectData;
108
149
PropertiesPage.Caption := lisInspectProperties;
109
150
MethodsPage.Caption := lisInspectMethods;
151
menuClassType.Caption := drsUseInstanceClassType;
112
154
procedure TIDEInspectDlg.InspectClass;
120
162
EditInspected.Text:=FExpression+' : Class '+FDBGInfo.TypeName+' inherits from '+FDBGInfo.Ancestor;
123
FGridData.AutoSizeColumn(1);
124
FGridData.AutoSizeColumn(2);
165
//FGridData.AutoSizeColumn(1);
166
//FGridData.AutoSizeColumn(2);
125
167
GridMethodsSetup;
126
168
ShowMethodsFields;
127
FGridMethods.AutoSizeColumn(1);
128
FGridMethods.AutoSizeColumn(3);
169
//FGridMethods.AutoSizeColumn(1);
170
//FGridMethods.AutoSizeColumn(3);
131
173
procedure TIDEInspectDlg.InspectVariant;
167
209
FGridData.Cells[0,1]:=FExpression;
168
210
FGridData.Cells[1,1]:=FDBGInfo.TypeName;
169
211
FGridData.Cells[2,1]:=FDBGInfo.Value.AsString;
170
FGridData.AutoSizeColumn(2);
212
//FGridData.AutoSizeColumn(2);
215
procedure TIDEInspectDlg.InspectEnum;
217
DataPage.TabVisible:=true;
218
PropertiesPage.TabVisible:=false;
219
MethodsPage.TabVisible:=false;
220
if not Assigned(FDBGInfo) then exit;
221
EditInspected.Text:=FExpression+' : '+FDBGInfo.TypeName + ' = ' + FDBGInfo.Value.AsString;
223
FGridData.Cells[0,1]:=FExpression;
224
FGridData.Cells[1,1]:=FDBGInfo.TypeName;
225
if (FDBGInfo.TypeName <> '') and (FDBGInfo.TypeDeclaration <> '')
226
then FGridData.Cells[1,1] := FGridData.Cells[1,1] + ' = ';
227
FGridData.Cells[1,1] := FGridData.Cells[1,1] + FDBGInfo.TypeDeclaration;
228
FGridData.Cells[2,1]:=FDBGInfo.Value.AsString;
229
//FGridData.AutoSizeColumn(2);
232
procedure TIDEInspectDlg.InspectSet;
234
DataPage.TabVisible:=true;
235
PropertiesPage.TabVisible:=false;
236
MethodsPage.TabVisible:=false;
237
if not Assigned(FDBGInfo) then exit;
238
EditInspected.Text:=FExpression+' : '+FDBGInfo.TypeName + ' = ' + FDBGInfo.Value.AsString;
240
FGridData.Cells[0,1]:=FExpression;
241
FGridData.Cells[1,1]:=FDBGInfo.TypeName;
242
if (FDBGInfo.TypeName <> '') and (FDBGInfo.TypeDeclaration <> '')
243
then FGridData.Cells[1,1] := FGridData.Cells[1,1] + ' = ';
244
FGridData.Cells[1,1] := FGridData.Cells[1,1] + FDBGInfo.TypeDeclaration;
245
FGridData.Cells[2,1]:=FDBGInfo.Value.AsString;
246
//FGridData.AutoSizeColumn(2);
173
249
procedure TIDEInspectDlg.InspectPointer;
182
258
if (FDBGInfo.TypeName <> '') and (FDBGInfo.TypeName[1] = '^')
183
259
then FGridData.Cells[1,1]:='Pointer to '+copy(FDBGInfo.TypeName, 2, length(FDBGInfo.TypeName))
184
260
else FGridData.Cells[1,1]:=FDBGInfo.TypeName;
261
{$PUSH}{$RANGECHECKS OFF}
185
262
FGridData.Cells[2,1]:=format('$%x',[PtrUInt(FDBGInfo.Value.AsPointer)]);
186
FGridData.AutoSizeColumn(2);
189
procedure TIDEInspectDlg.GridDataSetup;
191
with FGridData do begin
195
DefaultColWidth:=100;
196
Options:=[goColSizing,goDblClickAutoSize,goDrawFocusSelected,
197
goVertLine,goHorzLine,goFixedHorzLine,goSmoothScroll,
198
goTabs,goScrollKeepVisible,goRowSelect];
200
TitleFont.Style:=[fsBold];
201
ExtendedSelect:=false;
206
Cols[0].Text:='Name';
207
Cols[1].Text:='Type';
208
Cols[2].Text:='Value';
213
procedure TIDEInspectDlg.GridMethodsSetup;
215
with FGridMethods do begin
219
DefaultColWidth:=100;
220
Options:=[goColSizing,goDblClickAutoSize,goDrawFocusSelected,
221
goVertLine,goHorzLine,goFixedHorzLine,goSmoothScroll,
222
goTabs,goScrollKeepVisible,goRowSelect];
224
TitleFont.Style:=[fsBold];
225
ExtendedSelect:=false;
230
Cols[0].Text:='Name';
231
Cols[1].Text:='Type';
232
Cols[2].Text:='Returns';
233
Cols[3].Text:='Address';
264
//FGridData.AutoSizeColumn(2);
267
procedure TIDEInspectDlg.GridDataSetup(Initial: Boolean = False);
270
with FGridData do begin
274
DefaultColWidth:=100;
275
Options:=[goColSizing,goDblClickAutoSize,goDrawFocusSelected, goThumbTracking,
276
goVertLine,goHorzLine,goFixedHorzLine,goSmoothScroll,
279
TitleFont.Style:=[fsBold];
280
ExtendedSelect:=false;
285
Cols[0].Text:='Name';
286
Cols[1].Text:='Type';
287
Cols[2].Text:='Value';
290
FGridData.RowCount:=1;
291
FGridData.RowCount:=2;
292
FGridData.FixedRows:=1;
293
FGridData.Visible := True;
296
procedure TIDEInspectDlg.GridMethodsSetup(Initial: Boolean = False);
299
with FGridMethods do begin
303
DefaultColWidth:=100;
304
Options:=[goColSizing,goDblClickAutoSize,goDrawFocusSelected, goThumbTracking,
305
goVertLine,goHorzLine,goFixedHorzLine,goSmoothScroll,
308
TitleFont.Style:=[fsBold];
309
ExtendedSelect:=false;
314
Cols[0].Text:='Name';
315
Cols[1].Text:='Type';
316
Cols[2].Text:='Returns';
317
Cols[3].Text:='Address';
320
FGridMethods.RowCount:=1;
321
FGridMethods.RowCount:=2;
322
FGridMethods.FixedRows:=1;
238
325
procedure TIDEInspectDlg.ShowDataFields;
437
procedure TIDEInspectDlg.Clear;
439
DataPage.TabVisible:=false;
440
PropertiesPage.TabVisible:=false;
441
MethodsPage.TabVisible:=false;
443
FGridData.Visible := False;
444
EditInspected.Text:='';
447
function TIDEInspectDlg.ColSizeGetter(AColId: Integer; var ASize: Integer): Boolean;
451
COL_INSPECT_DNAME: ASize := FGridData.ColWidths[0];
452
COL_INSPECT_DTYPE: ASize := FGridData.ColWidths[1];
453
COL_INSPECT_DVALUE: ASize := FGridData.ColWidths[2];
454
COL_INSPECT_MNAME: ASize := FGridMethods.ColWidths[0];
455
COL_INSPECT_MTYPE: ASize := FGridMethods.ColWidths[1];
456
COL_INSPECT_MRETURNS: ASize := FGridMethods.ColWidths[2];
457
COL_INSPECT_MADDRESS: ASize := FGridMethods.ColWidths[3];
459
Result := (ASize > 0) and (ASize <> 100); // The default for all
462
procedure TIDEInspectDlg.ColSizeSetter(AColId: Integer; ASize: Integer);
465
COL_INSPECT_DNAME: FGridData.ColWidths[0]:= ASize;
466
COL_INSPECT_DTYPE: FGridData.ColWidths[1]:= ASize;
467
COL_INSPECT_DVALUE: FGridData.ColWidths[2]:= ASize;
468
COL_INSPECT_MNAME: FGridMethods.ColWidths[0]:= ASize;
469
COL_INSPECT_MTYPE: FGridMethods.ColWidths[1]:= ASize;
470
COL_INSPECT_MRETURNS: FGridMethods.ColWidths[2]:= ASize;
471
COL_INSPECT_MADDRESS: FGridMethods.ColWidths[3]:= ASize;
350
475
constructor TIDEInspectDlg.Create(AOwner: TComponent);
352
477
function NewGrid(AName: String; AParent: TWinControl; AHook: TPropertyEditorHook): TOIDBGGrid;
365
490
inherited Create(AOwner);
366
FDataGridHook := TPropertyEditorHook.Create;
367
FDataGrid := NewGrid('DataGrid', DataPage, FDataGridHook);
369
FPropertiesGridHook := TPropertyEditorHook.Create;
370
FPropertiesGrid := NewGrid('PropertiesGrid', PropertiesPage, FPropertiesGridHook);
372
FMethodsGridHook := TPropertyEditorHook.Create;
373
FMethodsGrid := NewGrid('MethodsGrid', MethodsPage, FMethodsGridHook);
492
//FDataGridHook := TPropertyEditorHook.Create;
493
//FDataGrid := NewGrid('DataGrid', DataPage, FDataGridHook);
495
//FPropertiesGridHook := TPropertyEditorHook.Create;
496
//FPropertiesGrid := NewGrid('PropertiesGrid', PropertiesPage, FPropertiesGridHook);
498
//FMethodsGridHook := TPropertyEditorHook.Create;
499
//FMethodsGrid := NewGrid('MethodsGrid', MethodsPage, FMethodsGridHook);
501
FUpdateLock := False;
502
FUpdateNeeded := False;
377
505
FGridData:=TStringGrid.Create(DataPage);
378
506
DataPage.InsertControl(FGridData);
380
509
FGridMethods:=TStringGrid.Create(MethodsPage);
381
510
MethodsPage.InsertControl(FGridMethods);
511
GridMethodsSetup(True);
385
516
destructor TIDEInspectDlg.Destroy;
387
518
FreeAndNil(FDBGInfo);
388
FreeAndNil(FDataGridHook);
389
FreeAndNil(FPropertiesGridHook);
390
FreeAndNil(FMethodsGridHook);
519
//FreeAndNil(FDataGridHook);
520
//FreeAndNil(FPropertiesGridHook);
521
//FreeAndNil(FMethodsGridHook);
391
522
inherited Destroy;
394
525
procedure TIDEInspectDlg.Execute(const AExpression: ansistring);
397
FreeAndNil(FDBGInfo);
398
if not DebugBoss.Evaluate(AExpression,FHumanReadable,FDBGInfo) or not assigned(FDBGInfo) then
527
FExpression:=AExpression;
531
procedure TIDEInspectDlg.UpdateData;
533
Opts: TDBGEvaluateFlags;
535
if FUpdateLock then begin
536
FUpdateNeeded := True;
541
FUpdateNeeded := False;
400
543
FreeAndNil(FDBGInfo);
403
FExpression:=AExpression;
404
case FDBGInfo.Kind of
405
skClass: InspectClass();
406
skRecord: InspectRecord();
407
skVariant: InspectVariant();
412
skSimple: InspectSimple();
413
skPointer: InspectPointer();
547
StatusBar1.SimpleText := '';
551
Opts := [defFullTypeInfo];
552
if menuClassType.Checked then
553
include(Opts, defClassAutoCast);
554
if not DebugBoss.Evaluate(FExpression, FHumanReadable, FDBGInfo, Opts)
555
or not assigned(FDBGInfo) then
557
FreeAndNil(FDBGInfo);
559
EditInspected.Text:=FExpression + ' : unavailable';
562
case FDBGInfo.Kind of
563
skClass: InspectClass();
564
skRecord: InspectRecord();
565
skVariant: InspectVariant();
568
skProcedure: InspectSimple;
569
skFunction: InspectSimple;
570
skSimple: InspectSimple();
571
skPointer: InspectPointer();
575
FUpdateLock := False;
578
if FUpdateNeeded then
591
InspectDlgWindowCreator := IDEWindowCreators.Add(DebugDialogNames[ddtInspect]);
592
InspectDlgWindowCreator.OnCreateFormProc := @CreateDebugDialog;
593
InspectDlgWindowCreator.OnSetDividerSize := @InspectDlgColSizeSetter;
594
InspectDlgWindowCreator.OnGetDividerSize := @InspectDlgColSizeGetter;
595
InspectDlgWindowCreator.DividerTemplate.Add('InspectDataName', COL_INSPECT_DNAME, @drsInspectColWidthDataName);
596
InspectDlgWindowCreator.DividerTemplate.Add('InspectDataType', COL_INSPECT_DTYPE, @drsInspectColWidthDataType);
597
InspectDlgWindowCreator.DividerTemplate.Add('InspectDataValue', COL_INSPECT_DVALUE, @drsInspectColWidthDataValue);
599
InspectDlgWindowCreator.DividerTemplate.Add('InspectMethName', COL_INSPECT_MNAME, @drsInspectColWidthMethName);
600
InspectDlgWindowCreator.DividerTemplate.Add('InspectMethType', COL_INSPECT_MTYPE, @drsInspectColWidthMethType);
601
InspectDlgWindowCreator.DividerTemplate.Add('InspectMethReturns', COL_INSPECT_MRETURNS, @drsInspectColWidthMethReturns);
602
InspectDlgWindowCreator.DividerTemplate.Add('InspectMethAddress', COL_INSPECT_MADDRESS, @drsInspectColWidthMethAddress);
603
InspectDlgWindowCreator.CreateSimpleLayout;