О применении библиотеки FastScript в своих проектах.
Часть-4 «Парсинг раздела «Uses» FS-скрипта».
Приложение-2. Дополнительные функции к разделу «Корректная выгрузка библиотечных FS-скриптов, хранящихся в БД, и «подключение» их к «вызывающему» FS-скрипту»


Исходные тексты дополнительных (существенных) функций, используемых в fsiBase_Main_Script_Mnemo_Prepare(…).


function DirName_from_List_EnvVars(List_EnvVars:TStrings):string;
//Получить полное имя папки для библиотечных файлов
begin
  Result:='';
  if Assigned(List_EnvVars) then begin
     if List_EnvVars.Count>0 then begin
        Result:=trim(List_EnvVars.Values['App_Dir']);
        Result:=Result+trim(List_EnvVars.Values['Scr_Dir']);
        Result:=Result+trim(List_EnvVars.Values['Lib_Dir']);
     end;
  end;
end;


function FS_LoadFromDB(Q:TFDQuery;
                       ScrMnemo:string;
                       ItsLibOnly:boolean=true
                      ):string;
//Загрузить FS-скрипт по МнемоКоду
Var
  sFilter:string;
begin
  Result:='';
  ScrMnemo:=trim(ScrMnemo);
  if ScrMnemo<>'' then begin
     sFilter:='(mnemocode_lc='+#39+AnsiLowerCase(ScrMnemo)+#39+')';
     if ItsLibOnly then begin
        sFilter:=sFilter+' and (its_lib=1)';
     end;
     Result:=DB_Table_Field_AsString(Q,
                                     'fs_scripts',
                                     'fs_script',
                                     sFilter
                                     );
  end;
end;


function Delete_start_String(Sx : string; Index:integer) : string;
//Удалить начало строки, начиная с 1-й позиции и до заданной (включая заданную)
begin
  Result:=Sx;
  if length(Sx)>0 then begin
     if Index>0 then begin
        System.Delete(Result, 1, Index);
     end;
  end;
end;


function Delete_end_String(Sx : string; Index:integer) : string;
//Удалить окончание строки, начиная с заданой позиции
begin
  Result:=Sx;
  if length(Sx)>0 then begin
     if Index>0 then begin
        System.Delete(Result, Index, length(Result)+1);
     end;
  end;
end;


function DB_Table_Field_AsString(Q:TFDQuery;
                                 tndb:string;
                                 fntn:string;
                                 sFilter:string;
                                 sValDef:string='';
                                 sOrderBy:string='';
                                 YesTrim:boolean=true):string;
//Получить значение заданного поля (как строка) заданной таблицы Б.Д. по заданному фильтру
Var
  Yes:boolean;
begin
  Result:=sValDef;
  tndb:=trim(tndb);
  fntn:=trim(fntn);
  if (length(tndb)>0) and (length(fntn)>0) then begin
      if Assigned(Q) then begin
         sFilter:=trim(sFilter);
         sOrderBy:=trim(sOrderBy);
         Yes:=false;
         Q.Close;
         Q.SQL.Clear;
         TRY
           Q.SQL.Add('select');
           Q.SQL.Add(fntn);
           Q.SQL.Add('from');
           Q.SQL.Add(tndb);
           if length(sFilter)>0 then begin
              Q.SQL.Add('where');
              Q.SQL.Add(sFilter);
           end;
           if length(sOrderBy)>0 then begin
              Q.SQL.Add('order by');
              Q.SQL.Add(sOrderBy);
           end;
           //Q.SQL.Add('limit 1');
           Q.Open;
           if Q.RecordCount>0 then begin
              if not Q.Fields[0].IsNull then begin
                 Result:=Q.Fields[0].AsString;
              end;
           end;
           Yes:=true;
         FINALLY
           Q.Close;
           if not Yes then begin
              ShowMessage(Q.SQL.Text);
           end;
           Q.SQL.Clear;
         END;
      end;
  end;
  if YesTrim then Result:=trim(Result);
end;


function Replace_In_String(const S, Srch, Replace: string; CaseIgnore:boolean=true): string;
//замена подстроки в строке
var
  N:Integer;
  Source:string;
begin
  Source:= S;
  Result:= '';
  repeat
    if CaseIgnore then begin
       N:=Pos(AnsiUpperCase(Srch), AnsiUpperCase(Source));
    end
    else begin
       N:=Pos(Srch, Source);
    end;
    if N>0 then begin
       Result:=Result+Copy(Source,1,N-1)+Replace;
       Source:=Copy(Source,N+Length(Srch),MaxInt);
    end
    else begin
      Result:=Result+Source;
    end;
  until N<=0;
end;


function Files_Delete(NameMask: String): integer;
//Удалить файлы по маске
Var
  DirInfo: TSearchRec;
  Err: integer;
begin
  Result := 0;
  Err := 0;
  Err := FindFirst(NameMask, faArchive, DirInfo);
  while Err = 0 do
   begin
    if DeleteFile(ExtractFilePath(NameMask) + DirInfo.Name) then begin
       Result := Result + 1;
    end;
    Err := FindNext(DirInfo);
  end;
  FindClose(DirInfo);
end;

07.04.2024  roamer55.ru