Использую Рефал в Галактике:)
Модераторы: m0p3e, edward_K, Модераторы
Использую Рефал в Галактике:)
Пример vip интерфейса к интерпретатору Рефал-5: http://sites.google.com/site/svobodnyef ... 0101115.7z
с решением задачки пакетной обработки Memo полей (106) таблиц.
Руководство по программированию и справочник Турчин В.Ф.: http://www.refal.ru/rf5_frm.htm - страница загрузки: http://botik.ru/pub/local/scp/refal5/refal5.html и загрузка версии PZ (Переславль Залесский): ftp://ftp.botik.ru/pub/local/scp/refal5 ... _winNT.zip
с решением задачки пакетной обработки Memo полей (106) таблиц.
Руководство по программированию и справочник Турчин В.Ф.: http://www.refal.ru/rf5_frm.htm - страница загрузки: http://botik.ru/pub/local/scp/refal5/refal5.html и загрузка версии PZ (Переславль Залесский): ftp://ftp.botik.ru/pub/local/scp/refal5 ... _winNT.zip
Последний раз редактировалось sensoft 19 июл 2011, 14:43, всего редактировалось 2 раза.
Re: Использую Рефал в Галактике:)
начальный вид:
в табличной форме список таблиц с Memo полем, в анкетной - интерфейс к интерпретатору, в текстовой - содержание Memo поля
в поле Рефал проги - название файла с расширением .ref. В Rev.ref - простой пример с переворотом строк, редактируется по кнопке [ProcessText]:
и компилируется по кнопке [RefC]
в поле входного файла для обработки - input.txt - текстовой файл, загружается по кнопке [ImportFileToMemo]:
далее он передаётся интерпретатору в - output.txt по кнопке [ExportMemoToFile] и интерпретируется в файл - input.txt по кнопке [RefGo], из текста Rev.ref ясно, что Arg1 = output.txt, а Arg2 = input.txt
и наконец, загружаем результат обработки снова по кнопке [ImportFileToMemo]:
при снятом checkbox [commit] результат виден только в текущем буфере, по двойному клику на таблице откроется окно:
и если уйти с текущей записи и вернуться, то прежнее содержимое Memo поля восстановится
это видно и если открыть просмотр таблицы по кнопке [SF_ViewTable]:
продолжение следует:)
в табличной форме список таблиц с Memo полем, в анкетной - интерфейс к интерпретатору, в текстовой - содержание Memo поля
в поле Рефал проги - название файла с расширением .ref. В Rev.ref - простой пример с переворотом строк, редактируется по кнопке [ProcessText]:
и компилируется по кнопке [RefC]
в поле входного файла для обработки - input.txt - текстовой файл, загружается по кнопке [ImportFileToMemo]:
далее он передаётся интерпретатору в - output.txt по кнопке [ExportMemoToFile] и интерпретируется в файл - input.txt по кнопке [RefGo], из текста Rev.ref ясно, что Arg1 = output.txt, а Arg2 = input.txt
и наконец, загружаем результат обработки снова по кнопке [ImportFileToMemo]:
при снятом checkbox [commit] результат виден только в текущем буфере, по двойному клику на таблице откроется окно:
и если уйти с текущей записи и вернуться, то прежнее содержимое Memo поля восстановится
это видно и если открыть просмотр таблицы по кнопке [SF_ViewTable]:
продолжение следует:)
Re: Использую Рефал в Галактике:)
Пример подстановок по таблице.
Рассмотрим задачу расширения списка рабочих таблиц с Memo полем в vip коде основного интерфейса:
т.е. в коде:
добавить другие таблицы из (106) доступных.
Образцом будут различные встречающиеся комбинации из N[Номер по алфиту] T[Название таблицы] F[Название Memo поля] I[Название Nrec индекса], а входом строки интерфейса при построчном однопроходном просмотре.
Таких правил всего 10:
По построению интерфейса создаётся словарь строк вида N T F I для (106) таблиц в файле dict.txt.
Используем его и перед обработкой считаем его и перед закапыванием в виде (N1 T1 F1 I1)(...) используем в качестве фильтра список добавляемых по [Insert] в интерфейсе таблиц в виде : (Начальный_номер_таблицы1 Количество_последовательных_таблиц1)(Начальный_номер_таблицы2 Количество_последовательных_таблиц2)(...).
При распознавании очередной строки интерфейса подставляем в цикле все варианты из выкопанного словаря, в противном случае просто выводим строку как есть. Всё:).
Пример использования - выбираем наш vip файл в текстовом поле по кнопке [Import]:
и далее вариант [Заменить старое содержимое]:
отметим, что при этом в базу реально уходит обновление (пользовать на свой страх и риск)
В результате:
В поле Ref файла вводим mn - просмотр и компиляция как обычно, его код:
или на экране:
Затем в интерфейсе выбираем таблицы по Insert:
при этом поле аргумента автоматически изменяется в виде списка ()()()...
Далее как обычно [ExportMemoToFile] [RefGo] и [ImportFileToMemo]:
Теперь обратная задача - убрать некоторые таблицы. Ref файл для удаления - rmn.ref:
на экране:
Выбираем таблицы для удаления (не забываем скомпилить - один раз):
Далее как обычно [ExportMemoToFile] [RefGo] и [ImportFileToMemo]:
Теперь добавим таблицу к уже изменённому интерфейсу:
тут отличие только в том, что нужно знать номер по алфавиту последней добавленной ранее таблицы, смотрим её номер и вводим его в поле дополнительного аргумента, в нашем случае [25]:
Наконец результат устраивает:
Остаётся сохранить новый Ref5.vip и скомпилить его как обычно.
Примечание: у таблицы HierZar нет односегментного индекса Nrec
Рассмотрим задачу расширения списка рабочих таблиц с Memo полем в vip коде основного интерфейса:
Код: Выделить всё
! Корм для Рефала
!
!
!
! 26.11.2010 CEH
const
cfpSDIWindow=1054;ColorMark=19;sci178InsPM=6959;cmSelectAll=1219;cmUnSelectAll=1220;cmMarkUnMark=1221;cmInvertAll=1222;ftLVar=14;cmProcessText=3000;cmRefC=3001;cmRefGo=3002;cmRefTr=3003;cmSF_ViewTable=3004;cmImportFileToMemo=3005;cmExportMemoToFile=3006;
cmCompressLevel=3035;cmShowAll=3036;cmHideAll=3106;
end;
table struct mTbl ""
(
nTbl : string[21] "Имя таблицы",
nFld : string[21] "Имя Memo поля",
nNrec: string[21] "Имя Nrec поля",
nT : byte "№ п/а таблицы"
)
with index
(
byNTbl = nTbl
);
!----------------------------------------------------------------------------
interface MemoTbl '' ('',,scInterface) EscClose, Cyan;
create view as select X$FIELDS.XE$NAME, XF$NAME, xf.XE$NAME, mTbl.*
from X$FIELDS, X$FILES, synonym X$FIELDS xf, mTbl
where((
root == X$FIELDS.XE$CODE and (byte(14) = X$FIELDS.XE$DATATYPE) and
X$FIELDS.XE$FILECODE == XF$CODE and
X$FIELDS.XE$FILECODE == xf.XE$FILECODE and
word(ftLVar) == xf.XE$CODE and
XF$NAME == nTbl
));
handleEvent
cmInit: begin
if( getFirst X$FIELDS = 0 )
do {
nTbl:=XF$NAME; nFld:=X$FIELDS.XE$NAME; nNrec:=xf.XE$NAME;
if( insert current mTbl = 0 ) {};
} while getNext X$FIELDS = 0;
abort;
end;
end;
end.
!----------------------------------------------------------------------------
interface Ref5 'refc+refgo' ('компиляции компиляции компиляции ... :)',,scInterface) EscClose, Cyan;
show at (0,0,64,24);
var
iDict,cI:byte;
n:array [0..127] of comp;
nI,m:array [1..127] of byte;
ref5Prog,inTxtFile,outTxtFile,refGoModulParams,refGoArgParams,refGoArgParams2:string;
batch,commit:word;
MarkerNT,IndexNT:longint;
Marker_ALGCALC,Index_ALGCALC:longint;
Marker_ALGCALCTMPL,Index_ALGCALCTMPL:longint;
function selectMarker(x:byte):longint;
begin
selectMarker:=bcase(x=0:0
,x=1:Marker_ALGCALC
,x=2:Marker_ALGCALCTMPL
);
end;
create view as
select nI[nT](FieldName=nInT)
,if(SearchMarker(MarkerNT,mTbl.nT,IndexNT),'+',' ')(FieldName=picked)
,GetMarkerCount(selectMarker(nT))(FieldName=ins)
,if(SearchMarker(Marker_ALGCALC,ALGCALC.NREC,Index_ALGCALC),'+',' ')(FieldName=picked_ALGCALC)
,if(SearchMarker(Marker_ALGCALCTMPL,ALGCALCTMPL.NREC,Index_ALGCALCTMPL),'+',' ')(FieldName=picked_ALGCALCTMPL)
,*
from
mTbl
,ALGCALC
,ALGCALCTMPL
where((
root==mTbl.nTbl
and n[1]==ALGCALC.NREC
and n[2]==ALGCALCTMPL.NREC
));
parameters iDict;
File Dict,Memo;
browse brwRef5 ' ' ('',,sci178InsPM);
show at (,,,3);
table mTbl;
fields { font = { bold = (nI[nT]>0); color = if(picked='+',ColorMark,0) } };
nInT '№' : [2], Skip, Centered, NoAutoSize;
picked ' ' : [1], Skip, Centered, NoAutoSize;
ins 'ins' : [5], Skip, NoAutoSize;
nTbl 'таблицы' : [10], protect;
nFld 'поля' : [10], protect;
nNrec 'nrec' : [10], protect;
nT '№ п/а' : [4], protect;
end;
screen scrRef5 ' ';
show (,4,,11) fixed_y;
fields
ref5Prog : noProtect;
inTxtFile : noProtect;
outTxtFile : noProtect;
batch : noProtect;
commit : noProtect;
refGoModulParams : noProtect;
refGoArgParams : noProtect;
refGoArgParams2 : noProtect;
buttons
cmSF_ViewTable; cmProcessText; cmRefC; cmImportFileToMemo; cmExportMemoToFile; cmRefTr; cmRefGo;
<<
<. SF_ViewTable .>`-выбор записей в таблицах с Memo полем`
.@@@@@@@@@@@@@@@@`-.ref Рефал` `редактор-`<. ProcessText .>
`компилятор-`<. RefC .>
.@@@@@@@@@@@@@@@@ <. ImportFileToMemo .>
.@@@@@@@@@@@@@@@@ <. ExportMemoToFile .> [.] batch` [.] commit`
.@@@@@@@@@@@@@@@@`-mods` параметры `args-`.@@@@@@@@@@@.@@@@
<. RefTr .>`-tracer` `интерпретатор-`<. RefGo .>
>>
end;
screen m_nT ' ';
show (,12,,);
fields
<<
>>
end;
text memoID=m_ALGCALC ALGCALC.DESCRIPT ' ALGCALC' : noProtect; show (,12,,);
text memoID=m_ALGCALCTMPL ALGCALCTMPL.DESCRIPT ' ALGCALCTMPL' : noProtect; show (,12,,);
tableEvent table mTbl
cmPositionChanged: begin
if(GetMarkerCount(MarkerNT)=0) refGoArgParams:='('+nT+' 1)';
if(nI[nT]>0) SetFormat(-65535+nI[nT]+1)
else SetFormat(m_nT);
ReDrawPanel(0);
end;
cmSetDefault: begin abort; exit; end;
end;
function PictMarker:string;
begin
var i,b,c:byte;
var s:string;
s:=''; c:=0;
for(i:=1;i<=127;i:=i+1)
if(m[i]=0) { if(c>0) { s:=s+'('+b+' '+c+')'; c:=0; }
}else{ if(c=0) b:=m[i]; c:=c+1; };
if(c>0) s:=s+'('+b+' '+c+')';
PictMarker:=s;
end;
procedure loop_InsertMarker(x:byte);
begin
bcase(x=0:x:=0
,x=1:_loop ALGCALC InsertMarker(selectMarker(nT),ALGCALC.NREC);
,x=2:_loop ALGCALCTMPL InsertMarker(selectMarker(nT),ALGCALCTMPL.NREC);
);
end;
procedure loop_InvertMarker(x:byte);
begin
bcase(x=0:x:=0
,x=1:_loop ALGCALC InvertMarker(selectMarker(nT),ALGCALC.NREC);
,x=2:_loop ALGCALCTMPL InvertMarker(selectMarker(nT),ALGCALCTMPL.NREC);
);
end;
function expFileToMemo(x:byte):boolean;
begin
expFileToMemo:=bcase(x=0:x=0
,x=1:ExportMemoToFile(ALGCALC.DESCRIPT,outTxtFile,false)
,x=2:ExportMemoToFile(ALGCALCTMPL.DESCRIPT,outTxtFile,false)
);
end;
function impFileToMemo(x:byte):boolean;
begin
impFileToMemo:=bcase(x=0:x=0
,x=1:ImportFileToMemo(ALGCALC.DESCRIPT,inTxtFile,false)
,x=2:ImportFileToMemo(ALGCALCTMPL.DESCRIPT,inTxtFile,false)
);
end;
function getNextInsRecord(x:byte;c:comp):boolean;
begin
getNextInsRecord:=bcase(x=0:x=0
,x=1:getFirst ALGCALC where ((c==ALGCALC.NREC))=0
,x=2:getFirst ALGCALCTMPL where ((c==ALGCALCTMPL.NREC))=0
);
end;
function exitExec(var i,j:longint; var b:byte):boolean;
begin
var c:comp;
exitExec:=false;
if(GetMarker(selectMarker(b),j,c)) if(getNextInsRecord(b,c)) { j:=j+1; exitExec:=true; exit; };
SetBounds(nI[b]);
if(GetMarkerCount(MarkerNT)=0) { ReDrawPanel(nI[nT]); exit; };
var oldb:byte; oldb:=b;
while GetMarker(MarkerNT,i,b) { i:=i+1; if(nI[b]>0) break; }; if(b=oldb) { ReDrawPanel(CurFormatInArea(m_nT)+65535-1); exit; };
if(GetMarkerCount(selectMarker(b))>0) { j:=0; ReSetBounds(nI[b]);
if(GetMarker(selectMarker(b),j,c)) if(getNextInsRecord(b,c)) { j:=j+1; exitExec:=true; exit; };
};
end;
function initExec(var i,j:longint; var b:byte):boolean;
begin
var c:comp;
initExec:=false;
if(batch=0) { initExec:=true; exit; };
if(GetMarkerCount(MarkerNT)=0) { if(nI[nT]=0) exit; b:=nT;
}else{ i:=0; while GetMarker(MarkerNT,i,b) { i:=i+1; if(nI[b]>0) break; }; if(nI[b]=0) exit; };
if(GetMarkerCount(selectMarker(b))>0) { j:=0; ReSetBounds(nI[b]);
if(GetMarker(selectMarker(b),j,c)) if(getNextInsRecord(b,c)) { j:=j+1; initExec:=true; exit; };
};
end;
#declare MacroWinMemo(N,T,F,FN)
window win_#T '#T';
browse brw_#T ' ' ('',,sci178InsPM);
show at (,,20,);
table #T;
fields { font = { bold = (#T.#FN=n[#N]); color = if(picked_#T='+',ColorMark,0) } };
picked_#T ' ' : [1], Skip, Centered, NoAutoSize;
#T.#FN '#FN' : [10], protect;
end;
text memoID=mw_#T #T.#F ' #T' : noProtect;
show (21,,,);
tableEvent table #T
cmInsertRecord: begin abort; exit; end;
cmDeleteRecord: begin abort; exit; end;
cmUpdateRecord: begin update current #T; end;
cmSetDefault: begin abort; exit; end;
end;
handleEvent
cmInit: begin ReSetBounds(tn#T); end;
cmDefault: begin n[#N]:=#T.#FN; ReReadRecord(tn#T); end;
cmDone: begin SetBounds(tn#T); end;
cmSelectAll: begin
PushPos(tn#T); ClearMarker(Marker_#T);
_loop #T InsertMarker(Marker_#T,#T.#FN);
PopPos(tn#T); ReReadRecord(tn#T);
end;
cmUnSelectAll: begin
ClearMarker(Marker_#T);
ReReadRecord(tn#T);
end;
cmMarkUnMark: begin
if(SearchMarker(Marker_#T,#T.#FN,Index_#T)) DeleteMarker(Marker_#T,#T.#FN)
else InsertMarker(Marker_#T,#T.#FN);
RedrawCurrentAndGo(GetCurrentFormat,true);
end;
cmInvertAll: begin
PushPos(tn#T);
_loop #T InvertMarker(Marker_#T,#T.#FN);
PopPos(tn#T); ReReadRecord(tn#T);
end;
cmInsert: begin stop; exit; end;
cmDelete: begin stop; exit; end;
end;
end;
#end
#MacroWinMemo(1,ALGCALC,DESCRIPT,NREC)
#MacroWinMemo(2,ALGCALCTMPL,DESCRIPT,NREC)
function updateCurrentTable(x:byte):boolean;
begin
updateCurrentTable:=bcase(x=0:x=0
,x=1:update current ALGCALC=0
,x=2:update current ALGCALCTMPL=0
);
end;
handleEvent
cmInit: begin
var i,j:byte;
var str,s1,s2,s3,s4:string;
if(not ExistFile('dict.txt')) iDict:=1;
if(iDict=1) { Dict.OpenFile('dict.txt',stCreate);
RunInterface(MemoTbl);
i:=1;
if(getFirst mTbl=0)
do {
nT:=i; i:=i+1;
if(update current mTbl=0) { Dict.WriteLn(string(nT)+' '+nTbl+' '+nFld+' '+nNrec); };
} while getNext mTbl=0;
} else { Dict.OpenFile('dict.txt',stOpenRead);
do { Dict.ReadLn(str);
s1:=substr(str,1,Pos(' ',str)-1); str:=substr(str,length(s1)+2,255);
s2:=substr(str,1,Pos(' ',str)-1); str:=substr(str,length(s2)+2,255);
s3:=substr(str,1,Pos(' ',str)-1); str:=substr(str,length(s3)+2,255);
s4:=str;
nT:=s1; nTbl:=s2; nFld:=s3; nNrec:=s4;
if(insert current mTbl=0) {};
} while not Dict.EOF;
};
if( getFirst mTbl = 0 ) {};
Dict.Close;
MarkerNT:=InitMarker('Ref5',1,127,10,true);
i:=1;
nI[1]:=i; i:=i+1; Marker_ALGCALC:=InitMarker('Ref5_ALGCALC',8,100,10,true);
nI[2]:=i; i:=i+1; Marker_ALGCALCTMPL:=InitMarker('Ref5_ALGCALCTMPL',8,100,10,true);
cI:=1; for(i:=1;i<=127;i:=i+1) if(cI<nI[i]) cI:=nI[i]; cI:=cI+1;
if(not ReadMyDsk(m,'Ref5_m',false)) {i:=0; while GetMarker(MarkerNT,i,j) {i:=i+1; m[j]:=j; }; };
var cIc:byte;
if(not ReadMyDsk(cIc,'Ref5_cI',false)) cIc:=1;
if(cIc>cI) cIc:=1;
if(cIc>1) if(not ReadMyDsk(n,'Ref5_n',false)) cIc:=1;
for(i:=cIc;i<cI;i:=i+1) { j:=FindItem(nI,i);
ReSetBounds(nI[j]);
if(bcase(j=0:j=0
,j=1:getFirst ALGCALC=0
,j=2:getFirst ALGCALCTMPL=0
)) bcase(j=0:j:=0
,j=1:n[j]:=ALGCALC.NREC
,j=2:n[j]:=ALGCALCTMPL.NREC
) else n[j]:=0;
SetBounds(nI[j]);
};
if(not ReadMyDsk(ref5Prog,'Ref5_ref5Prog',false)) ref5Prog:='rev';
if(not ReadMyDsk(inTxtFile,'Ref5_inTxtFile',false)) inTxtFile:='input.txt';
if(not ReadMyDsk(outTxtFile,'Ref5_outTxtFile',false)) outTxtFile:='output.txt';
if(not ReadMyDsk(refGoModulParams,'Ref5_refGoModulParams',false)) refGoModulParams:='reflib -e';
ReadMyDsk(batch,'Ref5_batch',false);
ReadMyDsk(commit,'Ref5_commit',false);
if(GetMarkerCount(MarkerNT)=0) refGoArgParams:='(1 1)'
else refGoArgParams:=PictMarker; ReDrawPanel(0);
cIc:=cI-1;
refGoArgParams2:=FindItem(nI,cIc);
cfsSetProp('win_ALGCALC',cfpSDIWindow,true);
cfsSetProp('win_ALGCALCTMPL',cfpSDIWindow,true);
end;
cmDone: begin DoneMarker(MarkerNT,'Ref5');
DoneMarker(Marker_ALGCALC,'Ref5_ALGCALC');
DoneMarker(Marker_ALGCALCTMPL,'Ref5_ALGCALCTMPL');
SaveMyDsk(n,'Ref5_n');
SaveMyDsk(cI,'Ref5_cI');
SaveMyDsk(m,'Ref5_m');
SaveMyDsk(ref5Prog,'Ref5_ref5Prog');
SaveMyDsk(inTxtFile,'Ref5_inTxtFile');
SaveMyDsk(outTxtFile,'Ref5_outTxtFile');
SaveMyDsk(batch,'Ref5_batch')
SaveMyDsk(commit,'Ref5_commit')
SaveMyDsk(refGoModulParams,'Ref5_refGoModulParams');
end;
cmSelectAll: begin
PushPos(#mTbl);
ClearMarker(MarkerNT); SetLimit(m,0); SetLimit(m,127);
_loop mTbl { InsertMarker(MarkerNT,mTbl.nT); m[mTbl.nT]:=mTbl.nT; };
PopPos(#mTbl);
refGoArgParams:=PictMarker;
ReReadRecord(#mTbl);
end;
cmUnSelectAll: begin
ClearMarker(MarkerNT); SetLimit(m,0); SetLimit(m,127);
refGoArgParams:='('+nT+' 1)';
ReReadRecord(#mTbl);
end;
cmMarkUnMark: begin
if(SearchMarker(MarkerNT,mTbl.nT,IndexNT)) {
DeleteMarker(MarkerNT,mTbl.nT);
m[mTbl.nT]:=0;
}else{
InsertMarker(MarkerNT,mTbl.nT);
m[mTbl.nT]:=mTbl.nT;
};
refGoArgParams:=PictMarker;
ReDrawPanel(0);
end;
cmInvertAll: begin
PushPos(#mTbl);
_loop mTbl {
InvertMarker(MarkerNT,mTbl.nT);
m[mTbl.nT]:=if(m[mTbl.nT]=0,mTbl.nT,0);
};
PopPos(#mTbl);
refGoArgParams:=PictMarker;
ReReadRecord(#mTbl);
end;
cmShowAll: begin
PushPos(#mTbl);
_loop mTbl {
if((ni[nT]=0) or (not SearchMarker(MarkerNT,nT,IndexNT))) continue;
ClearMarker(selectMarker(nT));
ReSetBounds(nI[nT]);
loop_InsertMarker(nT);
SetBounds(nI[nT]);
};
PopPos(#mTbl);
ReReadRecord(#mTbl);
end;
cmHideAll: begin
PushPos(#mTbl);
_loop mTbl {
if((ni[nT]=0) or (not SearchMarker(MarkerNT,nT,IndexNT))) continue;
ClearMarker(selectMarker(nT));
};
PopPos(#mTbl);
ReReadRecord(#mTbl);
end;
cmCompressLevel: begin
PushPos(#mTbl);
_loop mTbl {
if((ni[nT]=0) or (not SearchMarker(MarkerNT,nT,IndexNT))) continue;
ReSetBounds(nI[nT]);
loop_InvertMarker(nT);
SetBounds(nI[nT]);
};
PopPos(#mTbl);
ReReadRecord(#mTbl);
end;
cmInsert: begin stop; exit; end;
cmDelete: begin stop; exit; end;
cmDefault: begin if(CurTable=#mTbl) if(nI[nT]=0) PutCommand(cmSF_ViewTable) else RunWindow(nI[nT]-1); end;
cmSF_ViewTable: begin
var c:comp;
c:=SF_ViewTable(nTbl,0);
if((c=0) or (nI[nT]=0)) exit;
n[nT]:=c;
ReReadRecord(nI[nT]);
end;
cmProcessText: begin
ProcessText(ref5Prog+'.ref',0,'');
end;
cmRefC: begin
var aErr:integer;
ExecProgram('refc.exe',ref5Prog,'',0,aErr);
end;
cmRefGo: begin
var aErr:integer;
var i,j,mSize:longint;
var b:byte;
if(initExec(i,j,b))
do {
if(batch<>0) {
if(not IsMemoText(nI[b])) continue;
if(not bcase(b=0:false
,b=1:Memo.OpenMemo(ALGCALC.DESCRIPT)
,b=2:Memo.OpenMemo(ALGCALCTMPL.DESCRIPT)
)) continue;
mSize:=Memo.GetSize;
Memo.Close;
if(mSize=0) continue;
expFileToMemo(b);
};
ExecProgram('refgo.exe',ref5Prog+'+'+refGoModulParams+' '+chr(34)+outTxtFile+chr(34)+' '+chr(34)+inTxtFile+chr(34)+' '+chr(34)+refGoArgParams+chr(34)+' '+refGoArgParams2,'',0,aErr);
if(batch=0) exit;
impFileToMemo(b);
if(commit<>0) if(updateCurrentTable(b)) {};
} while exitExec(i,j,b);
end;
cmRefTr: begin
var aErr:integer;
ExecProgram('reftr.exe',ref5Prog+'+'+refGoModulParams+' '+chr(34)+outTxtFile+chr(34)+' '+chr(34)+inTxtFile+chr(34)+' '+chr(34)+refGoArgParams+chr(34)+' '+refGoArgParams2,'',0,aErr);
end;
cmImportFileToMemo: begin
if(nI[nT]=0) exit;
impFileToMemo(nT);
if(commit<>0) if(updateCurrentTable(nT)) {};
ReDrawPanel(nI[nT]);
end;
cmExportMemoToFile: begin
if(nI[nT]=0) exit;
expFileToMemo(nT);
end;
end;
end.
!----------------------------------------------------------------------------
Код: Выделить всё
from
mTbl
,ALGCALC
,ALGCALCTMPL
where((
root==mTbl.nTbl
and n[1]==ALGCALC.NREC
and n[2]==ALGCALCTMPL.NREC
));
Образцом будут различные встречающиеся комбинации из N[Номер по алфиту] T[Название таблицы] F[Название Memo поля] I[Название Nrec индекса], а входом строки интерфейса при построчном однопроходном просмотре.
Таких правил всего 10:
Код: Выделить всё
e.1 e.T e.2 e.T e.3 e.I e.4 e.T e.5 e.T e.6
e.1 e.T e.2 e.T e.3 e.F e.4 e.T e.5
e.1 e.N e.2 e.T e.3 e.F e.4 e.I e.5
e.1 e.N e.2 e.T e.3 e.T e.4 e.I e.5
e.1 e.N e.2 e.T e.3 e.T e.4
e.1 e.N e.2 e.T e.3 e.F e.4
e.1 e.N e.2 e.T e.3 e.I e.4
e.1 e.N e.2 e.T e.3
e.1 e.T e.2 e.T e.3
e.1 e.T e.2
Используем его и перед обработкой считаем его и перед закапыванием в виде (N1 T1 F1 I1)(...) используем в качестве фильтра список добавляемых по [Insert] в интерфейсе таблиц в виде : (Начальный_номер_таблицы1 Количество_последовательных_таблиц1)(Начальный_номер_таблицы2 Количество_последовательных_таблиц2)(...).
При распознавании очередной строки интерфейса подставляем в цикле все варианты из выкопанного словаря, в противном случае просто выводим строку как есть. Всё:).
Пример использования - выбираем наш vip файл в текстовом поле по кнопке [Import]:
и далее вариант [Заменить старое содержимое]:
отметим, что при этом в базу реально уходит обновление (пользовать на свой страх и риск)
В результате:
В поле Ref файла вводим mn - просмотр и компиляция как обычно, его код:
Код: Выделить всё
*
* По номерам из Arg3 ["(Начало1 Кол-во1)(Начало2 Кол-во2)(Начало3 ... )"]
* добавить в ref5.vip таблицы с этими номерами из dict.txt по образцам m0-m9,
* в Arg4 [номер п/а] последней ранее добавленной таблицы.
*
$ENTRY Go { = <Open 'r' 1 'dict.txt'><Br 'dict=' <Pre (<As <Arg 3>>)(<Arg 4>) <Get 1>>>
<Open 'r' 1 <Arg 1>><Open 'w' 2 <Arg 2>>
<Job <Get 1>>
}
Pre { (e.X)(e.Y) 0 = ;
(e.1 (e.N) e.2)(e.Y) e.N ' ' e.T ' ' e.F ' ' e.I = ((e.N)(e.T)(e.F)(e.I)) <Pre (e.1 (e.N) e.2)(e.Y) <Get 1>>;
(e.X)(e.Y) e.Y ' ' e.T ' ' e.F ' ' e.I = <Br 'last=' (e.Y)(e.T)(e.F)(e.I)> <Pre (e.X)(e.Y) <Get 1>>;
(e.X)(e.Y) e.Z = <Pre (e.X)(e.Y) <Get 1>>;
}
As { = ;
'\(' e.1 ' ' e.2 '\)' e.Tail = <Seq <Numb e.1> <Numb e.2>> <As e.Tail>
}
Seq { s.Begin 0 = ;
s.Begin s.Count = (<Symb s.Begin>) ' ' <Seq <+ s.Begin 1> <- s.Count 1>>
}
Job { 0 = ;
e.X = <Put 2 e.X> <m0s0 (<Dg 'last'>) e.X> <Job <Get 1>>
}
m0s0 {
((e.N)(e.T)(e.F)(e.I)) e.1 e.T e.2 e.T e.3 e.I e.4 e.T e.5 e.T e.6 = <m2s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)(e.5)(e.6)><Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.T e.2 e.T e.3 e.F e.4 e.T e.5 = <m5s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)(e.5)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.F e.4 e.I e.5 = <m8s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)(e.5)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.T e.4 e.I e.5 = <m6s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)(e.5)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.T e.4 = <m9s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.F e.4 = <m7s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.I e.4 = <m4s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 = <m1s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.T e.2 e.T e.3 = <m0s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.T e.2 = <m3s1 (<Dg 'dict'>)(e.1)(e.2)> <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.Z = <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
}
m2s1 { (e.D) e.X = <m2s2 (e.D) e.X> <Br 'dict=' e.D>; }
m5s1 { (e.D) e.X = <m5s2 (e.D) e.X> <Br 'dict=' e.D>; }
m8s1 { (e.D) e.X = <m8s2 (e.D) e.X> <Br 'dict=' e.D>; }
m6s1 { (e.D) e.X = <m6s2 (e.D) e.X> <Br 'dict=' e.D>; }
m9s1 { (e.D) e.X = <m9s2 (e.D) e.X> <Br 'dict=' e.D>; }
m7s1 { (e.D) e.X = <m7s2 (e.D) e.X> <Br 'dict=' e.D>; }
m4s1 { (e.D) e.X = <m4s2 (e.D) e.X> <Br 'dict=' e.D>; }
m1s1 { (e.D) e.X = <m1s2 (e.D) e.X> <Br 'dict=' e.D>; }
m0s1 { (e.D) e.X = <m0s2 (e.D) e.X> <Br 'dict=' e.D>; }
m3s1 { (e.D) e.X = <m3s2 (e.D) e.X> <Br 'dict=' e.D>; }
m0s2 { ()(e.1)(e.2)(e.3) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3) = <Put 2 e.1 e.T e.2 e.T e.3> <m0s2 (e.tail) (e.1)(e.2)(e.3)>;}
m1s2 { ()(e.1)(e.2)(e.3) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3) = <Put 2 e.1 e.N e.2 e.T e.3> <m1s2 (e.tail) (e.1)(e.2)(e.3)>;}
m2s2 { ()(e.1)(e.2)(e.3)(e.4)(e.5)(e.6) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)(e.5)(e.6) = <Put 2 e.1 e.T e.2 e.T e.3 e.I e.4 e.T e.5 e.T e.6><m2s2 (e.tail) (e.1)(e.2)(e.3)(e.4)(e.5)(e.6)>;}
m3s2 { ()(e.1)(e.2) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2) = <Put 2 e.1 e.T e.2> <m3s2 (e.tail) (e.1)(e.2)>;}
m4s2 { ()(e.1)(e.2)(e.3)(e.4) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4) = <Put 2 e.1 e.N e.2 e.T e.3 e.I e.4> <m4s2 (e.tail) (e.1)(e.2)(e.3)(e.4)>;}
m5s2 { ()(e.1)(e.2)(e.3)(e.4)(e.5) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)(e.5) = <Put 2 e.1 e.T e.2 e.T e.3 e.F e.4 e.T e.5> <m5s2 (e.tail) (e.1)(e.2)(e.3)(e.4)(e.5)>;}
m6s2 { ()(e.1)(e.2)(e.3)(e.4)(e.5) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)(e.5) = <Put 2 e.1 e.N e.2 e.T e.3 e.T e.4 e.I e.5> <m6s2 (e.tail) (e.1)(e.2)(e.3)(e.4)(e.5)>;}
m7s2 { ()(e.1)(e.2)(e.3)(e.4) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4) = <Put 2 e.1 e.N e.2 e.T e.3 e.F e.4> <m7s2 (e.tail) (e.1)(e.2)(e.3)(e.4)>;}
m8s2 { ()(e.1)(e.2)(e.3)(e.4)(e.5) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)(e.5) = <Put 2 e.1 e.N e.2 e.T e.3 e.F e.4 e.I e.5> <m8s2 (e.tail) (e.1)(e.2)(e.3)(e.4)(e.5)>;}
m9s2 { ()(e.1)(e.2)(e.3)(e.4) = ;
(((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4) = <Put 2 e.1 e.N e.2 e.T e.3 e.T e.4> <m9s2 (e.tail) (e.1)(e.2)(e.3)(e.4)>;}
Затем в интерфейсе выбираем таблицы по Insert:
при этом поле аргумента автоматически изменяется в виде списка ()()()...
Далее как обычно [ExportMemoToFile] [RefGo] и [ImportFileToMemo]:
Теперь обратная задача - убрать некоторые таблицы. Ref файл для удаления - rmn.ref:
Код: Выделить всё
*
* По номерам из Arg3 ["(Начало1 Кол-во1)(Начало2 Кол-во2)(Начало3 ... )"]
* удалить в ref5.vip таблицы с этими номерами из dict.txt по образцам m0-m9.
*
$ENTRY Go { = <Open 'r' 1 'dict.txt'><Br 'dict=' <Pre (<As <Arg 3>>) <Get 1>>>
<Open 'r' 1 <Arg 1>> <Open 'w' 2 <Arg 2>> <Job <Get 1>>
}
Pre { (e.X) 0 = ;
(e.1 (e.N) e.2) e.N ' ' e.T ' ' e.F ' ' e.I = ((e.N)(e.T)(e.F)(e.I)) <Pre (e.1 (e.N) e.2) <Get 1>>;
(e.X) e.Z = <Pre (e.X) <Get 1>>;
}
As { = ;
'\(' e.1 ' ' e.2 '\)' e.Tail = <Seq <Numb e.1> <Numb e.2>> <As e.Tail>
}
Seq { s.Begin 0 = ;
s.Begin s.Count = (<Symb s.Begin>) ' ' <Seq <+ s.Begin 1> <- s.Count 1>>
}
Job { 0 = ;
e.X = <m0s0 (<Dg 'dict'>) e.X> <Job <Get 1>>
}
m0s0 {
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.T e.2 e.T e.3 e.I e.4 e.T e.5 e.T e.6 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.T e.2 e.T e.3 e.F e.4 e.T e.5 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.F e.4 e.I e.5 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.T e.4 e.I e.5 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.T e.4 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.F e.4 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.I e.4 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.T e.2 e.T e.3 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.T e.2 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.X = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail> <Put 2 e.X>;
}
Выбираем таблицы для удаления (не забываем скомпилить - один раз):
Далее как обычно [ExportMemoToFile] [RefGo] и [ImportFileToMemo]:
Теперь добавим таблицу к уже изменённому интерфейсу:
тут отличие только в том, что нужно знать номер по алфавиту последней добавленной ранее таблицы, смотрим её номер и вводим его в поле дополнительного аргумента, в нашем случае [25]:
Наконец результат устраивает:
Остаётся сохранить новый Ref5.vip и скомпилить его как обычно.
Примечание: у таблицы HierZar нет односегментного индекса Nrec
Re: Использую Рефал в Галактике:)
Все это интересно. Но только не понятно к каким прикладным задачам это может быть применено?
Академический смысл понятен, но практический не очень.
Академический смысл понятен, но практический не очень.
-
- Постоянный обитатель
- Сообщения: 135
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Москва Связьтранснефть
Re: Использую Рефал в Галактике:)
>Академический смысл понятен, но практический не очень
Согласен с LaaLaa;) Каждый из нас может припомнить мудрёных узкоспецифических задач, когда-то решавшихся в "Гал", но не стоит, наверное, без необходимости помещать это здесь?
Согласен с LaaLaa;) Каждый из нас может припомнить мудрёных узкоспецифических задач, когда-то решавшихся в "Гал", но не стоит, наверное, без необходимости помещать это здесь?
С ув..
Re: Использую Рефал в Галактике:)
К стати. В тему функциональных языков программирования. Мы недавно с коллегами рассматривали теоретическую возможность применения языка Haskel или F#. Для реализации циклических ПАТ-отчетов и расчетов в ТХО.
Re: Использую Рефал в Галактике:)
LaaLaa
нравится Хаскел!
Практичный пример глобальной трансформации - чистка Memo полей,
код clr.ref:
в интерфейсе помечаем таблицы по [Insert] или сразу все [Gray Plus] и записи по [Ctrl+Gray Plus], выставляем checkbox [commit] и [batch] и [RefGo].
Примечание: При компиляции нет проблем добавить в ЛТ все (106) таблиц, а при выполнении по дефолту есть ограничение в (20).
нравится Хаскел!
Практичный пример глобальной трансформации - чистка Memo полей,
код clr.ref:
Код: Выделить всё
$ENTRY Go { = <Open 'r' 1 <Arg 1>>
<Open 'w' 2 <Arg 2>>
<Job <Get 1>>
}
Job {
0 = ;
e.X = <Job <Get 1>>
}
Примечание: При компиляции нет проблем добавить в ЛТ все (106) таблиц, а при выполнении по дефолту есть ограничение в (20).
Re: Использую Рефал в Галактике:)
Не осилил толком его пока. Из за разрыва черепной коробки.sensoft писал(а):LaaLaa
нравится Хаскел!
Re: Использую Рефал в Галактике:)
sensoft
Не осилил твой пример. В чем там суть, и какая практическая польза? Поясни, если не сложно, человеческим языком. В кодогенерации? В динамической компиляции в рантайме. Есть V4A, чем не устроил?
Не осилил твой пример. В чем там суть, и какая практическая польза? Поясни, если не сложно, человеческим языком. В кодогенерации? В динамической компиляции в рантайме. Есть V4A, чем не устроил?
Re: Использую Рефал в Галактике:)
galover
Хочу вернуться к естественной для себя форме работы с символьной информацией:). Интерфейс пока классический, но что-то уже можно, напр: генерить скрипты, разбирать формы, может доказательства для уменьшения теста. В примере демка множественного нагибания Memo:))).
Хочу вернуться к естественной для себя форме работы с символьной информацией:). Интерфейс пока классический, но что-то уже можно, напр: генерить скрипты, разбирать формы, может доказательства для уменьшения теста. В примере демка множественного нагибания Memo:))).
Re: Использую Рефал в Галактике:)
Ключевая фишка здесь использовать именно функциональный язык программирования, как альтернативу процедурному (императивному) языку.galover писал(а):Не осилил твой пример. В чем там суть, и какая практическая польза? Поясни, если не сложно, человеческим языком. В кодогенерации? В динамической компиляции в рантайме. Есть V4A, чем не устроил?
Разница межу этим и языками в методах программирования. Ссылка по теме на википедии: http://ru.wikipedia.org/wiki/%D0%AF%D0% ... 0%B8%D1%8F
Re: Использую Рефал в Галактике:)
LaaLaa
я в курсе, что есть функциональные языки, я не уловил, какая цель преследуется в приведенном примере
я в курсе, что есть функциональные языки, я не уловил, какая цель преследуется в приведенном примере
-
- На пенсии
- Сообщения: 797
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: г. Тюмень
- Контактная информация:
Re: Использую Рефал в Галактике:)
Хм... Соль есть, только куда солить не ясно.
Жду выхода Вселенная 2.12!
Re: Использую Рефал в Галактике:)
Увы, не нашёл eBNF's для ВИП и vip.exe не open-source. А потому специализация откладывается:)Max_Fin писал(а):Хм... Соль