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