📄 observerbreakpointlist.pas
字号:
//////////////////////////////////////////////////////////////////////
// //
// observerBreakpointList.pas: Breakpoint list observer //
// //
// The contents of this file are subject to the Bottled Light //
// Public License Version 1.0 (the "License"); you may not use this //
// file except in compliance with the License. You may obtain a //
// copy of the License at http://www.bottledlight.com/BLPL/ //
// //
// Software distributed under the License is distributed on an //
// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or //
// implied. See the License for the specific language governing //
// rights and limitations under the License. //
// //
// The Original Code is the Mappy VM User Interface, released //
// April 1st, 2003. The Initial Developer of the Original Code is //
// Bottled Light, Inc. Portions created by Bottled Light, Inc. are //
// Copyright (C) 2001-2003 Bottled Light, Inc. All Rights Reserved. //
// //
// Author(s): //
// Michael Noland (joat), michael@bottledlight.com //
// //
// Changelog: //
// 1.0: First public release (April 1st, 2003) //
// //
// Notes: //
// None at present. //
// //
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
unit observerBreakpointList; /////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
interface ////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ComCtrls, cpuObservers, nexus, ImgList;
//////////////////////////////////////////////////////////////////////
type
TdbgBreakpointList = class(TCpuObserver)
list: TListView;
contextMenu: TPopupMenu;
mEditBreakpoint: TMenuItem;
mAddBreakpoint: TMenuItem;
N1: TMenuItem;
mEnabled: TMenuItem;
mDeleteBreakpoint: TMenuItem;
mEnableAllBreakpoints: TMenuItem;
mDisableAllBreakpoints: TMenuItem;
mDeleteAllBreakpoints: TMenuItem;
N2: TMenuItem;
mViewSource: TMenuItem;
imageList: TImageList;
procedure contextMenuPopup(Sender: TObject);
procedure ToggleEnabled(Sender: TObject);
procedure EditBreakpoint(Sender: TObject);
procedure ViewSource(Sender: TObject);
procedure AddABreakpoint(Sender: TObject);
procedure DeleteABreakpoint(Sender: TObject);
procedure EnableAllBreakpoints(Sender: TObject);
procedure DisableAllBreakpoints(Sender: TObject);
procedure DeleteAllBreakpoints(Sender: TObject);
procedure FormCreate(Sender: TObject);
public
procedure UpdateObserver; override;
class function OCaption: string; override;
end;
//////////////////////////////////////////////////////////////////////
var
dbgBreakpointList: TdbgBreakpointList;
//////////////////////////////////////////////////////////////////////
implementation ///////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
uses
dbgBreakpoints, debugBreakpointProperties;
//////////////////////////////////////////////////////////////////////
{$R *.DFM}
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.UpdateObserver;
var
i: integer;
item: TListItem;
bp: TBreakpoint;
begin
list.Items.Clear;
for i := 0 to breakpoints.Count - 1 do begin
bp := breakpoints.Items[i] as TBreakpoint;
// Add the breakpoint info to the list
item := list.Items.Add;
item.Data := bp;
// item.Checked := bp.enabled;
item.Caption := IntToHex(bp.address, 8);
item.SubItems.Add(IntToStr(bp.line));
item.SubItems.Add(bp.condition);
if bp.breakExecution and (bp.logMessage <> '') then
item.SubItems.Add('Break, Log "' + bp.logMessage + '"')
else if bp.breakExecution then
item.SubItems.Add('Break')
else if bp.logMessage <> '' then
item.SubItems.Add('Log "' + bp.logMessage + '"')
else
item.SubItems.Add('');
if bp.enabled then
item.ImageIndex := 1
else
item.ImageIndex := 0;
item.SubItems.Add(IntToStr(bp.passCount));
end;
end;
//////////////////////////////////////////////////////////////////////
class function TdbgBreakpointList.OCaption: string;
begin
Result := 'Breakpoints';
end;
//////////////////////////////////////////////////////////////////////
// Context Menu //////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.contextMenuPopup(Sender: TObject);
var
itemSelected: boolean;
begin
itemSelected := list.Selected <> nil;
mEnabled.visible := itemSelected;
mEditBreakpoint.visible := itemSelected;
mViewSource.visible := itemSelected;
N1.visible := itemSelected;
mDeleteBreakpoint.visible := itemSelected;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.ToggleEnabled(Sender: TObject);
begin
if list.Selected <> nil then begin
TBreakpoint(list.Selected.data).enabled := not TBreakpoint(list.Selected.data).enabled;
UpdateObservers;
end;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.EditBreakpoint(Sender: TObject);
var
bpProperties: TdbgBreakpointProperties;
begin
if list.Selected <> nil then begin
Application.CreateForm(TdbgBreakpointProperties, bpProperties);
bpProperties.bp := TBreakpoint(list.Selected.data);
bpProperties.Show;
UpdateObservers;
end;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.ViewSource(Sender: TObject);
begin
Beep;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.AddABreakpoint(Sender: TObject);
var
bpProperties: TdbgBreakpointProperties;
begin
Application.CreateForm(TdbgBreakpointProperties, bpProperties);
bpProperties.bp := TBreakpoint.Create;
AddBreakpoint(bpProperties.bp);
bpProperties.Show;
UpdateObservers;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.DeleteABreakpoint(Sender: TObject);
begin
if list.Selected <> nil then begin
RemoveBreakpoint(TBreakpoint(list.Selected.data));
list.Items.Delete(list.Items.IndexOf(list.Selected));
UpdateObservers;
end;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.EnableAllBreakpoints(Sender: TObject);
var
i: integer;
begin
for i := 0 to breakpoints.Count - 1 do
TBreakpoint(breakpoints.items[i]).enabled := true;
UpdateObservers;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.DisableAllBreakpoints(Sender: TObject);
var
i: integer;
begin
for i := 0 to breakpoints.Count - 1 do
TBreakpoint(breakpoints.items[i]).enabled := false;
UpdateObservers;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.DeleteAllBreakpoints(Sender: TObject);
begin
ClearBreakpoints;
UpdateObservers;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgBreakpointList.FormCreate(Sender: TObject);
begin
HelpContext := LinkHelp('breakpoints.html');
list.DoubleBuffered := true;
end;
//////////////////////////////////////////////////////////////////////
initialization
RegisterViewer(TdbgBreakpointList);
end.
//////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -