Редактирование значений Memo в Preview

отредактировано 01:15 Раздел: FastReport 3.0
Помогите пожалуйста! Перерыл документацию и форум, но так и не нашел решения следующей проблемы:
В режиме просмотра готового отчета при клике на мемо должно вызваться диалоговое окно с режимом ввода. После ввода - текст надо вставить в несколько memo. Нашёл примеры для одного объекта, однако записать данные в таком случае могу только в ячейку, на которой был произведен клик.
procedure INNOnPreviewClick(Sender: TfrxView; Button: TMouseButton; Shift: Integer; var Modified: Boolean);
var
 s: String;
begin
 s := TfrxMemoView(Sender).Text;
 SetLength(s, Length(s) - 2); // cut off #13#10
 TfrxMemoView(Sender).Text := InputBox(sender.name,'', s);
 TfrxMemoView(mINN1).Text := s;
 TfrxMemoView(mINN2).Text := s;
 Modified := True;
end;

Однако выдает ошибку - на mINN1 и mINN2 выскакивает access violation. Как можно получить эти Memo из готового отчета в коде? :)

Комментарии

  • gpigpi
    отредактировано 01:15
    написал:
    Как можно получить эти Memo из готового отчета в коде?
    Только перебором всех элементов на всех страницах сформированного отчёта
  • отредактировано 01:15
    gpi написал: »
    Только перебором всех элементов на всех страницах сформированного отчёта
    А как перебрать все элементы на странице сформированного отчета???? page1.objects - перебирает все объекты в дизайнере вроде. В manuale подобной задачи ненашёл. Подскажите пожалуйста куда обратить внимание?
  • gpigpi
    отредактировано 01:15
    var i,j: integer;
          p: TfrxReportPage;
          Memo: TfrxMemoView;
          NeedModifyPage: Boolean;
     begin
           for j := 0 to frxReport1.PreviewPages.Count - 1 do
             begin
               p := frxReport1.PreviewPages.Page[j];
               NeedModifyPage := False;
               for i := 0 to p.AllObjects.Count - 1 do
                 if TObject(p.AllObjects.Items[i]).ClassType = TfrxMemoView then
                   begin
                     Memo:= TFrxMemoView(p.AllObjects.Items[i]);
                     if AnsiUpperCase(Memo.Name)=AnsiUpperCase('Memo1') then
                       begin
                         Memo.Text := 'test1';
                         NeedModifyPage := True;
                       end;
                   end;
               if NeedModifyPage then frxReport1.PreviewPages.ModifyPage(j, p);
             end;
     end;
    
  • отредактировано 01:15
    Спасибо, большое помогло. Вот только страничка не обновляется. Если поверх неё что-то открываю, а потом опять её- данные обновляются. Пробовал frxReport1.Preview.Refresh и frxReport1.Preview.Invalidate - ошибка access violation. :) Не подскажите как обновить отчёт?
  • ......
    отредактировано 01:15
    Обновить можно так frxReport1.Preview.Repaint;

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

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