BLOB
Модератор: Модераторы
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Так это... Опенсорс жеж ^_^
Так не буду же я менять и перекомпилировать компонент? Это неправильно.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Почему?
Потому что, если когда-то на свежей среде я попытаюсь скомпилировать то, что я понаписал раньше и забуду про исправленный компонент (а он такой не один будет)... Непереносимо.
Но ведь в доках ясно написано, что 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;
Минимум геморроя, имхо.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Вот как-то надо было повернуть текст на 90 градусов. В этом lazreport'e весь код был, но закомменчен - поскольку в gtk повороты запрещены. Так что можно сказать, разработчики поощряют личные патчи ^_^
А насчет дописывания компонента - почему бы и нет?
Кстати, а зачем?
Не, дописывать я его не собираюсь. Упаси меня кто-то там.
Отчёты и документы я тоже терпеть не могу. Но никуда без них.
А нужно мне вот для чего.
Есть несколько компаний, которые имеют свою форму квитанций. Формы небольшие по размеру (неск. Кб).
Мне нужно печатать: заявление, полис, квитанцию.
Формы (не сами квитанции) хранятся в базе, в таблице со страховыми компаниями.
При клике на компании в дереве, возможно выбрать из меню изменение формы квитанции.
После этого вызывается дизайнер. Форма должна сохраняться в объекте, который, затем, сохранит её в БД.
И, логично, что это должно происходить, при нажатии в дизайнере кнопки "Сохранить".
Поэтому я переопределяю обработчик этой кнопки. Если меняется форма квитанции, я сохраняю форму в БД.
Если меняются другие бланки, я вызываю старый обработчик. Но...
В дизайнере есть private свойство FileModified.
Если оно true, то, при закрытии окна, дизайнер спрашивает о сохранении.
Сбрасывается свойство в старом обработчике. Чтобы не мудрствовать, я просто решил ему подсунуть потомок класса TfrReport с пустыми методами сохранения (которые тоже вызываются в старом обработчике).
Но, к сожалению, методы невиртуальные, поэтому, всегда вызываются методы предка.
Отсюда, когда, я выбираю "Изменить квитанцию", после чего загружаю бланк (шаблон бланка) с диска, нажимаю сохранить, бланк на диске портится. Это очень неприятно.
Brainenjii писал(а):Вот как-то надо было повернуть текст на 90 градусов. В этом lazreport'e весь код был, но закомменчен - поскольку в gtk повороты запрещены. Так что можно сказать, разработчики поощряют личные патчи ^_^
Да ну. Проблем потом не оберёшся с исправленными компонентами. А что делать, когда новая версия выйдет? Тоже править?
Лень - это конечно хорошо, но все-же....
Я вот сейчас продумывал концепцию редактирования отчётов у себя в программе и решил, что меньшей болью будет копирование Десагнера в свой проект и модификация его под свои нужды.
п.с. В случае новой версии lazreport будет проще модифицировать код чем ждать и надеяться
Я вот сейчас продумывал концепцию редактирования отчётов у себя в программе и решил, что меньшей болью будет копирование Десагнера в свой проект и модификация его под свои нужды.
п.с. В случае новой версии lazreport будет проще модифицировать код чем ждать и надеяться
При клике на компании в дереве, возможно выбрать из меню изменение формы квитанции.
После этого вызывается дизайнер. Форма должна сохраняться в объекте, который, затем, сохранит её в БД.
Позволю себе процитировать какого-то анонимуса - "ужос, просто ужос" (с).
Сколько бланков в базе будет попорчено, сколько нервов потрачено
Да ну. Проблем потом не оберёшся с исправленными компонентами. А что делать, когда новая версия выйдет? Тоже править?
Боюсь, что для этой задачи все же придется переделывать компонент (лучше с другим именем, чтоб был доступен отдельно), причем желательно его немножко кастрировать, дабы проворные и шаловливые ручки пользователей не добрались до ненужных функций)
А с выходом новых версий репорта, использовать их для других проектов, а старый, переделанный, заново нареченый каким-нибудь типа TFrBlankReoport именем, акуратненько хранить в отдельной папочке, среди сорцов этого проекта, чтобы при случае его можно было установить и внести в проект необходимые изменения) Уточняю - я предлагаю изменить имя компонента и переделать под свои нужды, а основной Трепорт нехай тоже будет)
Сколько бланков в базе будет попорчено, сколько нервов потрачено![]()
Почему? Бланки в базе, вроде бы, не портятся.
Почему? Бланки в базе, вроде бы, не портятся.
Ну хз, может у тебя юзвери другие, а своим я бы не доверил бланки редактировать
B4rr4cuda писал(а):Почему? Бланки в базе, вроде бы, не портятся.
Ну хз, может у тебя юзвери другие, а своим я бы не доверил бланки редактировать
У меня, по идее, должны быть права на изменение.
Честно говоря лень перепиливать и устанавливать компонент. Потому, я тупо убрал 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 секунды:
Что я написал?!
