| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > По умолчанию преобразование кода Си в Delphi |
| Автор: WantToProg 26.4.2009, 12:47 | ||||
| Доброго времени суток уважаемые программисты. В очередной раз хочу вас побеспокоить. Имеется такой код на Си
Работа его заключается в очистке терминала от всех символов и печать на нем текста Hello world. Все бы ничего, да только надо мне этот код на delphi, а как это сделать, я к сожалению не знаю. Несколько предположений все таки сделал, но они не работают. Итак, первое Unsigned Char в Delphi можно представить как Word, ну или Byte. Таким образом получится:
Но не понимает Delphi данные в строке sdbuff := 0x1b;, говорит Missing operator or semicolon. То есть не хочет читать данные в шестнадцатиричном представлении. Я очень прошу подсказать, что я тут не так делаю. Да и вообще, как послать чудо терминалу такую команду? |
| Автор: WantToProg 26.4.2009, 13:09 | ||||
Такс, с представлением все ясно. Теперь проблемка с Unsigned Char, если не Word, то что тогда? Byte - не работает тоже, почему-то посылается непонятный набор символов, а не комманда $1b Что-то я делаю не так :( Забыл упомянуть про функцию MySocketSend Она обрабатывается в другом модуле как:
Вопрос в принципе так и остается, как это сделать на Delphi. Писал его под Linux на Си, теперь надо внедрить в 1С, и есть модуль на Delphi, вот и пытаюсь что то сделать. |
| Автор: kami 26.4.2009, 13:31 | ||
|
| Автор: WantToProg 26.4.2009, 13:35 | ||
| kami, Огромное спасибо. Но остался один небольшой вопрос: Что делать, если вместо текста '$Hello World' должна быть переменная? Как тогда организовать функцию? по какойто неведомой мне причине
Не работает :( |
| Автор: Keeper89 26.4.2009, 15:17 |
| Вот http://www.delphisources.ru/pages/faq/base/ascii_to_hex.html не поможет? |
| Автор: kami 26.4.2009, 16:00 | ||
Причины неведомыми не бывают. Либо компилятор что-нибудь скажет, либо в run-time ошибка вылезет. Весьма полезно вместо "Аааа, ничего не работает" говорить конкретные причины, например "Компилятор говорит Undeclared identifier: str" или "ESocketError 10061" Показанный вами код вполне работоспособен. Еще раз:
Добавлено через 3 минуты и 54 секунды Я еще многого мало знаю, но причем здесь преобразование в Hex представление? |
| Автор: WantToProg 26.4.2009, 16:40 | ||||||||
Не, это тут как бы не при чем.
Да, я согласен с вами, и код работоспособен и ошибок нет. Но вот не очень понятно следущее: Если я использую:
результат: Hello World - Все понятно, все нормально, команда #$1b, очищает экран если:
результат: #$1b и дальше содержимое переменной. то есть команда воспринимается как набор печатаемых символов, то есть не очищает экран. А если же:
результат: только содержимое переменной, команда #$1b почему то игнорируется, т.е. не очищает экран. В этом и есть суть вопроса. Почему в одной ситуации, без переменной, команда работает, а с переменной нет. |
| Автор: kami 26.4.2009, 16:51 |
| Поставьте breakpoint на строку Winsock.send(Sock, SendData[1], Length(SendData), 0); и посмотрите, чему равно SendData. Добавлено через 1 минуту и 10 секунд Код самой процедуры отправки и процедуры, ИЗ КОТОРОЙ она вызывается в студию. Добавлено через 7 минут и 52 секунды И естественно. В этом случае к str спереди линкуются 4 символа: #+$+1+b , что само собой ни разу не эквивалентно #$1b |
| Автор: WantToProg 26.4.2009, 17:19 | ||||
Это компонента .dll для 1С BP не добавить, поэтому я добавил объект
содержимое SendData = str символом . О чем это может говорить? |
| Автор: kami 26.4.2009, 17:22 | ||
| Это может говорить только об одном: #$1b не добавлено спереди к переменной str. Или же добавлено, но не к той переменной. (и это вполне серьезно, без иронии).
Добавлено через 1 минуту и 3 секунды Кстати, #$1b выглядит в сообщении, как квадратик. Добавлено через 10 минут и 22 секунды Так внесите логирование через каждую строчку в файл. "Получили данные для отправки. str='+str "соединили с символом. SendData='+SendData "Отправляем SendData. SendData='+SendData |
| Автор: WantToProg 26.4.2009, 17:42 | ||
Да, да. Я просто забыл добавить к переменной. Выглядит именно так. Таким образом символ #$1b действительно отсылается, но почему то не воспринимается как комманда
Прикрепляю файл на всякий случай, там как раз описан процесс подключения |
| Автор: kami 26.4.2009, 18:06 | ||
| Начнем с малого (остальное пока смотрю). потоковая функция должна быть объявлена как function send_thread(Parameter: Pointer): Integer; stdcall;. - иногда полезно смотреть исходники Delphi. Если параметр в данном случае значения не имеет (у integer и pointer размерность одна), то выделенное жирным шрифтом (т.е. отсутствующее у вас - это, извините, очень грубая ошибка). В дополнение, если работаете с CreateThread в Delphi (хотя это не рекомендуется, безопаснее пользоваться BeginThread), то выставьте хотя бы IsMultiThread:=True; Во-вторых - в корне неверная работа с сокетами (архитектурно, я имею ввиду). Извините, но так писать нельзя. Правда, это тема для отдельной ветки, посему опустим. У вас есть какой-нибудь сниффер, например http://soft.softodrom.ru/ap/p7531.shtml ? Если да - посмотрите, что на самом деле отсылаете, потому что других проблем на первый взгляд не видно. Добавлено через 7 минут и 48 секунд Почему бы, кстати, не воспользоваться ClientSocket вместо всей этой возни с WinSock? Было бы гораздо проще и нагляднее... Добавлено через 9 минут и 27 секунд
А он воспринимается как команда сразу после приема получателем, или после того, как получателю дойдут CRLF -символы ? |
| Автор: WantToProg 26.4.2009, 18:16 | ||||||
Все, огромное спасибо, проблема решена. На самом деле, нужно было немного включить мозг. Спешка мешает серьезно.
нужно было добавить '$' таким образом
И все заработает.
Я был бы не прочь посмотреть другие варианты работы с сокетами. Просто в Delphi пишу первый раз и первую программу. Да если честно, вообще опыта не много. Учусь так сказать |
| Автор: kami 26.4.2009, 18:19 |
"Я ш откедова знала-то" Удачи ! |
| Автор: WantToProg 26.4.2009, 18:22 | ||||
Данные отсылаются на сканер штрих кодов, а как он работает я понятия не имею. Все вычислял эмпирическим путем, т.е. наугад.
Да я сам понятия не имел Благодарю за помощь, но чувтствую не последний раз спрашиваю |