⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dmain.pas

📁 Delphi编写的一个支持语法高亮显示和很多语言的文本编辑器
💻 PAS
📖 第 1 页 / 共 5 页
字号:
          ConvLineBreak(s, tDoc.fLineBreak);
          StringToFile(Filename, s);
        end
        else
          TDoc.sciMain.Lines.SaveToFile(FileName);
        TDoc.sciMain.Modified := False;
      end
      else begin
        TDoc.hxMain.SaveToFile(FileName);
        TDoc.hxMain.Modified := False;
      end;
      TDoc.FileName := Filename;
      TDoc.Caption := Filename;
      tdoc.sciMain.Highlighter := GetHighlighterforFile(Filename);
      if tDoc.sciMain.Highlighter = nil then
        tdoc.cmbLang.ItemIndex := 0
      else
        if tDoc.sciMain.Highlighter is TSynMultiSyn then
          tDoc.cmbLang.ItemIndex := tDoc.cmbLang.Items.IndexOf((tDoc.sciMain.Highlighter as TSynMultiSyn).DefaultLanguageName)
        else
          tDoc.cmbLang.ItemIndex := tDoc.cmbLang.Items.IndexOf(GetLangName(tDoc.sciMain.Highlighter));

      TDoc.isFTP := false;
      TDoc.DoUpdateCaption;
      idx := frmMain.tcFiles.Tabs.IndexOfObject(TDoc);
      frmMain.tcFiles.Tabs[idx] := ExtractFileName(Filename);
    end
  end;

end;

function TdmMain.GetWeb: TfrmWeb;
begin
  if frmMain.ActiveMDIChild = nil then Result := nil;
  if (frmMain.ActiveMDIChild is TfrmWeb) then
    Result := (frmMain.ActiveMDIChild as TfrmWeb)
  else
    Result := nil;
end;


function TdmMain.GetDoc: TfrmDoc;
begin
  if frmMain.ActiveMDIChild = nil then Result := nil;
  if (frmMain.ActiveMDIChild is TfrmDoc) then
    Result := (frmMain.ActiveMDIChild as TfrmDoc)
  else
    Result := nil;
end;


procedure TdmMain.actFileCloseAllExecute(Sender: TObject);
var
  i: Integer;
begin
  CloseAll;
end;

procedure TdmMain.actFileOpenExecute(Sender: TObject);
var
  i: integer;
begin
  with dlgFileOpen do begin
    Options := [ofHideReadOnly,ofPathMustExist,ofEnableSizing, ofAllowMultiSelect];
    if Execute then
      for i := 0 to Files.Count - 1 do begin

        dmMain.NewDoc(Files[i]);
      end;
  end;
end;

procedure TdmMain.actFilePropertiesExecute(Sender: TObject);
begin
  if SelDoc <> nil then
    SelDoc.ShowPropertiesDialog;
end;

procedure TdmMain.actFileSaveExecute(Sender: TObject);
begin
  if SelDoc <> nil then
    SaveDoc(SelDoc);
end;

procedure TdmMain.actFileSaveAsExecute(Sender: TObject);
begin
  if SelDoc <> nil then
    SaveDocAs(SelDoc);
end;

procedure TdmMain.actFileSaveAllExecute(Sender: TObject);
var
  i: integer;
begin
  for i:= 0 to frmMain.MDIChildCount - 1 do begin
    if (frmMain.MDIChildren[i] is TfrmDoc) then
      SaveDoc(frmMain.MDIChildren[i] as TfrmDoc);
  end;
end;

procedure TdmMain.ClickLink(strURL: String);
var
  fNewWeb: TfrmWeb;
begin
  if SelWeb = nil then begin
    fNewWeb := TfrmWeb.Create(frmMain);
    frmMain.tcFiles.Tabs.InsertObject(frmMain.MDIChildCount-1, 'Webpage', fNewWEb);
    frmMain.tcFiles.TabIndex := frmMain.MDIChildCount-1;
    fNewWeb.Show;
    fNewWeb.www.Navigate(strURL);
    exit;
  end;
  selWeb.www.Navigate(strURL);
end;


procedure TdmMain.actFileShowInBrowserExecute(Sender: TObject);
var
  t: TStringList;
  f,blah: TStringList;
  i,d,l,b: Integer;
  s,g,m,y: String;

begin
  if SelDoc <> nil then begin
    with SelDoc do begin
      blah := TStringList.Create;
      m := t.Text;
      t := TStringList.Create;
      t.Text := sciMain.Text;
      s := t.Text;
      i := pos('<!--', s);
      d := i;
      if i <> 0 then
        s := MidStr(s, i, strLen(PChar(s)) - i);
      b := pos('-->', s);
      l := b;
      if b <> 0 then begin
        g := midStr(s, 0, b);
        b := Pos('#include file="', g);
        if b <> 0 then begin
          s := MidStr(g, b+StrLen(PChar('#include file="')), StrLen(PChar(g))-(b + strLen(PChar('#include file="'))));
//          b := b+StrLen(PChar('#include file"'));
          i := Pos('"', s);
          g := MidStr(s, 0, i-1);
          if FileExists(ExtractFilePath(Filename) + g) then
            f := TStringList.Create;
            f.LoadFromFile(ExtractFilePath(Filename) + g);
            y := MidStr(t.Text, 0, d-1);
            y := y + f.Text;
            y := y + MidStr(t.text, l + StrLen('-->'), StrLen(PChar(t.text)));

            blah.Text := y;
          end;
        end;

      if FileName <> '' then begin
        blah.SaveToFile(ExtractFilePath(Filename) + 'temp01.html');
        ClickLink(ExtractFilePath(Filename) + 'temp01.html');
      end
      else begin
        blah.SaveToFile(ExtractFilePath(Application.ExeName) + 'temp\temp01.html');
        ClickLink(ExtractFilePath(Application.ExeName) + 'temp\temp01.html');
      end;
    end;
  end;
end;



procedure TdmMain.actFileCloseExecute(Sender: TObject);
begin
  if SelDoc <> nil then
    SelDoc.Close;
end;

procedure TdmMain.actFileExportHTMLExecute(Sender: TObject);
var
  msgResponse: Word;
label Start;
begin

  if dmMain.SelDoc = nil then exit;
  With dlgFileSave do begin
    Filter := 'HTML Files (*.html)|*.html|All Files (*.*)|*.*';
Start:
    if Execute then begin
      if FileExists(FileName) then begin
        msgResponse:=MessageDlg('The file '''+Filename+''''+#13+#10+'already exists. Do you wish to overwrite?', mtWarning, [mbYes,mbNo,mbCancel], 0);
        if (msgResponse=mrNo) then
          Goto Start
        else if (msgResponse=mrCancel) then
          exit;
      end;
//.      dmMain.SelDoc.ExportHTML(Filename);
         dmMain.synExportHTML.ExportAsText := True;
         dmMain.synExportHTML.Highlighter := dmMain.SelDoc.sciMain.Highlighter;
         dmMain.synExportHTML.ExportAll(dmMain.SelDoc.sciMain.Lines);
         dmMain.synExportHTML.SavetoFile(FileName);
    end;
  end;
end;

procedure TdmMain.actFileExportRTFExecute(Sender: TObject);
var
  msgResponse: Word;
label Start;
begin

  if dmMain.SelDoc = nil then exit;
  With dlgFileSave do begin
    Filter := 'Richtext Format (*.rtf)|*.rtf|All Files (*.*)|*.*';
Start:
    if Execute then begin
      if FileExists(FileName) then begin
        msgResponse:=MessageDlg('The file '''+Filename+''''+#13+#10+'already exists. Do you wish to overwrite?', mtWarning, [mbYes,mbNo,mbCancel], 0);
        if (msgResponse=mrNo) then
          Goto Start
        else if (msgResponse=mrCancel) then
          exit;
      end;
//.      dmMain.SelDoc.ExportHTML(Filename);
         dmMain.synExportRTF.ExportAsText := True;
         dmMain.synExportRTF.Highlighter := dmMain.SelDoc.sciMain.Highlighter;
         dmMain.synExportRTF.ExportAll(dmMain.SelDoc.sciMain.Lines);
         dmMain.synExportRTF.SaveToFile(Filename);
    end;
  end;
end;

procedure TdmMain.actFileOpenFTPExecute(Sender: TObject);

begin
  With TfrmFTP.Create(self) do begin
    State := 0;
    ShowModal;
  end;
end;

procedure TdmMain.actFileSaveFTPExecute(Sender: TObject);
begin
  if dmMain.SelDoc = nil then exit;
  // Save the file to a temp file.
  dmMain.SelDoc.sciMain.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + 'temp\fileTemp.tmp');
  frmFTP := TfrmFTP.Create(self);
  frmFTP.IsFTP := True;
  frmFTP.State := 1;
  frmFtp.ShowModal;
end;

procedure TdmMain.actFileExitExecute(Sender: TObject);
begin
  frmMain.Close;
end;

procedure TdmMain.actEditUndoExecute(Sender: TObject);
var
   sr : string;
   i,fc,b,s,m,f:integer;
   g: PChar;
   linecnt: Integer;
   uList: TSynEditUndoList;
   iLow, iHigh: Integer;
   uItem: TSynEditUndoItem;
begin
  if selDoc <> nil then
    if selDoc.bHexMode = False then begin
{      if selDoc.sciMain.CanUndo = False then exit;
      dmMain.bDunUpdate := True;
      uList := selDoc.sciMain.UndoList;
      //uItem := uList.PopItem;
      //Ulist.PushItem(uItem);
      {uItem := uList.PeekItem;
      //uItem := uList.PeekItem;
      S := 1;
      uItem := TSynEditUndoItem(uList.fItems[uList.ItemCount-1]);
      f := uItem.ChangeNumber;
      iLow := uItem.ChangeStartPos.Y;
      iHigh := uItem.ChangeEndPos.y;

      fc := UItem.ChangeNumber;
      while uItem.ChangeNumber = f do begin
        if uList.ItemCount - s > 0 then begin
          uItem := TSynEditUndoItem(uList.fItems[uList.ItemCount-S]);
          f := uItem.ChangeNumber;
        end
        else
          f := uItem.ChangeNumber + 1;
        //if f = uItem.ChangeNumber then begin
          MessageBox(0, PChar(IntToStr(iLow) + '|' + IntTOStr(iHigh)), 'test', 0);
          if iLow > uItem.ChangeStartPos.Y then iLow := uItem.ChangeStartPos.Y;
          if iHigh < uItem.ChangeEndPos.Y then iHigh := uItem.ChangeEndPos.Y;
        //end;
        S := S + 1;
      end;
        bDunUpdate := True;
        lineCnt := 0;
      // First we remove all functions that are located in the lines of consideration.
      //MessageBox(0, PChar(IntTostr(uItem.ChangeEndPos.y) + '|' + IntToStr(uItem.ChangeStartPos.y)), 'test', 0);
      //MessageBox(0, PChar(IntToStr(UItem.ChangeStartPos.Y) + '|' + IntToStr(UItem.ChangeEndPos.Y)), 'test', 0);
      //MessageBox(0, PChar(IntTOStr(uitem.ChangeEndPos.y) + '|' + IntToStr(uitem.ChangeStartPos.y)), 'test', 0);
        for i:= iLow to iHigh do begin
          for b := selDoc.cmbKeywords.Items.Count - 1 downto 0 do begin
            m := Integer(seldoc.cmbKeywords.Items.Objects[b]);
         //   MessageBox(0, PChar(IntTOStr(Integer(seldoc.cmbKeywords.Items.Objects[b])) + '|' + IntToStr(i)), 'test', 0);
            if m = i then begin
              seldoc.cmbKeywords.Items.Delete(b);
            end;
          end;
        end;

        g := PChar(uitem.changestr);
        lineCnt := 0;
        for i:= 0 to strLen(g) do begin
          if g[i] = chr(10) then
            LineCnt := lineCnt + 1;
        end;
        iAdd := lineCnt + 1;

                               }
      selDoc.sciMain.Undo;      {

      if iLow < 1 then iLow := 1;
      if iHigh > selDoc.sciMain.Lines.Count then iHigh := selDoc.sciMain.Lines.Count;
      if iHigh < 1 then iHigh := 1;
      if iLow > selDoc.sciMain.Lines.Count then iLow := selDoc.sciMain.Lines.Count;
      if iLow < iHigh then begin
        SelDoc.ListFunctionsY(iLow-1, iHigh);
        seldoc.NeedUpdateFunc(-(iHigh - iLow));
      end
      else begin

        SelDoc.ListFunctionsY(iHigh-1, iLow);
        seldoc.NeedUpdateFunc(-(iLow - iHigh));
      end;
      MessageBox(0, 'test', 'test', 0);
      seldoc.NeedUpdateFunc(lineCnt);
      MessageBox(0, 'test2', 'test', 0);}
    end
    else
      selDoc.hxMain.Undo;
end;

procedure TdmMain.actEditRedoExecute(Sender: TObject);
var
   sr : string;
   i,b,s,m,f:integer;
   g: PChar;
   linecnt: Integer;
   uList: TSynEditUndoList;
   iLow, iHigh: Integer;
   uItem: TSynEditUndoItem;
begin
  if selDoc <> nil then
    if selDoc.bHexMode = False then begin
   {   if selDoc.sciMain.CanRedo = False then exit;
      dmMain.bDunUpdate := True;
      uList := selDoc.sciMain.RedoList;
      //uItem := uList.PopItem;
      //Ulist.PushItem(uItem);
      {uItem := uList.PeekItem;
      //uItem := uList.PeekItem;
      S := 1;
      uItem := TSynEditUndoItem(uList.fItems[uList.ItemCount-1]);
      f := uItem.ChangeNumber;
      iLow := uItem.ChangeStartPos.Y;
      iHigh := uItem.ChangeEndPos.y;

      while uItem.ChangeNumber = f do begin
        if uList.ItemCount - s > 0 then begin
          uItem := TSynEditUndoItem(uList.fItems[uList.ItemCount-S]);
          f := uItem.ChangeNumber;
        end
        else
          f := uItem.ChangeNumber + 1;
        if iLow > uItem.ChangeStartPos.Y then iLow := uItem.ChangeStartPos.Y;
        if iHigh < uItem.ChangeEndPos.Y then iHigh := uItem.ChangeEndPos.Y;
        S := S + 1;
        bDunUpdate := True;
        lineCnt := 0;
      // First we remove all functions that are located in the lines of consideration.
      //MessageBox4(0, PChar(IntTostr(uItem.ChangeEndPos.y) + '|' + IntToStr(uItem.ChangeStartPos.y)), 'test', 0);
      //MessageBox(0, PChar(IntToStr(UItem.ChangeStartPos.Y) + '|' + IntToStr(UItem.ChangeEndPos.Y)), 'test', 0);
      //MessageBox(0, PChar(IntTOStr(uitem.ChangeEndPos.y) + '|' + IntToStr(uitem.ChangeStartPos.y)), 'test', 0);
        for i:= uItem.ChangeStartPos.y to uitem.ChangeEndPos.y do begin
          for b := selDoc.cmbKeywords.Items.Count - 1 downto 0 do begin
            m := Integer(seldoc.cmbKeywords.Items.Objects[b]);
         //   MessageBox(0, PChar(IntTOStr(Integer(seldoc.cmbKeywords.Items.Objects[b])) + '|' + IntToStr(i)), 'test', 0);
            if m = i then begin
              seldoc.cmbKeywords.Items.Delete(b);
            end;
          end;
        end;
        seldoc.NeedUpdateFunc(-(uitem.ChangeEndPos.y - uitem.ChangeStartPos.y));
        g := PChar(uitem.changestr);
        lineCnt := 0;
        for i:= 0 to strLen(g) do begin
          if g[i] = chr(10) then
            LineCnt := lineCnt + 1;
        end;
        iAdd := lineCnt + 1;
        seldoc.NeedUpdateFunc(lineCnt);
      end;                     }
      selDoc.sciMain.Redo;      {
//      MessageBox(0, PChar(IntToStr(iLow) + '|' + IntTOStr(iHigh)), 'test', 0);
      SelDoc.ListFunctionsY(iLow-1, iHigh);}
    end
    else begin
      sr := Clipboard.AsText;
      SelDoc.hxMain.ReplaceSelection ( @sr[1] , Length ( sr ) );
    end;

end;

procedure TdmMain.actEditCutExecute(Sender: TObject);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -