можно ли в паскаль скрипте дизайнера использовать следующии функции: Mkdir, Createdir

отредактировано 19:24 Раздел: FastReport 4.0
Здравствуйте. Подскажите пожайлуста, можно ли в паскаль скрипте дизайнера использовать следующии функции: MkDir, CreateDir. Если возможно, то как правелтно описать? или как то можно запустить в дизайнере другой проект и настроить с ним взаимодействие? :)

Комментарии

  • отредактировано 19:24
    onUserFunction подойдёт?
  • отредактировано 19:24
    Nightmareterrible написал: »
    onUserFunction подойдёт?
    А как правельно описать её использование? Я пишу onUserFunction(MKdir (s1)); в ответ получаю идентификатор не определен? :) Просто в дезайнере используются видимо не все классы объектов, а как подключить я не знаю. Когда использую uses он пишет begin extend. Подскажите как можно реализовать эти функции.
  • отредактировано 19:24
    В коде Delphi:
    frxReport1.OnUserFunction := frxReport1UserFunction;
    frxReport1.AddFunction('function GET_WK_NAME(id:integer): string');
    
    function TDataModule5.frxReport1UserFunction(const MethodName: string;
      var Params: Variant): Variant;
    begin
      inherited;
      if MethodName = 'GET_WK_NAME' then
        Result := Get_wk_name(Params[0]);
    end;
    
    Обратите внимание, что MethodName передаётся в верхнем регистре (всегда).

    В коде Fasterport или в Memo FastReport
    Get_WK_Name(123);
  • отредактировано June 2014
    Nightmareterrible написал: »
    В коде Delphi:
      inherited;
    
    Пишет не определенный идентификатор. :)
    если убрать эту строчку то ругается на Get_wk_name неопределенный идентификатор.
  • отредактировано 19:24
    Get_wk_name - У вас такая функция определена в модуле TDataModule5 ?
    Не забудьте, что функцию надо создать в том же модуле, в котором вызывается frxReport1UserFunction() или использовать <имя модуля>.<функция>().

    inherited может и не надо, но ругаться не должно. Какая версия FastReport ? Попробуйте в uses подключить чего-нибудь из этого: frxClass, frxPreview, frxDsgnIntf
  • отредактировано 19:24
    Nightmareterrible написал: »
    Get_wk_name - У вас такая функция определена в модуле TDataModule5 ?
    Не забудьте, что функцию надо создать в том же модуле, в котором вызывается frxReport1UserFunction() или использовать <имя модуля>.<функция>().
    Я так понимаю что нужно модуль DataModule5 подключать через uses, но когда я пишу uses 'unit1.pas'; выдает ошибку Begin expected и ставит указатель перед uses. на сколько я знаю, перед uses не должно стоять ни begin ни end ни что либо другое в редакторе поля паскаль скрипт .
    Nightmareterrible написал: »
    Попробуйте в uses подключить чего-нибудь из этого: frxClass, frxPreview, frxDsgnIntf
    Когда указываешь uses frxClass, frxPreview, frxDsgnIntf; выдает ошибку identifer expected и ставит указатель на frxClass.
    Nightmareterrible написал: »
    inherited может и не надо, но ругаться не должно. Какая версия FastReport ?
    Но ругается :) . Fastreport 4.9. дезайнер FastReport идет как компонент к программе от которой нет исходников. Моя задача формировать пакеты документов при формировании отчета, но я не могу использовать некоторые функции. :) в частности mkdir, createdir.
  • отредактировано 19:24
    Сразу надо было говорить, что исходников нету.
    Данный код был написал для использования в среде Delphi.

    В FasteReport отсутствуют функции по управлению папками и файлами файловой системы - можно использовать только код компилируемого приложения (в данном случае на Delphi).
  • отредактировано 19:24
    Nightmareterrible написал: »
    В FasteReport отсутствуют функции по управлению папками и файлами файловой системы - можно использовать только код компилируемого приложения (в данном случае на Delphi).
    то есть я никак не смог реализовать данную работу через фастрепорт, даже если я напишу батник я не смогу его запусть в скрипте фастарепорт? :)
  • отредактировано 19:24
    Походу это так. К сожалению.
    Функций ShellExec и WinExec тоже нету.
  • отредактировано June 2014
    Nightmareterrible написал: »
    Походу это так. К сожалению.
    Функций ShellExec и WinExec тоже нету.
    Может быть есть какая то функция котороя отдельный модуль запустит скажем разработаный в делфи или джаве при форимировании отчета?
  • отредактировано 19:24
    Если такое и есть, то об этом будет известно будет уже только разработчикам FastReport - задайте вопрос в техподдержку. Без модификации исходных кодов программы я способов не знаю.
  • отредактировано 19:24
    Nightmareterrible написал: »
    Если такое и есть, то об этом будет известно будет уже только разработчикам FastReport - задайте вопрос в техподдержку. Без модификации исходных кодов программы я способов не знаю.
    Спасибо за всё :) Буду искать другие пути решения этой задачи.
  • отредактировано 19:24
    Решила реализовать формирование пакетов с помощью батника который создается при формировании отчета, конечно запускать его придется в ручную. Возник следующий вопрос как записать файл бат в нужной кодировке. :) Фастрепорт сохраняет почемуто в юникоде, бат не работает по-этому. Пересохранив бат в ANSI он прекрасно выполняет свои функции. Как выполнить запись в кодирвке ANSI? :) Для сохранения файла использую следующее:

    procedure CrFileBat5;
    var
    f:TFileStream;
    st:string;
    x:integer;
    begin
    );
    f:=TFileStream.Create( Edit2.text+'\mybat.bat',fmCreate);

    x:= length(memo22.text)*2;

    f.Seek(0,soFromEnd);
    f.write(memo22.text,x);

    f.Free;
    end;

    memo22.text содержит контент батника
  • отредактировано June 2014
    Если типа AnsiString нет, можно сделать по-тупому:
    for i := 1 to Length(s) do
    begin
      bytechar := Byte(s[i]);
      f.write(bytechar, 1);
    end;
    
    Но это сработает корректно только если в тексте будет только латиница и обычные служебные символы (с кодом < 128).

    Вообще PascalScript поддерживает загрузку сторонних DLL ( линк), но в FR это не работает - возможно, старая версия PS. А так можно было бы вообще без проблем юзать весь WinAPI
  • отредактировано 19:24
    Свойство Memo.Text - это TWideStrings, соответственно в файл тоже будет сохранятся юникод. Чтобы этого не происходило нужно использовать конвертирование в другую кодировку - однако таких функций у FastReport нету.
    Рекомендую посмотреть в сторону VisualBasic-скриптов или hta . Последний кстати используется в WPI, а WPI работает на всех компьютерах. Рекомендую взять какой-нибудь WPI и посмотреть исходные коды его hta-скрипта.
  • отредактировано 19:24
    написал:
    Свойство Memo.Text - это TWideStrings, соответственно в файл тоже будет сохранятся юникод. Чтобы этого не происходило нужно использовать конвертирование в другую кодировку - однако таких функций у FastReport нету.
    Рекомендую посмотреть в сторону VisualBasic-скриптов или hta . Последний кстати используется в WPI, а WPI работает на всех компьютерах. Рекомендую взять какой-нибудь WPI и посмотреть исходные коды его hta-скрипта.
    Может быть можно использовать переменную типа поддерживающего ANSI только можно ли будет использовать выше указанный код, и какой тип у переменной должен тогда быть? :)
  • отредактировано 19:24
    Ууу, тут даже приведение типов не работает...
    b := Byte(s[1]);
    Too many actual parameters
    
  • отредактировано June 2014
    Так в чем проблема?
    procedure CrFileBat5(s: string);
    var
     f:TFileStream;
    begin
     f:=TFileStream.Create('c:\mybat.bat',fmCreate); 
     f.write(s,length(s));
     f.Free; 
    end;  
    
    begin  
      CrFileBat5('blabla');                                                              
    end.
    

    Записывает в ansi, размер 6 байт
  • отредактировано 19:24
    Fr0sT написал: »
    Так в чем проблема?
    procedure CrFileBat5(s: string);
    var
     f:TFileStream;
    begin
     f:=TFileStream.Create('c:\mybat.bat',fmCreate); 
     f.write(s,length(s));
     f.Free; 
    end;  
    
    begin  
      CrFileBat5('blabla');                                                              
    end.
    

    Записывает в ansi, размер 6 байт
    для многострочности значит я должна использовать StringList и все будет сохранять в ansi :) попробую))
  • отредактировано 19:24
    Да не обязательно
    procedure CrFileBat5(list: twidestrings);
    var
     f:TFileStream;
     s: string;
     i: Integer;                          
    begin
     f:=TFileStream.Create('c:\mybat.bat',fmCreate); 
     for i := 0 to list.count-1 do
     begin                
       s := list[i] + #13#10;                               
       f.write(s,length(s));
     end;                         
     f.Free; 
    end;  
    
    begin  
      CrFileBat5(Memo10.Memo);                                                              
    end.
    
  • отредактировано 19:24
    Fr0sT написал: »
    Да не обязательно
    procedure CrFileBat5(list: twidestrings);
    var
     f:TFileStream;
     s: string;
     i: Integer;                          
    begin
     f:=TFileStream.Create('c:\mybat.bat',fmCreate); 
     for i := 0 to list.count-1 do
     begin                
       s := list[i] + #13#10;                               
       f.write(s,length(s));
     end;                         
     f.Free; 
    end;  
    
    begin  
      CrFileBat5(Memo10.Memo);                                                              
    end.
    
    В этом случае русские символы приврощаются в непонять что поэтому батник не срабатыввает :)
  • отредактировано 19:24
    Ну это закономерно! Я же сказал, что сработает только для латиницы. Теоретически, можно сделать батник-запускальщик, который будет устанавливать нужную кодировку перед выполнением сгенеренного батника, но легче избавиться от русских символов, если это возможно
  • отредактировано 19:24
    Fr0sT написал: »
    Ну это закономерно! Я же сказал, что сработает только для латиницы. Теоретически, можно сделать батник-запускальщик, который будет устанавливать нужную кодировку перед выполнением сгенеренного батника, но легче избавиться от русских символов, если это возможно
    К сожелению это не возможно )) Спасибо за совет))
  • отредактировано 19:24
    А вообще, можно же и из того же батника, покури команду chcp
  • gpigpi
    отредактировано 19:24
    var f: TMemoryStream;
        s: TStringList;                                 
    begin
         f := TMemoryStream.Create;
         s := TStringList.Create;
         s.Add('тест1');
         s.Add('тест2');
         s.SaveToStream(f);
         f.Position := 0;
         f.SaveToFile('C:\test.bat');                                     
         s.Free;
         f.Free;                              
    end.
    
  • отредактировано 19:24
    gpi написал: »
    var f: TMemoryStream;
        s: TStringList;                                 
    begin
         f := TMemoryStream.Create;
         s := TStringList.Create;
         s.Add('тест1');
         s.Add('тест2');
         s.SaveToStream(f);
         f.Position := 0;
         f.SaveToFile('C:\test.bat');                                     
         s.Free;
         f.Free;                              
    end.
    
    Спасибо огромное, все работает)) Спасибо всем за помощь))

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.