Данная тема предназначена для обсуждения развития проекта "Подводные камни", который был создан именно благодаря этому обсуждению. Здесь принимаются ваши предложения, замечания и пожелания по работе раздела. В теме сохранены первоначальная формулировка и весь ход предварительного обсуждения. Для истории :о) Изначальный вариант темы: Я согласна с Алексем Вуколовым и Портосом. Тема, без сомнения, заслуживает внимания, несмотря на то, что немало мест в сети ей посвящены. И если жители Королевства видят смысл в том, чтобы внести свою долю, то есть "ее обобщить, дополнить и т.д. и т.п", стоит это обсудить.
По просьбе господина Портоса аудиенция на предмет организации рубрики предоставлена. :о)
Обсуждается вопрос :
"Нужно или нет организовывать раздел "Подводные камни" и что он должен содержать?"
От себя добавлю, что обсуждать желательно именно эту тему, а не частные проблемы и "глюки".
Хотелось бы напомнить, что раздел кто-то должен вести и работа эта серьезная, таким образом будет нужен координатор проекта.
Текст предварительного обсуждения на Базарной площади. Елена Филиппова
Всего в теме 100 сообщений
Добавить свое сообщение
Отслеживать это обсуждение 
- Тестирование проекта. Отладка.
- Централизованная обработка ошибок
- Бета-тестирование
- Давайте учиться на ошибках.
- Почему программисты допускают ошибки?
- Автоматизированные тесты для GUI
- О системах контроля ошибок
- Вопросы оптимизации кода
100—91 | 90—81 | ...>>> Всего сообщений в теме: 100; страниц: 10; текущая страница: 1
№ 100 09-10-2024 14:56 |  |
Не знаю, жив ли ещё раздел. На всякий случай опубликую здесь камушек, об который я здорово отбил ногу
Delphi XE3, в Datasnap.DBClient.pas встречаем вот такой код
procedure TCustomClientDataSet.SetFieldData(Field: TField; Buffer: TValueBuffer);
var
RecBuf: PByte;
begin
if not (State in dsWriteModes) then DatabaseError(SNotEditing, Self);
if (State = dsSetKey) and ((Field.FieldNo < 0) or (FIndexFieldCount > 0) and
not Field.IsIndexField) then DatabaseErrorFmt(SNotIndexField, [Field.DisplayName]);
GetActiveRecBuf(RecBuf);
if Field.FieldKind in [fkData, fkInternalCalc] then
begin
if Field.ReadOnly and not (State in [dsSetKey, dsFilter]) then
DatabaseErrorFmt(SFieldReadOnly, [Field.DisplayName]);
Field.Validate(Buffer);
if State in [dsEdit, dsInsert] then
Check(FDSCursor.VerifyField(Field.FieldNo, Buffer));
Check(FDSCursor.PutField(RecBuf, Field.FieldNo, Buffer));
if FAggFieldsUpdated <> nil then
FAggFieldsUpdated[Field.FieldNo-1] := True;
end
else
begin
if State = dsInternalCalc then Exit;
Inc(RecBuf, FRecordSize + Field.Offset);
Boolean(RecBuf[0]) := LongBool(Buffer[0]);
if Boolean(RecBuf[0]) then Move(Buffer[0], RecBuf[1], Field.DataSize);
end;
if not (State in [dsCalcFields, dsInternalCalc, dsFilter, dsNewValue]) then
DataEvent(deFieldChange, IntPtr(Field));
end;
В указанной строке разработчик намудрил. Он таким хитрым способом хотел проверить Buffer на nil: LongBool интерпретирует 4 байта как false, если они все нулевые, а в противном случае -- true. Но вот только программист в этом месте ошибся и вместо адреса Buffer берёт 4 байта из самого Buffer. У меня там передавалось небольшое число Float, так что первые байты всегда были нулевыми, так что значение никогда не присваивалось, и вычисляемое поле (а именно к ним относится данный участок кода( всегда оставались NULL.
В Delphi 7 этой ошибки ещё нет, а в Delphi XE10 -- уже нет. Других версий у меня нет.
Простейшее исправление очевидно: вместо
Boolean(RecBuf[0]) := LongBool(Buffer[0]);
написать
Boolean(RecBuf[0]) := LongBool(Buffer);
В Delphi XE10 поправили так
Boolean(RecBuf[0]) := Buffer <> nil;
Я у себя поправил так
Boolean(RecBuf[0]) := Assigned(Buffer);
№ 99 24-03-2019 16:01 |  |
№ 97 21-08-2017 06:37 |  |
Раздел Подводные камни возобновляет свою работу.
Новый камень http://www.delphikingdom.com/stones/stone.asp?StoneID=118 от господина inferno
Материалы присылайте мне в СЛС. По мере возможности буду рассматривать и публиковать. Большая просьба: снабжайте ваш материал тестовым примером.
№ 96 26-03-2011 00:47 |  |
Ответ на »сообщение 95« (Андрей Чигинев)
___________________________
Вот что значит не читать сначала сообщений по теме :( Отправил сообщение о камнях на ARTICLES
№ 95 25-03-2011 13:07 |  |
Есть сообщение о паре подводных камней в Д-ХЕ, как и куда его отправить? Root@delphikingdom.com ответил, что его нет - письмо вернулось обратно...
№ 94 28-11-2008 09:11 |  |
№ 93 28-11-2008 08:35 |  |
Есть ещё один камушек. БИБЛИОТЕКА.VCL.Невидимые компоненты в плагинной форме.
Создание форм-плагинов через пакеты - это удобно и практично... но только когда все плагины поступают из единого источника! Если же мы создаём действительно открытую архитектуру, это "удар ниже пояса": для создания плагинов потребуется именно Delphi. На то они и плагины, чтобы их можно было писать на чём угодно: Delphi, VC++, MinGW...
И вот, создаём форму-плагин без пакета (через дескрипторы), показываем... а на ней видны только TGraphicControl'ы наподобие TLabel. Компоненты, производные от TWinControl (TPanel, TCheckBox и т.д.) не видны.
А решается всё одним щелчком. Достаточно установить в плагинной форме Visible=true.
Спасибо.
№ 92 10-05-2007 11:46 |  |
Ответ на »сообщение 91« (Антон Григорьев)
Большое спасибо :)
На этот раз письмо, по крайней мере, дошло. Остается наеяться, что его прочтут.
P.S. С нетерпением ждем, когда в ссылках на сайте заменят устаревший адрес root на новый...
№ 91 10-05-2007 01:42 |  |
Ответ на »сообщение 90« (Андрей Пляко)
___________________________
Есть ли какие-нибудь прогнозы о том, когда начнет работать e-mail адрес Королевства?
Насколько мне известно, уже никогда. Вместо root попытайтесь отправить на mail@тот_же_домен.
100—91 | 90—81 | ...>>> Всего сообщений в теме: 100; страниц: 10; текущая страница: 1
Добавить свое сообщение
Отслеживать это обсуждение 
Дополнительная навигация: |
|