On Thursday 27 October 2016 02:55:07 Fred van Stappen wrote:
> Hello Martin.
>
>
> In tmainfo I want to add a SyntaxDef menu-item.
> OnExecute will call a openfile dialog to choose the syntaxdef file.
>
MSEide loads syntax definition files on demand. The call stack is:
"
procedure tsourcepage.loadfile(value: filenamety);
begin
 inc(ffileloading);
 try
  edit.loadfromfile(value);
  ismoduletext:= ismoduletext or (fileext(value) = formfileext);
  finitialfilepath:= edit.filename;
  setsyntaxdef(value);
"
"
procedure tsourcepage.setsyntaxdef(const value: filenamety);
begin
 try
  edit.setsyntaxdef(value);
"
"
procedure tsyntaxedit.setsyntaxdef(const sourcefilename: filenamety);
begin
 if fsyntaxpainter <> nil then begin
  if sourcefilename = '' then begin
   unregistersyntaxpainter;
  end
  else begin
   setsyntaxdef(fsyntaxpainter.linkdeffile(sourcefilename));
"
"
function tsyntaxpainter.linkdeffile(const sourcefilename: filenamety): 
integer;
var
 int1,int2: integer;
 strar1: msestringarty;
 stream: ttextstream;
 str1: filenamety;

begin
 result:= -1;
 for int1:= 0 to fdefdefs.count - 1 do begin
  strar1:= nil;
  splitstringquoted(defdefs[int1].a,strar1);
  for int2:= 0 to high(strar1) do begin
   if checkfilename(sourcefilename,strar1[int2],true) then begin
    result:= int1;
    break;
   end;
  end;
  if result >= 0 then begin
   break;
  end;
 end;
 if result >= 0 then begin
  int2:= result;
  result:= -1;
  for int1:= 0 to high(fsyntaxdefs) do begin
   with fsyntaxdefs[int1] do begin
    if (charstyles <> nil) and (defdefsnr = int2) then begin
     result:= int1;
     break;
    end;
   end;
  end;
  if result < 0 then begin
   str1:= fdefdefs[int2].b;
   str1:= filepath(fdefsdir,str1);
   stream:= ttextstream.create(str1,fm_read);
   try
    try
     result:= readdeffile(stream);
"
"
function tsyntaxpainter.readdeffile(stream: ttextstream): integer;
type
 tokennrty = (tn_styles,tn_caseinsensitive,tn_keywordchars,tn_addkeywordchars,
              tn_colors,tn_pairwords,tn_keyworddefs,
              tn_scope,tn_endtokens,tn_keywords,tn_jumptokens,tn_calltokens,
              tn_return);
const
 tn_canmultiple = [tn_keyworddefs{,tn_jumptokens,tn_calltokens,tn_endtokens}];

 nonetoken = 'NONE';
 tokens: array[tokennrty] of string = (
       'STYLES','CASEINSENSITIVE','KEYWORDCHARS','ADDKEYWORDCHARS',
       'COLORS','PAIRWORDS','KEYWORDDEFS',
       'SCOPE','ENDTOKENS','KEYWORDS','JUMPTOKENS','CALLTOKENS',
       'RETURN');
 tn_localstart = tn_scope;
...
"
later:
"
procedure tsyntaxedit.setsyntaxdef(const handle: integer);
begin
 if fsyntaxpainter <> nil then begin
  unregistersyntaxpainter;
  if handle >= 0 then begin
   fsyntaxpainterhandle:= fsyntaxpainter.registerclient(self,flines,
           {$ifdef FPC}@{$endif}syntaxchanged,handle);
   initsyntaxparams();
   refreshsyntax(0,bigint);
  end;
 end;
end;
"
> I try with this procedure without succes:
>
> procedure tmainfo.LoadSyntaxDef(const sender: TObject);
> var
> int1 : integer;
> begin
>   openfile.controller.lastdir :=
> IncludeTrailingBackslash(ExtractFilePath(ParamStr(0))) + '/syntaxdefs';
>
> if openfile.execute = mr_ok then
> begin
>     with sourcefo.syntaxpainter do begin
>       sourcefo.syntaxpainter.clear;
>      try
>       for int1:= 0 to sourcefo.count - 1 do begin
>       
> sourcefo.items[int1].edit.setsyntaxdef(openfile.controller.filename); end;

This is wrong. In "edit.setsyntaxdef(<file>)" <file> should not be the syntax 
definition file but the source file. The appropriate *.sdef-file will be 
guessed by file extension of <file>.
You need to call
"
 tsyntaxedit.setsyntaxdef(const handle: integer)
"
with a handle you get by 
"
function tsyntaxpainter.readdeffile(stream: ttextstream): integer;
"
"stream" supplies the *.sdef file.
I suggest to load a given *.sdef file only once and to cache the handle for 
future use.

Martin

------------------------------------------------------------------------------
The Command Line: Reinvented for Modern Developers
Did the resurgence of CLI tooling catch you by surprise?
Reconnect with the command line and become more productive. 
Learn the new .NET and ASP.NET CLI. Get your free copy!
http://sdm.link/telerik
_______________________________________________
mseide-msegui-talk mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mseide-msegui-talk

Reply via email to