Автор Тема: LazReport / Вставка значений из текстовых полей [решено]  (Прочитано 2430 раз)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Всем привет!

Как можно вставить в отчёт значение из Edit1.Text ?
У меня там разные значения могут быть, поэтому нужно именно переменной.
Я переменную в отчёте создал, в отчёте разместил её в нужном месте, но как в коде передать значение переменное в отчёты -- не знаю.
Найти не получается.
« Последнее редактирование: 16.03.2015 22:09:11 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
проект бы тестовый в простейшем виде что не работает...

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
проект бы тестовый в простейшем виде что не работает...
Без проблем! (см. вложения)

Я создал переменную edit_text. Остальное вроде бы понятно в отчёте расписал.

PS. Странно, почему *.7z нельзя прикрепить к сообщению ? Пришлось использовать *.tar.gz...
Сноси Винду, переходи на Линукс ! :)

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
вечером попробую

Оффлайн alxl

  • Давно тут
  • **
  • Сообщений: 128
procedure TForm1.frReport1GetValue(const ParName: String; var ParValue: Variant );
begin
  if parname='edit_text' then parvalue:=edit1.text;
end;

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Это чертовски смешно, но я в примере который приложил, воспроизвёл, а в своём проекте никак не получается...
То есть в моём проекте не работает почему-то...
Сейчас с нуля повторить попытаюсь...


alxl
Спасибо! Очень кстати.
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Сейчас с нуля повторить попытаюсь...
С нуля работает вроде бы.

В моём проекте -- нет.
Как можно отследить что в переменную значение передаётся ? или хоть как то понять в чём проблема...
Ну всё также делаю, абсолютно.
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
События такие:
procedure TfMain.Button1Click(Sender: TObject);
begin
  with fDM do
  begin
    frReport1.LoadFromFile(ProgramDirectory + 'report/list_olymp.lrf');
    frReport1.ShowReport;
  end;
end;
и
procedure TfDM.frReport1GetValue(const ParName: String; var ParValue: Variant);
begin
  if ParName = 'search_field' then ParValue := 'asd1';
end;   

Ну формы у меня разные... в этом же не может быть дело ???
Сноси Винду, переходи на Линукс ! :)

Оффлайн alxl

  • Давно тут
  • **
  • Сообщений: 128
Разные формы - это как? И кстати 'search_field' в отчете именно так называется? без больших букв?

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Разные формы - это как?
Ну у меня frReport1 лежит на fDM, а вызываю я его с fMain.
И кстати 'search_field' в отчете именно так называется? без больших букв?
В отчёте именно так и называю (см. вложения)
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Воспроизвёл, косяк с формами. Если при вызове frReport, он (frReport) лежит на другой форме, в переменную не передаётся ничего.
Если же разместить на той же форме, где вызываешь -- всё норм.
Почему -- объяснить не могу.
Но хотелось бы починить...
« Последнее редактирование: 16.03.2015 21:19:59 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)

Оффлайн alxl

  • Давно тут
  • **
  • Сообщений: 128
похоже глюк в компоненте lazreport.

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
похоже глюк в компоненте lazreport.
Похоже на то или так задумано...

Ещё раз спасибо! Я в сети-то находил нечто похожее решение, пробовал в свой проект вставить, но вот этот глюк (с формами) запутывал меня ещё больше, а ваш ответ помог найти причину проблемы. ;-)
Сноси Винду, переходи на Линукс ! :)

Оффлайн alxl

  • Давно тут
  • **
  • Сообщений: 128
Нашел то место, где портится переменная. Там всё правильно. Вот эта процедура. procedure TfrReport.DoGetValue(const ParName: String; var ParValue: Variant);
begin
  if Assigned(FOnGetValue) then
    FOnGetValue(ParName, ParValue);
end;
Внутри этой процедуры параметр parname еще не испорчен, а после вызова FOnGetValue - ParName портится. Прикол оказался в том, что в модуле unit1 тип string в методе ongetvalue интерпретируется, как ansistring, а в unit2,unit3 ... как shortstring. Самый простой способ добиться правильной работы - указать  тип вместо parname:string - parname:ansistring.
procedure TForm2.frReport1GetValue(const ParName: AnsiString; var ParValue: Variant);
begin
  if parname='edit_text' then parvalue:='test';
end;

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Нашел
О, круть! Работает.
Спасибо.
Сноси Винду, переходи на Линукс ! :)