📄 observerwatchlist.pas
字号:
//////////////////////////////////////////////////////////////////////
// //
// observerWatchList.pas: Watch 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 observerWatchList; //////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
interface ////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ComCtrls, cpuObservers, nexus;
//////////////////////////////////////////////////////////////////////
type
TdbgWatchList = class(TCpuObserver)
contextMenu: TPopupMenu;
mEditWatch: TMenuItem;
mAddWatch: TMenuItem;
N1: TMenuItem;
mEnabled: TMenuItem;
mDeleteWatch: TMenuItem;
N2: TMenuItem;
mEnableAllWatches: TMenuItem;
mDisableAllWatches: TMenuItem;
mDeleteAllWatches: TMenuItem;
list: TListView;
procedure ToggleEnabled(Sender: TObject);
procedure EditWatch(Sender: TObject);
procedure AddAWatch(Sender: TObject);
procedure DeleteAWatch(Sender: TObject);
procedure EnableAllWatches(Sender: TObject);
procedure DisableAllWatches(Sender: TObject);
procedure DeleteAllWatches(Sender: TObject);
procedure contextMenuPopup(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure listAdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
var DefaultDraw: Boolean);
public
procedure UpdateObserver; override;
class function OCaption: string; override;
end;
//////////////////////////////////////////////////////////////////////
var
dbgWatchList: TdbgWatchList;
//////////////////////////////////////////////////////////////////////
implementation ///////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
uses
dbgWatches, debugWatchProperties;
//////////////////////////////////////////////////////////////////////
{$R *.DFM}
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.UpdateObserver;
var
i: integer;
item: TListItem;
watch: TWatch;
begin
list.Items.Clear;
for i := 0 to watches.Count - 1 do begin
watch := watches.Items[i] as TWatch;
// Add the breakpoint info to the list
item := list.Items.Add;
item.Data := watch;
// item.Checked := watch.enabled;
item.Caption := watch.expression;
item.SubItems.Add(watch.Evaluate);
end;
end;
//////////////////////////////////////////////////////////////////////
class function TdbgWatchList.OCaption: string;
begin
Result := 'Watches';
end;
//////////////////////////////////////////////////////////////////////
// Context Menu //////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.contextMenuPopup(Sender: TObject);
var
itemSelected: boolean;
begin
itemSelected := list.Selected <> nil;
mEnabled.visible := itemSelected;
mEditWatch.visible := itemSelected;
N1.visible := itemSelected;
mDeleteWatch.visible := itemSelected;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.ToggleEnabled(Sender: TObject);
begin
if list.Selected <> nil then begin
TWatch(list.Selected.data).enabled := not TWatch(list.Selected.data).enabled;
UpdateObservers;
end;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.EditWatch(Sender: TObject);
var
watchProperties: TdbgWatchProperties;
begin
if list.Selected <> nil then begin
Application.CreateForm(TdbgWatchProperties, watchProperties);
watchProperties.watch := TWatch(list.Selected.data);
watchProperties.Show;
UpdateObservers;
end;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.AddAWatch(Sender: TObject);
var
watchProperties: TdbgWatchProperties;
begin
Application.CreateForm(TdbgWatchProperties, watchProperties);
watchProperties.watch := TWatch.Create;
AddWatch(watchProperties.watch);
watchProperties.Show;
UpdateObservers;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.DeleteAWatch(Sender: TObject);
begin
if list.Selected <> nil then begin
RemoveWatch(TWatch(list.Selected.data));
list.Items.Delete(list.Items.IndexOf(list.Selected));
UpdateObservers;
end;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.EnableAllWatches(Sender: TObject);
var
i: integer;
begin
for i := 0 to watches.Count - 1 do
TWatch(watches.items[i]).enabled := true;
UpdateObservers;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.DisableAllWatches(Sender: TObject);
var
i: integer;
begin
for i := 0 to watches.Count - 1 do
TWatch(watches.items[i]).enabled := false;
UpdateObservers;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.DeleteAllWatches(Sender: TObject);
begin
ClearWatches;
UpdateObservers;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.FormCreate(Sender: TObject);
begin
HelpContext := LinkHelp('watches.html');
list.DoubleBuffered := true;
end;
//////////////////////////////////////////////////////////////////////
procedure TdbgWatchList.listAdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
begin
DefaultDraw := true;
if TWatch(item.Data).enabled then
list.Font.Color := clBtnText
else
list.Font.Color := clGrayText;
end;
//////////////////////////////////////////////////////////////////////
initialization
RegisterViewer(TdbgWatchList);
end.
//////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -