BLOB

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: BLOB

Сообщение Brainenjii » 19.07.2010 22:51:11

Так это... Опенсорс жеж ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: BLOB

Сообщение А.Н. » 19.07.2010 23:01:18

Так не буду же я менять и перекомпилировать компонент? Это неправильно.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: BLOB

Сообщение Brainenjii » 19.07.2010 23:05:46

Почему?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: BLOB

Сообщение А.Н. » 19.07.2010 23:10:09

Потому что, если когда-то на свежей среде я попытаюсь скомпилировать то, что я понаписал раньше и забуду про исправленный компонент (а он такой не один будет)... Непереносимо.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: BLOB

Сообщение B4rr4cuda » 19.07.2010 23:32:23

Но ведь в доках ясно написано, что TEXT - это BLOB, в котором, при сравнении не учитывается регистр.
Что ж это такое?
Спасибо огромное.

Пожалуйста. А текст - это стринговое поле, как его не крути. А блоб - бинарные данные. И процедуры работы с этими полями скорее всего разные. Вот и глючило.
С отчетами вообще не люблю работать, так что вопрос не ко мне, я Трепорт не копал особо
А насчет дописывания компонента - почему бы и нет?
Кстати, а зачем?
с пустыми методами сохранения, с последующим переопределением переменной CurrentReport

Доступ к текущему уже подготовленному отчету возможен через frReport1.EMFPages
Заливаем подготовленный отчет в базу, тоже в блоб поле, а когда этот отчет надо просмотреть проводим обратную операцию:
Опять код с того же проекта:
Код: Выделить всё
//загружаем шаблон отчета
  p1:=TMemoryStream.Create;
  AnalogProtocol.LoadReportBy('TPROTOCOL1',p1);
  frReport1.tag:=1;
  frReport1.LoadFromStream(p1);

//производим создание отчета, все нужные значения и текст уже введены - инфа в отчет идет запросом от frReport1GetValue
  if frReport1.PrepareReport then
  begin
//сохранение подготовленного отчета (то что мы видим нажав предпросмотр)
    tmp:=TMemoryStream.Create;
    frReport1.EMFPages.SaveToStream(tmp);
    tmp.Position:=0;
    (ZQtmp.FieldByName('PROTOCOL1')as TBlobField).LoadFromStream(tmp);
    tmp.free;
  end;

Ну а показ отчета по запросу делаем так:
Код: Выделить всё
var ms:tStream;
begin
  ms:=TMemoryStream.Create;
  (zadm.FieldByName('PROTOCOL1') as TBlobField).SaveToStream(ms);
  ms.Position:=0;
  frReport1.EMFPages.LoadFromStream(ms);
  frReport1.ShowPreparedReport;
  ms.free;

Минимум геморроя, имхо.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: BLOB

Сообщение Brainenjii » 19.07.2010 23:34:04

Вот как-то надо было повернуть текст на 90 градусов. В этом lazreport'e весь код был, но закомменчен - поскольку в gtk повороты запрещены. Так что можно сказать, разработчики поощряют личные патчи ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: BLOB

Сообщение А.Н. » 19.07.2010 23:46:57

А насчет дописывания компонента - почему бы и нет?
Кстати, а зачем?

Не, дописывать я его не собираюсь. Упаси меня кто-то там. :)
Отчёты и документы я тоже терпеть не могу. Но никуда без них.

А нужно мне вот для чего.
Есть несколько компаний, которые имеют свою форму квитанций. Формы небольшие по размеру (неск. Кб).
Мне нужно печатать: заявление, полис, квитанцию.
Формы (не сами квитанции) хранятся в базе, в таблице со страховыми компаниями.
При клике на компании в дереве, возможно выбрать из меню изменение формы квитанции.
После этого вызывается дизайнер. Форма должна сохраняться в объекте, который, затем, сохранит её в БД.
И, логично, что это должно происходить, при нажатии в дизайнере кнопки "Сохранить".
Поэтому я переопределяю обработчик этой кнопки. Если меняется форма квитанции, я сохраняю форму в БД.
Если меняются другие бланки, я вызываю старый обработчик. Но...
В дизайнере есть private свойство FileModified.
Если оно true, то, при закрытии окна, дизайнер спрашивает о сохранении.
Сбрасывается свойство в старом обработчике. Чтобы не мудрствовать, я просто решил ему подсунуть потомок класса TfrReport с пустыми методами сохранения (которые тоже вызываются в старом обработчике).
Но, к сожалению, методы невиртуальные, поэтому, всегда вызываются методы предка.
Отсюда, когда, я выбираю "Изменить квитанцию", после чего загружаю бланк (шаблон бланка) с диска, нажимаю сохранить, бланк на диске портится. Это очень неприятно.

Brainenjii писал(а):Вот как-то надо было повернуть текст на 90 градусов. В этом lazreport'e весь код был, но закомменчен - поскольку в gtk повороты запрещены. Так что можно сказать, разработчики поощряют личные патчи ^_^

Да ну. Проблем потом не оберёшся с исправленными компонентами. А что делать, когда новая версия выйдет? Тоже править?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: BLOB

Сообщение Mr.Smart » 19.07.2010 23:52:31

Лень - это конечно хорошо, но все-же....
Я вот сейчас продумывал концепцию редактирования отчётов у себя в программе и решил, что меньшей болью будет копирование Десагнера в свой проект и модификация его под свои нужды.
п.с. В случае новой версии lazreport будет проще модифицировать код чем ждать и надеяться :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: BLOB

Сообщение B4rr4cuda » 20.07.2010 00:01:13

При клике на компании в дереве, возможно выбрать из меню изменение формы квитанции.
После этого вызывается дизайнер. Форма должна сохраняться в объекте, который, затем, сохранит её в БД.

Позволю себе процитировать какого-то анонимуса - "ужос, просто ужос" (с).
Сколько бланков в базе будет попорчено, сколько нервов потрачено :lol:
Да ну. Проблем потом не оберёшся с исправленными компонентами. А что делать, когда новая версия выйдет? Тоже править?

Боюсь, что для этой задачи все же придется переделывать компонент (лучше с другим именем, чтоб был доступен отдельно), причем желательно его немножко кастрировать, дабы проворные и шаловливые ручки пользователей не добрались до ненужных функций)
А с выходом новых версий репорта, использовать их для других проектов, а старый, переделанный, заново нареченый каким-нибудь типа TFrBlankReoport именем, акуратненько хранить в отдельной папочке, среди сорцов этого проекта, чтобы при случае его можно было установить и внести в проект необходимые изменения) Уточняю - я предлагаю изменить имя компонента и переделать под свои нужды, а основной Трепорт нехай тоже будет)
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: BLOB

Сообщение А.Н. » 20.07.2010 17:26:58

Сколько бланков в базе будет попорчено, сколько нервов потрачено :lol:

Почему? Бланки в базе, вроде бы, не портятся. :)
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: BLOB

Сообщение B4rr4cuda » 20.07.2010 18:25:27

Почему? Бланки в базе, вроде бы, не портятся.

Ну хз, может у тебя юзвери другие, а своим я бы не доверил бланки редактировать :lol:
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: BLOB

Сообщение А.Н. » 21.07.2010 18:22:35

B4rr4cuda писал(а):
Почему? Бланки в базе, вроде бы, не портятся.

Ну хз, может у тебя юзвери другие, а своим я бы не доверил бланки редактировать :lol:

У меня, по идее, должны быть права на изменение.

Честно говоря лень перепиливать и устанавливать компонент. Потому, я тупо убрал CloseQuery для нового обработчика:
Код: Выделить всё
procedure TfrmMain.DesignerOnSaveClick(Sender: TObject);
begin
  try
    if (FTicketDesign) then
      with TInfInsCompany(CompaniesCollection[CompaniesCollection.ItemIndex]) do
        begin
          LoadTicket(CurReport);
          if (DB_Save() = false) then
            raise Exception.Create(SysToUTF8(cls_ticket_svg_err_msg));
          with TfrDesignerForm(frDesigner) do
            begin
              OnCloseQuery := nil;
            end;
        end
    else
      begin
        with TfrDesignerForm(frDesigner) do
          begin
            OnCloseQuery := @frDesignerFormCloseQuery;
          end;
        FOldDesignerSaveClick(TfrDesignerForm(frDesigner).FileBtn3);

      end;


Добавлено спустя 8 минут 31 секунду:
Ой, чего-то я ступил. o.O Я же, вообще, не буду вызывать старый обработчик. Короче, обойдутся без CloseQuery. Потому, с CloseQuery делать ничего не надо.

Добавлено спустя 27 минут 44 секунды:
Что я написал?! :shock: Беда с головой. Пойду биться об стену. :-(
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru