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

Расскажите мне пожалуйста по какому принципу вставляются смайлики в ICQ.И тот кто получает сообщение видит смайлик который был вставлен .....

Elvis (03.06.05 12:43)Смайлики передаются обычними символами, например :), :( а клиент преобразует его в картинку

:-& лишившийся дара речи; смутившийся; косноязычный:-р высовывающий язык:-s непоследовательный, бессвязный:-/ скептик:-\ нерешившийсяо:-) ангел>:-) дьявол:-q пытающийся достать языком до носа:-а то же самое, но с другой стороны:-е разочарованный:-о ox-ox:-9 облизывающий губы:-О не ори! (также оратор)

Elvis (03.06.05 12:43) То, что описАл dmitry501 © (03.06.05 12:51) [1] это ещё пол беды — реализуется не так сложно, главная проблема обратный процесс, т.е. преобразование картинки в смайлик. Сам давно хочу выяснить, как это работает.

> Расскажите мне пожалуйста по какому принципу вставляются > смайлики в ICQв ICQ никакие «смайлики» не вставляются, ICQ — это сеть, работающая по спецпротоколу, в котором ни каких смайликов не было и нет.если же под ICQ подразумевается некая программа-клиент, «умеющая» в поступающих текстовых сообщениях распознавать комбинации символов (см.выше) и интерпретировать их как команды на отрисовку в соотв.позициях соотв.смайликов, то это просто фича клиентской программы, а не ICQ вообще

>>>программа-клиент, «умеющая» в поступающих текстовых сообщениях распознавать комбинации символов (см.выше) и интерпретировать их как команды на отрисовку в соотв.позициях соотв.смайликов>>>ну дык а как такое сделать-то??

Elvis (03.06.05 13:17) [5]ну дык а как такое сделать-то??Так в чем проблема?Алгоритм простой.Перед передачей кода смайлика вставляешь неотображаемый символ-флажок в передаваемый поток данных.На приемной стороне проверяй. Вот и весь алгоритм.

на кой икс флажок? просто в полученной строчки ищешь комбинации символов образующих смайлики...

iskatel © (03.06.05 15:51) [7]А на такой, что такая комбинация символов — не обязательно смайлик.

Alexander Panov © (03.06.05 15:58) [8]Не... iskatel © (03.06.05 15:51) [7] прав, никаких флажков там нету, т.к. даже если вручную набрать смайли — его преобразует в картинку.

Флажков там нету :)) идет простой текст вида :) :( и и.д... как юзер миранды хорошо с этим знаком :)) Периодически набиваю вещи вроде *JOKINGLY* :))))

(.)(.) Ms. Dos

Eraser © (03.06.05 16:00) [9]никаких флажков там нету, т.к. даже если вручную набрать смайли — его преобразует в картинку.Причем здесь "Там"?Человеу надо сделать подобную вещь, как я понимаю.И делать надо не как там, а как правильно.

Alexander Panov © (03.06.05 16:36) [12] > И делать надо не как там, а как правильно.Посмотри протокол мастаковского чата. Смайлики есть, а невидимых флажков нету.

Alexander Panov © (03.06.05 16:36) [12]По той же причине, что я написал в [9] по-другому сделать нельзя, т.к. некоторым пользователям, например Kerk«у удобнее «набирать» смайлик вручную, при этом не о каких флажках не может быть и речи.Другой вопрос это обратное преобразование. ICQ клиент (и не только, VyPress тоже так умеет) умеет «преобразовывать» картинку-смайлик в текстовый смайлик, т.е. в картинках-смайликах есть какие-то иднтификаторы... так и не разобрался как оно сделано.. если кто знает раскажите, буду очень благодарен ;-)

Eraser © (03.06.05 16:43) [14] > это обратное преобразованиеКакое обратное преобразование ? Ты о чем ? Картинки возникают только в момент отображения сообщения.

Игорь Шевченко © (03.06.05 16:52) [15]Не... когда в ICQ-клиенте в менюшке выбираешь смайлик — он появляется в тексте отправителя в ГРАФИЧЕСКОМ виде, т.е. картинкой. Если эту картинку перетащит на какой-нибудь RichEdit, например WordPad, то картинка преобразуется в текстовое представление... попробуйте.

> Alexander Panov © (03.06.05 16:36)Это смотря что требуется.Если нужно преборазование текста в смайлы — то флажки не нужны.Если предполагается, что юзер будет каждый раз наживать «вставить смайл», то нужны. Но это не очень удобно.

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

BasiL_666_ © (03.06.05 17:02) [18]Дык не везде вставляются текстовые варианты, ICQ 2003, 4, 5 видел? При нажатии «вставить смайл» вставляется картинка.

Eraser © (03.06.05 17:06) [19]> При нажатии «вставить смайл» вставляется картинка.Отображается, а не появляется. Почувствуйте разницу.

Игорь Шевченко © (03.06.05 17:09) [20]Дык понятно, что отображается, а перед передачей данных заменяется текстом... только где вот этот текст хранится...

Eraser © (03.06.05 17:16) [21] > только где вот этот текст хранится...Внутре :) Путешествует промеж клиентом и сервером и обратно.

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

Ну так про то и речь идет.ICQ-клиенту без разницы, что ъхотел пользователь. Если в тексте встретится определенная комбинация символов, он смайл отобразит. Но это ведь неправильно.

BasiL_666_ © (03.06.05 17:39) [23]вставляетсмя в любом случае текстовый вариант смайлаКуда вставляется?передается тоже текстовый вариантОткуда передаётся?

BasiL_666_ © (03.06.05 17:39) [23]Ты хочешь сказать, что имеется скрытая копия редактора ввода, где смайлы всегда текстовые... врядли.

куда те нада туда и вставляется (Memo, RichEdit и тд..)...а передается по сети или по инету все зависит от клиента... наскока я понял делается именно сообственный ICQ-клиент...

BasiL_666_ © (03.06.05 17:49) [27]Делается новая версия одной моей проги ) не, с ICQ пока не связано...

я не понимаю а в чем может быть проблема при написание сообщения заменять их сразу на картинки??? то есть вставляется не картинка, а ее текстовый вариант.... а в клинет просто сразу распознается как смайл и заменяется картинкой....

BasiL_666_ © (03.06.05 17:52) [29]я не понимаю а в чем может быть проблема при написание сообщения заменять их сразу на картинки???Да хочется, чтобы при написании сообщения, если выбрать в меню картинку-смайл вставлялась НЕ надпись *LOL*, а картинка, как в ICQ.

Eraser © (03.06.05 17:55) [30] В ICQ вставляется надпись. Которая отображается, как картинка.

Игорь Шевченко © (03.06.05 17:58) [31]А как это можно самому организовать? Возможно ли это сделать на базе TJvRichEdit?

я так полагаю это трудно реализуемо, если меня до сих пор не поняли.... вообщемто не буду спорить.. я говорил как эту проблему понимал я.... не более того...

Eraser © (03.06.05 18:00) [32]Да реализвать можно как угодно.Тот же клиент ICQ хранит информацию, связанную с любым отображаемым объектом.Точно так же реализуется и для своей реализации.Отрисовываешь рисунок на канве — в массиве сохраняешь свойства этого рисунка(ам же хранятся и координаты рисунка, естественно).При начале Drag извлекатеся информация из этого массива.

Eraser © (03.06.05 18:00) [32]я так полагаю это трудно реализуемоЭто не сложно.

BasiL_666_ © (03.06.05 18:01) [33]Просто в посте [29] ты напсал 2 противоречащие друг другу мысли «заменять их сразу на картинки» и «то есть вставляется не картинка, а ее текстовый вариант» прочитал это несклько раз, так и не понял, что ты имел ввиду.

Eraser © (03.06.05 18:11) [36]Для того, чтобы понять раз и навсегда, поробуй определить проблемы с написанием собственного редактора. Причем использовать только канву без готовых редакторов.Вт тогда ты поймешь, как хранятся все изображения, текст и прочие объекты в подобных приложениях.

Alexander Panov © (03.06.05 18:09) [34]О, это уже ближе к телу )Просто хотелось бы на 100% узанть, что не сществует типовых вариантов.А насчёт координат — опять же врядли... в том, то и проблема — идентифицировать рисунок.Буду разбираться.

Alexander Panov © (03.06.05 18:14) [37]Класс окна ввода в ICQ 5 — RichEdit20A....

Eraser © (03.06.05 18:14) [38]А насчёт координат — опять же врядли... в том, то и проблема — идентифицировать рисунок.Ну вот. Опять снова то же самое.В любом редакторе, который поддерживает вставку объектов, отличных от текста, необходимо сохранять информацию об этих объектах. Для этого приложение сохздает массив структур, которые связаны каждая со своим объектом.Как минимум, в этой структуре хранятся: позиция для отображения на канве(x,y) размеры либо ссылка на исходный объект.При любых перерисовках канвы эти сруктуры динамически изменяются для актуализации тех же координат отображения на канве.Таким образом, приложение в любой момент времени знает, что находится в любой точке канвы, и всегда находит связанную с этой точкой структуру.

Alexander Panov © (03.06.05 18:14)Полностью согласен. Так делается, если писать тестовый редактор с нуля. Но ICQ-редактор НЕ написан с нуля см. [39].

Eraser © (03.06.05 18:22) [41]Но ICQ-редактор НЕ написан с нуля см. а при чем тут ICQ?Если надо вытаскивать именно из ICQ-клиета, то необходимо разобраться, как хранятся данные в его редакторе в исходном коде.

Alexander Panov © (03.06.05 18:30) [42]а при чем тут ICQ?ICQ при том, что использует тот же компонент, что и обёртка TJvRichEdit, а именно RichEdit20A, соответственно «как хранятся данные в его редакторе» относится не к коду ICQ, а к коду этого самого RichEdit20A, соответственно, это можно сделать и через TJvRichEdit или напрямую обращаясь к RichEdit20A через дескриптор в TJvRichEdit, весь вопрос «как»...

Eraser © (03.06.05 18:37) [43] Можно сделать. Как — очень просто, ищещь способ вставить в RichEdit картинку, находишь его, потом, анализируя текст, который надо вставить в RichEdit, вместо нужных фрагментов текста вставляешь картинки найденным выше способом. Собственно так же, как любой browser видя тэг <img> вставляет вместо него картинку :)Hint: html-страницы внутрь себя картинку не вставляют, являясь текстом :) В них картинка указывается именем файла. Тебе проще, так как набор смайликов ограничен, то для того, чтобы вставить смайлик, достаточно его кода (например «:)»), по которому ты его однозначно идентифицируешь.

Игорь Шевченко © (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* , а ввиде объектов (картинок).Надеюсь на этот раз я понятно объяснил проблему ;-)

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

Игорь Шевченко © (03.06.05 22:20) [46]Эх... хотелось бы отправлять! ) Да где его взять то.Тем более трюки в ICQ с перетаскиванием смайлика на другой контрол, о которых я писАл наводят на мысль, что инф-я о смайлики хранится в самом объекте рисунке, и этот объект имеет свойство в котором эта инфа хранится, а не в каком-то стороннем массиве с координатами.ИМХО есть способ без изобретения велосипедов.К сожалению с OLE знаком очень плохо.. :*(Игорь Шевченко © (03.06.05 21:50) [44]Hint: html-страницы внутрь себя картинку не вставляют, являясь текстом :) В них картинка указывается именем файла. Тебе проще, так как набор смайликов ограничен, то для того, чтобы вставить смайлик, достаточно его кода (например «:)»), по которому ты его однозначно идентифицируешь.Насчёт HTML я подумывал, но пока что считаю, что RichEdit использовать удобнее. Тем более подкуает, что аська и VyPress Chat построены на RichEdit, а это лучшие прграммы в своих областях.

Eraser © (03.06.05 22:33) [47] HTML — это данные.RichEdit — элемент отображения данных.Неужели трудно увидеть разницу ? Например, если тебе нужно передать данные для построения диаграммы в Excel, ты же передаешь набор значений, а не снимаешь ее изображение Print Screen«ом, и не передаешь получившееся изображение, правильно ?Тоже самое и тут — то, что передается, отличается от того, каким образом оно отображается.> аська и VyPress Chat построены на RichEditГлупости. Аська использует RichEdit для отображения данных. С таким же успехом я могу принимать аськины данные своим приложением и отображать их в окне консоли, без картинок-смайликов, правда, но и хрен бы с ними, главное, что сообщение будет передано и принято.

Игорь Шевченко © (03.06.05 22:49) [48]HTML — это данные.RichEdit — элемент отображения данных.Да эт я прекрасно понимаю. Проблема в том, что RichEdit является не только элементом отображения данных, но и инструментом взаимодействия с этими данными, т.е. их формирования.Возьмём опять же пример с перетаскиванием. Пользователь ведь не нажимает, какую-то «левую» кнопку, чтобы перетащить выделеный смайл на другой контрол, он перетаскивает ОТОБРАЖАЕМЫЙ элимент..., в свою очередь RichEdit (т.е. интерфейс взаимодействия) может подменить этот элимент нужными текстовыми данными.Проблема в том, что я не знаю как пользоваться этой «интерфейсной» возможность.

Eraser © (03.06.05 22:57) [49] Пользователь, когда перетаскивает, уведомляет RichEdit, что произошло событие. RichEdit уведомляет программу, что на него что-то перетащили. При этом событии программа знает, какой объект перетаскивается, и программе же не затруднит в текст для отправки вставить нужную комбинацию символов и отобразить в RichEdit«е картинку вместо этой комбинации. То есть, RichEdit сам при перетаскивании на него картинки никакую картинку не вставит, насколько мне известно, такой функциональности в нем не предусмотрено.

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

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

Игорь Шевченко © (03.06.05 23:31) [52]Чтож — логично... похоже на правду, почему бы и нет... Буду подробно разбираться в механизме dragNdrop.Если у кого есть полезные ссылки по этой теме, буду признателен.

> Если у кого есть полезные ссылки по этой темеЕсть статья MBo на этом сайте в разделе «Статьи»

Игорь Шевченко © (03.06.05 23:50) [54]Статья хорошая, правда в моём случае нужен OLEDragNDrop.

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

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

аматор © (04.06.05 10:40) [57]Да видел я уже эти исходники, там необычно сделана вставка смайла, но распознвания нету.Спасибо всё равно!

Наверх

Источник