
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.207] |
![]() |
|
Страницы: (14) « Первая ... 11 12 [13] 14 все ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#181
,
|
|
эээ... .net? Добавлено ну это новый этап. это как с 2007 на 2009. Добавлено Цитата Krid @ ЗЫ IMHO, версия сырая и в некоторых местах банально недоделанная. Пока останусь на XE. там много исправлений в VCL. с vcl оно ведет себя стабильно, а вот при FireMonkey... когда кодишь то ощущаешь себя мартышкой с гранатой которая через каждых 10 минут само произвольно выплевывает кольцо. |
![]() |
Сообщ.
#182
,
|
|
Цитата ViktorXP @ эээ... .net? .Net - платформа, а RAD Studio - Framework. Это разные вещи. |
![]() |
Сообщ.
#183
,
|
|
если ничего не трогать низкоуровневое. то никаких проблем. мой компонент например прекрасно перенесся с XE в XE2 (а вот что бы он заработал на 2010 немного помучатся пришлось)
Добавлено пс. хотя он даже WinApi юзает. он за счет ее внедряется в окно и подменяет оконную процедуру. |
![]() |
Сообщ.
#184
,
|
|
Ну а для меня WinAPI в XE2 и есть самая большая проблема.
Например, в той же SendMessageTimeout последний параметр всегда был "var lpdwResult: DWORD". А в XE2 - это указатель (lpdwResult: PDWORD_PTR). И таких ф-ций дофига. Они поменяли сигнатуры, и из-за этого мне кучу кода переписывать надо ![]() С одной стороны это хорошо, что они многие сигнатуры WinAPI ф-ций сделали такими же, как в VS. Но из-за этого нужно переписывать код (который в предыдущих версиях работать не будет ![]() Ну а про Unit Scope и конфигурациях проектов я уже говорил.. Прикинь, сколько ручной работы нужно, чтобы перенести все свои проекты в XE2! Цитата ViktorXP @ ну это новый этап. это как с 2007 на 2009. Я и говорю ![]() Цитата ViktorXP @ а вот при FireMonkey... когда кодишь то ощущаешь себя мартышкой с гранатой которая через каждых 10 минут само произвольно выплевывает кольцо А вот FireMonkey как раз порадовал. Конечно, как первый блин - немного комом получился, но в общем и целом хорошая штука, IMHO. Посмотри пример. |
![]() |
Сообщ.
#185
,
|
|
Цитата Krid @ Конечно, как первый блин - немного комом получился я это понимаю. но мне не понятно почему среда ведет себя не в адеквате. при том что я пишу простой код, не связаный с FireMonkey, но в проекте FireMonkey. сама же библиотека компонентов FireMonkey заслуживает похвал. сделана очень гибко и красиво. есть конечно недостатки, но как ты правильно заметил тут дело в блине ![]() |
![]() |
Сообщ.
#186
,
|
|
вот это не дочеты:
![]() ![]() procedure MQEventCallbackProc(var Item: TItemRespunce; Loss: Boolean); begin list2.SendCallback(procedure (SENMessage: PSENMessage; var Buf: PByte; var Size: Integer) begin Move(Item.Buf^, Buf^, Item.Size); Size := Item.Size; end); end; ![]() ![]() [DCC Error] UMain.pas(50): E2555 Cannot capture symbol 'Item' [DCC Error] UMain.pas(50): E2555 Cannot capture symbol 'Item' [DCC Error] UMain.pas(51): E2555 Cannot capture symbol 'Item' помнится когда то тип Pointer был не совместим с типом Integer. ![]() ![]() var P: Pointer; PB: PByte; I: Integer; P := P+I;// по прежнему не совместимы PB := PB+I;// работает. что не может не радовать. FreeAndNil(I);// а вот это жесть. и оно не ругается на это. даже не предупреждает. |
Сообщ.
#187
,
|
|
|
Цитата ViktorXP @ FreeAndNil(I);// а вот это жесть. и оно не ругается на это. даже не предупреждает. В 2010 так же, сам недавно столкнулся - переделал класс в запись, а Freeandnil убрать забыл. Ловил AV. Баг Репорт есть, но делать проверку не хотят (по неизвестной мне причине) |
![]() |
Сообщ.
#188
,
|
|
О какую я ошибку выцепил. Я не сразу понял из за чего ошибка. ибо ругается оно вообще не там где ошибка.
![]() ![]() type TChildObject<T: record> = class(TObject) private type PItem = ^TItem; TItem = record Data: T; end; TInternalObject = class(TObject) public procedure Test(P: Pointer); end; var InternalObject: TInternalObject; public constructor Create; destructor Destroy; override; end; { TChildObject<T>.TInternalObject } procedure TChildObject<T>.TInternalObject.Test(P: Pointer); var Item: PItem absolute P; //F2084 Internal Error: AV06A90AD4-W00000014-1 //если //Item: PItem; то все работает {or:} var Item: PItem; Data: PByte absolute Item; //F2084 Internal Error: AV06A90AD4-W00000014-1 begin end; { TChildObject<T> } constructor TChildObject<T>.Create; begin InternalObject := TInternalObject.Create(); end; destructor TChildObject<T>.Destroy; begin FreeAndNil(InternalObject); inherited; end; type TTestRecord = record I: Integer; end; var ChildObject: TChildObject<TTestRecord>; begin ChildObject := TChildObject<TTestRecord>.Create(); ChildObject.InternalObject.Test(nil); end; Добавлено а у кого то Update 2 есть? интересно будет ли там это работать |
Сообщ.
#189
,
|
|
|
Цитата ViktorXP @ вот это не дочеты: ![]() ![]() procedure MQEventCallbackProc(var Item: TItemRespunce; Loss: Boolean); begin list2.SendCallback(procedure (SENMessage: PSENMessage; var Buf: PByte; var Size: Integer) begin Move(Item.Buf^, Buf^, Item.Size); Size := Item.Size; end); end; ![]() ![]() [DCC Error] UMain.pas(50): E2555 Cannot capture symbol 'Item' [DCC Error] UMain.pas(50): E2555 Cannot capture symbol 'Item' [DCC Error] UMain.pas(51): E2555 Cannot capture symbol 'Item' А что здесь не так? var, const параметры нельзя передавать в анонимную процедуру. Объявляй локальную переменную. Пруф: Цитата E2555 Cannot capture symbol '%s' (Delphi)From RAD Studio Go Up to Error and Warning Messages (Delphi) Index The parameter indicated in the message cannot be captured, for example because the parameter is defined as a constant. Retrieved from "http://docwiki.embarcadero.com/RADStudio/en/E2555_Cannot_capture_symbol_%27%25s%27_(Delphi)" Category: RAD Studio Reference Добавлено Цитата Item: PItem absolute P; Пора уже забыть о существовании такой конструкции. Стыдно, товарищ! ![]() Добавлено Цитата ViktorXP @ помнится когда то тип Pointer был не совместим с типом Integer. Никогда! Только через приведение типов. Совместим был PChar. Но это была залипуха, которую убрали с помощью PByte. И это более логично, потому что указательная арифметика применима не только к строкам, а и любым двоичным данным. К чему тут PChar? Добавлено Цитата Krid @ Например, в той же SendMessageTimeout последний параметр всегда был "var lpdwResult: DWORD". А в XE2 - это указатель (lpdwResult: PDWORD_PTR). Мда, жалко. С var-ом так удобно было ![]() |
![]() |
Сообщ.
#190
,
|
|
Цитата [S]mike @ А что здесь не так? var, const параметры нельзя передавать в анонимную процедуру. Объявляй локальную переменную. Да я так и понял. и именно подобным способом и решил. но могли бы это и предусмотреть. хотя боюсь там не все так просто (с учетом того что анонимная функция вообще как интерфейс создается (если верить отладчику) Прикреплённый файл ![]() Добавлено Цитата [S]mike @ Пора уже забыть о существовании такой конструкции. Стыдно, товарищ! ну не скажи. absolute очень удобная вещь. Добавлено вот недавно мне нужно было по быстрому набросать код вывода одного файла. там нюанс был что в блоке сначала идет признак что это, а потом сам блока причем следующий блок только в конце текущего. и размеры у их у всех разные. и идут они не по порядку. с absolute это получилось куда красивее ![]() ![]() procedure ShowSecurity(); var B: Byte; I, f, Ccp: Integer; var ms: TMemoryStream; CP_info: PCP_info; Utf8_info: PcpUtf8_info absolute CP_info; cpClassRefInfo: PcpClassRefInfo absolute CP_info; cpIntegerInfo: PcpIntegerInfo absolute CP_info; cpPackage: PcpPackage absolute CP_info; begin ms := TMemoryStream.Create; try ms.LoadFromFile(security_f); with PExportFile(ms.Memory)^ do begin WriteLn('Magic: ', IntToHex(Magic, 8)); WriteLn('Version: ', MajorVersion, '.', MinorVersion); WriteLn('ConstantPoolCount: ', ConstantPoolCount)); CP_info := @ConstantPool[0]; if ConstantPoolCount > 0 then begin Ccp := ConstantPoolCount; while Ccp > 0 do begin WriteLn('CP_info.Tag: ', GetNameBycpType(CP_info.Tag)); case CP_info.Tag of cptPackage: begin WriteLn('CP_info.NameIndex: ', cpClassRefInfo.NameIndex); WriteLn('CP_info.Version: ', cpPackage.MajorVersion, '.', cpPackage.MinorVersion); Write('CP_info.AID: '); for I := 0 to cpPackage.AID_length - 1 do Write(IntToHex(cpPackage.AID[I], 2)); WriteLn; CP_info := cpPackage.Next; end; cptClassRef: begin WriteLn('CP_info.NameIndex: ', cpClassRefInfo.NameIndex); CP_info := cpClassRefInfo.Next; end; cptInteger: begin WriteLn('CP_info.bytes: ', cpIntegerInfo.bytes); CP_info := cpIntegerInfo.Next; end; cptUtf8: begin Write('CP_info.Bytes: '); for I := 0 to Utf8_info.Length - 1 do Write(Utf8_info.Bytes[I]); WriteLn; CP_info := Utf8_info.Next; end; end; Dec(Ccp); WriteLn; end; end; end; finally FreeAndNil(ms); end; end; |
Сообщ.
#191
,
|
|
|
Цитата ViktorXP @ хотя боюсь там не все так просто (с учетом того что анонимная функция вообще как интерфейс создается (если верить отладчику) Именно! А если передавать var-переменную в анонимную процедуру, то ты будешь ожидать, что, изменив ее значение так, задашь результат конечной переменной, а это будет не так. Цитата ViktorXP @ ну не скажи. absolute очень удобная вещь. Это паскалевский рудимент (как и goto), имеющий в современной дельфи массу ограничений и имеющий сомнительную кроссплатформенность (как и ассемблерные вставки). А смысла в нем особо нет. Я лично обхожусь без особых неудобств. Добавлено Цитата ViktorXP @ вот недавно мне нужно было по быстрому набросать код вывода одного файла. там нюанс был что в блоке сначала идет признак что это, а потом сам блока причем следующий блок только в конце текущего. и размеры у их у всех разные. и идут они не по порядку. с absolute это получилось куда красивее Красоты коду это не добавляет, что в процедурном программировании, что в ООП. Для ООП нужен был бы полиморфизм объектов: создавать экземпляр класса нужного типа, который бы записывал нужные данные, а потом возвращал следующий блок. Для процедурного программирования все это нужно было бы вынести в отдельные функции. Все было бы намного красивее, практичнее и без absolute. |
![]() |
Сообщ.
#192
,
|
|
Цитата [S]mike @ Все было бы намного красивее, практичнее и без absolute. Ну это холивар по типу "нельзя юзать goto". ![]() |
Сообщ.
#193
,
|
|
|
Цитата ViktorXP @ Ну это холивар по типу "нельзя юзать goto". А это и не холивар. Нельзя и все. Здесь я наглядно показал, что Goto - это непрактично, некрасиво и к тому же медленно ![]() Добавлено Да, про Integer и Pointer я тебе тоже ответил. Так что в данном случае твои претензии несостоятельны. |
Сообщ.
#194
,
|
|
|
Цитата [S]mike @ Здесь я наглядно показал, что Goto - это непрактично, некрасиво и к тому же медленно Да будет тебе известно, что статья Дейкстры в своё время была написано не просто так, а для конкретной цели: борьбы с кодом-лапшой, пример которого ты и привёл. А код-лапша получался из интересных свойств ранних языков, вроде Basic. И много сегодня у нас пишут код-лапшу? Нет. Так в чём же тогда реальный вред от goto? С каким-таким монстром мы боремся? Противники goto всегда выбирают самые плохие примеры ("плохие" - в смысле "страшные"), вроде лапши или перехода в середину цикла извне и т.п. Тут, конечно, не поспоришь, да и не нужно спорить - они правы. Только вот они умело "забывают" про то, что использование goto бывает иногда удобно. Скажем, для прерывания двойного цикла. Противники goto тут же говорят, что, дескать, двойной цикл надо бы оформить в отдельную функцию и воспользоваться Exit. Как-то не очень согласуется с "быстрее" и "практичнее". Не, если исходный код на страницу - однозначно надо выделять, но если кроме двойного цикла в процедуре всего несколько строчек, то выделять из неё подпрограмму - явный overkill. Аналогично и absolute - он опасен не более, чем нетипизированные указатели и goto, но иногда может быть полезен. Надеюсь, нетипизированные указатели не хотим запрещать в native-языках? Добавлено Второй пример полезности goto - обработка ошибок. Конечно, конкретно в Delphi это не применимо (тут есть try/finally), но в других языках без SEH (в старом Pascal-е или в Basic-е) - вполне. |
Сообщ.
#195
,
|
|
|
Цитата CodeMonkey @ но иногда может быть полезен Такой прием называется "дай обезьяне гранату" (без намеков на ник ![]() Для первого примера с компонентами RTTI или WinAPI было бы более удобным способом. А вообще, читаем комменты к оригиналу статьи http://www.deltics.co.nz/blog/?p=586 Цитата CodeMonkey @ Надеюсь, нетипизированные указатели не хотим запрещать в native-языках? Во всяком случае их использование следует минимизировать, а не декларировать все указателем, потом через absolute "приводить" к нужным типам ![]() |