mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 15:02:27 +01:00 
			
		
		
		
	MWE:
+ Added callstack object and dialog + Added checks to see if debugger = nil + Added dbgutils git-svn-id: trunk@1654 -
This commit is contained in:
		
							parent
							
								
									9f6e67ba6f
								
							
						
					
					
						commit
						06faefdcf7
					
				
							
								
								
									
										6
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							| @ -53,9 +53,12 @@ components/synedit/synhighlighterxml.pas svneol=native#text/pascal | |||||||
| components/synedit/syntextdrawer.pp svneol=native#text/pascal | components/synedit/syntextdrawer.pp svneol=native#text/pascal | ||||||
| debugger/breakpointsdlg.lrs svneol=native#text/pascal | debugger/breakpointsdlg.lrs svneol=native#text/pascal | ||||||
| debugger/breakpointsdlg.pp svneol=native#text/pascal | debugger/breakpointsdlg.pp svneol=native#text/pascal | ||||||
|  | debugger/callstackdlg.lrs svneol=native#text/pascal | ||||||
|  | debugger/callstackdlg.pp svneol=native#text/pascal | ||||||
| debugger/cmdlinedebugger.pp svneol=native#text/pascal | debugger/cmdlinedebugger.pp svneol=native#text/pascal | ||||||
| debugger/dbgoutputform.lrs svneol=native#text/pascal | debugger/dbgoutputform.lrs svneol=native#text/pascal | ||||||
| debugger/dbgoutputform.pp svneol=native#text/pascal | debugger/dbgoutputform.pp svneol=native#text/pascal | ||||||
|  | debugger/dbgutils.pp svneol=native#text/pascal | ||||||
| debugger/debugger.pp svneol=native#text/pascal | debugger/debugger.pp svneol=native#text/pascal | ||||||
| debugger/debuggerdlg.pp svneol=native#text/pascal | debugger/debuggerdlg.pp svneol=native#text/pascal | ||||||
| debugger/gdbdebugger.pp svneol=native#text/pascal | debugger/gdbdebugger.pp svneol=native#text/pascal | ||||||
| @ -63,6 +66,7 @@ debugger/gdbmidebugger.pp svneol=native#text/pascal | |||||||
| debugger/localsdlg.lrs svneol=native#text/pascal | debugger/localsdlg.lrs svneol=native#text/pascal | ||||||
| debugger/localsdlg.pp svneol=native#text/pascal | debugger/localsdlg.pp svneol=native#text/pascal | ||||||
| debugger/tbreakpointsdlg.lfm svneol=native#text/plain | debugger/tbreakpointsdlg.lfm svneol=native#text/plain | ||||||
|  | debugger/tcallstackdlg.lfm svneol=native#text/plain | ||||||
| debugger/tdbgoutputform.lfm svneol=native#text/plain | debugger/tdbgoutputform.lfm svneol=native#text/plain | ||||||
| debugger/test/debugtest.pp svneol=native#text/pascal | debugger/test/debugtest.pp svneol=native#text/pascal | ||||||
| debugger/test/debugtestform.lrs svneol=native#text/pascal | debugger/test/debugtestform.lrs svneol=native#text/pascal | ||||||
| @ -185,9 +189,7 @@ ide/splash.lrs svneol=native#text/pascal | |||||||
| ide/splash.pp svneol=native#text/pascal | ide/splash.pp svneol=native#text/pascal | ||||||
| ide/sysvaruseroverridedlg.pas svneol=native#text/pascal | ide/sysvaruseroverridedlg.pas svneol=native#text/pascal | ||||||
| ide/tcolumndlg1.lfm svneol=native#text/plain | ide/tcolumndlg1.lfm svneol=native#text/plain | ||||||
| ide/tinsertwatch.lfm svneol=native#text/plain |  | ||||||
| ide/transfermacros.pp svneol=native#text/pascal | ide/transfermacros.pp svneol=native#text/pascal | ||||||
| ide/twatchesdlg.lfm svneol=native#text/plain |  | ||||||
| ide/uniteditor.pp svneol=native#text/pascal | ide/uniteditor.pp svneol=native#text/pascal | ||||||
| ide/unitinfodlg.pp svneol=native#text/pascal | ide/unitinfodlg.pp svneol=native#text/pascal | ||||||
| ide/viewforms1.lrs svneol=native#text/pascal | ide/viewforms1.lrs svneol=native#text/pascal | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								debugger/callstackdlg.lrs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								debugger/callstackdlg.lrs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  |   LazarusResources.Add('TCallStackDlg','FORMDATA', | ||||||
|  |     'TPF0'#13'TCallStackDlg'#12'CallStackDlg'#4'Left'#3'g'#1#3'Top'#2'~'#5'Wid' | ||||||
|  |     +'th'#3#244#1#6'Height'#3#200#0#7'Caption'#6#9'CallStack'#0#9'TListView'#11 | ||||||
|  |     +'lvCallStack'#4'Left'#2#0#3'Top'#2#0#5'Width'#3#228#1#6'Height'#3#200#0#5 | ||||||
|  |     +'Align'#7#8'alClient'#7'Columns'#14#1#7'Caption'#6#6'Source'#5'Width'#3 | ||||||
|  |     +#150#0#0#1#7'Caption'#6#4'Line'#5'Width'#2'2'#0#1#7'Caption'#6#8'Function' | ||||||
|  |     +#5'Width'#3','#1#0#0#11'MultiSelect'#8#9'ViewStyle'#7#8'vsReport'#0#0#0 | ||||||
|  |   ); | ||||||
							
								
								
									
										124
									
								
								debugger/callstackdlg.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								debugger/callstackdlg.pp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,124 @@ | |||||||
|  | { $Id$ } | ||||||
|  | {               ----------------------------------------------   | ||||||
|  |                  callstackdlg.pp  -  Overview of the callstack  | ||||||
|  |                 ----------------------------------------------  | ||||||
|  |   | ||||||
|  |  @created(Sun Apr 28th WET 2002) | ||||||
|  |  @lastmod($Date$) | ||||||
|  |  @author(Marc Weustink <marc@@dommelstein.net>)                        | ||||||
|  | 
 | ||||||
|  |  This unit contains the Call Stack debugger dialog. | ||||||
|  |   | ||||||
|  |   | ||||||
|  | /***************************************************************************  | ||||||
|  |  *                                                                         *  | ||||||
|  |  *   This program is free software; you can redistribute it and/or modify  *  | ||||||
|  |  *   it under the terms of the GNU General Public License as published by  *  | ||||||
|  |  *   the Free Software Foundation; either version 2 of the License, or     *  | ||||||
|  |  *   (at your option) any later version.                                   *  | ||||||
|  |  *                                                                         *  | ||||||
|  |  ***************************************************************************/  | ||||||
|  | }  | ||||||
|  | unit CallStackDlg; | ||||||
|  | 
 | ||||||
|  | {$mode objfpc}{$H+} | ||||||
|  | 
 | ||||||
|  | interface | ||||||
|  | 
 | ||||||
|  | uses | ||||||
|  |   LResources, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, | ||||||
|  |   ComCtrls, Debugger, DebuggerDlg; | ||||||
|  | 
 | ||||||
|  | type | ||||||
|  |   TCallStackDlg = class(TDebuggerDlg) | ||||||
|  |     lvCallStack: TListView; | ||||||
|  |   private   | ||||||
|  |     procedure CallStackChanged(Sender: TObject); | ||||||
|  |   protected | ||||||
|  |     procedure SetDebugger(const ADebugger: TDebugger); override; | ||||||
|  |   public | ||||||
|  |   published          | ||||||
|  |     // publish some properties until fpcbug #1888 is fixed | ||||||
|  |     property Top; | ||||||
|  |     property Left; | ||||||
|  |     property Width;  | ||||||
|  |     property Height;  | ||||||
|  |     property Caption; | ||||||
|  |   end; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | implementation | ||||||
|  | 
 | ||||||
|  | { TCallStackDlg } | ||||||
|  | 
 | ||||||
|  | procedure TCallStackDlg.CallStackChanged(Sender: TObject); | ||||||
|  | var | ||||||
|  |   n, m: Integer;                                | ||||||
|  |   Item: TListItem; | ||||||
|  |   S: String;    | ||||||
|  |   Entry: TDBGCallStackEntry; | ||||||
|  | begin        | ||||||
|  |   // Reuse entries, so add and remove only                     | ||||||
|  |   // Remove unneded | ||||||
|  |   for n := lvCallStack.Items.Count - 1 downto Debugger.CallStack.Count do | ||||||
|  |     lvCallStack.Items.Delete(n); | ||||||
|  | 
 | ||||||
|  |   // Add needed | ||||||
|  |   for n := lvCallStack.Items.Count to Debugger.CallStack.Count - 1 do | ||||||
|  |   begin | ||||||
|  |     Item := lvCallStack.Items.Add; | ||||||
|  |     Item.SubItems.Add(''); | ||||||
|  |     Item.SubItems.Add(''); | ||||||
|  |   end; | ||||||
|  | 
 | ||||||
|  |   for n := 0 to lvCallStack.Items.Count - 1 do   | ||||||
|  |   begin | ||||||
|  |     Item := lvCallStack.Items[n]; | ||||||
|  |     Entry := Debugger.CallStack.Entries[n]; | ||||||
|  |     Item.Caption := Entry.Source; | ||||||
|  |     Item.SubItems[0] := IntToStr(Entry.Line); | ||||||
|  |     S := ''; | ||||||
|  |     for m := 0 to Entry.ArgumentCount - 1 do | ||||||
|  |     begin | ||||||
|  |       if S <> ''  | ||||||
|  |       then S := S + ', '; | ||||||
|  |       S := S + Entry.ArgumentValues[m]; | ||||||
|  |     end;                                | ||||||
|  |     if S <> '' | ||||||
|  |     then S := '(' + S + ')'; | ||||||
|  |     Item.SubItems[1] := Entry.FunctionName + S; | ||||||
|  |   end;                                  | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | procedure TCallStackDlg.SetDebugger(const ADebugger: TDebugger);  | ||||||
|  | begin | ||||||
|  |   if ADebugger <> Debugger | ||||||
|  |   then begin | ||||||
|  |     if Debugger <> nil | ||||||
|  |     then begin | ||||||
|  |       Debugger.CallStack.OnChange := nil; | ||||||
|  |     end; | ||||||
|  |     inherited; | ||||||
|  |     if Debugger <> nil | ||||||
|  |     then begin | ||||||
|  |       Debugger.CallStack.OnChange := @CallStackChanged; | ||||||
|  |       CallStackChanged(Debugger.CallStack); | ||||||
|  |     end; | ||||||
|  |   end | ||||||
|  |   else inherited; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | initialization | ||||||
|  |   {$I callstackdlg.lrs} | ||||||
|  | 
 | ||||||
|  | end. | ||||||
|  | 
 | ||||||
|  | { ============================================================================= | ||||||
|  |   $Log$ | ||||||
|  |   Revision 1.1  2002/04/30 15:57:39  lazarus | ||||||
|  |   MWE: | ||||||
|  |     + Added callstack object and dialog | ||||||
|  |     + Added checks to see if debugger = nil | ||||||
|  |     + Added dbgutils | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -60,17 +60,6 @@ type | |||||||
| 
 | 
 | ||||||
| procedure SendBreak(const AHandle: Integer); | procedure SendBreak(const AHandle: Integer); | ||||||
| 
 | 
 | ||||||
| function GetLine(var ABuffer: String): String; |  | ||||||
| function StripLN(const ALine: String): String; |  | ||||||
| function GetPart(const ASkipTo, AnEnd: String; var ASource: String): String; |  | ||||||
| 
 |  | ||||||
| const |  | ||||||
| {$IFDEF WIN32} |  | ||||||
|   LINE_END = #13#10; |  | ||||||
| {$ELSE} |  | ||||||
|   LINE_END = #10; |  | ||||||
| {$ENDIF} |  | ||||||
| 
 |  | ||||||
| implementation | implementation | ||||||
| 
 | 
 | ||||||
| uses | uses | ||||||
| @ -81,7 +70,7 @@ uses | |||||||
|    Unix, |    Unix, | ||||||
|  {$ENDIF}      |  {$ENDIF}      | ||||||
| {$ENDIF} | {$ENDIF} | ||||||
|   SysUtils, Forms; |   SysUtils, Forms, DBGUtils; | ||||||
|    |    | ||||||
| ////////////////////////////////////////////////// | ////////////////////////////////////////////////// | ||||||
| //       Needs to go to proper include | //       Needs to go to proper include | ||||||
| @ -153,75 +142,6 @@ end; | |||||||
|    |    | ||||||
| ////////////////////////////////////////////////// | ////////////////////////////////////////////////// | ||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////// |  | ||||||
| //           Tools and utilities |  | ||||||
| //           |  | ||||||
| ////////////////////////////////////////////////// |  | ||||||
| function GetLine(var ABuffer: String): String; |  | ||||||
| var |  | ||||||
|   idx: Integer; |  | ||||||
| begin |  | ||||||
|   idx := Pos(#10, ABuffer); |  | ||||||
|   if idx = 0 |  | ||||||
|   then Result := '' |  | ||||||
|   else begin |  | ||||||
|     Result := Copy(ABuffer, 1, idx); |  | ||||||
|     Delete(ABuffer, 1, idx); |  | ||||||
|   end; |  | ||||||
| end; |  | ||||||
| 
 |  | ||||||
| function StripLN(const ALine: String): String; |  | ||||||
| var |  | ||||||
|   idx: Integer; |  | ||||||
| begin |  | ||||||
|   idx := Pos(#10, ALine); |  | ||||||
|   if idx = 0 |  | ||||||
|   then begin |  | ||||||
|     idx := Pos(#13, ALine); |  | ||||||
|     if idx = 0 |  | ||||||
|     then begin |  | ||||||
|       Result := ALine; |  | ||||||
|       Exit; |  | ||||||
|     end; |  | ||||||
|   end |  | ||||||
|   else begin |  | ||||||
|     if (idx > 1) |  | ||||||
|     and (ALine[idx - 1] = #13) |  | ||||||
|     then Dec(idx); |  | ||||||
|   end; |  | ||||||
|   Result := Copy(ALine, 1, idx - 1); |  | ||||||
| end;            |  | ||||||
| 
 |  | ||||||
| function GetPart(const ASkipTo, AnEnd: String; var ASource: String): String; |  | ||||||
| var |  | ||||||
|   idx: Integer; |  | ||||||
| begin                   |  | ||||||
|   if ASkipTo <> '' |  | ||||||
|   then begin |  | ||||||
|     idx := Pos(ASkipTo, ASource); |  | ||||||
|     if idx = 0  |  | ||||||
|     then begin |  | ||||||
|       Result := ''; |  | ||||||
|       Exit; |  | ||||||
|     end; |  | ||||||
|     Delete(ASource, 1, idx + Length(ASkipTo) - 1); |  | ||||||
|   end; |  | ||||||
|   if AnEnd = '' |  | ||||||
|   then idx := 0 |  | ||||||
|   else idx := Pos(AnEnd, ASource); |  | ||||||
|   if idx = 0  |  | ||||||
|   then begin |  | ||||||
|     Result := ASource; |  | ||||||
|     ASource := ''; |  | ||||||
|   end |  | ||||||
|   else begin |  | ||||||
|     Result := Copy(ASource, 1, idx - 1); |  | ||||||
|     Delete(ASource, 1, idx - 1); |  | ||||||
|   end; |  | ||||||
| end; |  | ||||||
| 
 |  | ||||||
| ////////////////////////////////////////////////// |  | ||||||
| 
 |  | ||||||
| { TCmdLineDebugger } | { TCmdLineDebugger } | ||||||
| 
 | 
 | ||||||
| constructor TCmdLineDebugger.Create(const AExternalDebugger: String); | constructor TCmdLineDebugger.Create(const AExternalDebugger: String); | ||||||
| @ -413,7 +333,7 @@ begin | |||||||
|     FDbgProcess.Input.Write(LINE_END, 1); |     FDbgProcess.Input.Write(LINE_END, 1); | ||||||
|   end |   end | ||||||
|   else begin |   else begin | ||||||
|     WriteLN('[TCmdLineDebugger.SendCmdLn] Process stopped running when sending: <', ACommand, '>'); |     WriteLN('[TCmdLineDebugger.SendCmdLn] Unable to send <', ACommand, '>. No process running.'); | ||||||
|     SetState(dsError); |     SetState(dsError); | ||||||
|   end; |   end; | ||||||
| end; | end; | ||||||
| @ -431,6 +351,12 @@ end; | |||||||
| end. | end. | ||||||
| { ============================================================================= | { ============================================================================= | ||||||
|   $Log$ |   $Log$ | ||||||
|  |   Revision 1.10  2002/04/30 15:57:39  lazarus | ||||||
|  |   MWE: | ||||||
|  |     + Added callstack object and dialog | ||||||
|  |     + Added checks to see if debugger = nil | ||||||
|  |     + Added dbgutils | ||||||
|  | 
 | ||||||
|   Revision 1.9  2002/04/24 20:42:29  lazarus |   Revision 1.9  2002/04/24 20:42:29  lazarus | ||||||
|   MWE: |   MWE: | ||||||
|     + Added watches |     + Added watches | ||||||
|  | |||||||
							
								
								
									
										113
									
								
								debugger/dbgutils.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								debugger/dbgutils.pp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,113 @@ | |||||||
|  | { $Id$ } | ||||||
|  | {                   ------------------------------------------- | ||||||
|  |                      dbgutils.pp  -  Debugger utility routines | ||||||
|  |                     ------------------------------------------- | ||||||
|  | 
 | ||||||
|  |  @created(Sun Apr 28st WET 2002) | ||||||
|  |  @lastmod($Date$) | ||||||
|  |  @author(Marc Weustink <marc@@dommelstein.net>) | ||||||
|  | 
 | ||||||
|  |  This unit contains a collection of debugger support routines. | ||||||
|  | 
 | ||||||
|  | /*************************************************************************** | ||||||
|  |  *                                                                         * | ||||||
|  |  *   This program is free software; you can redistribute it and/or modify  * | ||||||
|  |  *   it under the terms of the GNU General Public License as published by  * | ||||||
|  |  *   the Free Software Foundation; either version 2 of the License, or     * | ||||||
|  |  *   (at your option) any later version.                                   * | ||||||
|  |  *                                                                         * | ||||||
|  |  ***************************************************************************/ | ||||||
|  | } | ||||||
|  | unit DBGUtils; | ||||||
|  | 
 | ||||||
|  | {$mode objfpc}{$H+} | ||||||
|  | 
 | ||||||
|  | interface  | ||||||
|  | 
 | ||||||
|  | function GetLine(var ABuffer: String): String; | ||||||
|  | function StripLN(const ALine: String): String; | ||||||
|  | function GetPart(const ASkipTo, AnEnd: String; var ASource: String): String; | ||||||
|  | 
 | ||||||
|  | const | ||||||
|  | {$IFDEF WIN32} | ||||||
|  |   LINE_END = #13#10; | ||||||
|  | {$ELSE} | ||||||
|  |   LINE_END = #10; | ||||||
|  | {$ENDIF} | ||||||
|  | 
 | ||||||
|  | implementation | ||||||
|  | 
 | ||||||
|  | function GetLine(var ABuffer: String): String; | ||||||
|  | var | ||||||
|  |   idx: Integer; | ||||||
|  | begin | ||||||
|  |   idx := Pos(#10, ABuffer); | ||||||
|  |   if idx = 0 | ||||||
|  |   then Result := '' | ||||||
|  |   else begin | ||||||
|  |     Result := Copy(ABuffer, 1, idx); | ||||||
|  |     Delete(ABuffer, 1, idx); | ||||||
|  |   end; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function StripLN(const ALine: String): String; | ||||||
|  | var | ||||||
|  |   idx: Integer; | ||||||
|  | begin | ||||||
|  |   idx := Pos(#10, ALine); | ||||||
|  |   if idx = 0 | ||||||
|  |   then begin | ||||||
|  |     idx := Pos(#13, ALine); | ||||||
|  |     if idx = 0 | ||||||
|  |     then begin | ||||||
|  |       Result := ALine; | ||||||
|  |       Exit; | ||||||
|  |     end; | ||||||
|  |   end | ||||||
|  |   else begin | ||||||
|  |     if (idx > 1) | ||||||
|  |     and (ALine[idx - 1] = #13) | ||||||
|  |     then Dec(idx); | ||||||
|  |   end; | ||||||
|  |   Result := Copy(ALine, 1, idx - 1); | ||||||
|  | end;            | ||||||
|  | 
 | ||||||
|  | function GetPart(const ASkipTo, AnEnd: String; var ASource: String): String; | ||||||
|  | var | ||||||
|  |   idx: Integer; | ||||||
|  | begin                   | ||||||
|  |   if ASkipTo <> '' | ||||||
|  |   then begin | ||||||
|  |     idx := Pos(ASkipTo, ASource); | ||||||
|  |     if idx = 0  | ||||||
|  |     then begin | ||||||
|  |       Result := ''; | ||||||
|  |       Exit; | ||||||
|  |     end; | ||||||
|  |     Delete(ASource, 1, idx + Length(ASkipTo) - 1); | ||||||
|  |   end; | ||||||
|  |   if AnEnd = '' | ||||||
|  |   then idx := 0 | ||||||
|  |   else idx := Pos(AnEnd, ASource); | ||||||
|  |   if idx = 0  | ||||||
|  |   then begin | ||||||
|  |     Result := ASource; | ||||||
|  |     ASource := ''; | ||||||
|  |   end | ||||||
|  |   else begin | ||||||
|  |     Result := Copy(ASource, 1, idx - 1); | ||||||
|  |     Delete(ASource, 1, idx - 1); | ||||||
|  |   end; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | end. | ||||||
|  | { ============================================================================= | ||||||
|  |   $Log$ | ||||||
|  |   Revision 1.1  2002/04/30 15:57:39  lazarus | ||||||
|  |   MWE: | ||||||
|  |     + Added callstack object and dialog | ||||||
|  |     + Added checks to see if debugger = nil | ||||||
|  |     + Added dbgutils | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -94,7 +94,6 @@ type | |||||||
|   TDBGBreakPointClass = class of TDBGBreakPoint; |   TDBGBreakPointClass = class of TDBGBreakPoint; | ||||||
|   TDBGBreakPoint = class(TCollectionItem) |   TDBGBreakPoint = class(TCollectionItem) | ||||||
|   private |   private | ||||||
|     FDebugger: TDebugger;  // reference to our debugger |  | ||||||
|     FGroup: TDBGBreakPointGroup; |     FGroup: TDBGBreakPointGroup; | ||||||
|     FValid: Boolean; |     FValid: Boolean; | ||||||
|     FEnabled: Boolean; |     FEnabled: Boolean; | ||||||
| @ -106,6 +105,7 @@ type | |||||||
|     FActions: TDBGBreakPointActions; |     FActions: TDBGBreakPointActions; | ||||||
|     FDisableGroupList: TList; |     FDisableGroupList: TList; | ||||||
|     FEnableGroupList: TList;                                   |     FEnableGroupList: TList;                                   | ||||||
|  |     function  GetDebugger: TDebugger; | ||||||
|     procedure SetActions(const AValue: TDBGBreakPointActions); |     procedure SetActions(const AValue: TDBGBreakPointActions); | ||||||
|     procedure SetEnabled(const AValue: Boolean); |     procedure SetEnabled(const AValue: Boolean); | ||||||
|     procedure SetExpression(const AValue: String); |     procedure SetExpression(const AValue: String); | ||||||
| @ -121,7 +121,7 @@ type | |||||||
|     procedure SetHitCount(const AValue: Integer); |     procedure SetHitCount(const AValue: Integer); | ||||||
|     procedure SetLocation(const ASource: String; const ALine: Integer); virtual; |     procedure SetLocation(const ASource: String; const ALine: Integer); virtual; | ||||||
|     procedure SetValid(const AValue: Boolean); |     procedure SetValid(const AValue: Boolean); | ||||||
|     property  Debugger: TDebugger read FDebugger; |     property  Debugger: TDebugger read GetDebugger; | ||||||
|   public |   public | ||||||
|     procedure AddDisableGroup(const AGroup: TDBGBreakPointGroup); |     procedure AddDisableGroup(const AGroup: TDBGBreakPointGroup); | ||||||
|     procedure AddEnableGroup(const AGroup: TDBGBreakPointGroup); |     procedure AddEnableGroup(const AGroup: TDBGBreakPointGroup); | ||||||
| @ -209,10 +209,10 @@ type | |||||||
|   TDBGWatchClass = class of TDBGWatch; |   TDBGWatchClass = class of TDBGWatch; | ||||||
|   TDBGWatch = class(TCollectionItem) |   TDBGWatch = class(TCollectionItem) | ||||||
|   private |   private | ||||||
|     FDebugger: TDebugger;  // reference to our debugger |  | ||||||
|     FEnabled: Boolean; |     FEnabled: Boolean; | ||||||
|     FExpression: String; |     FExpression: String; | ||||||
|     FValid: Boolean; |     FValid: Boolean; | ||||||
|  |     function  GetDebugger: TDebugger; | ||||||
|     procedure SetEnabled(const AValue: Boolean); |     procedure SetEnabled(const AValue: Boolean); | ||||||
|     procedure SetExpression(const AValue: String); |     procedure SetExpression(const AValue: String); | ||||||
|   protected |   protected | ||||||
| @ -223,7 +223,7 @@ type | |||||||
|     function  GetValue: String; virtual; |     function  GetValue: String; virtual; | ||||||
|     function  GetValid: Boolean; virtual; |     function  GetValid: Boolean; virtual; | ||||||
|     procedure SetValid(const AValue: Boolean); |     procedure SetValid(const AValue: Boolean); | ||||||
|     property  Debugger: TDebugger read FDebugger; |     property  Debugger: TDebugger read GetDebugger; | ||||||
|   public |   public | ||||||
|     constructor Create(ACollection: TCollection); override; |     constructor Create(ACollection: TCollection); override; | ||||||
|     property Enabled: Boolean read FEnabled write SetEnabled; |     property Enabled: Boolean read FEnabled write SetEnabled; | ||||||
| @ -283,6 +283,52 @@ type | |||||||
|     property OnChange: TNotifyEvent read FOnChange write FOnChange; |     property OnChange: TNotifyEvent read FOnChange write FOnChange; | ||||||
|   end; |   end; | ||||||
| 
 | 
 | ||||||
|  |   TDBGCallStackEntry = class(TObject) | ||||||
|  |   private | ||||||
|  |     FIndex: Integer; | ||||||
|  |     FAdress: Pointer; | ||||||
|  |     FFunctionName: String; | ||||||
|  |     FLine: Integer; | ||||||
|  |     FArguments: TStrings; | ||||||
|  |     FSource: String; | ||||||
|  |     function GetArgumentCount: Integer;  | ||||||
|  |     function GetArgumentName(const AnIndex: Integer): String; | ||||||
|  |     function GetArgumentValue(const AnIndex: Integer): String; | ||||||
|  |   protected | ||||||
|  |   public | ||||||
|  |     constructor Create(const AIndex:Integer; const AnAdress: Pointer; const AnArguments: TStrings; const AFunctionName: String; const ASource: String; const ALine: Integer); | ||||||
|  |     destructor Destroy; override; | ||||||
|  |     property Adress: Pointer read FAdress; | ||||||
|  |     property ArgumentCount: Integer read GetArgumentCount;  | ||||||
|  |     property ArgumentNames[const AnIndex: Integer]: String read GetArgumentName; | ||||||
|  |     property ArgumentValues[const AnIndex: Integer]: String read GetArgumentValue; | ||||||
|  |     property FunctionName: String read FFunctionName; | ||||||
|  |     property Source: String read FSource; | ||||||
|  |     property Line: Integer read FLine; | ||||||
|  |   end; | ||||||
|  | 
 | ||||||
|  |   TDBGCallStack = class(TObject) | ||||||
|  |   private | ||||||
|  |     FDebugger: TDebugger;  // reference to our debugger | ||||||
|  |     FEntries: TList;       // list of created entries | ||||||
|  |     FOldState: TDBGState;  // records the previous debugger state  | ||||||
|  |     FOnChange: TNotifyEvent; | ||||||
|  |     procedure Clear; | ||||||
|  |     function GetStackEntry(const AIndex: Integer): TDBGCallStackEntry; | ||||||
|  |   protected | ||||||
|  |     procedure DoChange; | ||||||
|  |     function CreateStackEntry(const AIndex: Integer): TDBGCallStackEntry; virtual;  | ||||||
|  |     procedure DoStateChange; virtual; | ||||||
|  |     function GetCount: Integer; virtual; | ||||||
|  |     property Debugger: TDebugger read FDebugger; | ||||||
|  |   public    | ||||||
|  |     function Count: Integer; | ||||||
|  |     constructor Create(const ADebugger: TDebugger);  | ||||||
|  |     destructor Destroy; override; | ||||||
|  |     property Entries[const AIndex: Integer]: TDBGCallStackEntry read GetStackEntry; | ||||||
|  |     property OnChange: TNotifyEvent read FOnChange write FOnChange; | ||||||
|  |   end; | ||||||
|  | 
 | ||||||
|   TDBGOutputEvent = procedure(Sender: TObject; const AText: String) of object; |   TDBGOutputEvent = procedure(Sender: TObject; const AText: String) of object; | ||||||
|   TDBGCurrentLineEvent = procedure(Sender: TObject; const ALocation: TDBGLocationRec) of object; |   TDBGCurrentLineEvent = procedure(Sender: TObject; const ALocation: TDBGLocationRec) of object; | ||||||
|   TDBGExceptionEvent = procedure(Sender: TObject; const AExceptionID: Integer; const AExceptionText: String) of object; |   TDBGExceptionEvent = procedure(Sender: TObject; const AExceptionID: Integer; const AExceptionText: String) of object; | ||||||
| @ -297,6 +343,7 @@ type | |||||||
|     FFileName: String; |     FFileName: String; | ||||||
|     FLocals: TDBGLocals; |     FLocals: TDBGLocals; | ||||||
|     FState: TDBGState; |     FState: TDBGState; | ||||||
|  |     FCallStack: TDBGCallStack; | ||||||
|     FWatches: TDBGWatches; |     FWatches: TDBGWatches; | ||||||
|     FOnCurrent: TDBGCurrentLineEvent; |     FOnCurrent: TDBGCurrentLineEvent; | ||||||
|     FOnException: TDBGExceptionEvent; |     FOnException: TDBGExceptionEvent; | ||||||
| @ -309,6 +356,7 @@ type | |||||||
|   protected |   protected | ||||||
|     function  CreateBreakPoints: TDBGBreakPoints; virtual; |     function  CreateBreakPoints: TDBGBreakPoints; virtual; | ||||||
|     function  CreateLocals: TDBGLocals; virtual; |     function  CreateLocals: TDBGLocals; virtual; | ||||||
|  |     function  CreateCallStack: TDBGCallStack; virtual; | ||||||
|     function  CreateWatches: TDBGWatches; virtual; |     function  CreateWatches: TDBGWatches; virtual; | ||||||
|     procedure DoCurrent(const ALocation: TDBGLocationRec); |     procedure DoCurrent(const ALocation: TDBGLocationRec); | ||||||
|     procedure DoDbgOutput(const AText: String); |     procedure DoDbgOutput(const AText: String); | ||||||
| @ -344,6 +392,7 @@ type | |||||||
|     property BreakPoints: TDBGBreakPoints read FBreakPoints;                     // list of all breakpoints |     property BreakPoints: TDBGBreakPoints read FBreakPoints;                     // list of all breakpoints | ||||||
|     property BreakPointGroups: TDBGBreakPointGroups read FBreakPointGroups;      // list of all breakpointgroups |     property BreakPointGroups: TDBGBreakPointGroups read FBreakPointGroups;      // list of all breakpointgroups | ||||||
|     property Commands: TDBGCommands read GetCommands;                            // All current available commands of the debugger |     property Commands: TDBGCommands read GetCommands;                            // All current available commands of the debugger | ||||||
|  |     property CallStack: TDBGCallStack read FCallStack; | ||||||
|     property ExitCode: Integer read FExitCode; |     property ExitCode: Integer read FExitCode; | ||||||
|     property ExternalDebugger: String read FExternalDebugger; |     property ExternalDebugger: String read FExternalDebugger; | ||||||
|     property FileName: String read FFileName write SetFileName;                  // The name of the exe to be debugged |     property FileName: String read FFileName write SetFileName;                  // The name of the exe to be debugged | ||||||
| @ -360,7 +409,7 @@ type | |||||||
| implementation | implementation | ||||||
| 
 | 
 | ||||||
| uses | uses | ||||||
|   SysUtils; |   SysUtils, DBGUtils; | ||||||
| 
 | 
 | ||||||
| const | const | ||||||
|   COMMANDMAP: array[TDBGState] of TDBGCommands = ( |   COMMANDMAP: array[TDBGState] of TDBGCommands = ( | ||||||
| @ -394,6 +443,7 @@ begin | |||||||
|   FExternalDebugger := AExternalDebugger; |   FExternalDebugger := AExternalDebugger; | ||||||
|   FBreakPoints := CreateBreakPoints; |   FBreakPoints := CreateBreakPoints; | ||||||
|   FLocals := CreateLocals; |   FLocals := CreateLocals; | ||||||
|  |   FCallStack := CreateCallStack; | ||||||
|   FWatches := CreateWatches; |   FWatches := CreateWatches; | ||||||
|   FBreakPointGroups := TDBGBreakPointGroups.Create; |   FBreakPointGroups := TDBGBreakPointGroups.Create; | ||||||
|   FExitCode := 0; |   FExitCode := 0; | ||||||
| @ -404,6 +454,11 @@ begin | |||||||
|   Result := TDBGBreakPoints.Create(Self, TDBGBreakPoint); |   Result := TDBGBreakPoints.Create(Self, TDBGBreakPoint); | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | function TDebugger.CreateCallStack: TDBGCallStack;  | ||||||
|  | begin | ||||||
|  |   Result := TDBGCallStack.Create(Self); | ||||||
|  | end; | ||||||
|  | 
 | ||||||
| function TDebugger.CreateLocals: TDBGLocals; | function TDebugger.CreateLocals: TDBGLocals; | ||||||
| begin | begin | ||||||
|   Result := TDBGLocals.Create(Self); |   Result := TDBGLocals.Create(Self); | ||||||
| @ -425,8 +480,16 @@ begin | |||||||
|   if FState <> dsNone |   if FState <> dsNone | ||||||
|   then Done; |   then Done; | ||||||
| 
 | 
 | ||||||
|   FBreakPointGroups.Free; |   FBreakPoints.FDebugger := nil; | ||||||
|   FWatches.Free; |   FLocals.FDebugger := nil; | ||||||
|  |   FCallStack.FDebugger := nil; | ||||||
|  |   FWatches.FDebugger := nil; | ||||||
|  | 
 | ||||||
|  |   FreeAndNil(FBreakPoints); | ||||||
|  |   FreeAndNil(FBreakPointGroups); | ||||||
|  |   FreeAndNil(FLocals);      | ||||||
|  |   FreeAndNil(FCallStack); | ||||||
|  |   FreeAndNil(FWatches); | ||||||
|   inherited; |   inherited; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| @ -558,6 +621,7 @@ begin | |||||||
|     FState := AValue; |     FState := AValue; | ||||||
|     FBreakpoints.DoStateChange; |     FBreakpoints.DoStateChange; | ||||||
|     FLocals.DoStateChange; |     FLocals.DoStateChange; | ||||||
|  |     FCallStack.DoStateChange; | ||||||
|     FWatches.DoStateChange; |     FWatches.DoStateChange; | ||||||
|     DoState; |     DoState; | ||||||
|   end; |   end; | ||||||
| @ -622,7 +686,6 @@ begin | |||||||
|   FGroup := nil; |   FGroup := nil; | ||||||
|   FFirstRun := True; |   FFirstRun := True; | ||||||
|   FActions := [bpaStop]; |   FActions := [bpaStop]; | ||||||
|   FDebugger := TDBGBreakPoints(ACollection).FDebugger; |  | ||||||
|   FDisableGroupList := TList.Create; |   FDisableGroupList := TList.Create; | ||||||
|   FEnableGroupList := TList.Create; |   FEnableGroupList := TList.Create; | ||||||
| end; | end; | ||||||
| @ -694,6 +757,11 @@ begin | |||||||
|     TDBGBreakPointGroup(FDisableGroupList[n]).Enabled := True; |     TDBGBreakPointGroup(FDisableGroupList[n]).Enabled := True; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | function  TDBGBreakPoint.GetDebugger: TDebugger; | ||||||
|  | begin | ||||||
|  |   Result := TDBGBreakPoints(Collection).FDebugger; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
| procedure TDBGBreakPoint.RemoveDisableGroup(const AGroup: TDBGBreakPointGroup); | procedure TDBGBreakPoint.RemoveDisableGroup(const AGroup: TDBGBreakPointGroup); | ||||||
| begin | begin | ||||||
|   if AGroup = nil then Exit; |   if AGroup = nil then Exit; | ||||||
| @ -814,9 +882,9 @@ end; | |||||||
| 
 | 
 | ||||||
| constructor TDBGBreakPoints.Create(const ADebugger: TDebugger; const ABreakPointClass: TDBGBreakPointClass); | constructor TDBGBreakPoints.Create(const ADebugger: TDebugger; const ABreakPointClass: TDBGBreakPointClass); | ||||||
| begin | begin | ||||||
|   inherited Create(ABreakPointClass); |  | ||||||
|   FDebugger := ADebugger; |   FDebugger := ADebugger; | ||||||
|   FNotificationList := TList.Create; |   FNotificationList := TList.Create; | ||||||
|  |   inherited Create(ABreakPointClass); | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| destructor TDBGBreakPoints.Destroy; | destructor TDBGBreakPoints.Destroy; | ||||||
| @ -1020,7 +1088,6 @@ constructor TDBGWatch.Create(ACollection: TCollection); | |||||||
| begin | begin | ||||||
|   inherited Create(ACollection); |   inherited Create(ACollection); | ||||||
|   FEnabled := False; |   FEnabled := False; | ||||||
|   FDebugger := TDBGWatches(ACollection).FDebugger; |  | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| procedure TDBGWatch.DoEnableChange; | procedure TDBGWatch.DoEnableChange; | ||||||
| @ -1037,6 +1104,11 @@ procedure TDBGWatch.DoStateChange; | |||||||
| begin     | begin     | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | function TDBGWatch.GetDebugger: TDebugger; | ||||||
|  | begin | ||||||
|  |   Result := TDBGWatches(Collection).FDebugger; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
| function TDBGWatch.GetValid: Boolean; | function TDBGWatch.GetValid: Boolean; | ||||||
| begin | begin | ||||||
|   Result := False; |   Result := False; | ||||||
| @ -1252,10 +1324,139 @@ begin | |||||||
|   if FRefCount = 0 then Free; |   if FRefCount = 0 then Free; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | { =========================================================================== } | ||||||
|  | { TDBGCallStackEntry } | ||||||
|  | { =========================================================================== } | ||||||
|  | 
 | ||||||
|  | constructor TDBGCallStackEntry.Create(const AIndex: Integer; const AnAdress: Pointer; const AnArguments: TStrings; const AFunctionName: String; const ASource: String; const ALine: Integer); | ||||||
|  | begin | ||||||
|  |   inherited Create;    | ||||||
|  |   FIndex := AIndex; | ||||||
|  |   FAdress := AnAdress; | ||||||
|  |   FArguments := TStringlist.Create; | ||||||
|  |   FArguments.Assign(AnArguments); | ||||||
|  |   FFunctionName := AFunctionName; | ||||||
|  |   FSource := ASource; | ||||||
|  |   FLine := ALine; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | destructor TDBGCallStackEntry.Destroy; | ||||||
|  | begin | ||||||
|  |   inherited; | ||||||
|  |   FreeAndNil(FArguments); | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TDBGCallStackEntry.GetArgumentCount: Integer;  | ||||||
|  | begin | ||||||
|  |   Result := FArguments.Count; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TDBGCallStackEntry.GetArgumentName(const AnIndex: Integer): String; | ||||||
|  | begin | ||||||
|  |   Result := FArguments.Names[AnIndex]; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TDBGCallStackEntry.GetArgumentValue(const AnIndex: Integer): String; | ||||||
|  | begin                         | ||||||
|  |   Result := FArguments[AnIndex]; | ||||||
|  |   Result := GetPart('=', '', Result); | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | { =========================================================================== } | ||||||
|  | { TDBGCallStack } | ||||||
|  | { =========================================================================== } | ||||||
|  | 
 | ||||||
|  | procedure TDBGCallStack.Clear; | ||||||
|  | var | ||||||
|  |   n:Integer; | ||||||
|  | begin | ||||||
|  |   for n := 0 to FEntries.Count - 1 do  | ||||||
|  |     TObject(FEntries[n]).Free; | ||||||
|  |      | ||||||
|  |   FEntries.Clear;   | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TDBGCallStack.Count: Integer; | ||||||
|  | begin | ||||||
|  |   if  (FDebugger <> nil)  | ||||||
|  |   and (FDebugger.State = dsPause) | ||||||
|  |   then Result := GetCount | ||||||
|  |   else Result := 0; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | constructor TDBGCallStack.Create(const ADebugger: TDebugger); | ||||||
|  | begin | ||||||
|  |   FDebugger := ADebugger; | ||||||
|  |   FEntries := TList.Create; | ||||||
|  |   FOldState := FDebugger.State; | ||||||
|  |   inherited Create; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TDBGCallStack.CreateStackEntry(const AIndex: Integer): TDBGCallStackEntry;  | ||||||
|  | begin | ||||||
|  |   Result := nil; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | destructor TDBGCallStack.Destroy; | ||||||
|  | begin | ||||||
|  |   Clear; | ||||||
|  |   inherited; | ||||||
|  |   FreeAndNil(FEntries); | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | procedure TDBGCallStack.DoChange;  | ||||||
|  | begin | ||||||
|  |   if Assigned(FOnChange) then FOnChange(Self); | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | procedure TDBGCallStack.DoStateChange;  | ||||||
|  | begin | ||||||
|  |   if FDebugger.State = dsPause | ||||||
|  |   then DoChange | ||||||
|  |   else begin | ||||||
|  |     if FOldState = dsPause | ||||||
|  |     then begin  | ||||||
|  |       Clear; | ||||||
|  |       DoChange; | ||||||
|  |     end; | ||||||
|  |   end;           | ||||||
|  |   FOldState := FDebugger.State; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TDBGCallStack.GetCount: Integer; | ||||||
|  | begin | ||||||
|  |   Result := 0; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TDBGCallStack.GetStackEntry(const AIndex: Integer): TDBGCallStackEntry; | ||||||
|  | var | ||||||
|  |   n: Integer; | ||||||
|  | begin | ||||||
|  |   if (AIndex < 0)  | ||||||
|  |   or (AIndex >= Count) | ||||||
|  |   then raise EInvalidOperation.CreateFmt('Index out of range (%d)', [AIndex]); | ||||||
|  |    | ||||||
|  |   for n := 0 to FEntries.Count - 1 do | ||||||
|  |   begin | ||||||
|  |     Result := TDBGCallStackEntry(FEntries[n]); | ||||||
|  |     if Result.FIndex = AIndex  | ||||||
|  |     then Exit; | ||||||
|  |   end; | ||||||
|  |    | ||||||
|  |   Result := CreateStackEntry(AIndex); | ||||||
|  |   if Result <> nil  | ||||||
|  |   then FEntries.Add(Result); | ||||||
|  | end; | ||||||
| 
 | 
 | ||||||
| end. | end. | ||||||
| { ============================================================================= | { ============================================================================= | ||||||
|   $Log$ |   $Log$ | ||||||
|  |   Revision 1.14  2002/04/30 15:57:39  lazarus | ||||||
|  |   MWE: | ||||||
|  |     + Added callstack object and dialog | ||||||
|  |     + Added checks to see if debugger = nil | ||||||
|  |     + Added dbgutils | ||||||
|  | 
 | ||||||
|   Revision 1.13  2002/04/24 20:42:29  lazarus |   Revision 1.13  2002/04/24 20:42:29  lazarus | ||||||
|   MWE: |   MWE: | ||||||
|     + Added watches |     + Added watches | ||||||
|  | |||||||
| @ -68,6 +68,7 @@ type | |||||||
|     function  ChangeFileName: Boolean; override; |     function  ChangeFileName: Boolean; override; | ||||||
|     function  CreateBreakPoints: TDBGBreakPoints; override; |     function  CreateBreakPoints: TDBGBreakPoints; override; | ||||||
|     function  CreateLocals: TDBGLocals; override; |     function  CreateLocals: TDBGLocals; override; | ||||||
|  |     function  CreateCallStack: TDBGCallStack; override; | ||||||
|     function  CreateWatches: TDBGWatches; override; |     function  CreateWatches: TDBGWatches; override; | ||||||
|     function  GetSupportedCommands: TDBGCommands; override; |     function  GetSupportedCommands: TDBGCommands; override; | ||||||
|     function  RequestCommand(const ACommand: TDBGCommand; const AParams: array of const): Boolean; override; |     function  RequestCommand(const ACommand: TDBGCommand; const AParams: array of const): Boolean; override; | ||||||
| @ -86,7 +87,7 @@ type | |||||||
| implementation | implementation | ||||||
| 
 | 
 | ||||||
| uses | uses | ||||||
|   SysUtils, Dialogs; |   SysUtils, Dialogs, DBGUtils; | ||||||
| 
 | 
 | ||||||
| type | type | ||||||
|   TGDBMIBreakPoint = class(TDBGBreakPoint) |   TGDBMIBreakPoint = class(TDBGBreakPoint) | ||||||
| @ -136,6 +137,18 @@ type | |||||||
|     constructor Create(ACollection: TCollection); override; |     constructor Create(ACollection: TCollection); override; | ||||||
|   end; |   end; | ||||||
|    |    | ||||||
|  |   TGDBMICallStack = class(TDBGCallStack) | ||||||
|  |   private | ||||||
|  |     FCount: Integer;  // -1 means uninitialized | ||||||
|  |   protected | ||||||
|  |     function CreateStackEntry(const AIndex: Integer): TDBGCallStackEntry; override;  | ||||||
|  |     procedure DoStateChange; override; | ||||||
|  |     function GetCount: Integer; override; | ||||||
|  |   public | ||||||
|  |     constructor Create(const ADebugger: TDebugger);  | ||||||
|  |   end; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| function CreateValueList(AResultValues: String): TStringList; | function CreateValueList(AResultValues: String): TStringList; | ||||||
| var | var | ||||||
|   n: Integer; |   n: Integer; | ||||||
| @ -264,6 +277,11 @@ begin | |||||||
|   Result := TDBGBreakPoints.Create(Self, TGDBMIBreakPoint); |   Result := TDBGBreakPoints.Create(Self, TGDBMIBreakPoint); | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | function TGDBMIDebugger.CreateCallStack: TDBGCallStack;  | ||||||
|  | begin | ||||||
|  |   Result := TGDBMICallStack.Create(Self); | ||||||
|  | end; | ||||||
|  | 
 | ||||||
| function TGDBMIDebugger.CreateLocals: TDBGLocals; | function TGDBMIDebugger.CreateLocals: TDBGLocals; | ||||||
| begin | begin | ||||||
|   Result := TGDBMILocals.Create(Self); |   Result := TGDBMILocals.Create(Self); | ||||||
| @ -782,7 +800,8 @@ end; | |||||||
| 
 | 
 | ||||||
| destructor TGDBMIBreakPoint.Destroy; | destructor TGDBMIBreakPoint.Destroy; | ||||||
| begin | begin | ||||||
|   if FBreakID <> 0 |   if  (FBreakID <> 0) | ||||||
|  |   and (Debugger <> nil) | ||||||
|   then begin |   then begin | ||||||
|     TGDBMIDebugger(Debugger).ExecuteCommand('-break-delete %d', [FBreakID]); |     TGDBMIDebugger(Debugger).ExecuteCommand('-break-delete %d', [FBreakID]); | ||||||
|   end; |   end; | ||||||
| @ -798,7 +817,9 @@ procedure TGDBMIBreakPoint.DoEnableChange; | |||||||
| const | const | ||||||
|   CMD: array[Boolean] of String = ('disable', 'enable'); |   CMD: array[Boolean] of String = ('disable', 'enable'); | ||||||
| begin | begin | ||||||
|   if FBreakID = 0 then Exit; |   if (FBreakID = 0)  | ||||||
|  |   or (Debugger = nil) | ||||||
|  |   then Exit; | ||||||
| 
 | 
 | ||||||
|   TGDBMIDebugger(Debugger).ExecuteCommand('-break-%s %d', [CMD[Enabled], FBreakID]); |   TGDBMIDebugger(Debugger).ExecuteCommand('-break-%s %d', [CMD[Enabled], FBreakID]); | ||||||
| end; | end; | ||||||
| @ -830,6 +851,8 @@ var | |||||||
|   ResultList, BkptList: TStringList; |   ResultList, BkptList: TStringList; | ||||||
|   ResultState: TDBGState; |   ResultState: TDBGState; | ||||||
| begin | begin | ||||||
|  |   if Debugger = nil then Exit; | ||||||
|  |    | ||||||
|   TGDBMIDebugger(Debugger).ExecuteCommand('-break-insert %s:%d', [Source, Line], True, ResultState, S); |   TGDBMIDebugger(Debugger).ExecuteCommand('-break-insert %s:%d', [Source, Line], True, ResultState, S); | ||||||
|   ResultList := CreateValueList(S); |   ResultList := CreateValueList(S); | ||||||
|   BkptList := CreateValueList(ResultList.Values['bkpt']); |   BkptList := CreateValueList(ResultList.Values['bkpt']); | ||||||
| @ -845,6 +868,7 @@ end; | |||||||
| procedure TGDBMIBreakPoint.SetLocation(const ASource: String; const ALine: Integer); | procedure TGDBMIBreakPoint.SetLocation(const ASource: String; const ALine: Integer); | ||||||
| begin | begin | ||||||
|   inherited; |   inherited; | ||||||
|  |   if Debugger = nil then Exit; | ||||||
|   if TGDBMIDebugger(Debugger).State in [dsStop, dsPause, dsIdle] |   if TGDBMIDebugger(Debugger).State in [dsStop, dsPause, dsIdle] | ||||||
|   then SetBreakpoint; |   then SetBreakpoint; | ||||||
| end; | end; | ||||||
| @ -874,7 +898,8 @@ end; | |||||||
| 
 | 
 | ||||||
| function TGDBMILocals.Count: Integer; | function TGDBMILocals.Count: Integer; | ||||||
| begin | begin | ||||||
|   if Debugger.State = dsPause |   if  (Debugger <> nil) | ||||||
|  |   and (Debugger.State = dsPause) | ||||||
|   then begin |   then begin | ||||||
|     LocalsNeeded; |     LocalsNeeded; | ||||||
|     Result := FLocals.Count; |     Result := FLocals.Count; | ||||||
| @ -898,7 +923,8 @@ end; | |||||||
| 
 | 
 | ||||||
| procedure TGDBMILocals.DoStateChange; | procedure TGDBMILocals.DoStateChange; | ||||||
| begin | begin | ||||||
|   if Debugger.State = dsPause |   if  (Debugger <> nil) | ||||||
|  |   and (Debugger.State = dsPause) | ||||||
|   then begin |   then begin | ||||||
|     DoChange; |     DoChange; | ||||||
|   end |   end | ||||||
| @ -910,7 +936,8 @@ end; | |||||||
| 
 | 
 | ||||||
| function TGDBMILocals.GetName(const AnIndex: Integer): String; | function TGDBMILocals.GetName(const AnIndex: Integer): String; | ||||||
| begin | begin | ||||||
|   if Debugger.State = dsPause |   if  (Debugger <> nil) | ||||||
|  |   and (Debugger.State = dsPause) | ||||||
|   then begin |   then begin | ||||||
|     LocalsNeeded; |     LocalsNeeded; | ||||||
|     Result := FLocals.Names[AnIndex]; |     Result := FLocals.Names[AnIndex]; | ||||||
| @ -920,7 +947,8 @@ end; | |||||||
| 
 | 
 | ||||||
| function TGDBMILocals.GetValue(const AnIndex: Integer): String; | function TGDBMILocals.GetValue(const AnIndex: Integer): String; | ||||||
| begin | begin | ||||||
|   if Debugger.State = dsPause |   if  (Debugger <> nil) | ||||||
|  |   and (Debugger.State = dsPause) | ||||||
|   then begin |   then begin | ||||||
|     LocalsNeeded; |     LocalsNeeded; | ||||||
|     Result := FLocals[AnIndex]; |     Result := FLocals[AnIndex]; | ||||||
| @ -934,6 +962,7 @@ var | |||||||
|   S: String; |   S: String; | ||||||
|   List: TStrings; |   List: TStrings; | ||||||
| begin | begin | ||||||
|  |   if Debugger = nil then Exit; | ||||||
|   if not FLocalsValid |   if not FLocalsValid | ||||||
|   then begin |   then begin | ||||||
|     TGDBMIDebugger(Debugger).ExecuteCommand('-stack-list-locals 1', S); |     TGDBMIDebugger(Debugger).ExecuteCommand('-stack-list-locals 1', S); | ||||||
| @ -967,6 +996,8 @@ end; | |||||||
| 
 | 
 | ||||||
| procedure TGDBMIWatch.DoStateChange; | procedure TGDBMIWatch.DoStateChange; | ||||||
| begin | begin | ||||||
|  |   if Debugger = nil then Exit; | ||||||
|  | 
 | ||||||
|   if Debugger.State in [dsPause, dsStop] |   if Debugger.State in [dsPause, dsStop] | ||||||
|   then FEvaluated := False; |   then FEvaluated := False; | ||||||
|   if Debugger.State = dsPause then Changed(False); |   if Debugger.State = dsPause then Changed(False); | ||||||
| @ -975,6 +1006,7 @@ end; | |||||||
| procedure TGDBMIWatch.EvaluationNeeded; | procedure TGDBMIWatch.EvaluationNeeded; | ||||||
| begin | begin | ||||||
|   if FEvaluated then Exit; |   if FEvaluated then Exit; | ||||||
|  |   if Debugger = nil then Exit; | ||||||
| 
 | 
 | ||||||
|   if (Debugger.State in [dsPause, dsStop]) |   if (Debugger.State in [dsPause, dsStop]) | ||||||
|   and Enabled |   and Enabled | ||||||
| @ -989,7 +1021,8 @@ end; | |||||||
| 
 | 
 | ||||||
| function TGDBMIWatch.GetValue: String; | function TGDBMIWatch.GetValue: String; | ||||||
| begin | begin | ||||||
|   if (Debugger.State in [dsStop, dsPause]) |   if  (Debugger <> nil) | ||||||
|  |   and (Debugger.State in [dsStop, dsPause]) | ||||||
|   and Enabled |   and Enabled | ||||||
|   then begin |   then begin | ||||||
|     EvaluationNeeded; |     EvaluationNeeded; | ||||||
| @ -1004,9 +1037,102 @@ begin | |||||||
|   Result := inherited GetValid; |   Result := inherited GetValid; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | { =========================================================================== } | ||||||
|  | { TGDBMICallStack } | ||||||
|  | { =========================================================================== } | ||||||
|  | 
 | ||||||
|  | constructor TGDBMICallStack.Create(const ADebugger: TDebugger);  | ||||||
|  | begin | ||||||
|  |   FCount := -1; | ||||||
|  |   inherited; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TGDBMICallStack.CreateStackEntry(const AIndex: Integer): TDBGCallStackEntry; | ||||||
|  | var                  | ||||||
|  |   n: Integer; | ||||||
|  |   S: String; | ||||||
|  |   Arguments, ArgList, List: TStrings; | ||||||
|  | begin | ||||||
|  |   if Debugger = nil then Exit; | ||||||
|  | 
 | ||||||
|  |   Arguments := TStringList.Create; | ||||||
|  |   TGDBMIDebugger(Debugger).ExecuteCommand('-stack-list-arguments 1 %d %d', [AIndex, AIndex], S); | ||||||
|  |   List := CreateValueList(S);    | ||||||
|  |   S := List.Values['stack-args']; | ||||||
|  |   FreeAndNil(List); | ||||||
|  |   List := CreateValueList(S); | ||||||
|  |   S := List.Values['frame']; // all arguments | ||||||
|  |   FreeAndNil(List); | ||||||
|  |   List := CreateValueList(S);    | ||||||
|  |   S := List.Values['args']; | ||||||
|  |   FreeAndNil(List); | ||||||
|  |    | ||||||
|  |   ArgList := CreateValueList(S); | ||||||
|  |   for n := 0 to ArgList.Count - 1 do | ||||||
|  |   begin | ||||||
|  |     List := CreateValueList(ArgList[n]); | ||||||
|  |     Arguments.Add(List.Values['name'] + '=' + List.Values['value']); | ||||||
|  |     FreeAndNil(List); | ||||||
|  |   end; | ||||||
|  |   FreeAndNil(ArgList); | ||||||
|  |    | ||||||
|  |   TGDBMIDebugger(Debugger).ExecuteCommand('-stack-list-frames %d %d', [AIndex, AIndex], S); | ||||||
|  |   List := CreateValueList(S);    | ||||||
|  |   S := List.Values['stack']; | ||||||
|  |   FreeAndNil(List); | ||||||
|  |   List := CreateValueList(S);    | ||||||
|  |   S := List.Values['frame']; | ||||||
|  |   FreeAndNil(List); | ||||||
|  |   List := CreateValueList(S);    | ||||||
|  |   Result := TDBGCallStackEntry.Create( | ||||||
|  |     AIndex,  | ||||||
|  |     Pointer(StrToIntDef(List.Values['addr'], 0)), | ||||||
|  |     Arguments, | ||||||
|  |     List.Values['func'], | ||||||
|  |     List.Values['file'], | ||||||
|  |     StrToIntDef(List.Values['line'], 0) | ||||||
|  |   ); | ||||||
|  |    | ||||||
|  |   FreeAndNil(List); | ||||||
|  |   Arguments.Free; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | procedure TGDBMICallStack.DoStateChange;  | ||||||
|  | begin | ||||||
|  |   if Debugger.State <> dsPause  | ||||||
|  |   then FCount := -1;     | ||||||
|  |   inherited; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
|  | function TGDBMICallStack.GetCount: Integer; | ||||||
|  | var | ||||||
|  |   S: String; | ||||||
|  |   List: TStrings; | ||||||
|  | begin | ||||||
|  |   if FCount = -1  | ||||||
|  |   then begin | ||||||
|  |     if Debugger = nil  | ||||||
|  |     then FCount := 0 | ||||||
|  |     else begin | ||||||
|  |       TGDBMIDebugger(Debugger).ExecuteCommand('-stack-info-depth', S); | ||||||
|  |       List := CreateValueList(S); | ||||||
|  |       FCount := StrToIntDef(List.Values['depth'], 0); | ||||||
|  |       FreeAndNil(List); | ||||||
|  |     end; | ||||||
|  |   end; | ||||||
|  |    | ||||||
|  |   Result := FCount; | ||||||
|  | end; | ||||||
|  | 
 | ||||||
| end. | end. | ||||||
| { ============================================================================= | { ============================================================================= | ||||||
|   $Log$ |   $Log$ | ||||||
|  |   Revision 1.6  2002/04/30 15:57:40  lazarus | ||||||
|  |   MWE: | ||||||
|  |     + Added callstack object and dialog | ||||||
|  |     + Added checks to see if debugger = nil | ||||||
|  |     + Added dbgutils | ||||||
|  | 
 | ||||||
|   Revision 1.5  2002/04/24 20:42:29  lazarus |   Revision 1.5  2002/04/24 20:42:29  lazarus | ||||||
|   MWE: |   MWE: | ||||||
|     + Added watches |     + Added watches | ||||||
|  | |||||||
							
								
								
									
										29
									
								
								debugger/tcallstackdlg.lfm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								debugger/tcallstackdlg.lfm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | object CallStackDlg: TCallStackDlg | ||||||
|  |   Left = 359 | ||||||
|  |   Top = 126 | ||||||
|  |   Width = 500 | ||||||
|  |   Height = 200 | ||||||
|  |   Caption = 'CallStack' | ||||||
|  |   object lvCallStack: TListView | ||||||
|  |     Left = 0 | ||||||
|  |     Top = 0 | ||||||
|  |     Width = 484 | ||||||
|  |     Height = 200 | ||||||
|  |     Align = alClient | ||||||
|  |     Columns = < | ||||||
|  |       item | ||||||
|  |         Caption = 'Source' | ||||||
|  |         Width = 150 | ||||||
|  |       end | ||||||
|  |       item | ||||||
|  |         Caption = 'Line' | ||||||
|  |         Width = 50 | ||||||
|  |       end | ||||||
|  |       item | ||||||
|  |         Caption = 'Function' | ||||||
|  |         Width = 300 | ||||||
|  |       end> | ||||||
|  |     MultiSelect = False | ||||||
|  |     ViewStyle = vsReport | ||||||
|  |   end | ||||||
|  | end  | ||||||
| @ -25,7 +25,8 @@ interface | |||||||
| 
 | 
 | ||||||
| uses | uses | ||||||
|   Classes, Graphics, Controls, Forms, Dialogs, LResources, |   Classes, Graphics, Controls, Forms, Dialogs, LResources, | ||||||
|   Buttons, StdCtrls, Debugger, DbgOutputForm, BreakpointsDlg, LocalsDlg, WatchesDlg; |   Buttons, StdCtrls, Debugger, DbgOutputForm, BreakpointsDlg,  | ||||||
|  |   LocalsDlg, WatchesDlg, CallStackDlg; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| type | type | ||||||
| @ -80,6 +81,7 @@ type | |||||||
|     FBreakpointDlg: TBreakpointsDlg; |     FBreakpointDlg: TBreakpointsDlg; | ||||||
|     FLocalsDlg: TLocalsDlg; |     FLocalsDlg: TLocalsDlg; | ||||||
|     FWatchesDlg: TWatchesDlg; |     FWatchesDlg: TWatchesDlg; | ||||||
|  |     FCallStackDlg: TCallStackDlg; | ||||||
|     FDummy: Boolean; |     FDummy: Boolean; | ||||||
|     procedure DBGState(Sender: TObject); |     procedure DBGState(Sender: TObject); | ||||||
|     procedure DBGCurrent(Sender: TObject; const ALocation: TDBGLocationRec); |     procedure DBGCurrent(Sender: TObject; const ALocation: TDBGLocationRec); | ||||||
| @ -136,6 +138,9 @@ begin | |||||||
| 
 | 
 | ||||||
|   FOutputForm := TDBGOutputForm.Create(Application); |   FOutputForm := TDBGOutputForm.Create(Application); | ||||||
|   FOutputForm.Show; |   FOutputForm.Show; | ||||||
|  |    | ||||||
|  |   FCallStackDlg := TCallStackDlg.Create(Application); | ||||||
|  |   FCallStackDlg.Show; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| procedure TDebugTestForm.FormDestroy(Sender: TObject); | procedure TDebugTestForm.FormDestroy(Sender: TObject); | ||||||
| @ -145,7 +150,7 @@ begin | |||||||
|     FLocalsDlg.Debugger := nil; |     FLocalsDlg.Debugger := nil; | ||||||
|     FWatchesDlg.Debugger := nil; |     FWatchesDlg.Debugger := nil; | ||||||
|     FOutputForm.Debugger := nil; |     FOutputForm.Debugger := nil; | ||||||
|     FWatchesDlg.Debugger := nil; |     FCallStackDlg.Debugger := nil; | ||||||
|   except |   except | ||||||
|     on Exception do; |     on Exception do; | ||||||
|   end; |   end; | ||||||
| @ -168,7 +173,7 @@ begin | |||||||
|     FLocalsDlg.Debugger := FDebugger; |     FLocalsDlg.Debugger := FDebugger; | ||||||
|     FWatchesDlg.Debugger := FDebugger; |     FWatchesDlg.Debugger := FDebugger; | ||||||
|     FOutputForm.Debugger := FDebugger; |     FOutputForm.Debugger := FDebugger; | ||||||
|     FWatchesDlg.Debugger := FDebugger; |     FCallStackDlg.Debugger := FDebugger;    | ||||||
|   end; |   end; | ||||||
|   FDebugger.Init; |   FDebugger.Init; | ||||||
|   FDebugger.FileName := txtFileName.Text; |   FDebugger.FileName := txtFileName.Text; | ||||||
| @ -318,6 +323,12 @@ initialization | |||||||
| end. | end. | ||||||
| { ============================================================================= | { ============================================================================= | ||||||
|   $Log$ |   $Log$ | ||||||
|  |   Revision 1.8  2002/04/30 15:57:40  lazarus | ||||||
|  |   MWE: | ||||||
|  |     + Added callstack object and dialog | ||||||
|  |     + Added checks to see if debugger = nil | ||||||
|  |     + Added dbgutils | ||||||
|  | 
 | ||||||
|   Revision 1.7  2002/04/24 20:42:29  lazarus |   Revision 1.7  2002/04/24 20:42:29  lazarus | ||||||
|   MWE: |   MWE: | ||||||
|     + Added watches |     + Added watches | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ uses | |||||||
|   ProjectDefs, BaseDebugManager, MainBar, DebuggerDlg; |   ProjectDefs, BaseDebugManager, MainBar, DebuggerDlg; | ||||||
|    |    | ||||||
| type | type | ||||||
|   TDebugDialogType = (ddtOutput, ddtBreakpoints, ddtWatches, ddtLocals); |   TDebugDialogType = (ddtOutput, ddtBreakpoints, ddtWatches, ddtLocals, ddtCallStack); | ||||||
| 
 | 
 | ||||||
|   TDebugManager = class(TBaseDebugManager) |   TDebugManager = class(TBaseDebugManager) | ||||||
|     // Menu events |     // Menu events | ||||||
| @ -87,7 +87,8 @@ implementation | |||||||
| 
 | 
 | ||||||
| uses | uses | ||||||
|   Menus, |   Menus, | ||||||
|   Watchesdlg, BreakPointsdlg, LocalsDlg, DBGOutputForm, GDBMIDebugger; |   Watchesdlg, BreakPointsdlg, LocalsDlg, DBGOutputForm, GDBMIDebugger,  | ||||||
|  |   CallStackDlg; | ||||||
| 
 | 
 | ||||||
|   |   | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| @ -253,7 +254,7 @@ end; | |||||||
| procedure TDebugManager.ViewDebugDialog(const ADialogType: TDebugDialogType); | procedure TDebugManager.ViewDebugDialog(const ADialogType: TDebugDialogType); | ||||||
| const | const | ||||||
|   DEBUGDIALOGCLASS: array[TDebugDialogType] of TDebuggerDlgClass = ( |   DEBUGDIALOGCLASS: array[TDebugDialogType] of TDebuggerDlgClass = ( | ||||||
|     TDbgOutputForm, TBreakPointsDlg, TWatchesDlg, TLocalsDlg |     TDbgOutputForm, TBreakPointsDlg, TWatchesDlg, TLocalsDlg, TCallStackDlg | ||||||
|   ); |   ); | ||||||
| begin | begin | ||||||
|   if FDialogs[ADialogType] = nil |   if FDialogs[ADialogType] = nil | ||||||
| @ -331,6 +332,8 @@ begin | |||||||
|     itmViewBreakPoints.Tag := Ord(ddtBreakPoints); |     itmViewBreakPoints.Tag := Ord(ddtBreakPoints); | ||||||
|     itmViewLocals.OnClick := @mnuViewDebugDialogClick; |     itmViewLocals.OnClick := @mnuViewDebugDialogClick; | ||||||
|     itmViewLocals.Tag := Ord(ddtLocals); |     itmViewLocals.Tag := Ord(ddtLocals); | ||||||
|  |     itmViewCallStack.OnClick := @mnuViewDebugDialogClick; | ||||||
|  |     itmViewCallStack.Tag := Ord(ddtCallStack); | ||||||
|     itmViewDebugOutput.OnClick := @mnuViewDebugDialogClick; |     itmViewDebugOutput.OnClick := @mnuViewDebugDialogClick; | ||||||
|     itmViewDebugOutput.Tag := Ord(ddtOutput); |     itmViewDebugOutput.Tag := Ord(ddtOutput); | ||||||
|   end; |   end; | ||||||
| @ -351,6 +354,7 @@ begin | |||||||
|     itmViewBreakpoints.ShortCut := CommandToShortCut(ecToggleBreakPoints); |     itmViewBreakpoints.ShortCut := CommandToShortCut(ecToggleBreakPoints); | ||||||
|     itmViewDebugOutput.ShortCut := CommandToShortCut(ecToggleDebuggerOut); |     itmViewDebugOutput.ShortCut := CommandToShortCut(ecToggleDebuggerOut); | ||||||
|     itmViewLocals.ShortCut := CommandToShortCut(ecToggleLocals); |     itmViewLocals.ShortCut := CommandToShortCut(ecToggleLocals); | ||||||
|  |     itmViewCallStack.ShortCut := CommandToShortCut(ecToggleCallStack); | ||||||
|   end; |   end; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,112 +0,0 @@ | |||||||
| object TINSERTWATCH |  | ||||||
|   CAPTION = 'Watch Properties' |  | ||||||
|   COLOR = -2147483633 |  | ||||||
|   CLIENTHEIGHT = 200 |  | ||||||
|   CLIENTWIDTH = 420 |  | ||||||
|   POSITION = poscreencenter |  | ||||||
|   HEIGHT = 200 |  | ||||||
|   WIDTH = 420 |  | ||||||
|   object lblExpression: TLABEL |  | ||||||
|     CAPTION = 'Expression:' |  | ||||||
|     FONT.COLOR = -2147483640 |  | ||||||
|     LEFT = 15 |  | ||||||
|     HEIGHT = 17 |  | ||||||
|     TOP = 20 |  | ||||||
|     WIDTH = 65 |  | ||||||
|   end |  | ||||||
|   object edtExpression: TEDIT |  | ||||||
|     LEFT = 105 |  | ||||||
|     TOP = 17 |  | ||||||
|     WIDTH = 300 |  | ||||||
|   end |  | ||||||
|   object lblRepCount: TLABEL |  | ||||||
|     CAPTION = 'Repeat Count:' |  | ||||||
|     FONT.COLOR = -2147483640 |  | ||||||
|     LEFT = 15 |  | ||||||
|     HEIGHT = 17 |  | ||||||
|     TOP = 45 |  | ||||||
|     WIDTH = 80 |  | ||||||
|   end |  | ||||||
|   object edtRepCount: TEDIT |  | ||||||
|     TEXT = '0' |  | ||||||
|     LEFT = 105 |  | ||||||
|     TOP = 42 |  | ||||||
|     WIDTH = 60 |  | ||||||
|   end |  | ||||||
|   object lblDigits: TLABEL |  | ||||||
|     CAPTION = 'Digits:' |  | ||||||
|     FONT.COLOR = -2147483640 |  | ||||||
|     LEFT = 175 |  | ||||||
|     HEIGHT = 17 |  | ||||||
|     TOP = 45 |  | ||||||
|     WIDTH = 40 |  | ||||||
|   end |  | ||||||
|   object edtDigits: TEDIT |  | ||||||
|     TEXT = '0' |  | ||||||
|     LEFT = 225 |  | ||||||
|     TOP = 45 |  | ||||||
|     WIDTH = 180 |  | ||||||
|   end |  | ||||||
|   object cbEnabled: TCHECKBOX |  | ||||||
|     CAPTION = 'Enabled' |  | ||||||
|     STATE = cbchecked |  | ||||||
|     DRAGCURSOR = 0 |  | ||||||
|     TABORDER = 0 |  | ||||||
|     LEFT = 15 |  | ||||||
|     TOP = 65 |  | ||||||
|     WIDTH = 60 |  | ||||||
|   end |  | ||||||
|   object cbAllowFunc: TCHECKBOX |  | ||||||
|     CAPTION = 'Allow Function Calls' |  | ||||||
|     DRAGCURSOR = 0 |  | ||||||
|     TABORDER = 0 |  | ||||||
|     LEFT = 105 |  | ||||||
|     TOP = 65 |  | ||||||
|   end |  | ||||||
|   object Style: TRADIOGROUP |  | ||||||
|     CAPTION = 'Style' |  | ||||||
|     ITEMINDEX = 7 |  | ||||||
|     ITEMS.Strings = ( |  | ||||||
|       'Character' |  | ||||||
|       'String' |  | ||||||
|       'Decimal' |  | ||||||
|       'Hexadecimal' |  | ||||||
|       'Floating Point' |  | ||||||
|       'Pointer' |  | ||||||
|       'Record/Structure' |  | ||||||
|       'Default' |  | ||||||
|       'Memory Dump' |  | ||||||
|     ) |  | ||||||
|     COLUMNS = 3 |  | ||||||
|     LEFT = 15 |  | ||||||
|     HEIGHT = 70 |  | ||||||
|     TOP = 90 |  | ||||||
|     WIDTH = 390 |  | ||||||
|   end |  | ||||||
|   object TBUTTON |  | ||||||
|     MODALRESULT = 1 |  | ||||||
|     CAPTION = 'OK' |  | ||||||
|     FONT.COLOR = -2147483640 |  | ||||||
|     LEFT = 170 |  | ||||||
|     HEIGHT = 25 |  | ||||||
|     TOP = 170 |  | ||||||
|     WIDTH = 75 |  | ||||||
|   end |  | ||||||
|   object TBUTTON |  | ||||||
|     MODALRESULT = 2 |  | ||||||
|     CAPTION = 'Cancel' |  | ||||||
|     FONT.COLOR = -2147483640 |  | ||||||
|     LEFT = 250 |  | ||||||
|     HEIGHT = 25 |  | ||||||
|     TOP = 170 |  | ||||||
|     WIDTH = 75 |  | ||||||
|   end |  | ||||||
|   object TBUTTON |  | ||||||
|     CAPTION = 'Help' |  | ||||||
|     FONT.COLOR = -2147483640 |  | ||||||
|     LEFT = 330 |  | ||||||
|     HEIGHT = 25 |  | ||||||
|     TOP = 170 |  | ||||||
|     WIDTH = 75 |  | ||||||
|   end |  | ||||||
| end |  | ||||||
| @ -1,21 +0,0 @@ | |||||||
| object WatchesDlg: TWATCHESDLG |  | ||||||
|   CAPTION = 'Watches' |  | ||||||
|   COLOR = -2147483633 |  | ||||||
|   CLIENTHEIGHT = 100 |  | ||||||
|   CLIENTWIDTH = 250 |  | ||||||
|   POSITION = poscreencenter |  | ||||||
|   LEFT = 515 |  | ||||||
|   HEIGHT = 100 |  | ||||||
|   TOP = 462 |  | ||||||
|   WIDTH = 250 |  | ||||||
|   object ListBox1: TLISTBOX |  | ||||||
|     ALIGN = alclient |  | ||||||
|     BORDERSTYLE = bssingle |  | ||||||
|     ONKEYPRESS = nil |  | ||||||
|     ONKEYDOWN = nil |  | ||||||
|     LEFT = 1 |  | ||||||
|     HEIGHT = 25 |  | ||||||
|     TOP = 1 |  | ||||||
|     WIDTH = 100 |  | ||||||
|   end |  | ||||||
| end |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 lazarus
						lazarus