Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (версии 2009, 2010 Weaver, 2011 Fulcrum)

Автор: lsferret
Дата сообщения: 20.01.2011 12:12
hi!

При тестовом переносе Builder проекта с Weaver на Fulcrum обнаружен баг при использовании компонента JvGIFAnimator библиотеки JEDI и расскраске строк DBGrid или DBGridEh. С этой проблемой маловероятно кто столкнется, так как обстоябельства появления не тривиальны.
По порядку:
- есть главная форма с расположеным на ней DBGrid, подключенный к базе (любой) и имеющей обработчик DBGrid1DrawColumnCell:
Код: TDataSet *dataset = Column->Field->DataSet;
try
{
if(dataset->FieldByName("Valid")->AsInteger == 0)
{
DBGrid1->Canvas->Brush->Color = clYellow;
}

if(State.Contains(Grids::gdSelected))
{
DBGrid1->Canvas->Font->Color = clRed;
DBGrid1->Canvas->Font->Style = TFontStyles() << fsBold;
}
DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
}
catch (...)
{}
Автор: Eternal_Shield
Дата сообщения: 20.01.2011 13:50
aidarsimon
В шапке ничего нету, Андрей пропал куда-то и никто обновить её не может. Ищите в теме ссылки. Там всё есть.
Автор: aidarsimon
Дата сообщения: 20.01.2011 14:02
Eternal_Shield
mvictor71
Спасибо вам. Нашел активатор от Core. Все работает четко.
Автор: Frodo_Torbins
Дата сообщения: 20.01.2011 15:17
lsferret
Похоже, что в своем try/catch вы затираете чужую память. В данном случае вам везет, и вы сразу получаете исключение от JvGIFAnimator1. В делфи вам не повезло - там объекты расположились в памяти по другому, и вы (по чистой случайности) исключения не получаете. Но, вполне возможно, начнете получать после незначительного изменения в совершенно другом месте своей программы. Эдакий баг-фантомас получается. Но вычислить его можно. К примеру с помощью FastMM, или специального отладочного менеджера SafeMM.
Автор: lsferret
Дата сообщения: 20.01.2011 17:38
to Frodo_Torbins
Спасибо за наводку, посмотрю.
Но я все же не понимаю - это я не прав или в среде разработки "косяк".
На 99% уверен, что ничего кримильного не делаю. Вот http://www.rapidshare.ru/1723918 тестовый проект. Для моделирования ситуации нажать на форме кнопку 1, затем 2.
В качестве базы использвована DBDEMOS по пути С:\Program Files\Common Files\CodeGear Shared\Data.
Можно избежать AV, добавив вместо try/catch дополнительную проверку на открываемую таблицу или выкинуть нафиг JvGIFAnimator. Но терзает смутное сомнение, что в большом проекте вылезет бочина в другом месте, так что Weaver в этом отношении намного более стабильный и предсказуемый.
Автор: aidarsimon
Дата сообщения: 20.01.2011 18:35
Есть кейген. В нем поле ключа и кнопка "генерировать".
Можно ли как-то сэмулировать нажатие кнопки генерации и скопировать ключ в буфер, а потом записать в свою программу например в поле edit. И можно ли кейген запускать в скрытом режиме, чтоб для пользователя было прозрачно - как будто и нет его.
Автор: psa1974
Дата сообщения: 21.01.2011 09:35
aidarsimon
Смотря какой кейген. Если кнопка генерации - оконный элемент управления, т.е. имеет дескриптор, то - можно: найти дескриптор главного окна кейгена, а потом дескриптор кнопки, послать ей сообщение BM_CLICK, потом найти элемент управления, куда он пишет сгенерированный ключ, послать ему сообщение WM_GETTEXT... Но вероятнее всего не получится задумка, потому что большинство кейгенов используют неоконные элементы управления для кнопок, соответственно с ними не получится взаимодействовать из другого процесса средствами WinApi...
Автор: shurkis
Дата сообщения: 23.01.2011 20:20

Цитата:
JohnSilver182


Цитата:
Есть разница в какой последоваельности делать FREE ??


В указанном примере, освобождать вручную экземпляры TADOConnection и TADOQquery не нужно, так как они были созданы с указанием владельца (Self), он и будет освобождать данные объекты.
В Вашем же примере, данные объекты будут освобождаться дважды - один раз вручную, второй раз из деструктора владельца.
Автор: emo
Дата сообщения: 23.01.2011 22:29
shurkis

Цитата:
В Вашем же примере, данные объекты будут освобождаться дважды

Мусье пишет чепуху.
Автор: JohnSilver182
Дата сообщения: 24.01.2011 08:38
А я подумал , если Функция возвращает данные типа Record


Код: type TFunctionResult = record
Successful :boolean;
MessageOnError:string;
end;
Автор: Frodo_Torbins
Дата сообщения: 24.01.2011 09:16
JohnSilver182
Разве что with использовать. Но вообще выглядит не очень.
Автор: Eternal_Shield
Дата сообщения: 24.01.2011 09:16
JohnSilver182

Цитата:
КАК ЭЛЕГАНТНО проверить Successful :boolean; и MessageOnError:string;
что бы не вводить переменную
var x:TFunctionResult
......................................
x:=DropDatabase......
if x.Successful = false then

Однако...

А проверять как-нить вот так:

Код:
with DropDatabase(...) do
if Successful then...
Автор: Frodo_Torbins
Дата сообщения: 24.01.2011 11:01
lsferret
Наконец то нашлось время проверить вашу демку. Правда только в делфи, билдера у меня нету. В переведенной на делфи строка в строку демке никаких AV нет и в помине. Возможно где то в недрах билдеровской VCL есть незначительные отличия от делфийской.
В любом случае, если у вас есть возможность с помощью дополнительных проверок избежать возникновения исключения, то это надо сделать. Во-первых исключения довольно тормозные, но самое главное - они затрудняют отладку.
Автор: lsferret
Дата сообщения: 24.01.2011 12:52
to Frodo_Torbins
Спасибо. Пока так и делаю. Хотя пока "боевые" проекты в Fulcrum далать не решился бы. Уж очень напрягает, что перехваченные исключения могут каким-то непонятным, магическим способом поврежать память других объектов. По правильному надо бы запостить вопрос Embarcadero, но боюсь не смогу грамотно описать довольно запутанную проблему в English.
Автор: shurkis
Дата сообщения: 24.01.2011 21:59

Цитата:

Цитата:
В Вашем же примере, данные объекты будут освобождаться дважды

Мусье пишет чепуху.

Извините, был не прав, освобождаются один раз.
Автор: JohnSilver182
Дата сообщения: 24.01.2011 22:31

Цитата:
что мешает ? =.=`


А вообще, лучше возвращать какие-нибудь индексы ошибок, наподибии GetLastError и завести массив, словестно описывающий индексы ошибок. Структура со строчкой - плохая идея.


Непонял про =.=
Автор: Blind
Дата сообщения: 26.01.2011 16:34
Обнаружил абсурдный косяк. Если поместить TLabeledEdit поверх другого компонента (например, TPanel), то поле ввода окажется поверх, а лейбл - позади.
С TLabel такая же ерунда, но это "цельный" компонент. Когда же одна часть компонента поверх, а другая позади другого компонента - это нелепо.

Проявляется в D7, D2010, D2011.
Автор: Frodo_Torbins
Дата сообщения: 26.01.2011 17:07
Blind
Ничего удивительного. TEdit это оконный элемент управления, он может перекрывать другие окна (TPanel тоже окно). А вот TLabel - неоконный элемент, он всегда рисуется на своем родителе. В TLabeledEdit эти контролы просто склеены вместе, и продолжают рисоватся как обычно.
Автор: vez
Дата сообщения: 26.01.2011 17:10

Цитата:
Для моделирования ситуации нажать на форме кнопку 1, затем 2.
В качестве базы использвована DBDEMOS по пути С:\Program Files\Common Files\CodeGear Shared\Data.
Можно избежать AV, добавив вместо try/catch дополнительную проверку на открываемую таблицу или выкинуть нафиг JvGIFAnimator. Но терзает смутное сомнение, что в большом проекте вылезет бочина в


Я добавил в строку проверку наличия поля Valid и всё пашет.
if(dataset->FieldList->Text.Pos("Valid") && dataset->FieldByName("Valid")->AsInteger == 0)

Вообще-то в таких случаях надо проверять это, а бага наверняка в JEDI библиотеке.

Добавлено:
Кстати, сталкивался с подобными ошибками и в Билдере6, теперь работаю с ХЕ - основные инструменты.
Автор: Eternal_Shield
Дата сообщения: 26.01.2011 21:02
JohnSilver182
Если возврат функций подразумевает что-то более серьёзное нежели True/False, то лучше возвращать инту. Например: 0 - успех, 1 - нет источника, 2 - неверный формат и т.п.

И, удобнее всего, оформить возврат функции в виде неиндексированного енума. Типа:

Код:
TFunctionResult = (trSuccess, trNoSource, trInvalidFormat);
Автор: JohnSilver182
Дата сообщения: 26.01.2011 21:39
Eternal_Shield
Интересно , только вот если надо само сообщение об ошибке....

Автор: tanaseduard
Дата сообщения: 26.01.2011 23:12
JohnSilver182
Как вариант хранить глобальную переменную LastErrorText или структуру с болле расшыренными параметрами.
Автор: Eternal_Shield
Дата сообщения: 27.01.2011 13:16
JohnSilver182

Цитата:
Интересно , только вот если надо само сообщение об ошибке....

Без доп. переменной всё-равно не обойтись ... ну или совсем извратиться и использовать анонимный подход:
исходная функа

Код:
Function DropDatabase(const a_par:TjFib):TfunctionResult;
Автор: Samotek
Дата сообщения: 27.01.2011 14:05
JohnSilver182

Цитата:
Интересно , только вот если надо само сообщение об ошибке....

А чего не вернуть сообщение об ошибке? А если ее нет - пустую стоку?
Автор: JohnSilver182
Дата сообщения: 27.01.2011 14:12
Samotek - шаман !
Автор: Samotek
Дата сообщения: 27.01.2011 14:17
JohnSilver182

Цитата:
Samotek - шаман !

Это хорошо или плохо?
Автор: JohnSilver182
Дата сообщения: 27.01.2011 14:24

Цитата:
Это хорошо или плохо?

Я тоже прикидывал так сделать
Автор: X11
Дата сообщения: 29.01.2011 12:02
1-го февраля выходит Delphi Starter Edition. О технических и программных ограничениях пока ничего не известно. Легально могут использовать только частники. Организациям не получится. Стоимость около 200 долларов Для фрилансеров самое оно! Ждём понедельника .
Автор: KSJJFS
Дата сообщения: 29.01.2011 17:41
После установки пакета CnWizards появились мешающая нумерация



Как или в каких опциях отключит эту нумерацию
Автор: JAPWork
Дата сообщения: 29.01.2011 17:57
KSJJFS
Хм... Как ни странно - в меню CnPack - Мастер табуляции - Настройки - "Показывать порядок табуляции"

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: Установка копоненты ZipTV


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.