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

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

?? otautils.pas

?? delphi代碼格式化,最新漢化版
?? PAS
字號:
unit OTAUtils;


interface


uses ToolsAPI, Classes, SysUtils;

type
  TUnitInfo = class(TObject)
  private
    FFormName: string;
    FUnitName: string;
    FFileName: string;
  public
    property UnitName: string read FUnitName write FUnitName;
    property FormName: string read FFormName write FFormName;
    property FileName: string read FFileName write FFileName;
  end;


function OtaGetCurrentModule: IOTAModule;
function OtaGetCurrentProjectName: string;
function OtaGetCurrentProject: IOTAProject;
function OtaGetProjectGroup: IOTAProjectGroup;
function OtaGetActiveEditorTextAsString(var Text: string; UseSelection: Boolean): Boolean;
function OtaGetActiveEditorText(Stream: TStream; UseSelection: Boolean): Boolean;
function OtaGetSourceEditorFromModule(Module: IOTAModule; const FileName: string = ''): IOTASourceEditor;
function OtaGetFileEditorForModule(Module: IOTAModule; Index: Integer): IOTAEditor;
function OtaGetTopMostEditView(SourceEditor: IOTASourceEditor): IOTAEditView;
function OtaGetCurrentSourceEditor: IOTASourceEditor;
procedure OtaSaveReaderToStream(EditReader: IOTAEditReader; Stream: TStream);
procedure OtaInsertTextIntoEditorAtPos(const Text: string; Position: Longint;
  SourceEditor: IOTASourceEditor);
function OtaGetEditWriterForSourceEditor(SourceEditor: IOTASourceEditor = nil): IOTAEditWriter;
procedure OtaAssertSourceEditorNotReadOnly(SourceEditor: IOTASourceEditor);
function OtaGetTopMostEditBuffer: IOTAEditBuffer;
procedure OtaFillUnitInfoListForCurrentProject(const List: TList);
procedure ClearUnitInfoList(const List: TList);
function OtaOpenFile(const FileName: string): Boolean;
function OtaIsFileOpen(const AFileName: string): Boolean;
function OtaGetCurrentSourceFile: string;
procedure OtaDeleteTextFromPos(StartPos, Count: Longint; SourceEditor: IOTASourceEditor = nil);
procedure OtaSettringAsActiveEditorText(Text: string);
procedure OtaInsertTextIntoEditor(const Text: string);

implementation

procedure ClearUnitInfoList(const List: TList);
var
  i: Integer;
begin
  if Assigned(List) then
    begin
      for i := 0 to List.Count - 1 do
        TObject(List[i]).Free;
      List.Clear;
    end;
end;

function OtaGetCurrentSourceFile: string;
var
  Module: IOTAModule;
  Editor: IOTAEditor;
begin
  Result := '';
  Module := OtaGetCurrentModule;
  if Module <> nil then
    begin
      Editor := Module.GetCurrentEditor;
      if Editor <> nil then
        Result := Editor.FileName
      else // C++Builder 6 returns nil for some old-style modules without DFMs
        Result := Module.FileName;
    end;
end;

function OtaIsFileOpen(const AFileName: string): Boolean;
var
  ModuleServices: IOTAModuleServices;
  Module: IOTAModule;
  FileEditor: IOTAEditor;
  i: Integer;
  FileName: string;
begin
  Result := False;

  ModuleServices := BorlandIDEServices as IOTAModuleServices;
  Assert(Assigned(ModuleServices));
  FileName := AFileName;

  Module := ModuleServices.FindModule(FileName);
  if Assigned(Module) then
    begin
      for i := 0 to Module.GetModuleFileCount - 1 do
        begin
          FileEditor := OtaGetFileEditorForModule(Module, i);
          Assert(Assigned(FileEditor));

          Result := SameFileName(FileName, FileEditor.FileName);
          if Result then
            Exit;
        end;
    end;
end;

function OtaOpenFile(const FileName: string): Boolean;
var
  ActionServices: IOTAActionServices;
begin
  ActionServices := BorlandIDEServices as IOTAActionServices;
  Assert(Assigned(ActionServices));

  Result := ActionServices.OpenFile(FileName);
end;

procedure OtaFillUnitInfoListForCurrentProject(const List: TList);
var
  i: Integer;
  CurrentProject: IOTAProject;
  ModuleInfo: IOTAModuleInfo;
  UnitInfo: TUnitInfo;
begin
  Assert(Assigned(List));
  ClearUnitInfoList(List);

  CurrentProject := OtaGetCurrentProject;
  if not Assigned(CurrentProject) then
    Exit;

  for i := 0 to CurrentProject.GetModuleCount - 1 do
    begin
      ModuleInfo := CurrentProject.GetModule(i);
      Assert(Assigned(ModuleInfo));

      if ModuleInfo.FileName <> '' then
        begin
          UnitInfo := TUnitInfo.Create;
          List.Add(UnitInfo);

          UnitInfo.FileName := ModuleInfo.FileName;
          UnitInfo.FormName := ModuleInfo.FormName;
          UnitInfo.UnitName := ModuleInfo.Name;
        end;
    end;
end;

procedure OtaAssertSourceEditorNotReadOnly(SourceEditor: IOTASourceEditor);
begin
  Assert(Assigned(SourceEditor));
  if Supports(SourceEditor, IOTAEditBuffer) then
    if (SourceEditor as IOTAEditBuffer).IsReadOnly then
      raise Exception.CreateFmt('%s is read only', [ExtractFileName(SourceEditor.FileName)]);
end;

procedure OtaInsertTextIntoEditor(const Text: string);
var
  EditView: IOTAEditView;
  Position: Longint;
  CharPos: TOTACharPos;
  EditPos: TOTAEditPos;
begin
  EditView := OtaGetTopMostEditView(OtaGetCurrentSourceEditor);
  Assert(Assigned(EditView), 'No edit view found');
  EditPos := EditView.CursorPos;
  EditView.ConvertPos(True, EditPos, CharPos);
  Position := EditView.CharPosToPos(CharPos);
  OtaInsertTextIntoEditorAtPos(Text, Position, OtaGetCurrentSourceEditor);
  EditView.MoveViewToCursor;
  EditView.Paint;
end;

function OtaGetEditWriterForSourceEditor(SourceEditor: IOTASourceEditor = nil): IOTAEditWriter;
resourcestring
  SEditWriterNotAvail = 'Edit writer not available';
begin
  if not Assigned(SourceEditor) then
    SourceEditor := OtaGetCurrentSourceEditor;
  if Assigned(SourceEditor) then
    begin
      OtaAssertSourceEditorNotReadOnly(SourceEditor);
      Result := SourceEditor.CreateUndoableWriter;
    end;
  Assert(Assigned(Result), SEditWriterNotAvail);
end;

procedure OtaSettringAsActiveEditorText(Text: string);
var
  EditView: IOTAEditView;
  CharPos: TOTACharPos;
  EditPos: TOTAEditPos;
begin
  EditView := OtaGetTopMostEditView(OtaGetCurrentSourceEditor);
  Assert(Assigned(EditView), 'No edit view found');
  EditPos := EditView.CursorPos;
  EditView.ConvertPos(True, EditPos, CharPos);
  OtaDeleteTextFromPos(0, MaxInt, OtaGetCurrentSourceEditor);
  OtaInsertTextIntoEditorAtPos(Text, 0, OtaGetCurrentSourceEditor);
  EditView.CursorPos := EditPos;
  EditView.MoveViewToCursor;
  EditView.Paint;
end;

procedure OtaDeleteTextFromPos(StartPos, Count: Longint; SourceEditor: IOTASourceEditor = nil);
var
  EditWriter: IOTAEditWriter;
begin
  EditWriter := OtaGetEditWriterForSourceEditor(SourceEditor);
  EditWriter.CopyTo(StartPos);
  EditWriter.DeleteTo(StartPos + Count);
end;

procedure OtaInsertTextIntoEditorAtPos(const Text: string; Position: Longint;
  SourceEditor: IOTASourceEditor);
var
  EditWriter: IOTAEditWriter;
begin
  if Text = '' then
    Exit;
  EditWriter := OtaGetEditWriterForSourceEditor(SourceEditor);
  EditWriter.CopyTo(Position);
  EditWriter.Insert(PChar(Text));
end;

procedure OtaSaveReaderToStream(EditReader: IOTAEditReader; Stream: TStream);
const
  // Leave typed constant as is - needed for streaming code.
  TerminatingNulChar: Char = #0;
  BufferSize = 1024 * 24;
var
  Buffer: PChar;
  EditReaderPos: Integer;
  ReadDataSize: Integer;
begin
  Assert(EditReader <> nil);
  Assert(Stream <> nil);

  GetMem(Buffer, BufferSize);
  try
    EditReaderPos := 0;
    ReadDataSize := EditReader.GetText(EditReaderPos, Buffer, BufferSize);
    Inc(EditReaderPos, ReadDataSize);
    while ReadDataSize = BufferSize do
      begin
        Stream.Write(Buffer^, ReadDataSize);
        ReadDataSize := EditReader.GetText(EditReaderPos, Buffer, BufferSize);
        Inc(EditReaderPos, ReadDataSize);
      end;
    Stream.Write(Buffer^, ReadDataSize);
    Stream.Write(TerminatingNulChar, SizeOf(TerminatingNulChar));
  finally
    FreeMem(Buffer);
  end;
end;

function OtaGetTopMostEditView(SourceEditor: IOTASourceEditor): IOTAEditView;
begin
  if SourceEditor = nil then
    SourceEditor := OtaGetCurrentSourceEditor;
  if Assigned(SourceEditor) and (SourceEditor.EditViewCount > 0) then
    Result := SourceEditor.EditViews[0]
  else
    Result := nil;
end;

function OtaGetFileEditorForModule(Module: IOTAModule; Index: Integer): IOTAEditor;
begin
  Assert(Assigned(Module));
  Result := Module.GetModuleFileEditor(Index);
end;

function OtaGetSourceEditorFromModule(Module: IOTAModule; const FileName: string = ''): IOTASourceEditor;
var
  i: Integer;
  IEditor: IOTAEditor;
  ISourceEditor: IOTASourceEditor;
begin
  Result := nil;
  if not Assigned(Module) then
    Exit;

  for i := 0 to Module.GetModuleFileCount - 1 do
    begin
      IEditor := OtaGetFileEditorForModule(Module, i);

      if Supports(IEditor, IOTASourceEditor, ISourceEditor) then
        begin
          if Assigned(ISourceEditor) then
            begin
              if (FileName = '') or SameFileName(ISourceEditor.FileName, FileName) then
                begin
                  Result := ISourceEditor;
                  Break;
                end;
            end;
        end;
    end;
end;


function OtaGetTopMostEditBuffer: IOTAEditBuffer;
var
  EditorServices: IOTAEditorServices;
begin
  EditorServices := (BorlandIDEServices as IOTAEditorServices);
  Assert(Assigned(EditorServices));
  Result := EditorServices.TopBuffer;
end;

function OtaGetCurrentSourceEditor: IOTASourceEditor;
var
  EditBuffer: IOTAEditBuffer;
begin
  Result := nil;
  EditBuffer := OtaGetTopMostEditBuffer;
  if Assigned(EditBuffer) and (EditBuffer.FileName <> '') then
    Result := OtaGetSourceEditorFromModule(OtaGetCurrentModule, EditBuffer.FileName);
  if Result = nil then
    Result := OtaGetSourceEditorFromModule(OtaGetCurrentModule);
end;

function OtaGetActiveEditorText(Stream: TStream; UseSelection: Boolean): Boolean;
var
  ISourceEditor: IOTASourceEditor;
  IEditView: IOTAEditView;
  IEditReader: IOTAEditReader;
  BlockSelText: string;
begin
  Assert(Stream <> nil);

  Result := False;

  ISourceEditor := OtaGetCurrentSourceEditor;
  if ISourceEditor = nil then
    Exit;

  if ISourceEditor.EditViewCount > 0 then
    begin
      IEditView := OtaGetTopMostEditView(ISourceEditor);
      Assert(IEditView <> nil);

      if (IEditView.Block.Size > 0) and UseSelection then
        begin
          BlockSelText := IEditView.Block.Text;
          Stream.WriteBuffer(PChar(BlockSelText)^, Length(BlockSelText) + SizeOf(#0));
          Result := True;
        end
      else
        begin
          IEditReader := ISourceEditor.CreateReader;
          OtaSaveReaderToStream(IEditReader, Stream);
          Result := False;
        end;
    end;
end;


function OtaGetActiveEditorTextAsString(var Text: string; UseSelection: Boolean): Boolean;
var
  StringStream: TStringStream;
begin
  StringStream := TStringStream.Create('');
  try
    Result := OtaGetActiveEditorText(StringStream, UseSelection);
    Text := StringStream.DataString;
  finally
    FreeAndNil(StringStream);
  end;
end;

function OtaGetCurrentModule: IOTAModule;
var
  ModuleServices: IOTAModuleServices;
begin
  ModuleServices := BorlandIDEServices as IOTAModuleServices;
  Assert(Assigned(ModuleServices));
  Result := ModuleServices.CurrentModule;
end;

function OtaGetProjectGroup: IOTAProjectGroup;
var
  IModuleServices: IOTAModuleServices;
  IModule: IOTAModule;
  i: Integer;
begin
  Assert(Assigned(BorlandIDEServices));

  IModuleServices := BorlandIDEServices as IOTAModuleServices;
  Assert(Assigned(IModuleServices));

  Result := nil;
  for i := 0 to IModuleServices.ModuleCount - 1 do
    begin
      IModule := IModuleServices.Modules[i];
      if Supports(IModule, IOTAProjectGroup, Result) then
        Break;
    end;
end;

function OtaGetCurrentProject: IOTAProject;
var
  IProjectGroup: IOTAProjectGroup;
  IModuleServices: IOTAModuleServices;
  IModule: IOTAModule;
  i: Integer;
begin
  Result := nil;

  IProjectGroup := OtaGetProjectGroup;
  if not Assigned(IProjectGroup) then
    begin
      Assert(Assigned(BorlandIDEServices));
      IModuleServices := BorlandIDEServices as IOTAModuleServices;
      Assert(Assigned(IModuleServices));

      for i := 0 to IModuleServices.ModuleCount - 1 do
        begin
          IModule := IModuleServices.Modules[i];
          if Supports(IModule, IOTAProject, Result) then
            Break;
        end;
    end;

  try
    // This raises exceptions in D5 with .bat projects active
    if Assigned(IProjectGroup) and (not Assigned(Result)) then
      Result := IProjectGroup.ActiveProject;
  except
    Result := nil;
  end;
end;

function OtaGetCurrentProjectName: string;
var
  IProject: IOTAProject;
begin
  Result := '';
  IProject := OtaGetCurrentProject;
  if Assigned(IProject) then
    begin
      Result := ExtractFileName(IProject.FileName);
      Result := ChangeFileExt(Result, '');
    end;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕 久热精品 视频在线 | 亚洲欧美自拍偷拍色图| 精品一区二区三区视频| 精品日韩在线一区| 国产酒店精品激情| 亚洲三级电影网站| 欧美精品在线观看一区二区| 国产伦精品一区二区三区在线观看| 国产精品视频yy9299一区| 欧美日韩一区二区三区四区五区| 日韩电影免费一区| 国产亚洲一本大道中文在线| 在线观看不卡一区| 蜜臀久久99精品久久久画质超高清| 国产精品天天摸av网| 亚洲品质自拍视频| 久久久欧美精品sm网站| 欧美日本一区二区三区四区| 波波电影院一区二区三区| 偷拍一区二区三区四区| 亚洲欧美在线aaa| 亚洲综合一二三区| 久久精品一区蜜桃臀影院| 久久蜜桃av一区二区天堂 | 亚洲国产成人高清精品| 中文字幕高清一区| 一区二区三区蜜桃| 亚洲欧美日韩在线| 国产精品视频在线看| 亚洲一区二区在线免费看| 一区二区三区四区在线免费观看| 亚洲最色的网站| 日韩精品一二三| 中文文精品字幕一区二区| 亚洲视频在线观看三级| 免费亚洲电影在线| 日日夜夜免费精品视频| 国产乱妇无码大片在线观看| 色一情一伦一子一伦一区| 高清不卡一二三区| 精品午夜久久福利影院| 色综合久久88色综合天天 | 日韩精品亚洲一区| 国产成人av一区二区三区在线| 日产国产欧美视频一区精品| 成人污污视频在线观看| 九九视频精品免费| 在线亚洲精品福利网址导航| 国产区在线观看成人精品| 国产亚洲制服色| 免费视频最近日韩| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 日韩一区二区三区四区| 欧美不卡123| 亚洲午夜视频在线| 91香蕉视频污在线| 在线观看视频一区| 中文av一区二区| 国产一区久久久| 欧美精品日日鲁夜夜添| 亚洲黄色小视频| 日韩中文欧美在线| 色菇凉天天综合网| 欧美群妇大交群的观看方式| 亚洲免费资源在线播放| 成人动漫视频在线| 欧美日本在线一区| 亚洲一区二区在线播放相泽 | 欧美日韩一区高清| 亚洲福利国产精品| 欧美性生活大片视频| 日韩女优制服丝袜电影| 国产亚洲欧美中文| 国产精品一区二区在线播放 | 亚洲1区2区3区4区| 91精品福利在线一区二区三区| 国产综合成人久久大片91| 成人av影视在线观看| 国产视频视频一区| 粉嫩一区二区三区性色av| 国产偷v国产偷v亚洲高清| 国产一区二区精品久久91| 久久精品视频免费| 成人网在线播放| 国产精品麻豆视频| 色综合天天视频在线观看| 亚洲精品成人精品456| 色悠久久久久综合欧美99| 亚洲精品视频一区| 在线不卡的av| 精品在线你懂的| 中文字幕国产一区| 在线观看成人免费视频| 日本欧美加勒比视频| 欧美xxxxx牲另类人与| 国产99久久久国产精品免费看 | 免费精品视频最新在线| 欧美成人国产一区二区| 国产成人在线影院| 一区二区三区在线观看国产| 3d动漫精品啪啪1区2区免费| **性色生活片久久毛片| 欧美三级午夜理伦三级中视频| 日韩高清欧美激情| 国产精品水嫩水嫩| 717成人午夜免费福利电影| 国产精品自拍毛片| 亚洲资源在线观看| 久久久久久久一区| 欧美亚洲国产一区二区三区va| 麻豆91在线观看| 亚洲欧洲日韩一区二区三区| 欧美久久久久久久久久| 国产成人免费av在线| 亚洲高清视频中文字幕| 国产精品色婷婷久久58| 91麻豆精品国产无毒不卡在线观看 | 93久久精品日日躁夜夜躁欧美| 国产亚洲综合在线| 欧美日韩成人综合天天影院| 国产精品 日产精品 欧美精品| 亚洲国产成人精品视频| 自拍偷自拍亚洲精品播放| 日韩一区二区三区四区五区六区 | 国内精品第一页| 亚洲无线码一区二区三区| 欧美激情资源网| 精品区一区二区| 欧美剧情电影在线观看完整版免费励志电影| 国产精品资源网| 久久精品国产精品青草| 欧美精品一区二区三区蜜桃视频 | 粉嫩av一区二区三区| 青青青爽久久午夜综合久久午夜| 亚洲欧洲综合另类| 国产精品国产自产拍在线| 色婷婷激情一区二区三区| 国产精品一区二区在线播放| 麻豆一区二区三| 日韩中文字幕区一区有砖一区 | 久久综合丝袜日本网| 成人在线一区二区三区| 久久69国产一区二区蜜臀| 青青草国产精品97视觉盛宴| 亚洲bt欧美bt精品777| 亚洲精品美腿丝袜| 最新不卡av在线| 国产精品美女久久久久久久久| 26uuu国产电影一区二区| 日韩一卡二卡三卡四卡| 91精品国产综合久久精品性色| 欧美三电影在线| 欧美男人的天堂一二区| 欧美日韩综合色| 欧美美女直播网站| 欧美剧在线免费观看网站| 日韩一区二区三免费高清| 日韩一区二区三区免费观看| 26uuu亚洲| 国产精品日韩成人| 亚洲日本va在线观看| 亚洲麻豆国产自偷在线| 亚洲大尺度视频在线观看| 婷婷综合在线观看| 美女视频网站久久| 韩国理伦片一区二区三区在线播放| 蜜芽一区二区三区| 国产精品一区二区视频| 99久久99久久精品免费看蜜桃| 色哟哟在线观看一区二区三区| 在线亚洲+欧美+日本专区| 69av一区二区三区| 精品国产一区二区精华| 中文字幕巨乱亚洲| 亚洲小说欧美激情另类| 麻豆久久久久久| 国产不卡视频一区二区三区| 一本大道av一区二区在线播放| 欧美日韩一区高清| 国产色一区二区| 一区二区三区视频在线观看| 久久精品99久久久| 成人激情免费网站| 欧美日韩精品三区| 久久精品亚洲国产奇米99| 亚洲激情网站免费观看| 蜜臀av一区二区在线免费观看| 国产成人精品影视| 欧美日韩国产高清一区二区| 久久亚洲二区三区| 亚洲国产中文字幕在线视频综合| 韩国av一区二区三区在线观看| 色综合久久综合| xnxx国产精品| 日韩高清一级片| 91久久国产最好的精华液| 久久综合一区二区| 午夜精品福利一区二区三区av| 国产99久久久久| 日韩色视频在线观看|