亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? symdictcontextform.pas

?? script language
?? PAS
字號:
{**********************************************************************}
{                                                                      }
{    This file is a demo for using the SymbolDictionary, ContextMap,   }
{    and SourceList features of a DWS program.                         }
{                                                                      }
{    The demo makes use of the SynEdit editor.                         }
{    It can be found here (http://synedit.sourceforge.net)             }
{                                                                      }
{    The Initial Developer of the Original Code is Mark Ericksen.      }
{**********************************************************************}

{$I dws2.inc}

unit SymDictContextForm;

interface

uses
  Windows, Messages, SysUtils,
{$IFDEF NEWVARIANTS}
  Variants,
{$ENDIF}
  Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls,
  SynEditHighlighter, SynHighlighterPas, SynEdit,
  dws2Comp, dws2Exprs, dws2Errors;

type
  TfmDictContxt = class(TForm)
    DelphiWebScriptII1: TDelphiWebScriptII;
    Editor: TSynEdit;
    SynPasSyn1: TSynPasSyn;
    sbStatus: TStatusBar;
    Splitter1: TSplitter;
    pFooter: TPanel;
    pDictionary: TPanel;
    lbSymNames: TListBox;
    Splitter2: TSplitter;
    Panel1: TPanel;
    lbSymPositions: TListBox;
    mMessages: TMemo;
    Splitter3: TSplitter;
    pContext: TPanel;
    pContextHdr: TPanel;
    tvContextMap: TTreeView;
    grpListControl: TGroupBox;
    chkAutoUpdate: TCheckBox;
    btnForceUpdate: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure EditorChange(Sender: TObject);
    procedure EditorStatusChange(Sender: TObject; Changes: TSynStatusChanges);
    procedure btnForceUpdateClick(Sender: TObject);
    procedure lbSymNamesClick(Sender: TObject);
    procedure lbSymPositionsClick(Sender: TObject);
    procedure tvContextMapClick(Sender: TObject);
  private
    FProgram: TProgram;      // need to have a compiled script for browsing SymbolDictionary
    FScriptChanged: Boolean; // flag it as dirty
    function GetScriptName(ScriptPos: TScriptPos): string;
    procedure ValidateInMain(ScriptPos: TScriptPos);  // Aborts if not in Main script
  public
    procedure BuildLists;
    procedure BuildDictionaryList;
    procedure BuildContextList;
    procedure CompileScriptIfNeeded;
  end;

var
  fmDictContxt: TfmDictContxt;

implementation

{$R *.dfm}

uses dws2Compiler, dws2Symbols;

procedure TfmDictContxt.FormCreate(Sender: TObject);
begin
  FScriptChanged := True;
  { These two compiler options MUST be on for the demo to work. }
  DelphiWebScriptII1.Config.CompilerOptions := [coSymbolDictionary, coContextMap];
end;

procedure TfmDictContxt.EditorStatusChange(Sender: TObject; Changes: TSynStatusChanges);
var
  Context: TContext;
begin
  sbStatus.SimpleText := Format('%d : %d', [Editor.CaretY, Editor.CaretX]);
  { Select the context that corresponds to current position }

  if Assigned(FProgram) then
  begin
    // only look for contexts within the main source
    Context := FProgram.ContextMap.FindContext(Editor.CaretX, Editor.CaretY,
                                               FProgram.SourceList.MainScript.SourceFile);
    if Assigned(Context) then
      tvContextMap.Selected := TTreeNode(Context.Data)   // stuffed pointer to node in 'Data' property
    else
      tvContextMap.Selected := nil;
  end;
end;

procedure TfmDictContxt.btnForceUpdateClick(Sender: TObject);
begin
  BuildLists;
end;

procedure TfmDictContxt.lbSymNamesClick(Sender: TObject);
var
  i: Integer;
  SymList: TSymbolPositionList;
  Sym: TSymbolPosition;
  TypeDisplay: string;
  Usages: TStringList;
begin
  { User selected a symbol. Show list of positions in script. }
  lbSymPositions.Items.Clear;

  Usages := TStringList.Create;
  try
    if lbSymNames.ItemIndex > -1 then begin
      SymList := TSymbolPositionList(lbSymNames.Items.Objects[lbSymNames.ItemIndex]);
      if Assigned(SymList) then
        for i := 0 to SymList.Count - 1 do begin
          Sym := SymList[i];
          Usages.Clear;
          if suForward in Sym.SymbolUsages then
            Usages.Add('Forward');
          if suDeclaration in Sym.SymbolUsages then
            Usages.Add('Declared');
          if suImplementation in Sym.SymbolUsages then
            Usages.Add('Implemented');
          if suReference in Sym.SymbolUsages then
            Usages.Add('Referenced');

          TypeDisplay := '';
          if Usages.Count > 0 then
            TypeDisplay := '('+Usages.CommaText+')';

          lbSymPositions.Items.AddObject(Format('Line %d : Col %d %s - [%s]',
                                                [Sym.ScriptPos.Line,
                                                 Sym.ScriptPos.Col,
                                                 TypeDisplay,
                                                 GetScriptName(Sym.ScriptPos)]),
                                         Sym);   // add pointer to symbol position
        end;
    end;
  finally
    Usages.Free;
  end;
end;

procedure TfmDictContxt.CompileScriptIfNeeded;
var
  i: Integer;
begin
  // if script hasn't been changed, leave it.
  if not FScriptChanged then EXIT;

  // if changed, rebuild
  if Assigned(FProgram) then
    FreeAndNil(FProgram);

  FProgram := DelphiWebScriptII1.Compile(Editor.Lines.Text);
  FScriptChanged := False;

  { Write out compiler messages }
  mMessages.Lines.Clear;
  for i := 0 to FProgram.Msgs.Count - 1 do
    mMessages.Lines.Add(FProgram.Msgs[i].AsInfo);
  if mMessages.Lines.Count = 0 then
    mMessages.Lines.Add('**Compiled**');
end;

procedure TfmDictContxt.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FProgram);  // Make sure to free it
end;

procedure TfmDictContxt.EditorChange(Sender: TObject);
begin
  FScriptChanged := True;
  if chkAutoUpdate.Checked then
    BuildLists;
end;

procedure TfmDictContxt.lbSymPositionsClick(Sender: TObject);
var
  SymPos: TSymbolPosition;
begin
  { On double-click of a Symbol position, put cursor at the script postion }
  if lbSymPositions.ItemIndex > -1 then
  begin
    // get object in the list
    SymPos := TSymbolPosition(lbSymPositions.Items.Objects[lbSymPositions.ItemIndex]);
    if Assigned(SymPos) then
    begin
      // validate position is in the main script
      ValidateInMain(SymPos.ScriptPos);

      // place cursor at the symbol's position
      Editor.CaretX := SymPos.ScriptPos.Col;
      Editor.CaretY := SymPos.ScriptPos.Line;
      ActiveControl := Editor;
    end;
  end;
end;

procedure TfmDictContxt.tvContextMapClick(Sender: TObject);
var
  Context: TContext;
  StartPoint, EndPoint: TPoint;
begin
  { When context is double-clicked, select the context block in the editor }
  if tvContextMap.Selected <> nil then
    if Assigned(tvContextMap.Selected.Data) then
    begin
      Context := TContext(tvContextMap.Selected.Data);

      // Validate that the script position is in the main script
      ValidateInMain(Context.StartPos);

      // find start of selection
      StartPoint.X := Context.StartPos.Col;
      StartPoint.Y := Context.StartPos.Line;
      // find end of selection
      EndPoint.X   := Context.EndPos.Col;
      EndPoint.Y   := Context.EndPos.Line;

      // put the cursor at the beginning of the block
      Editor.CaretX := StartPoint.X;
      Editor.CaretY := StartPoint.Y;

      // Set selection blocks
      Editor.BlockBegin := StartPoint;
      Editor.BlockEnd   := EndPoint;

      ActiveControl := Editor;
    end;
end;

procedure TfmDictContxt.BuildLists;
begin
  CompileScriptIfNeeded;

  BuildDictionaryList;
  BuildContextList;
end;

procedure TfmDictContxt.BuildContextList;

    procedure AddContextToTree(Context: TContext; ParentNode: TTreeNode);
    var
      NewNode: TTreeNode;
      i: Integer;
    begin
      { Add that context }
      NewNode := tvContextMap.Items.AddChildObject(ParentNode,
                                                   Format('Start %d:%d; End %d:%d [%s]',
                                                          [Context.StartPos.Line,
                                                           Context.StartPos.Col,
                                                           Context.EndPos.Line,
                                                           Context.EndPos.Col,
                                                           GetScriptName(Context.StartPos)]),
                                                   Context);
      Context.Data := NewNode;   // have context link to node for easy dereference later
      { Cycle for any sub-contexts }
      for i := 0 to Context.SubContexts.Count - 1 do
        { Recusively call to add them - added as children of tree node}
        AddContextToTree(TContext(Context.SubContexts[i]), NewNode);
    end;

var
  i: Integer;
  Context: TContext;
begin
  tvContextMap.Items.Clear;

  { Call for a compile. Will create Program. }
  CompileScriptIfNeeded;

  { Add all context map entries to the tree view }
  for i := 0 to FProgram.ContextMap.Contexts.Count - 1 do
  begin
    { Add top level contexts. They will recusively add any sub-contexts. }
    Context := TContext(FProgram.ContextMap.Contexts.Items[i]);
    AddContextToTree(Context, nil);
  end;
  tvContextMap.FullExpand;
end;

procedure TfmDictContxt.BuildDictionaryList;
var
  i: Integer;
  SymList: TSymbolPositionList;
begin
  lbSymNames.Clear;
  lbSymPositions.Items.Clear;

  { Call for a compile. Will create Program. }
  CompileScriptIfNeeded;

  for i := 0 to FProgram.SymbolDictionary.Count - 1 do begin
    SymList := FProgram.SymbolDictionary[i];
    lbSymNames.Items.AddObject(Format('%s = %s', [SymList.Symbol.Name,
                                                  SymList.Symbol.ClassName]),
                               SymList);
  end;
  lbSymNames.ItemIndex := 0;   // set to the first one
  lbSymNamesClick(nil);   // trigger event to select first one and display info
end;

function TfmDictContxt.GetScriptName(ScriptPos: TScriptPos): string;
var
  x: Integer;
begin
  // find index of script file
  x := FProgram.SourceList.IndexOf(ScriptPos);
  if (x > -1) then
  begin
    Result := FProgram.SourceList[x].NameReference;
    if Result = '' then
      Result := '(main module)';
  end
  else
    Result := '(unknown)';
end;

procedure TfmDictContxt.ValidateInMain(ScriptPos: TScriptPos);
begin
  // if position is not in the main script, show message and raise an Abort
  if FProgram.SourceList.MainScript <> FProgram.SourceList.FindScriptSourceItem(ScriptPos) then
  begin
    MessageDlg('The specified position is in a different script file.', mtInformation, [mbOK], 0);
    Abort;
  end
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91国偷自产一区二区使用方法| 欧美日韩一区二区三区四区 | 亚洲综合一区二区三区| 午夜精品成人在线视频| 福利电影一区二区| 欧美二区乱c少妇| 中文字幕在线观看不卡| 极品少妇xxxx偷拍精品少妇| 日本国产一区二区| 日本一区二区三区电影| 老司机免费视频一区二区| 波多野结衣中文一区| 欧美变态tickle挠乳网站| 一区二区三区在线影院| 成人综合婷婷国产精品久久蜜臀| 欧美一区二区三区在线观看| 亚洲欧美国产三级| www.色精品| 欧美国产日韩在线观看| 蜜桃av一区二区| 欧美三级日韩三级| 亚洲乱码精品一二三四区日韩在线 | av一区二区三区四区| 久久精品综合网| 久久国产综合精品| 欧美一区二区播放| 丝袜美腿亚洲综合| 91福利在线导航| 日韩伦理av电影| 成人av手机在线观看| 国产亚洲一区二区在线观看| 日韩电影在线免费观看| 欧美久久久久中文字幕| 无吗不卡中文字幕| 欧美体内she精高潮| 亚洲午夜久久久| 精品视频在线看| 亚洲成av人片在线| 欧美高清视频www夜色资源网| 亚洲亚洲人成综合网络| 一本大道久久a久久综合婷婷 | 国产成人亚洲综合a∨婷婷| 日韩码欧中文字| 26uuu国产电影一区二区| 亚洲欧美日韩电影| 一本大道av伊人久久综合| 亚洲精品日日夜夜| 精品女同一区二区| 国产激情视频一区二区在线观看| 26uuu精品一区二区三区四区在线| 美女国产一区二区三区| 精品国产凹凸成av人导航| 国产美女精品一区二区三区| 久久久精品免费免费| 菠萝蜜视频在线观看一区| 一区二区欧美在线观看| 欧美三级欧美一级| 久久99国产精品免费| 国产性色一区二区| 在线观看视频一区二区欧美日韩| 亚洲一二三专区| 欧美成人欧美edvon| 成人一区在线观看| 亚洲香肠在线观看| 欧美精品一区二区蜜臀亚洲| 成人app下载| 午夜精品aaa| 中文字幕欧美激情| 91电影在线观看| 美女视频免费一区| 国产精品美女久久久久久久| 欧美午夜一区二区三区| 国内精品免费在线观看| 亚洲婷婷国产精品电影人久久| 欧美日韩精品欧美日韩精品 | 国产精品久久久久桃色tv| 欧美三级日本三级少妇99| 久久国产乱子精品免费女| 亚洲天堂精品视频| 日韩欧美国产精品一区| 91蜜桃免费观看视频| 久久av中文字幕片| 亚洲最大色网站| 久久婷婷综合激情| 在线成人高清不卡| jvid福利写真一区二区三区| 日韩av网站在线观看| 亚洲欧洲日韩av| 久久亚洲一区二区三区四区| 欧美专区亚洲专区| 99r精品视频| 国产一区二区导航在线播放| 亚洲欧美国产高清| 亚洲电影一区二区| 亚洲色图第一区| 久久久精品天堂| 日韩午夜av电影| 欧美日韩一级片网站| 成人av网站在线观看| 国产一区二区精品在线观看| 日韩成人免费看| 亚洲国产日韩a在线播放| 国产精品久99| 欧美国产丝袜视频| 久久精品视频免费| 日韩精品一区二区三区老鸭窝| 欧美日韩日日夜夜| 欧美三级日韩三级| 在线免费精品视频| 一本大道av一区二区在线播放| 成人禁用看黄a在线| 国产精品一卡二| 韩国欧美一区二区| 激情六月婷婷综合| 久久99热这里只有精品| 麻豆成人在线观看| 久久精品国产亚洲高清剧情介绍| 亚洲v日本v欧美v久久精品| 一区二区三区精品视频| 亚洲精品视频在线看| 亚洲欧美偷拍卡通变态| 亚洲精品国产a| 一区二区三区日韩欧美| 亚洲美女屁股眼交3| 一区二区三区免费观看| 亚洲尤物视频在线| 亚洲一区二区三区视频在线| 玉足女爽爽91| 亚洲国产乱码最新视频| 午夜不卡av免费| 男人的j进女人的j一区| 久久99精品久久久久久久久久久久| 麻豆91精品视频| 国产一区视频网站| 高清久久久久久| 日本道色综合久久| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲成人免费观看| 青草国产精品久久久久久| 久久av资源站| 99精品偷自拍| 欧美日韩在线播放一区| 日韩欧美自拍偷拍| 国产精品乱码妇女bbbb| 亚洲高清中文字幕| 国产原创一区二区| 色综合久久中文字幕| 91精品国产色综合久久不卡蜜臀 | 国产欧美一区二区精品秋霞影院| 日本一区二区成人| 亚洲精品久久久蜜桃| 蜜桃一区二区三区在线| 成人一区二区三区中文字幕| 欧美在线观看你懂的| 久久影院午夜片一区| 综合婷婷亚洲小说| 日韩中文字幕不卡| 成人午夜av在线| 3atv一区二区三区| 国产精品国模大尺度视频| 天天色天天爱天天射综合| 国产成人精品综合在线观看 | 在线视频中文字幕一区二区| 欧美视频在线播放| 337p日本欧洲亚洲大胆精品| 专区另类欧美日韩| 韩国欧美国产一区| 欧美日韩高清一区| 日本一区二区三区视频视频| 日韩精品每日更新| 色综合天天综合网国产成人综合天 | 精品国产污污免费网站入口| 亚洲精品写真福利| 国产成人在线免费| 日韩视频一区二区三区在线播放 | 99久久精品99国产精品| 欧美va天堂va视频va在线| 亚洲影院免费观看| 97久久精品人人爽人人爽蜜臀| 日韩精品中文字幕一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 国产又黄又大久久| 欧美一级理论性理论a| 一区二区欧美精品| 91丝袜美女网| 国产精品午夜在线| 国产精品69久久久久水密桃| 4438x成人网最大色成网站| 亚洲一线二线三线视频| 99国产一区二区三精品乱码| 久久久www免费人成精品| 日本女优在线视频一区二区| 欧美影视一区在线| 亚洲欧美成aⅴ人在线观看| 成人91在线观看| 国产精品视频九色porn| 国产九色sp调教91| 久久久国产综合精品女国产盗摄| 久久精品国产99国产精品| 欧美日本国产视频|