2011-10-20 5 views
2

J'ai ce code, pour initialiser Scintilla avec xml lexer:DScintilla, le pliage du code ne fonctionne pas pour moi

procedure TfrmWeMain.DScintilla1MarginClick(ASender: TObject; AModifiers, 
    APosition, AMargin: Integer); 
    var line_number:integer; 
begin 

    line_number:= (ASender as TDScintilla).SendEditor(SCI_LINEFROMPOSITION, APosition, 0); 

    case AMargin of 
    1: 
    begin 
     (ASender as TDScintilla).SendEditor(SCI_TOGGLEFOLD, line_number, 0); 
    end 

    end; 
end; 

procedure TfrmWeMain.addDocument(filename:string); 
var frmEditor:tFrameEditor; 
ts:TTabSheet; 
procedure setColors(lang:integer;fore:integer;const back:tcolor=clWindow; 
    const bold:boolean=false; const italic:boolean=false; 
    const underline:boolean=false; const font:string='Courier New'; 
    const size:integer=10); 

begin 
    frmEditor.sci.StyleSetBack(lang,colortorgb(back)); 
    frmEditor.sci.StyleSetFore(lang,colortorgb(fore)); 
    frmEditor.sci.StyleSetFont(lang,font); 
    frmEditor.sci.StyleSetBold(lang,bold); 
    frmEditor.sci.StyleSetItalic(lang,italic); 
    frmEditor.sci.StyleSetUnderline(lang,underline); 
    frmEditor.sci.StyleSetSize(lang,size); 
end; 

procedure setFolding; 
begin 
    frmEditor.sci.SetMarginTypeN(1,0); 
    frmEditor.sci.SetMarginTypeN(1,SC_MARGIN_SYMBOL); 
    frmEditor.sci.SetMarginMaskN(1,SC_MASK_FOLDERS); 
    frmEditor.sci.SetMarginWidthN(0,40); 
    frmEditor.sci.SetMarginWidthN(1,20); 
    frmEditor.sci.SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_PLUS); 
    frmEditor.sci.SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS); 
    frmEditor.sci.SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND, SC_MARK_EMPTY); 
    frmEditor.sci.SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY); 
    frmEditor.sci.SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY); 
    frmEditor.sci.SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_EMPTY); 
    frmEditor.sci.SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_EMPTY); 
    frmEditor.sci.SendEditor(SCI_SETFOLDFLAGS, 16, 0); // 16  Draw line below if not expanded 
    frmEditor.sci.OnMarginClick:=DScintilla1MarginClick; 
    frmeditor.sci.StartStyling(0,0); 
end; 
begin 

///... 
frmEditor.sci.SetLexer(SCLEX_XML); 
frmEditor.sci.SetCodePage(CP_UTF8); 
setColors(SCE_H_DEFAULT,clBlack); 
setColors(SCE_H_TAG,clPurple,clWindow,true); 
setColors(SCE_H_TAGUNKNOWN,clRed); 
setColors(SCE_H_ATTRIBUTE,clNavy); 
setColors(SCE_H_ATTRIBUTEUNKNOWN,clRed); 
setColors(SCE_H_NUMBER,clBlue); 
setColors(SCE_H_DOUBLESTRING,clBlue); 
setColors(SCE_H_SINGLESTRING,clBlue); 
setColors(SCE_H_OTHER,clBlack); 
setColors(SCE_H_COMMENT,clTeal); 
setColors(SCE_H_ENTITY,clPurple); 
setColors(SCE_H_TAGEND,clPurple); 
setColors(SCE_H_CDATA,clTeal); 
setFolding; 

///... 


end; 

Voir la partie setFolding du code, il est que lorsque le pliage devrait entrer en mouvement, mais ne le fait pas. Je ne peux pas voir les marqueurs de plis, ni le pliage lui-même fonctionne.

J'ai besoin de savoir ce que je manque ici, ou ce que je fais mal. Les extraits de code en Delphi, C++, C# ou pseudocode sont les bienvenus

Répondre

4

Voici l'exemple de repliement pour XML. Vous étiez assez proche pour le faire fonctionner, mais vous avez manqué pour définir 2 détails importants, activer le pliage globalement et pour votre langue (voir here pour fold.html plier la propriété pour XML) et ensuite activer la marge de pli pour être sensible aux clics de souris , ce qui permet réellement de déclencher l'événement OnMarginClick (voir here).

Pour cet exemple, j'ai évité d'utiliser la messagerie SendEditor et utilisé toute la puissance de l'encapsuleur DScintilla.

uses 
    DScintillaTypes; 

const 
    MARGIN_LINE_NUMBERS = 0; 
    MARGIN_CODE_FOLDING = 1; 

procedure TForm1.DScintilla1MarginClick(ASender: TObject; AModifiers, 
    APosition, AMargin: Integer); 
var 
    Line: Integer; 
begin 
    Line := DScintilla1.LineFromPosition(APosition); 

    if AMargin = MARGIN_CODE_FOLDING then 
    DScintilla1.ToggleFold(Line); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 

    procedure SetColors(const Style: Integer; const Fore: Integer; 
    const Back: TColor = clWindow; const Bold: Boolean = False; 
    const Italic: Boolean = False; const Underline: Boolean = False; 
    const Font: string = 'Courier New'; const Size: Integer = 10); 
    begin 
    DScintilla1.StyleSetBack(Style, ColorToRGB(Back)); 
    DScintilla1.StyleSetFore(Style, ColorToRGB(Fore)); 
    DScintilla1.StyleSetFont(Style, Font); 
    DScintilla1.StyleSetSize(Style, Size); 
    DScintilla1.StyleSetBold(Style, Bold); 
    DScintilla1.StyleSetItalic(Style, Italic); 
    DScintilla1.StyleSetUnderline(Style, Underline); 
    end; 

begin 
    DScintilla1.SetLexer(SCLEX_XML); 
    DScintilla1.SetCodePage(CP_UTF8); 

    // this is very important and enables the folding globally 
    // and then the language specific, see [1] for details 

    DScintilla1.SetProperty('fold', '1'); 
    DScintilla1.SetProperty('fold.html', '1'); 

    // I used here constant placeholders, for line numbering 
    // margin it's the MARGIN_LINE_NUMBERS and for code folding 
    // margin it's the MARGIN_CODE_FOLDING constant 

    DScintilla1.SetMarginWidthN(MARGIN_CODE_FOLDING, 0); 
    DScintilla1.SetMarginTypeN(MARGIN_CODE_FOLDING, SC_MARGIN_SYMBOL); 
    DScintilla1.SetMarginMaskN(MARGIN_CODE_FOLDING, SC_MASK_FOLDERS); 
    DScintilla1.SetMarginWidthN(MARGIN_LINE_NUMBERS, 40); 
    DScintilla1.SetMarginWidthN(MARGIN_CODE_FOLDING, 20); 

    // markers for code folding 

    DScintilla1.MarkerDefine(SC_MARKNUM_FOLDER, SC_MARK_PLUS); 
    DScintilla1.MarkerDefine(SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS); 
    DScintilla1.MarkerDefine(SC_MARKNUM_FOLDEREND, SC_MARK_EMPTY); 
    DScintilla1.MarkerDefine(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY); 
    DScintilla1.MarkerDefine(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY); 
    DScintilla1.MarkerDefine(SC_MARKNUM_FOLDERSUB, SC_MARK_EMPTY); 
    DScintilla1.MarkerDefine(SC_MARKNUM_FOLDERTAIL, SC_MARK_EMPTY); 

    // also very important, this will enable the OnMarginClick event 
    // to fire, if you set the ASensitive parameter to False or omit 
    // this line, the OnMarginClick will never fire 

    DScintilla1.SetMarginSensitiveN(MARGIN_CODE_FOLDING, True); 

    // and some visual settings 

    SetColors(SCE_H_DEFAULT, clBlack); 
    SetColors(SCE_H_TAG, clPurple, clWindow, True); 
    SetColors(SCE_H_TAGUNKNOWN, clRed); 
    SetColors(SCE_H_ATTRIBUTE, clNavy); 
    SetColors(SCE_H_ATTRIBUTEUNKNOWN, clRed); 
    SetColors(SCE_H_NUMBER, clBlue); 
    SetColors(SCE_H_DOUBLESTRING, clBlue); 
    SetColors(SCE_H_SINGLESTRING, clBlue); 
    SetColors(SCE_H_OTHER, clBlack); 
    SetColors(SCE_H_COMMENT, clTeal); 
    SetColors(SCE_H_ENTITY, clPurple); 
    SetColors(SCE_H_TAGEND, clPurple); 
    SetColors(SCE_H_CDATA, clTeal); 
end; 

Hope this helps :)

+0

merci, je vais essayer cet après-midi et revenir avec les résultats – beerwin

+0

ELABOREE de la boîte, merci beaucoup – beerwin

+0

Vous êtes les bienvenus, heureux de vous aider:) – TLama