На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (14) « Первая ... 11 12 [13] 14  все  ( Перейти к последнему сообщению )  
> RAD Studio XE 2 , Обсуждаем новую версию Delphi
    Цитата Krid @
    Даже мелкомягкие так своих клиентов/пользователей не напрягают.

    эээ... .net?

    Добавлено
    Цитата Krid @
    но они реально зае-ли этими своими модификациями RTL/VCL :angry: Где обратная совместимость??

    ну это новый этап. это как с 2007 на 2009.

    Добавлено
    Цитата Krid @
    ЗЫ IMHO, версия сырая и в некоторых местах банально недоделанная. Пока останусь на XE.

    там много исправлений в VCL. с vcl оно ведет себя стабильно, а вот при FireMonkey... когда кодишь то ощущаешь себя мартышкой с гранатой которая через каждых 10 минут само произвольно выплевывает кольцо.
      Цитата ViktorXP @
      эээ... .net?

      .Net - платформа, а RAD Studio - Framework. Это разные вещи.
        если ничего не трогать низкоуровневое. то никаких проблем. мой компонент например прекрасно перенесся с XE в XE2 (а вот что бы он заработал на 2010 немного помучатся пришлось)

        Добавлено
        пс. хотя он даже WinApi юзает. он за счет ее внедряется в окно и подменяет оконную процедуру.
          Ну а для меня WinAPI в XE2 и есть самая большая проблема.

          Например, в той же SendMessageTimeout последний параметр всегда был "var lpdwResult: DWORD". А в XE2 - это указатель (lpdwResult: PDWORD_PTR).
          И таких ф-ций дофига. Они поменяли сигнатуры, и из-за этого мне кучу кода переписывать надо :angry:, бо WinAPI я юзаю почти везде (в том числе и в компонентах).

          С одной стороны это хорошо, что они многие сигнатуры WinAPI ф-ций сделали такими же, как в VS. Но из-за этого нужно переписывать код (который в предыдущих версиях работать не будет :wall:).

          Ну а про Unit Scope и конфигурациях проектов я уже говорил.. Прикинь, сколько ручной работы нужно, чтобы перенести все свои проекты в XE2!

          Цитата ViktorXP @
          ну это новый этап. это как с 2007 на 2009.

          Я и говорю
          Цитата Krid @
          они реально зае-ли этими своими модификациями RTL/VCL
          :yes:

          Цитата ViktorXP @
          а вот при FireMonkey... когда кодишь то ощущаешь себя мартышкой с гранатой которая через каждых 10 минут само произвольно выплевывает кольцо

          А вот FireMonkey как раз порадовал. Конечно, как первый блин - немного комом получился, но в общем и целом хорошая штука, IMHO. Посмотри пример.
            Цитата Krid @
            Конечно, как первый блин - немного комом получился

            я это понимаю. но мне не понятно почему среда ведет себя не в адеквате. при том что я пишу простой код, не связаный с FireMonkey, но в проекте FireMonkey.
            сама же библиотека компонентов FireMonkey заслуживает похвал. сделана очень гибко и красиво. есть конечно недостатки, но как ты правильно заметил тут дело в блине :D
              вот это не дочеты:
              ExpandedWrap disabled
                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;
              При этом ругать идет
              ExpandedWrap disabled
                [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.
              ExpandedWrap disabled
                var
                 P: Pointer;
                 PB: PByte;
                 I: Integer;
                 
                 P := P+I;// по прежнему не совместимы
                 PB := PB+I;// работает. что не может не радовать.
                 
                 FreeAndNil(I);// а вот это жесть. и оно не ругается на это. даже не предупреждает.
                Цитата ViktorXP @
                FreeAndNil(I);// а вот это жесть. и оно не ругается на это. даже не предупреждает.

                В 2010 так же, сам недавно столкнулся - переделал класс в запись, а Freeandnil убрать забыл. Ловил AV. Баг Репорт есть, но делать проверку не хотят (по неизвестной мне причине)
                Сообщение отредактировано: Fr0sT -
                  О какую я ошибку выцепил. Я не сразу понял из за чего ошибка. ибо ругается оно вообще не там где ошибка.
                  ExpandedWrap disabled
                    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 есть? интересно будет ли там это работать
                  Сообщение отредактировано: ViktorXP -
                    Цитата ViktorXP @
                    вот это не дочеты:
                    ExpandedWrap disabled
                      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;
                    При этом ругать идет
                    ExpandedWrap disabled
                      [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;

                    Пора уже забыть о существовании такой конструкции. Стыдно, товарищ! :yes:

                    Добавлено
                    Цитата ViktorXP @
                    помнится когда то тип Pointer был не совместим с типом Integer.

                    Никогда! Только через приведение типов.

                    Совместим был PChar. Но это была залипуха, которую убрали с помощью PByte. И это более логично, потому что указательная арифметика применима не только к строкам, а и любым двоичным данным. К чему тут PChar?

                    Добавлено
                    Цитата Krid @
                    Например, в той же SendMessageTimeout последний параметр всегда был "var lpdwResult: DWORD". А в XE2 - это указатель (lpdwResult: PDWORD_PTR).

                    Мда, жалко. С var-ом так удобно было :yummy:
                      Цитата [S]mike @
                      А что здесь не так? var, const параметры нельзя передавать в анонимную процедуру. Объявляй локальную переменную.

                      Да я так и понял. и именно подобным способом и решил. но могли бы это и предусмотреть. хотя боюсь там не все так просто (с учетом того что анонимная функция вообще как интерфейс создается (если верить отладчику) Прикреплённый файлПрикреплённый файл1.png (19,97 Кбайт, скачиваний: 570) )

                      Добавлено
                      Цитата [S]mike @
                      Пора уже забыть о существовании такой конструкции. Стыдно, товарищ!

                      ну не скажи. absolute очень удобная вещь.

                      Добавлено
                      вот недавно мне нужно было по быстрому набросать код вывода одного файла. там нюанс был что в блоке сначала идет признак что это, а потом сам блока причем следующий блок только в конце текущего. и размеры у их у всех разные. и идут они не по порядку. с absolute это получилось куда красивее
                      ExpandedWrap disabled
                        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;
                        Цитата ViktorXP @
                        хотя боюсь там не все так просто (с учетом того что анонимная функция вообще как интерфейс создается (если верить отладчику)

                        Именно! А если передавать var-переменную в анонимную процедуру, то ты будешь ожидать, что, изменив ее значение так, задашь результат конечной переменной, а это будет не так.

                        Цитата ViktorXP @
                        ну не скажи. absolute очень удобная вещь.

                        Это паскалевский рудимент (как и goto), имеющий в современной дельфи массу ограничений и имеющий сомнительную кроссплатформенность (как и ассемблерные вставки). А смысла в нем особо нет. Я лично обхожусь без особых неудобств.

                        Добавлено
                        Цитата ViktorXP @
                        вот недавно мне нужно было по быстрому набросать код вывода одного файла. там нюанс был что в блоке сначала идет признак что это, а потом сам блока причем следующий блок только в конце текущего. и размеры у их у всех разные. и идут они не по порядку. с absolute это получилось куда красивее

                        Красоты коду это не добавляет, что в процедурном программировании, что в ООП. Для ООП нужен был бы полиморфизм объектов: создавать экземпляр класса нужного типа, который бы записывал нужные данные, а потом возвращал следующий блок. Для процедурного программирования все это нужно было бы вынести в отдельные функции. Все было бы намного красивее, практичнее и без absolute.
                          Цитата [S]mike @
                          Все было бы намного красивее, практичнее и без absolute.

                          Ну это холивар по типу "нельзя юзать goto".
                          :)
                            Цитата ViktorXP @
                            Ну это холивар по типу "нельзя юзать goto".

                            А это и не холивар. Нельзя и все.

                            Здесь я наглядно показал, что Goto - это непрактично, некрасиво и к тому же медленно :yes:

                            Добавлено
                            Да, про Integer и Pointer я тебе тоже ответил. Так что в данном случае твои претензии несостоятельны.
                              Цитата [S]mike @
                              Здесь я наглядно показал, что Goto - это непрактично, некрасиво и к тому же медленно


                              Да будет тебе известно, что статья Дейкстры в своё время была написано не просто так, а для конкретной цели: борьбы с кодом-лапшой, пример которого ты и привёл. А код-лапша получался из интересных свойств ранних языков, вроде Basic.

                              И много сегодня у нас пишут код-лапшу? Нет. Так в чём же тогда реальный вред от goto? С каким-таким монстром мы боремся?

                              Противники goto всегда выбирают самые плохие примеры ("плохие" - в смысле "страшные"), вроде лапши или перехода в середину цикла извне и т.п. Тут, конечно, не поспоришь, да и не нужно спорить - они правы.

                              Только вот они умело "забывают" про то, что использование goto бывает иногда удобно. Скажем, для прерывания двойного цикла. Противники goto тут же говорят, что, дескать, двойной цикл надо бы оформить в отдельную функцию и воспользоваться Exit. Как-то не очень согласуется с "быстрее" и "практичнее". Не, если исходный код на страницу - однозначно надо выделять, но если кроме двойного цикла в процедуре всего несколько строчек, то выделять из неё подпрограмму - явный overkill.

                              Аналогично и absolute - он опасен не более, чем нетипизированные указатели и goto, но иногда может быть полезен. Надеюсь, нетипизированные указатели не хотим запрещать в native-языках?

                              Добавлено
                              Второй пример полезности goto - обработка ошибок. Конечно, конкретно в Delphi это не применимо (тут есть try/finally), но в других языках без SEH (в старом Pascal-е или в Basic-е) - вполне.
                                Цитата CodeMonkey @
                                но иногда может быть полезен

                                Такой прием называется "дай обезьяне гранату" (без намеков на ник ;) ). Можно конечно воспользоваться. Но стоит элементарно где-то описАться, как получим кучу труднонаходимых ошибок.

                                Для первого примера с компонентами RTTI или WinAPI было бы более удобным способом.

                                А вообще, читаем комменты к оригиналу статьи http://www.deltics.co.nz/blog/?p=586

                                Цитата CodeMonkey @
                                Надеюсь, нетипизированные указатели не хотим запрещать в native-языках?

                                Во всяком случае их использование следует минимизировать, а не декларировать все указателем, потом через absolute "приводить" к нужным типам :D
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0659 ]   [ 17 queries used ]   [ Generated: 18.07.25, 01:33 GMT ]