powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Fast Report - апострофы в переменных
25 сообщений из 84, страница 1 из 4
Fast Report - апострофы в переменных
    #39956398
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер.
Может кто сталкивался с такой проблемой не могу понять или я что то не так делаю или звезды не так сошлись. Задаю переменную для отчета FastReport Report.Variables['TxtConcl']:='''' + FConclusion.Text + '''';

FConclusion: TStringList - задается в обычном Memo и передается в функцию формирования отчета

В отчете текст выводится в апострофах я не понимаю от куда они берутся пробовал удалять их при задании переменной тогда вылетает ошибка при формировании. И по моему в документации написано что переменные типа String задаются в двойных кавычках. При этом другие переменные в одну строку (без спец символов) выводятся нормально. Кто ни будь может посоветовать как от них избавиться и почему в обычной строке их нет а в строке с символами chr(10) + chr(13) появляются апострофы.

Пример:

'11111

222

333
'
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956407
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SDima55> пробовал удалять их при задании переменной
SDima55> тогда вылетает ошибка при формировании.

Текст ошибки и тип переменной покажи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956416
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55

И по моему в документации написано что переменные типа String задаются в двойных кавычках. При этом другие переменные в одну строку (без спец символов) выводятся нормально.
'

Переменные отчета это выражения скрипта. Т.е. литералы в переменных указываться в соответствии с выбранным языком скрипта.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956422
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам,
Memo19: error in expression: Expression expected
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956423
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_,
язык скрипта PASCAL
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956425
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_,

PascalScript
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956427
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам,
Переменные в FastReport Variants я переменной присваиваю String в TStringList свойство Text возращает string
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956438
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не припомню подобных проблем...

Можно посмотреть в сторону события OnGetValue и там заполнять нужное значение.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956439
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,
Нужно формировать соответствующий языку строковый литерал.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
  function BuildStringLiteral(List: TStrings): String;
  const sLineBreak = '#13#10';
  var
    i, Sz, Len: Integer;
  begin
    if List.Count = 0 then
    begin
      Result := ''''+'''';
      Exit;
    end;
    Sz := 0;
    for i := 0 to List.Count - 1 do
     Inc(Sz, Length(List[i]) + 8);
    Dec(Sz, 6);
    SetLength(Result, Sz);
    Sz := 1;
    for i := 0 to List.Count - 1 do
    begin
      Result[Sz] := '''';
      Len := Length(List[i]);
      CopyMemory(@Result[Sz + 1], @List[i][1], Len * SizeOf(Char));
      Inc(Sz, Len + 2);
      Result[Sz - 1] := '''';
      if i < List.Count - 1 then
        CopyMemory(@Result[Sz], @sLineBreak[1], Length(sLineBreak) * SizeOf(Char));
      Inc(Sz, 6);
    end;
  end;
...
begin
  frxReport.Variables.Variables['Var1'] := BuildStringLiteral(s);
end;



Либо, как уже предложили, вместо переменных отчета использовать событие OnGetValue .
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956441
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_,

Это в скрипте рапорта функцию описывать или не посредственно в delphi
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956443
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_,
Дело в том что раньше все проекты делал на ReportBuilder недавно перешел на FastReport мне просто интересно это зависит от чего
в Memo строка типа String я ее присваиваю переменной Variant Report выводит апострофы но в других строках без спец символов не выводит? так и должно быть или чтото не так. Просто чтоб потом не задавь глупые вопросы.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956444
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,

Это код для Delphi.
Если вызов делается в скрипте, то можно просто объявить переменную там же с типом String и использовать ее имя в выражении текстового поля [ИмяПеременнойСкрипта].
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956446
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,
Я уже объяснил выше. Переменные отчета это выражения, которые содержат сприпт. Там должно быть либо выражение, либо литерал.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956448
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_,

Просто если это нормально то тогда надо выносить в свойство MemoView потому что часто бывает когда пользователь вводит некий текст в Memo и его хотелось бы увидеть без доп. кавычек. Я же язык скрипта поставил pascal. А так два дня парусь и понять не могу либо лыжи не едут или я ****й
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956451
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,
Если передача параметра идет из кода приложения и хочется передавать именно через Report.Variables, то используйте функцию приведенную выше.

Если список формируется в скрипте, то проще использовать переменную скрипта в выражении(пример прицепил).
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956454
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot _Den_Z_#22131503]SDima55,
Нужно формировать соответствующий языку строковый литерал.
[src delphi]
function BuildStringLiteral(List: TStrings): String;
const sLineBreak = '#13#10';
var
i, Sz, Len: Integer;
begin
if List.Count = 0 then
begin
Result := ''''+'''';
Exit;
end;
Sz := 0;
for i := 0 to List.Count - 1 do
Inc(Sz, Length(List[i]) + 8);
Dec(Sz, 6);
SetLength(Result, Sz);
Sz := 1;
for i := 0 to List.Count - 1 do
begin
Result[Sz] := '''';
Len := Length(List[i]);
CopyMemory(@Result[Sz + 1], @List[i][1], Len * SizeOf(Char));
Inc(Sz, Len + 2);
Result[Sz - 1] := '''';
if i < List.Count - 1 then
CopyMemory(@Result[Sz], @sLineBreak[1], Length(sLineBreak) * SizeOf(Char));
Inc(Sz, 6);
end;
end;
...
begin
frxReport.Variables.Variables['Var1'] := BuildStringLiteral(s);
end;

Это работает огромное спасибо. Т. е. я так понял String вводимый из Memo который может содержать спец символы необходимо прогонять через эту функцию. Еще раз спасибо. Всем удачи но два дня потеряных жалко. Весь мозг взорвал себе. Всем удачи
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956457
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_,

Спасибо большое. Удачи. Я так понял функцию нужно делать глобальную. Пригодиться.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956458
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,

Просто все Report.Variables вычисляются как скрипт, т.е. там может быть вызов функции такой как Format или любой другой.
Соответственно все значения должны быть в виде литералов скрипта, т.е. для паскаля: 11, 1.34, '123', '123'#13#10'123' (фактически как вы пишете строковый литерал в самой Delphi).

Если вычисления выражений не нужны, то лучше использовать переменные скрипта или событие onGetValue.
А функция просто формирует строковый литерал для паскаля ('123'#13#10'123').
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956462
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_,

Решить та поставленую задачу можно было но я посчитал сто через GetValue будет не совсем правильно. Но в целом я все понял. Еще огромное спасибо. Просто интересно в инете не наше по этой теме ничего или все такие умные или у некого такого небыло.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956465
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,
Да еще вопрос я на другом форуме тоже задавал его. Но за день не ответил никто можно _Den_Z_ твой ответ вставить?
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956473
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,
Конечно, без проблем.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956479
_Den_Z_,

Какой ужасный код, с точки оптимизации - которую вы пытались сделать


TestBuild: 0.717718
BuildStringLiteral: 3.569232

Будь проще

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
function TestBuild(Lines: TStrings): string;
const
  SizeAlloc = 32 * 4;
var
  i, Len, current, c: Cardinal;
  wd: string;
begin
  i := Lines.Count;
  if i = 0 then
    Exit('''' + '''');

  Len := SizeAlloc;
  SetLength(Result, Len);

  wd := '''' + Lines[0] + '''';
  current := Length(wd);
  Move(wd[1], Result[1], current * SizeOf(Char));

  for i := 1 to i - 1 do
  begin
    wd := '#13#10' + '''' + Lines[i] + '''';

    c := Length(wd);

    if (current + c) > Len then
    begin
      Inc(Len, SizeAlloc);
      SetLength(Result, Len);
    end;

    Move(wd[1], Result[current], c * SizeOf(Char));
    Inc(current, c);
  end;
  SetLength(Result, current - 1);
end;




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  T, T1, T3: Int64;
  i, A: integer;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): integer; cdecl; varargs; external 'msvcrt.dll';

function PrintTime(T: Int64): AnsiString;
var
  A, b: Int64;
begin
  Result := '';
  if QueryPerformanceCounter(A) and QueryPerformanceFrequency(b) then
  begin
    SetLength(Result, 25);
    SetLength(Result, sprintf(PAnsiChar(Result), '%f', single((A - T) / b)));
  end;
end;

function BuildStringLiteral(List: TStrings): String;
const
  sLineBreak = '#13#10';
var
  i, Sz, Len: integer;
begin
  if List.Count = 0 then
  begin
    Result := '''' + '''';
    Exit;
  end;
  Sz := 0;
  for i := 0 to List.Count - 1 do
    Inc(Sz, Length(List[i]) + 8);
  Dec(Sz, 6);
  SetLength(Result, Sz);
  Sz := 1;
  for i := 0 to List.Count - 1 do
  begin
    Result[Sz] := '''';
    Len := Length(List[i]);
    CopyMemory(@Result[Sz + 1], @List[i][1], Len * SizeOf(Char));
    Inc(Sz, Len + 2);
    Result[Sz - 1] := '''';
    if i < List.Count - 1 then
      CopyMemory(@Result[Sz], @sLineBreak[1], Length(sLineBreak) * SizeOf(Char));
    Inc(Sz, 6);
  end;
end;

function TestBuildStringLiteral(List: TStrings): AnsiString;
var
  arr: Pointer;
  i, r: integer;
begin
  QueryPerformanceCounter(T1);
  for r := 0 to 3 do
    for i := 0 to 1000 do
      BuildStringLiteral(List);

  Result := PrintTime(T1);
end;

function TestBuild(Lines: TStrings): string;
const
  SizeAlloc = 32 * 4;
var
  i, Len, current, c: Cardinal;
  wd: string;
begin
  i := Lines.Count;
  if i = 0 then
    Exit('''' + '''');

  Len := SizeAlloc;
  SetLength(Result, Len);

  wd := '''' + Lines[0] + '''';
  current := Length(wd);
  Move(wd[1], Result[1], current * SizeOf(Char));

  for i := 1 to i - 1 do
  begin
    wd := '#13#10' + '''' + Lines[i] + '''';

    c := Length(wd);

    if (current + c) > Len then
    begin
      Inc(Len, SizeAlloc);
      SetLength(Result, Len);
    end;

    Move(wd[1], Result[current], c * SizeOf(Char));
    Inc(current, c);
  end;
  SetLength(Result, current - 1);
end;

function TestTestBuild(List: TStrings): AnsiString;
var
  arr: Pointer;
  i, r: integer;
begin
  QueryPerformanceCounter(T1);
  for r := 0 to 3 do
    for i := 0 to 1000 do
      TestBuild(List);

  Result := PrintTime(T1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Lines.Add('TestBuild: ' + TestTestBuild(Memo1.Lines));
  Memo2.Lines.Add('BuildStringLiteral: ' + TestBuildStringLiteral(Memo1.Lines));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(TestBuild(Memo1.Lines));
  ShowMessage(BuildStringLiteral(Memo1.Lines));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  S: string;
begin
  S := '';
  for i := 0 to 100 do
    S := S + 'Ijisjergije488reujiorjt' + i.ToString + #13#10;
  Memo1.Text := S;
end;

end.

...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956482
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный,

Это тоже интересно т. к. отчет формируется достаточно долго много картинок но кроме него некто не от ветил поэтому ему большое спасибо а Вам спасибо
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956483
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, ты снова напился. Это не PHP, это FastReport.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956485
SDima55,

Функция быстрее в 5 раз. Но в принципе можно и быстрее её сделать. Но это самый простой вариант который можно написать за 2 минуты
...
Рейтинг: 0 / 0
25 сообщений из 84, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Fast Report - апострофы в переменных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]