-
Вроде нашел ошибку в коде АРС, не уверен правда, что ошибка. См. мои комментарии:
SetLength(WS, Length(S));
if MultiByteToWideChar(cp_utf8, 0, PChar(S), -1, PWideChar(WS), Length(WS) + 1) = 0 then begin
Result := S;
Exit;
end;
SetLength(Result, Length(WS));
if WideCharToMultiByte(cp_1251, 0, PWideChar(WS), Length(WS) + 1, PChar(Result), Length(WS) + 1, nil, nil) = 0 then begin
Result := S;
Exit;
end;
-
> guav (12.11.2006 22:34:00) [0]
Так ты до конца смотри, последнея строка Result := PChar(Result); Результат точная строка, до первого нулевого символа.
Я конечно мог бы сделать с получением длины необходимой строки, но это двойной вызов функции и в конце то же самое Result := S
Зачем? Результат одинаковый.
Не вижу проблемы. Мусор учтен, он убирается последней строкой, для UTF-8 этот метод подходит, поскольку результат всегда меньше по длине. Строка может содержать любой мусор в конце, важна только левая часть до первого ограничителя, что и убирается через функцию PChar Параметр -1 обеспечивает этот самый ноль.
Давай свои доводы.
-
> guav (12.11.2006 22:34:00) [0]
Там где Result := S; Exit; - там присваивается входное значение в случае внутренней ошибки в работе функции MultiByteToWideChar и WideCharToMultiByte
-
> guav (12.11.2006 22:34:00) [0]
Я так понимаю, что ты уже скачал код и анализируешь? Как общее впечателение?
-
> [1] Anatoly Podgoretsky © (12.11.06 23:08)
Не заметил слона :-( ветку можно удалять. а можно и не удалять.
более лучшим было бы решение не с урезанием Result а с урезанием WS (таким же образом, или по результату MultiByteToWideChar)
PS: Я успешно поставил компонент. однако, сам проект окрывается сложнее [D7, Ics6]
-
> guav (12.11.2006 23:38:04) [4]
Да зачем удалять, если потребуется, то сюда же и можно писать.
-
> guav (12.11.2006 23:38:04) [4]
Рано послал ответ, я специально отказался от выделения точного места, функция это позволяет, в других проектах у меня это используется, просто здесь более эффективен этот метод, не надо считать, само присвоит ровно столько сколько нужно.
Насчет установки - я предупреждал, три компонента, правда один все равно полезен - это TNT, а вот два остальных возможно никогда не будут использоваться, хотя если надо будет сделать что то на сторону с полностью встроеный БД, то и абсолют пригодится, а вот судьба ICS более печально, правильнее пользоваться, тем что идет с Дельфи, просто мне Инди не подошло, только потратил неделю, но плохой опыт - тоже опыт.
-
> [3] Anatoly Podgoretsky © (12.11.06 23:23) > Как общее впечателение?
Трудно пока сказать, мне сложно в это сразу вникнуть, особенно когда среда отвергает проект (пытаюсь открывать в Д7). Могу разве что попридираться к ReadSettings/SaveSettings или к MultiByteToWideChar :-)
-
> guav (12.11.2006 23:38:04) [4]
Упс, я писал, что нужен ICS5, я не знаю как себя это будет вести на бете версии 6.
-
> [6] Anatoly Podgoretsky © (12.11.06 23:54) > я специально отказался от выделения точного места, функция > это позволяет, в других проектах у меня это используется, > просто здесь более эффективен этот метод, не надо считать, > само присвоит ровно столько сколько нужно.
не понял.
-
> [8] Anatoly Podgoretsky © (12.11.06 23:56)
поведение не важно, мне лишь бы открыть в среде. Модули переименовал и всё ок вроде. Но наверно таки установлю ICS5
-
> guav (12.11.2006 23:55:07) [7]
Ну к этому можно придраться, хотя это самые не существенные куски, можно по разному реализовывать, тем более что я к одному замечанию, по поводу ReadSettings прислушался, сделал по другому, хотя и старый вариант тоже нормальный был.
-
> guav (12.11.2006 23:57:09) [9]
У функции можно спросить, сколько байт требуется для результата, затем выделить это место и снова вызвать уже для исполнения.
-
> guav (12.11.2006 23:59:10) [10]
И учти, что я делал на Д2006 может и тут что-то вылезет.
-
> [12] Anatoly Podgoretsky © (13.11.06 00:10)
Понял. Долгий, но зато надёжный способ.
Про ReadSettings/SaveSettings: Ну не нравится мне когда вышел с максимизированным окном, после чего окно не уменьшается при восстанавливании wsNormal. да и повторение кода в каждой форме уже может быть поводом для придирки :-)
> [13] Anatoly Podgoretsky © (13.11.06 00:10) > И учти, что я делал на Д2006 может и тут что-то вылезет.
Кроме лишних свойств в ДФМ и кодировки модулей в УТФ-7 - ничего, вроде.
-
> guav (13.11.2006 0:18:14) [14]
UTF это не дань моде, а насущная необходимость, при том это делаю не я, а среда. В отличии от предудущих версий в 2006 это сделано хорошо, а предыдущие версии мне крови попортили.
-
> [15] Anatoly Podgoretsky © (13.11.06 00:23)
Я не возражаю против UTF-8. D7 возражает.
-
>[16] guav(c) 13-Nov-2006, 00:24 >Я не возражаю против UTF-8. D7 возражает. нотепадом её убивать.
-
> guav (13.11.2006 0:24:16) [16]
Знаю, но это не первый раз, не считая свойств. Издержки. Ну не хочет Борланд сделать раз и навсегда Юникод, а на дворе уже 2006 год. Сообственно уже в Д6 были зачатки, тексты кодировались с некотором текстовом подобии Юникод и вот тут то и возникала подлянка при переносе на машину с другой локализацией, хотели сделать хорошо, а получилось как всегда и трудно было программировать тексты более чем на одном языке, хоть в 2006 сделали что-то более приличное, но до нормального еще далеко.
-
> Ketmar (13.11.2006 0:30:17) [17]
Убить то можно, не будет ли других проблем?
-
>[19] Anatoly Podgoretsky(c) 13-Nov-2006, 00:31 >Убить то можно, не будет ли других проблем? так всё равно без абсолюта не работает, какая разница...
-
> Ketmar (13.11.2006 0:32:20) [20]
Возможно с данным проектом это и пойдет, конечно на русской локализации, зато другие мои проекты включают как минимум два языка и к сожалению нет достойного набора компонент для полной, нормальной реализации, TNT не перекрывает даже потребности баз данных, например отсутствие TTntDBLookupComboBox потребовало искать обходные пути, но это и к лучшему, почти везде где можно отказался от dbAware компонент, что благоприятно повлияло на проекты, а иначе бы так и сидел на них.
-
мда. dbaware -- удобно, но такая гадость... %-)
-
> Ketmar (13.11.2006 0:38:22) [22]
Да не гадость, но меньшая управляемость, зато теперь красота - SELECT/INSERT/UPDATE короткие транзакции, кроме читающей SELECT и никаких проблем со сложными запросами.
-
> [17] Ketmar © (13.11.06 00:30)
Уже, причём именно ноутпадом > да и повторение кода в каждой форме уже может быть поводом > для придирки
Это опрометчивое заявление. ReadSettings все разные. В одном есть несущий магический смысл Exit. procedure TMainForm.ReadSettings;
begin
with TRegistry.Create do
try
OpenKey(RegBase + 'MainForm', True);
if ValueExists('Left') then begin
... end
else begin
...
Exit;
end;
finally
Free;
end;
end; В другой есть except (я понимаю, зачем он там нужен, вопрос скорее почему в других местах нет). Копипаст - зло, ошибки нужно делать и исправлять в одном месте.
-
>[24] guav(c) 13-Nov-2006, 00:45 можно сократить до >ошибки нужно делать %-)
-
> guav (13.11.2006 0:45:24) [24]
В других местах его нет потому что там пользовательские, а не серверные функции и исключение не смертельно для сервера, а наоборот пользователь узнает о нем. Главный ReadSettings как раз другой. Ну и второй вариант, может я чего то не учел. Кроме того эти другие от отличаются и подходом, в них записаны характеристики форм, если в реестре нет значения, то оно будет создано при закрытии, иначе будут использованы дизайнтайм характеристики.
Поэтому подход дифферинцирован, но надо будет внимательно посмотреть, нет ли каких блох.
-
> guav (13.11.2006 0:45:24) [24]
Ой посмотрел код, не совсем так, совсем не так, except вообще не нужен, можно будет убрать, пусть стандартная обработка работает, а главный серверный защищен с помощью ValueExists Но можно и не менять, разве только для единства стиля. И так и так результат одинаковый и более того вероятность возникновения ошибка в TRegistry.Create практически равна нулю и если такая вероятность есть тут уже не до моей программы, живым бы ноги унести, это говорит что у системы серьезные проблемы. Конечно есть определенная непоследовательность и как ты справедливо заметил, из-за китайского метода, все никак не могу себя от него отучить, проблемы из-за него постоянно возникают.
-
нормальный метод. наследие времён, когда платили за количество строк. %-)
-
> [25] Ketmar © (13.11.06 00:50)
Можно. Но это и так очевидно. Можно до "ошибки нужно делать и исправлять" - это тоже очевидно. А вот "ошибки нужно делать и исправлять в одном месте." - уже аргумент против копипаста.
> [27] Anatoly Podgoretsky © (13.11.06 00:56) > из-за китайского метода, все никак > не могу себя от него отучить, проблемы из-за него постоянно > возникают.
Я обычно пишу таким образом места, которые сразу не могу писать нормально, но потом специально выискиваю "китайский" код и исправляю.
Вообще, там столько переменных публикуемых типов пишется и читается в реестр, что запуздыривание их в класс и запись/чтение через RTTI не только сделает код менее "китайским", но и уменьшит размер иходников.
-
> [28] Ketmar © (13.11.06 00:59) > нормальный метод.
В основном, да. Легко писать, легко трассировать. Однако модифицировать такой код потом трудно: где-то можно забыть исправить. И баги по несколько раз исправлять приходится.
-
>[30] guav(c) 13-Nov-2006, 01:15 не надо мне про это рассказывать. знаком не по-наслышке. %-)
-
> [31] Ketmar © (13.11.06 01:34) > не надо мне про это рассказывать.
и то правда.
Что меня побудило скачать исходники - ошибки АРС, причём не в том, что касается протоколов, но в более простых вещах. Хотел увидеть, как так может быть. Увидел, что там просто код даже более "китайский", чем мой.
-
>[32] guav(c) 13-Nov-2006, 01:40 >просто код даже более "китайский", чем мой. CDM такой же. %-)
-
а я вообще писать клиента не буду.
а шокирующий меня пример копипаста я увидел в генофонде: перегруженные версии FloatToText, FloatToTextFmt и FormatBuf не разделяют единую реализацию, я предполагал, что из версий без const FormatSettings: TFormatSettings вызываются вкрсии с оным, оказалось - нет, копипаст.
-
Я уже молчу про DMClient, который начал писать один человек, не собираясь никому показывать ни исходный код, ни саму программу, а теперь дописывает другой.
-
> Gero (13.11.2006 02:14:35) [35]
Он чего боялся чтоли? Я например не боюсь показывать любой код, как бы плохо он не был написан.
-
> [36] Anatoly Podgoretsky © (13.11.06 09:13)
Почему же, не боялся, и код потом был опубликован.
-
> guav (13.11.2006 01:10:29) [29]
> Я обычно пишу таким образом места, которые сразу не могу писать нормально, но потом специально выискиваю "китайский" код и исправляю.
Видел бы ты как писался код, сколько раз он изменялся по данной причине, поскольку не только не ясно как нормально, а вообще не ясно как вообще, многочисленый трассировки с воссождание различных ситуаций, тем более что нельзя сразу написать для всех вариатов, которых просто очень много, неизвестные реакции серверов на различные ситуации и при этом сервер должен оставаться в любом случае живым, это же не клиент. Вот если буду писать другой сервер то будет полегче, уже известны многие проблемы. Документация - ожидалось, что в RFC все описано, оказалось что нет, один формат XOVER столько пришлось перешерстить Интернета, все ссылаются на одного чувака, мол у него описан формат, а все ссылки на него мертвые и датированы прошлым веком, еле еле нашел одно единственное место, где была нужная мне строчка. А код как код, можно писать с разными вариантами, сути не меняет.
-
> guav (13.11.2006 01:15:30) [30]
Не, китайский метод, это зло, именно забывается и особенно когда идентификаторы близкие по написанию и старое описание то есть и оно валидное, компилятор тут не помогает. Но время ускоряет невероятно, только нужно быть скрупулезно внимательным, но и то пропускаешь, если же писать не этом методом, то не будет единства стиля, сам же в него меня ткнул вчера и дольше, но более надежно.
-
> Gero (13.11.2006 09:19:37) [37]
Ну я не про потом. Да ладно, шучу я :-)
-
> [40] Anatoly Podgoretsky © (13.11.06 09:57)
А, я сразу не понял о чем речь ;)
-
> [38] Anatoly Podgoretsky © (13.11.06 09:21)
Ну так на места, в которых уже всё понятно, можно переписывать, причём по возможности до написания нового кода. > старое описание то есть и оно валидное, компилятор тут > не помогает.
Для старого описания есть такая штука
или директива depercated > Документация - ожидалось, что в RFC все описано, оказалось > что нет
Бывает. Не на всё есть хелп и МСДН, кое-что и выдумывать приходится :-( > [33] Ketmar © (13.11.06 01:55)
> [35] Gero © (13.11.06 02:14)
Никого я не обвиняю (было бы в чём), но реальность суровая... В код других клиентов не вникал, теперь боюсь. зы: завёл тему про копирование в борландовских ньюзгрупах, посмотрим насколько китайцы дружные ;-)
-
> guav (13.11.2006 13:50:42) [42]
> Не на всё есть хелп и МСДН, кое-что и выдумывать приходится
Статус все таки разные, пока я искал я обратил внимание, что кроме меня еще множество народу ищет и в ответ что несуразное, например обращаться в Беркли, мол там есть один человек, который это знает. А ведь это одна их базовых команд и без ее формата реализовать сервер невозможно. Но что хорошо, что есть альтернатива - гнусный XHDR, по крайней мере ОЕ если определяет, что XOVER не поддержан, то переходит на него. Но я например неуверен, что многие другие клиенты смогут работать если XOVER не будет поддержан.
> Для старого описания есть такая штука // или директива depercated
Видимо я не четко выразился, я про следующее, например скопировал из другого модуля или из другого обработчика следующий код.
:= XXX1.YYY
XXX1 валиден, а нужен XXX2 - очень легко нарваться, если не изменил, и программа будет работать, поскольку и XXX1 и XXX2 валидны в месте применения, в одном блоке, но будет непонятно, почему иногда результаты не те, это китайское противодействие. Конечно пример простой, но понятно о чем речь. Если куски копирования маленькие, то конечно не ошибешься, а если сотни строк, то элементарно. Но китайские метод дает хорошие характеристики по скорости, в ущерб надежности. Поэтому последнее время приучаю себя не копировать, пусть дольше, но надежнее. В данном сервере я допустил несколько ляпов подобного рода, но во время обнаружил, в итоге вместо экономии была потеря времени и нервов.
Но к сожалению пока еще это плохо выходит, надо быть настойчивее и сразу бить по рукам самого себя.
Кстати Д2006 очень плохо относится к китайскому методу, при копировании блока свойств и связаных объявлений обработчиков - она просто довольно быстро зависает, при том намертво, так что приходится снимать из процессов. И то с трудом. В рефакторинге я не нашел функции по полю создать одноименное свойство и Get/Set методы
-
К вопросу об клиентском скрипте, вот данное сообщение было перемещено в 13:16 а оповещение поступило только сейчас, вместе с ним перемещалось еще одно сообщение, оповещения пока нет
--= Eagle =-- © (13.11.2006 13:16) [D7, Win2k, WinXP] »» Перемещено в конференцию "WinAPI"
-
Вот наконей поступило, но как удаленое, о чем ввиде ошибки сообщил OE
-
> Anatoly Podgoretsky (13.11.2006 15:08:44) [44]
Вот спустя 5 минут пришло и второе оповещение, хотя разница в секунды и кроме того скрипт выдал в рассылке список уже давно удаленые (перемещеные) сообщения и как прикажешь с подобным жить?
--
-
Вот теперь еще раз выдал, уже повторно.
-
> if MultiByteToWideChar(cp_utf8, 0, PChar(S), -1, PWideChar(WS) > , Length(WS) + 1) = 0 then begin
cbMultiByte
[in] Specifies the size in bytes of the string pointed to by the lpMultiByteStr parameter, or it can be -1 if the string is null terminated. Note that if cbMultiByte is 0, the function fails. Т.е. -1 не обязательно, можно смело передавать Length, которая в байтах тоже.
-
Gero © (13.11.06 02:14) [35] Я уже молчу про DMClient, который начал писать один человек, не собираясь никому показывать ни исходный код, ни саму программу, а теперь дописывает другой.
Ничего я не дописывал! :)
Anatoly Podgoretsky © (13.11.06 09:21) [38] Документация - ожидалось, что в RFC все описано, оказалось что нет, один формат XOVER столько пришлось перешерстить Интернета
Анатолий, я тоже искал, а как оказолось это банальный STAT :)
-
оказолось это банальный STAT :)
Имею ввиду, формат
-
> guav (15.11.2006 01:36:48) [48]
Ну и какой Length ты передашь для utf-8
-
> Другой (15.11.2006 05:54:49) [49]
Даже если бы это было и так, то в rfc нет никакого намека на это, но на самом деле ничего даже близкого к STAT нет и не пахнет
-
> Другой (15.11.2006 05:54:50) [50]
И я это же имею в виду.
-
> [51] Anatoly Podgoretsky © (15.11.06 09:16) > Ну и какой Length ты передашь для utf-8
Тот что возращаеся Length(). Он в байтах.
-
> guav (15.11.2006 10:19:54) [54]
То есть то что я говорил про двойной вызов функции, а данное предложение я понял как про одинарный вызов функии. Пусть прояснится, что он имел в виду.
-
> Anatoly Podgoretsky (15.11.2006 10:47:55) [55]
moder=app action=close
-
moder=app action=move 6
-
> Кстати Д2006 очень плохо относится к китайскому методу, > при копировании блока свойств и связаных объявлений обработчиков > - она просто довольно быстро зависает, при том намертво, > так что приходится снимать из процессов. И то с трудом.
Такое бывает, если установлен Punto Switcher, до v2.8 включительно, с включеной фунцией "сохранение буфера обмена в дневнике". Лично я пользуюсь этой функцией, для восстановления кода (текста), который долго набирал, но не сумел сохранить. Или в случае неудачной отправки сообщения из клиента.
-
Дату поста вижу, но всяк случай напишу если у кого нить подобные грабли будут))))
вместо MultiByteToWideChar юзайте StringToWideChar
или так
function StringToWChar(const S: string): PWideChar; var Buffer: array[0..127] of WideChar; begin result:=StringToWideChar(S, Buffer, SizeOf(Buffer) div 2); end;
-
Просто поднял, что бы легче было новеньким.
-
Вот у меня проблеам: Есть набор китайских иероглифов, знаю точно что в мультибайте, и их надо вывести в поле Edit1.Text. Я никак не могу понять в чём моя проблема: MultiByteToWideChar(CP_UTF8,0,PAnsiChar(List3[number].gfx[1]),-1,PWideChar(wc),0); Edit1.Text:=wc;
// var gfx: Array[0..127] of AnsiChar;(ну он в записи стоит) wc:widechar; Надеюсь на Вашу помощь! Заранее спасибо!
|