PDA

Просмотр полной версии : Проблема в Delphi 2006


Yegor
27.07.2009, 19:39
Поставил Delphi 2006 и столкнулся с глюком - она отказываетсья правильно понимать конструкции вроде следующей:

TL2SpelledList = class
isSummon, objectID: integer;
skills: array of record
skillID: integer;
skillName: string;
skillIcon: integer;
skillLevel: word;
duration: integer;
end;
end;


компилятор это проглатывает нормально (F9) и приложение запускается и без проблемм работает, но при попытке сделать действие в редакторе кода например автосоздание функции объявленной в классе (ctrl+shift+c) - редактор после раздумий несколко секунд выдает мне что: "identefier expected but ';' found после слова record, то есть он воспринимает его как уже объявленный тип. Причем в панели structure есть список классов только до этого объявления, дальше пусто. На delphi 7 работало, уже поставил кучу фиксов - но не помогает. Может кто знает в чем проблемма? Ну не хочеться объявлять эти записи отдельно :(, так как используются только в одном месте.

xkor
27.07.2009, 20:17
Yegor, в RADStudio редактор более придирчив к синтаксису чем компилятор, он не любит создание типов внутри объявления класса (что кстати хоть и переваривается компилятором не считается хорошим тоном программирования)
короче чтобы это заработало надо просто более правильно и красиво это оформить:
TSkills = array of record
skillID: integer;
skillName: string;
skillIcon: integer;
skillLevel: word;
duration: integer;
end;

TL2SpelledList = class
isSummon, objectID: integer;
skills: TSkills;
end;

Yegor
27.07.2009, 23:02
Спасибо так и сделаю. Я недавно только узнал что записи можно объявлять сразу как переменные и был этому дико рад, теперь прийдеться отвыкать :(.
В delphi меня злит что объявление и тело методов находиться в разных метсах, прихордится постоянно перемещаться по страницам. Хочу как в Java, можно даже класс в классе и все его методы сразу объявить и реализовать, это для меня удобно.

xkor
28.07.2009, 01:22
Yegor, зато не надо много крутить прокрутку чтобы посмотреть весь список методов и полей класса), а для перемещения от обьявляния метода к его реализации и наоборот реализуется кликом мышкой по его названию удерживая клавишу Ctrl (правда пашет это только если все класса в модуле объявлены "красиво" для редактора...)

Yegor
28.07.2009, 01:43
xkor, я перемещаюсь по ctrl+shift+up(dn), а для удобного просмотра реализованных методов и полей есть специальные панели. Вобщем все на любителя.
Переписал все объявления записей отдельно от класса - все норм. Кстати после компиляции на 2006 появилось ощущение улучшения стабильности работы моей программы, у меня была большая проблемма с взаимными блокировками. Например vcl компонент timagelist (в нем я храню все используемые иконки), напрочь зависал при использовании tuj метода add из потока если был в критичесской секции.

xkor
28.07.2009, 02:31
Yegor, с VCL компонентами следует работать только в основном потоке, для этого есть метод Synhronize (не помню точно как пишется)

Yegor
28.07.2009, 03:15
xkor, метод Synhronize можно использовать если я для потоков использую класс TThread, а так мне пришлось вынести работу с этим компонентом в функции вызываемую по postmessage. Проблема в том что в основном потоке перерисовываются некоторые таблицы, карта, инвентарь и данные в них берутся из общих массивов. Соотвтетственно пришлось например на методы OnData, OnPaint, где я реализовал свою прорисовку или заполнение данными, вводить те же критичесские секции, а поэтому метод Sinhronize не сможет выполниться пока основной поток неосвободиться. Именно поэтому я сделал именно postmessage. Но тут есть тоже определенные нестыковки, даже незнаю как лучше сделать.

alexteam
28.07.2009, 11:46
при передаче сообщения по postmessage вместе с сообщением можно передавать указатель на структуру в которую скопированы необходимые данные. не забываем разрушай эту структуру после обработки в самом обработчике.

зы. почему не сендмессейдж ?. или блокировка доп нитей нежелательна ?

Yegor
29.07.2009, 01:53
alexteam, сендмессейдж будет ожидать освобождения основного потока чтобы его обработать, а он как рас может в данный момент быть на "паузе" из за той же критичесской сесии.

Добавлено через 12 часов 46 минут
Поработал я денек на этой среде и появилось громадное желание вернуться к Delphi 7. Редактор кода по непонятным причинам иногда начинает о чем то думать секунд по 10-20, находит синтаксические ошибки и подчеркивает их красным, хотя ошибки реально нет (после перезагрузки почему то уже все норм), очень медленно запускаеться проект (какие то тут глюки с перерисовкой форм). Скажите это только у меня или реально delphi 7 рулит, может стоит более новую версию поставить?

xkor
29.07.2009, 03:47
Yegor, ну 2007 работает значительно стабильнее, но по стабильности всё равно глубоко сосет у 7ки, однако мне он нравиться больше)

Yegor
29.07.2009, 04:03
xkor, наверно сказалось то что уже другая компания над ней работает.

xkor
29.07.2009, 04:26
Yegor, скорее что они коренным образом изменили IDE, точнее написали по моему полностью новый, а в связи с перекупками между компаниями никак не могут свою новую поделку отладить...

NLObP
29.07.2009, 11:38
очень медленно запускаеться проект

Я пользуюсь DelphiSpeedUp v 2.76 для ускорения загрузки RAD Studio 2007.

alexteam
29.07.2009, 12:53
alexteam, сендмессейдж будет ожидать освобождения основного потока чтобы его обработать, а он как рас может в данный момент быть на "паузе" из за той же критичесской сесии.
а это тут при чем ?

зы. работаю в д7.

Yegor
29.07.2009, 13:18
alexteam, по исходникам phx не заметно чтобы это был проект D7.

зы. почему не сендмессейдж ?. или блокировка доп нитей нежелательна ?

Ну при этом.

alexteam
29.07.2009, 16:41
если принять все время моей работы с проектом за 100% то скажем 90% из них это был д7. остальные 10% - попытка работать в бдс2006.

Yegor
29.07.2009, 16:59
alexteam, ты терпеливый, меня хватило только на 1% написания кода в 2006 от всего написанного объема.

Yegor
24.08.2009, 02:55
Подскажите плис есть ли возможность в delphi 7 вести лог который будет сохранятся автоматом в файл? Нашел вывод лог в точках прерывания но они выводят в лог-окно и после перезапуска точки забываются. А то есть глюки в проге и не могу отловить где они засели :(.

alexteam
24.08.2009, 13:31
use OutputDebugString.
если я правильно понял.

xkor
24.08.2009, 14:27
если я правильно понял.а я вот вообще ничего не понял...

//alexteam: "индусы, подумал штирлиц".