| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка под ASP.NET > Выбор выноски на рисунке |
| Автор: kedicik 16.5.2007, 21:38 |
| Можно ли реализовать след задачу? Есть рисунок . На нем какие-то выноски к деталям (назовем так). Как выделить выноску на рисунке? И прочитать что выделено? Можно ли это сделать с помощью ImageMap? |
| Автор: Mymik 16.5.2007, 23:22 |
| kedicik, преобразование рисунка в текст. Это очень сложные и трудоемкие процессы. Алгоритмы дорого стоят. А реализация ихняя еще дороже. Стандартных функция распознавания текста из рисунка нет. Если где-нибудь найдешь бесплатную библию для распознавания текста -- поделись, мы все будем очень и очень благодарны столь щедрому подарку. |
| Автор: kedicik 17.5.2007, 07:01 |
| Я имела ввиду не распознавание текста. А если сделать на рисунке хот споты и выделять их. Мне без разницы текст или нет. Какие-то части на рисунке. Я это имела ввиду. Вот прочитала про ImageMap/ Там есть хот споты. Просто если это и возможно то если имедж идет их бд? Тогда на нем надо уже заранее проставить хот споты. Или вообще это не реализуется? |
| Автор: Mymik 17.5.2007, 09:04 | ||
| kedicik, Нет, ты ж всегда можешь определять RectangleHotSpot для своего ImageMap. Сам по себе ImageMap должен иметь ссылку на картинку. Вот ты и забираешь картинку из СУБД. Ну и соответственно после этого ты можешь (если ты используешь GridView/DataGrid, Repeater или DataList) прикрепится к *DataBound и там подсовывать к этому ImageMap разные HotSpot
Конечно, было б классно хранить в отдельной таблице в базе тип HotSpot'а, ссылку куда он ведет, его разметку и ToolTip. типа по ID картинки забираешь из таблицы все данные для HotSpot'а и генерируешь их на ходу. Добавлено через 1 минуту и 7 секунд Да. Ну а если не используешь что-то типа GridView/DataGrid, Repeater или DataList Тогда ты можешь подсовывать прямо в Page_Load |
| Автор: kedicik 17.5.2007, 12:22 |
| Все получилось Да я согласна! Хранить в бд координаты. Жалко что не выделяется хот спот при щелчке. Хорошо бы наложить на него как бы слой при щелчке. А при повторном удалить его. Типа прорисовать прямоугольник. Как нить можно? |
| Автор: Mymik 17.5.2007, 16:17 | ||||||
Если очень захотеть. То можно
JS Функция отвечающая за рисование прямоугольника. (Другие фигуры было очень лень рисовать)
А в behind-code добавляем вот так вот
|
| Автор: kedicik 17.5.2007, 19:22 |
| Спасибо попробую завтра на работе. |
| Автор: kedicik 18.5.2007, 17:58 |
| На открытие страницы сделала 2 хотспота. При клике по ним выводятся прямоугольники. При повторном они исчезают. Все правильно. Теперь мне нужно куда-нить сохранить какие споты у меня выделены. Мне нужно загнать в серверную лебел. Но я из джавы не вижу лебел. Может я не умею ее найти. Я могу найти только html inputtext/ туда я засылаю. Но я должна сделать его невидимым. Но после этого он у меня не может найтись в документе в джаве. Добавлено через 3 минуты и 39 секунд я вообще джаву плохо знаю. Вообще в джаве можно обращаться к серверным контролам? напр лебелам? И интересна 1 вещь. На этом Image Map у меня еще 2 спота которые я создала обычным способом. После клика и высвечивания прямоуг клик по Image map не идет. Т есть по другим спотам ничего не работает Добавлено через 6 минут и 42 секунды или это влияет слой который наложился на мап? Добавлено через 9 минут и 17 секунд ну а вообще меня давно интересует союз джавы и visualbasic.net почему из джавы никак нельзя обновить какое-нибудь поле текстовое типа asp:Label |
| Автор: kedicik 18.5.2007, 21:15 |
| А что такое обычный способ ??? Ну я имею ввиду что я создала 2 спота в конструкторе а не программно как вы мне написали. То есть есть2 спота с джавой и 2 спота обычных. Все 4 спота есть после загрузки страницы. Если я не кликаю по тем спотам где выводятся прямоугольники то по клику по мапу у меня нормально работают другие споты. Я получаю то что мне надо - иформацию по какому я кликнула (например координаты). Но как только я кликнула по джавским спотам и у меня появился прямоугольник, тогда те споты я не вижу и по клику у меня выводится - страница выводится с ошибкой-. ну это ладно . Поскольку нужны прямоугольники. И еще: а как отменить прямоугольник но чтобы тоже отловить это. Например по отрисовке прямоугольника я вывожу window.alert() а когда он становится невидимым то ?????? надо наверное новую джаву писать на это. 2 варианта - видимы и невидимый. Но я в джаве профан. Спасибо за инфу про обновление серверных полей. А я так долго мучилась с этим! Добавлено через 8 минут и 8 секунд Спасибо и жду ответов. Добавлено через 13 минут и 13 секунд Да на Input.text visible=false/ было. А брала из поля Value/ Но если даже засовывать инфу в asp:label то не произойдет отправка на сервер. Это понятно. А если в другой серверный элемент? Я тоже думаю что нет. И возбудить событие нельзя из джавы? я думаю что нет. |
| Автор: Mymik 18.5.2007, 22:17 | ||||||||||
Покажи как ты определила те два спота. Потому как у меня все работает.
Прямоугольник не становится невидимым -- он удаляется из контента страницы. удаление прямоугольника стоит на событие onclick.
Вот этот код отвечает за удаление элемента со страницы. Вставь перед ним что тебе нужно, или вынеси в отдельную функцию.
красные квадраты не становятся видимыми или невидимыми. Они либо есть, либо нет. Ты можешь попросту отловить событие до создания рисунка. В функции drawRect можешь поставить свои условия и ответвления работы скрипта.
Вот тут вот ход твоих мыслей я слабо очень понимаю... что ты хочешь ??? Создать какие-то данные с помощью JS и отправить с PostBack на сервер ??? ну так засунь эти данные в HiddenFiled, на клиенте это (<input type="hidden" />) это тот же <input type="text" /> только невидимый и он делает PostBack на сервер. Т.е. на сервере ты можешь обратится к контенту этого поля и взять из него данные, что были вписаны туда по средствами JS. Почему ж нельзя, конечно можно, с помощью Page.ClientScript.GetCallbackEventReference()(в asp.net 1.1 Page.GetPostBackClientEvent()) Причем вплоть до того, что можно не использовать asp.net AJAX RC1 а через эти методы использовать ajax (сам недавно узнал об этом). |
| Автор: kedicik 18.5.2007, 23:36 | ||
Я поставила на них тип не NavigateUrl а забыла .......... на работе это.... postback ? и определила Target=_self. Когда кликаю по ним (но уже прямоугольник появился на других спотах) то внизу вижу ошиибку как раз что-то про Тarget. Ну тогда до понедельника если точно нужно |
| Автор: kedicik 21.5.2007, 18:00 | ||||||
| Вот посылаю Form1.aspx и Form1.aspx.vb/ Framework 2.0 Добавлено @ 18:04 Извините не знаю как правильно присоединить
Добавлено @ 18:10
Добавлено @ 18:12
|
| Автор: kedicik 21.5.2007, 18:19 |
| Все таки обновление Label не работает. После отрисовки прм-ка меняется только Hidden и InputText/ а label не меняется. После отрисовки прям-ка по клику на Hot1 Hot2 выдается ошибка Ошибка на странице jscript: "theForm._EVENTTARGET" есть NULL и не явл объектом |
| Автор: Mymik 21.5.2007, 21:33 | ||||||
| kedicik, твой behind-code я вообще не смотрел. Я только смотрел только то что видим в aspx файле. 1) получение ссылок на DOM объект через document.all не поддерживается браузерами кроме IE(а нам ведь нужен код, который будет работать везде). Потому ее лучше заменять на document.getElementById. 2) В 10 и 11 строчках твоего xml файла (последняя вставка в виде xml) у элементов input есть атрибут runat="server" что делает их объектами HtmlControls. А следовательно их id (как и name) на клиенте отличаются от серверного. Потому общаться к ним надо
<%=Text1.ClientID %> -- преобразуют серверный ID в клиентский. 3) asp:Label на клиенте преобразуется в конструкцию <span></span> и чтобы записать текст в эту конструкцию, тебе нужно использовать прототип innerHTML. Этот прототип возвращает и устанавливает значение контента у данного DOM объекта. потому и изменять текст мы будем через
4)После того как ты нажимала на JS кнопки, которые рисовали квадратики, я как бы переписывал весь html... и из-за этого IE почему-то не хотело делать PostBack. Потому я пошел по другому пути и переписал это полностью на DOM модели. Ну и вобщем код страницы теперь выглядит вот так вот -->>
VB.NET я не сильно люблю, потому туда даже и не смотрел. Что касается работоспособности страницы -- теперь она работает во всех браузерах. |
| Автор: kedicik 22.5.2007, 20:07 |
| Ну хоть убейте меня но Label не выводит Num/ Я решила что я чего-то не понимаю ! А все остальное работает так как надо. Спасибо! |
| Автор: Mymik 22.5.2007, 20:18 |
| чего это Label не работает ??? работает... он выводит значение числа Num... все правильно там... у меня работает отлично... |
| Автор: kedicik 22.5.2007, 23:19 |
| Ну я не знаю почему. Как было у меня HELLO так и осталось. Ну может для меня это и не так важно но просто хочется понять!! и на будущее может понадобится. У меня explorer 6/0/ Отчего же может это зависеть.... |
| Автор: Mymik 23.5.2007, 08:07 | ||||
ты точно записываешь туда данные вот этой строкой
регистр букв соблюдала ??? (JavaScript регистрозависимый). Ковычки ставила ??? Смотри, у меня выглядит JS функция drawRect вот так вот
Это то что я отдавал тебе. когда ты срабатывает функция alert то значение в Label остается Hello. Как только доходит работа функции до последней строчки, так в Label появляется значение Num. Все работает как по мне. Или ты хочешь, чтобы измененное значение Label появилось на server-side ??? Label не делает PostBack данных. Так что ты не достучишься до измененного значениея Label на стороне сервера. Только лишь с помощью дополнительных элементов это можно сделать. |
| Автор: kedicik 23.5.2007, 12:16 |
| Сегодня все работает как надо. Все правильно. Я первым делом просмотрела регистр. Все соответствовало. Потом не долго мучаясь взяла и скопировала из ВАШЕГО примера . В общем все работает как часы. Какой-то глюк был. Большое спасибо за терпение и очень обстоятельные ответы. Все отлично. |
| Автор: kedicik 23.5.2007, 18:07 | ||
| Ну спрошу еще одну вещь. Раз мы уж говорили на тему что Label не отправляет инфу серверу. На какое событие мне писать занесение результата в БД? На unload страницы? и брать результат из поля Hidden? У меня есть страница с radioButtonList Там я сразу при выборе одного из элементов сохраняю результат в БД. Но это серверный элемент и это возможно. А в этом случае? Как поступить? Добавлено через 2 минуты и 53 секунды
Какие допол элементы? |
| Автор: Mymik 23.5.2007, 19:27 | ||||||
| kedicik, В http://forum.vingrad.ru/forum/topic-152577.html обсуждалось как реализовать отправку данных (вызов события) на сервер. Ты же можешь не генерировать вызов этой функции, а написать ее сама, первый ее параметр будет строчка, а второй параметр подставляй значение Num. Либо так как мы люди продвинутые и сейчас используется AJAX, но мы конечно же не хотим подключать эти сложные библиотеки и тому подобную фигню. Мы будем использовать наш старый добрый Page.ClientScript.GetCallbackEventReference(). Который нам сгенерирует скрипт AsyncPostBack'а. На страницы нам понадобится JS функция которая будет обрабатывать ответ с сервера
Я особо не заморачивался и написал маленькую функцию, которая просто вписывает значение в Label. На странице у меня аж целых три контрола
А самое интересное начинается в behind-code Во-первых для обработки AJAX'овых запросов, нам понадобится унаследоваться от интерфейса ICallbackEventHandler и реализовать два его метода RaiseCallbackEvent и GetCallbackResult Метод RaiseCallbackEvent вызывается при поподании запроса на сервер. Т.е. тут ты как раз и видишь те аргументы что пришли к тебе. Метод GetCallbackResult отвечает за отдачу строчки обратно пользователю. Т.е. как я представляю это себе -- первый метод для работы, второй метод для оповещения пользователя, что все супер. И так. в Behind-code у меня вот такой вот код
Вот собственно говоря и все. Это такой маленький экскурс в AJAX который тебе пригодится в поиске твоего решения. Для больший проектов такая генерация AJAX очень сложна и лучше подключать сборку asp.net ajax rc1. А для одиночного запроса подойдет и такое дело. Если же не хочешь использовать AJAX. То тебе всегда на помощь спешат HiddenFields, в которые ты сможешь записать данные из Label и они уже отпостят эти изменения на сервер. Вот так вот все просто... только тогда пользователя обязательно надо будет отправить на сервер... |
| Автор: kedicik 24.5.2007, 17:15 |
| Огромное спасибо! Все замечательно. А я так долго мучилась с этим. MyMik спасибо за обстоятельные ответы |
| Автор: kedicik 25.5.2007, 19:18 |
| Сори.... это опять я. Соединила все наши изыскания вместе. По клику по хотспоту рисую прямоугольник и загоняю Num в TextBox txtText (все делаю как ранее). На onChange Textbox стоит занесение текта в Label txtText.Attributes.Add("onchange", "DoCallBack(this.value, 0)") Если меняю текст в Textbox и перехожу на кнопку или щелкаю по форме (теряю фокус), то как и было ранее меняется Label. Но это работает когда вживую меняешь текст. Если же кликаешь по хотспоту то Label не меняется то есть onchange не возникает. Может txtText.Attributes.Add("onchange", "DoCallBack(this.value, 0)") поменять на что-то другое? Я думала по клику на спот загнать Num в txtText, и потом по изменению в txtText сохранить инф в БД. Получается я должна сделать : найти контрол Myhot1 (поскольку он динамический) и после этого Myhot1.Attributes.Add("onclick", "DoCallBack(this.value, 0)") Так ? |
| Автор: Mymik 25.5.2007, 21:34 | ||
kedicik, после того как ты записала данные в TextBox просто искусственно возбуди событие onchange().
P.S. настоятельно рекомендую начать ознакамливаться с DHTML или DOM level 0. ну и потихоньку до третьего уровня добраться. обращаться сюда это нормально и мы всегда рады тебе помочь, но слишком сильно тормозит производство окончательного продукта в виде сайта. |
| Автор: kedicik 28.5.2007, 21:07 |
| Mymik, большое спасибо за все! Все получилось! |