【问题标题】:Scintilla Control Saving bookmarks to fileScintilla Control 将书签保存到文件
【发布时间】:2013-03-18 18:02:34
【问题描述】:

我正在尝试在 scintilla 中保存正在编辑的文件的指示器(书签),以便下次打开文件时重新加载它们。

这是我的代码 sn-p:

List<int> bookmarks = new List<int>();
for (int i = 0; i < scintilla1.Lines.Count; i++)
{
    if (!bookmarks.Contains(scintilla1.Markers.FindNextMarker(i).Number))
        bookmarks.Add(scintilla1.Markers.FindNextMarker(i).Number);
}

for (int j=0;j<bookmarks.Count;j++)
    MessageBox.Show(bookmarks[j].ToString());

但是,索引似乎超出了范围,有什么帮助吗?

【问题讨论】:

  • 哪个数组越界了?
  • 另外,您应该使用 HashMap 而不是 List。这样会更有效,因为您不必检查书签是否已存在。

标签: c# windows forms scintilla


【解决方案1】:

你可以试试这个:

HashMap<int> bookmarks = new HashMap<int>();
for (int i = 0; i < scintilla1.Lines.Count; i++)
{
    bookmarks.Add(scintilla1.Markers.FindNextMarker(i).Number);
}

foreach (var bookmark in bookmarks)
{
    MessageBox.Show(bookmark.ToString());
}

另外,应该注意FindNextMarker 将返回具有标记的下一行(参见实现here)。所以我认为你的方法是错误的。应该更像这样:

HashMap<int> bookmarks = new HashMap<int>();
int nextBookmark = 0;

while (nextBookmark != UInt32.MaxValue)
{
    nextBookmark = scintilla1.Markers.FindNextMarker(nextBookmark).Line;
    if (nextBookmark != UInt32.MaxValue)
    {
        bookmarks.Add(nextBookmark);
    }
}

foreach (var bookmark in bookmarks)
{
    MessageBox.Show(bookmark.ToString());
}

更好的是,您可以使用public List&lt;Marker&gt; GetMarkers(int line) 获取所有标记:

foreach (var bookmark in scintilla1.Markers.GetMarkers(0))
{
    MessageBox.Show(bookmark.Line.ToString());
}

需要注意,每个文件似乎最多有 32 个标记。请参阅markers documentation on the Scintilla site

【讨论】:

    【解决方案2】:

    我用下面的代码解决了这个问题,但是,我想将书签内容添加到文件的末尾,这样当我打开一个新文件时,我就可以知道在哪里加载书签。 如何编辑 scintilla1.Lines[scintilla1.Lines.Count]?

    List<int> bookmarks = new List<int>();
    
    while(true)
    {
        try
        {
            Line next = scintilla1.Markers.FindNextMarker();
            scintilla1.Caret.Position = next.StartPosition;
            scintilla1.Caret.Goto(next.EndPosition);
            scintilla1.Scrolling.ScrollToCaret();
            scintilla1.Focus();
            bookmarks.Add(next.Number);
        }
        catch(Exception ex)
        {
            break;
        }
    }
    
    string Marks="";
    for(int i =0;i<bookmarks.Count;i++)
        Marks += bookmarks[i]+ ",";
    

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2021-03-22
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2014-11-23
      相关资源
      最近更新 更多