Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

принцип вставления смайликов в ICQ.   Найти похожие ветки 

 
Alexander Panov ©   (2005-06-03 18:18) [40]

Eraser ©   (03.06.05 18:14) [38]
А насчёт координат - опять же врядли... в том, то и проблема - идентифицировать рисунок.


Ну вот. Опять снова то же самое.

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

Как минимум, в этой структуре хранятся:
 позиция для отображения на канве(x,y)
 размеры либо ссылка на исходный объект.

При любых перерисовках канвы эти сруктуры динамически изменяются для актуализации тех же координат отображения на канве.

Таким образом, приложение в любой момент времени знает, что находится в любой точке канвы, и всегда находит связанную с этой точкой структуру.


 
Eraser ©   (2005-06-03 18:22) [41]

Alexander Panov ©   (03.06.05 18:14)

Полностью согласен. Так делается, если писать тестовый редактор с нуля. Но ICQ-редактор НЕ написан с нуля см. [39].


 
Alexander Panov ©   (2005-06-03 18:30) [42]

Eraser ©   (03.06.05 18:22) [41]
Но ICQ-редактор НЕ написан с нуля см.


а при чем тут ICQ?
Если надо вытаскивать именно из ICQ-клиета, то необходимо разобраться, как хранятся данные в его редакторе в исходном коде.


 
Eraser ©   (2005-06-03 18:37) [43]

Alexander Panov ©   (03.06.05 18:30) [42]
а при чем тут ICQ?


ICQ при том, что использует тот же компонент, что и обёртка TJvRichEdit, а именно RichEdit20A, соответственно "как хранятся данные в его редакторе" относится не к коду ICQ, а к коду этого самого RichEdit20A, соответственно, это можно сделать и через TJvRichEdit или напрямую обращаясь к RichEdit20A через дескриптор в TJvRichEdit, весь вопрос "как"...


 
Игорь Шевченко ©   (2005-06-03 21:50) [44]

Eraser ©   (03.06.05 18:37) [43]

Можно сделать. Как - очень просто, ищещь способ вставить в RichEdit картинку, находишь его, потом, анализируя текст, который надо вставить в RichEdit, вместо нужных фрагментов текста вставляешь картинки найденным выше способом. Собственно так же, как любой browser видя тэг <img> вставляет вместо него картинку :)

Hint: html-страницы внутрь себя картинку не вставляют, являясь текстом :) В них картинка указывается именем файла. Тебе проще, так как набор смайликов ограничен, то для того, чтобы вставить смайлик, достаточно его кода (например ":)"), по которому ты его однозначно идентифицируешь.


 
Eraser ©   (2005-06-03 22:12) [45]

Игорь Шевченко ©   (03.06.05 21:50) [44]

ищещь способ вставить в RichEdit картинку


Нашёл. Метод InsertBitmap, основанный на технологии OLE.

procedure TJvCustomRichEdit.InsertBitmap(ABitmap: TBitmap; const Sizeable: Boolean);
var
 OleClientSite: IOleClientSite;
 Storage: IStorage;
 OleObject: IOleObject;
 ReObject: TReObject;
 DataObject: IDataObject;
 Selection: TCharRange;
 FormatEtc: TFormatEtc;
begin
 if HandleAllocated and Assigned(FRichEditOle) then
 begin
   DataObject := TImageDataObject.Create(ABitmap);

   FillChar(ReObject, SizeOf(TReObject), 0);
   IRichEditOle(FRichEditOle).GetClientSite(OleClientSite);
   Storage := nil;
   OleObject := nil;
   try
     CreateStorage(Storage);

     FormatEtc.cfFormat := CF_METAFILEPICT;
     FormatEtc.ptd := nil;
     FormatEtc.dwAspect := DVASPECT_CONTENT;
     FormatEtc.lindex := -1;
     FormatEtc.tymed := TYMED_MFPICT;

     OleCheck(OleCreateStaticFromData(DataObject, IOleObject, OLERENDER_FORMAT,
       @FormatEtc, OleClientSite, Storage, OleObject));
     OleSetContainedObject(OleObject, True);
     try
       FillChar(ReObject, SizeOf(TReObject), #0);
       with ReObject do
       begin
         cbStruct := SizeOf(TReObject);
         cp := REO_CP_SELECTION;
         poleobj := OleObject;
         OleObject.GetUserClassID(clsid);
         pstg := Storage;
         polesite := OleClientSite;
         dvAspect := DVASPECT_CONTENT;
         if Sizeable then
           dwFlags := REO_RESIZABLE;
         //OleCheck(OleSetDrawAspect(OleObject,
         //  Data.dwFlags and PSF_CHECKDISPLAYASICON <> 0,
         //  Data.hMetaPict, dvAspect));
       end;
       SendMessage(Handle, EM_EXGETSEL, 0, Longint(@Selection));
       Selection.cpMax := Selection.cpMin + 1;
       OleCheck(IRichEditOle(FRichEditOle).InsertObject(ReObject));
       SendMessage(Handle, EM_EXSETSEL, 0, Longint(@Selection));
       IRichEditOle(FRichEditOle).SetDvaspect(
         Longint(REO_IOB_SELECTION), ReObject.dvAspect);
     finally
       ReleaseObject(OleObject);
     end;
   finally
     ReleaseObject(OleClientSite);
     ReleaseObject(Storage);
   end;
 end;
end;


анализируя текст, который надо вставить в RichEdit, вместо нужных фрагментов текста вставляешь картинки найденным выше способом.

Проанализировал, вставил.
А вот дальше проблема. Как отправалять данный текст. Есть 2 варианта:
1. Сохранять все данные rtf вместе с вндрёнными объектами, то бишь рисунками и отправлять. Этот вариант сейчас рабочий.
2. Преобразовывать картинки в текстовое представление и отправлять rtf без объектов (картинок), как это делает ICQ.

Хотелось бы применять 2 вариант. Но опять же повторюсь, проблема в идентификации УЖЕ вставленных смайликов, которые НЕ в виде *LOL* , а ввиде объектов (картинок).

Надеюсь на этот раз я понятно объяснил проблему ;-)


 
Игорь Шевченко ©   (2005-06-03 22:20) [46]


> Проанализировал, вставил.
> А вот дальше проблема. Как отправалять данный текст.


А ты отправляй не тот, который отображается, а тот, который анализируешь.


 
Eraser ©   (2005-06-03 22:33) [47]

Игорь Шевченко ©   (03.06.05 22:20) [46]

Эх... хотелось бы отправлять! ) Да где его взять то.
Тем более трюки в ICQ с перетаскиванием смайлика на другой контрол, о которых я писАл наводят на мысль, что инф-я о смайлики хранится в самом объекте рисунке, и этот объект имеет свойство в котором эта инфа хранится, а не в каком-то стороннем массиве с координатами.
ИМХО есть способ без изобретения велосипедов.
К сожалению с OLE знаком очень плохо.. :*(

Игорь Шевченко ©   (03.06.05 21:50) [44]
Hint: html-страницы внутрь себя картинку не вставляют, являясь текстом :) В них картинка указывается именем файла. Тебе проще, так как набор смайликов ограничен, то для того, чтобы вставить смайлик, достаточно его кода (например ":)"), по которому ты его однозначно идентифицируешь.


Насчёт HTML я подумывал, но пока что считаю, что RichEdit использовать удобнее. Тем более подкуает, что аська и VyPress Chat построены на RichEdit, а это лучшие прграммы в своих областях.


 
Игорь Шевченко ©   (2005-06-03 22:49) [48]

Eraser ©   (03.06.05 22:33) [47]

HTML - это данные.
RichEdit - элемент отображения данных.

Неужели трудно увидеть разницу ? Например, если тебе нужно передать данные для построения диаграммы в Excel, ты же передаешь набор значений, а не снимаешь ее изображение Print Screen"ом, и не передаешь получившееся изображение, правильно ?
Тоже самое и тут - то, что передается, отличается от того, каким образом оно отображается.


> аська и VyPress Chat построены на RichEdit


Глупости. Аська использует RichEdit для отображения данных. С таким же успехом я могу принимать аськины данные своим приложением и отображать их в окне консоли, без картинок-смайликов, правда, но и хрен бы с ними, главное, что сообщение будет передано и принято.


 
Eraser ©   (2005-06-03 22:57) [49]

Игорь Шевченко ©   (03.06.05 22:49) [48]
HTML - это данные.
RichEdit - элемент отображения данных.


Да эт я прекрасно понимаю. Проблема в том, что RichEdit является не только элементом отображения данных, но и инструментом взаимодействия с этими данными, т.е. их формирования.

Возьмём опять же пример с перетаскиванием. Пользователь ведь не нажимает, какую-то "левую" кнопку, чтобы перетащить выделеный смайл на другой контрол, он перетаскивает ОТОБРАЖАЕМЫЙ элимент..., в свою очередь RichEdit (т.е. интерфейс взаимодействия) может подменить этот элимент нужными текстовыми данными.
Проблема в том, что я не знаю как пользоваться этой "интерфейсной" возможность.


 
Игорь Шевченко ©   (2005-06-03 23:05) [50]

Eraser ©   (03.06.05 22:57) [49]

Пользователь, когда перетаскивает, уведомляет RichEdit, что произошло событие. RichEdit уведомляет программу, что на него что-то перетащили. При этом событии программа знает, какой объект перетаскивается, и программе же не затруднит в текст для отправки вставить нужную комбинацию символов и отобразить в RichEdit"е картинку вместо этой комбинации. То есть, RichEdit сам при перетаскивании на него картинки никакую картинку не вставит, насколько мне известно, такой функциональности в нем не предусмотрено.


 
Eraser ©   (2005-06-03 23:14) [51]

Игорь Шевченко ©   (03.06.05 23:05) [50]

Так я ж имею ввиду обратный процесс. Возмём для "понятности" ту же ICQ.
Имеется контрол ввода сообщения, которое нужо отправить. Имеется меню, в котором отображены смайлика. Мы вибираем из этого меню нужный смайлик и он в графическом виде отображается на контроле ввода. Далее наводим мышу на этот смайлик и перетаскиваем в WordPad, там отображается смайлик в текстовом виде, т.е. :-).
Понятно что в момент начала операции dragNdrop ICQ подменила выделенный OLE объект-рисунок, на текст, но вопрос в том, откуда она ICQ узнала о том, что перетаскивается именно объект, обозначающий какой-то конкретный определённый смайлик ":-)"? Меня интерсует именно техническая сторона вопроса...


 
Игорь Шевченко ©   (2005-06-03 23:31) [52]


> на текст, но вопрос в том, откуда она ICQ узнала о том,
> что перетаскивается именно объект, обозначающий какой-то
> конкретный определённый смайлик


Определила, в какой позиции в RichEdit был перетаскиваемый объект, рассчитала длину текста, проанализировала текст в этом месте, отдала.


 
Eraser ©   (2005-06-03 23:38) [53]

Игорь Шевченко ©   (03.06.05 23:31) [52]

Чтож - логично... похоже на правду, почему бы и нет... Буду подробно разбираться в механизме dragNdrop.
Если у кого есть полезные ссылки по этой теме, буду признателен.


 
Игорь Шевченко ©   (2005-06-03 23:50) [54]


> Если у кого есть полезные ссылки по этой теме


Есть статья MBo на этом сайте в разделе "Статьи"


 
Eraser ©   (2005-06-03 23:59) [55]

Игорь Шевченко ©   (03.06.05 23:50) [54]

Статья хорошая, правда в моём случае нужен OLEDragNDrop.


 
аматор ©   (2005-06-04 10:37) [56]

http://www.everaldo.com/ - эт прога смахивающая на аську
зайди и полазь
там даже исходники


 
аматор ©   (2005-06-04 10:40) [57]

ссори сылки сплутал http://dmess.ytu.ru/


 
Eraser ©   (2005-06-04 13:39) [58]

аматор ©   (04.06.05 10:40) [57]

Да видел я уже эти исходники, там необычно сделана вставка смайла, но распознвания нету.
Спасибо всё равно!



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.04 c
3-1116422713
Иг
2005-05-18 17:25
2005.06.29
Как достучаться к функциям Ацеса из адо?


1-1118174449
Pasha L
2005-06-08 00:00
2005.06.29
Директория из TSearchRec


1-1117703726
Phoenix9000
2005-06-02 13:15
2005.06.29
запуск процедуры в определенное время


3-1116125866
Lex_!
2005-05-15 06:57
2005.06.29
Поиск по БД


1-1118311597
rtyui
2005-06-09 14:06
2005.06.29
DateEdit1.Date<>0





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский