Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2010, 02:18   #1
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
Вопрос RichView и JvGIFAnimator

Доброго времени суток !
Возникла проблема.
Дано: есть компонент RichView, на него нужно выводить анимированные смайлики (точно такие же как здесь на форуме) довольно в большом количестве. Все выводиться нормально и программа жива здорова до того момента пока количество этих самых смайликов (каждый из них это компонент JvGIFAnimator c загруженным в него gif`ом из ресурса) не достигнет примерно 70-80 штук, и это не считая текста самих сообщений.
Вот при таком условии программа "еле-еле душа в теле", а при закрытии вообще забирает у процессора 98-99% и висит около 10 минут с вываливанием сообщения "Access violation ..."
Кто-нибудь сталкивался с подобным ? Что делать ? Программа почти готова...

P.S. Пробовал вместо JvGIFAnimator использовать RxGIFAnimator, AdvImage с анимированием (TMS Controls) - все тоже самое только адрес в сообщении "Access violation ..." меняется, пробовал смайлики только совсем мааааленькие и почти без анимации вес каждого около 2кБ - тоже самое и ничуть не быстрее.
А вот с обычными компонентами-картинками, будь то Image, AdvImage без анимирования - все прекрасно работает и закрывается.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 10.01.2010, 02:40   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

У вас одновременно в RichView отображаются
Цитата:
примерно 70-80 штук
???
Тогда это просто бред. Нормальная прога ограничивает их количество. Имхо.

З.Ы. Попробуйте на нашем форуме использовать больше 3-х смайлов в посте... (по-крайней мере раньше так было)

Последний раз редактировалось mihali4; 10.01.2010 в 02:51.
mihali4 вне форума Ответить с цитированием
Старый 10.01.2010, 09:33   #3
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

mihali4, я хочу сказать в свое оправдание. Прога к примеру работает весь день и пользователь вносит сообщения, даже если на новом сообщении ввести ограничение (у меня оно есть - 4 смайла), то ведь в истории разговора за день наберется немало. И как мне здесь ограничиваться ?
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 10.01.2010, 10:23   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
то ведь в истории разговора за день наберется немал
А если после каждых 2000 символов (или N количества сообщений) сохранять историю в файл и очищать в текущем риче? А по требованию показывать окошко истории?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 11.01.2010, 11:12   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Давно не пользовался "квипом", но кажется там отображаются только последние 10 смайлов (и в истории и так)...
Более "ранние" показываются в виде тегов...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 11.01.2010, 13:35   #6
Sunktor
 
Аватар для Sunktor
 
Регистрация: 06.01.2010
Сообщений: 4
По умолчанию

Я мало разбираюсь в компонентах, но если есть нечто, вроде фрейма в HTML, то можно было бы ограничиться десятком смайлов, а их повторения выводить в таких фреймах, это могло бы сэкономить ресурсы.
Sunktor вне форума Ответить с цитированием
Старый 11.01.2010, 16:46   #7
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

По-моему почти разобрался. Все дело в "жоре" GDI ресурсов с тем подходом который я применил. Я делал компонент JvGIFAnimator, лил в него гифку из ресурса и потом вставлял его в RichView - это подход для 10-20 смайлов (причем сам размер гифа не имеет почти никакого значения). Сделал так: загоняю в массив все гифки которые собираюсь выводить, забываю напрочь о JvGIFAnimator`е, применяя GifImage, включаю в RichView анимацию при форматировании (т.к. RichView сам может анимировать гифки вставленные в него) и самое главное в компонент gifimage не загружаю Load`ом , а связываю методом Assign нужный смайл ...
Пока все нормально, но все еще тестирую...

Благодарю всех кто откликнулся !!!
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 15.04.2010, 20:55   #8
Razyiller
Пользователь
 
Регистрация: 31.03.2010
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Kotofff Посмотреть сообщение
... и самое главное в компонент gifimage не загружаю Load`ом , а связываю методом Assign нужный смайл ...
Пока все нормально, но все еще тестирую...
можно код выложить?
Razyiller вне форума Ответить с цитированием
Старый 15.04.2010, 21:48   #9
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Код:
var
  _Smiles: array[1..44] of TGIFImage;// наш массив анимированных смайлов
  bufGIF: TJvGIFAnimator;// используем TJvGIFAnimator только лишь из-за его корректности в работе с Gif`ами 
                                          //и возможности загрузки gif`ки из ресурса
  tempStream: TMemoryStream;
  s : string;
  ...
  ...
  ...
  bufgif := TJvGIFAnimator.Create(nil);// создаем "буфер"
  Stream0 := TMemoryStream.Create; // поток для переброски. Можно подумать об альтернативе ...
  for i:=1 to 44 do  // допустим что смайлов 44 ...  у меня в проге так
    begin
      Stream0.Clear; // 
      s := 's' + IntToStr(i); // формируем имя в ресурсе
      bufgif.Image.LoadFromResourceName(HInstance, s, PChar('ANYOL1'));// загрузка из ресурса
      bufgif.Image.SaveToStream(Stream0);// загрузка в поток
      _Smiles[i] := TGIFImage.Create;// создаем очередной элемент массива смайлов
      _Smiles[i].LoadFromStream(Stream0); // грузим смайл в массив
    end;
  Stream0.Free;// чистим
  bufgif.Free;   // все
...
...
...
...
// это в самом конце модуля 
initialization
  RegisterClass(TGIFImage); // все что пихаем в RichView - сначала так объявляем ...
end.
Имея массив gif`ок работаем далее так, вставка смайла из массива на место курсора в компоненте RichViewEdit:
Код:
var
  giff:TGIFImage;// опять некий "буфер"
  ...
  ...
  ...
  giff := TGIFImage.Create; // создаем "буфер"
  giff.Assign(_Smiles[ItemNo + 1]); // имеено так а нет так ":="  -  это чтобы не было проблем 
  RVE.InsertPicture('SMILE' + IntToStr(ItemNo), giff, rvvaAbsMiddle); // именно InsertPicture, и обязательно делаю имя каждому объекту соответствующее номеру в массиве - мне это нужно для парсинга сообщения
  RVE.Reformat; // обновляем без обнуления позиции курсора
Ну конечно же выставляем в компоненте RichViewEdit или RichView, тут все одинаково, свойство AnimationMode равное rvaniManualStart - смысл таков, что анимировать gif`ку будет сам RichView после команды форматирования, не создавая никаких проблем с загрузкой системы.

P.S.
Это примерный код - дальше сам ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 16.04.2010, 23:02   #10
Razyiller
Пользователь
 
Регистрация: 31.03.2010
Сообщений: 50
По умолчанию

возникла проблема с обработкой строки в которой и тект и код смайлика, если есть варианты помогите
Код:
while l<=Length(ss) do
       begin
            if  ss[l]='#'
              then
                begin
                  ChatRichEdit.AddText(Copy(ss,0,l-1),0);
                  ChatRichEdit.ReFormat;
                  Delete(ss,0,l);
                 for q:=1 to colSm do
                  begin
           if (copy(ss,l,Length(SmileCod[q]))=SmileCod[q])and((copy(ss,l,Length(SmileCod[q]))<>''))
                      then
                        begin
                          ChatRichEdit.AddControlEx('',SmileImage[q] , -1, rvvaMiddle);
                          ChatRichEdit.reformat;
                          Delete(ss,l,Length(SmileCod[q]));
                        end;
                  end;
                end;

          l:=l+1;
       end;
Razyiller вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
RichView rvvaMiddle KoBRaAndrey Общие вопросы Delphi 4 15.04.2010 00:53
RichView help mar4elo Общие вопросы Delphi 4 13.02.2009 22:07