2013-03-18 66 views
1

我试图保存正在编辑的文件在闪烁体中的指示器(书签),以便在下次打开文件时重新加载它们。Scintilla Control将书签保存到文件

这是我的代码片段:

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()); 

然而,似乎索引超出侧的界限,任何帮助吗?

+0

哪个数组超出范围? – joce 2013-03-18 18:09:19

+0

另外,您应该使用HashMap而不是List。这样做会更有效,因为您不必检查书签的预存状态。 – joce 2013-03-18 18:12:13

回答

0

你可以试试这个:

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<Marker> GetMarkers(int line)得到所有的标记:

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

要注意,似乎有最多不超过32个标志文件。请参阅markers documentation on the Scintilla site

0

我用下面的代码解决了这个问题,但是我想将书签内容添加到文件的末尾,这样我就可以知道在打开一个新文件时加载书签的位置。 如何编辑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]+ ",";