Pequenas Diferenças entre Delphi 7 e Delphi 2009

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (1)  (0)

Esta é apenas uma dica das diferenças entre os dois compiladores ao se trabalhar com inteiros negativos.

SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf'; SyntaxHighlighter.config.bloggerMode = true; SyntaxHighlighter.defaults['toolbar'] = true; SyntaxHighlighter.all(); p{ line-height: 15px; } br { line-height: 15px; } .code { border: 2px dotted #663366; line-height: 15px; display: block; font-family: Fixedsys; font-size: 11px; color: #000099; background-color: #ddddff; width: 99%; text-align: justify; } .purecode { line-height: 15px; display: block; font-family: Fixedsys; font-size: 11px; width: 99%; text-align: justify; } .text { line-height: 14px; font-family: Trebuchet MS; color: #666666; background-color: #eeeeee; }

Analisando as diferenças entre o Delphi 7 e o novo Delphi 2009 podemos ver que elas não se limitam apenas a diferenças de componentes ou bibliotecas. Alem das diferenças da própria linguagem, temos algumas diferenças de sintaxe. Nos exemplos abaixo mostrarei alguns exemplos de cálculos com números negativos que gerariam a exception de Integer Overflow no Delphi 7, mas que no Delphi 2009 funcionam perfeitamente.

Abaixo os comentarios estão separados por pipes "|". A esquerda comentei o resultado da função em Delphi 7 e a direita em delphi 2009. Teste nas duas versões.

Um abraço e até a próxima!


01.{
02.    Esse pequeno programa demonstra um erro de integer ovrflow que ocorre diferente
03.    entre o delphi 7 e o 2009.
04. 
05.    Esse erro ocorre ao se declarar um int, porem tentar armazenar nele a multiplicação
06.    de -1* um numero do tipo longword (unsigned).
07. 
08.    O operador de multiplicação terá precedência sobre o unario de negativação e será negativado
09.    um número unsigned, fazendo com que seu bit mais significativo seja ativado e tornando-o enorme.
10. 
11. 
12.    O interessante da diferença entre o Delphi 7 e o 2009 é que no Delphi 2009, ao contrario do delphi 7,
13.    a negativação do longword automaticamente o converte para um integer. Porém, ao se multiplicar
14.    -1*[longword] o efeito é o mesmo obtido no delphi 7: ativação do bit mais significativo
15.    do longword resultando em um numero enorme.
16. 
17.    Para contornar esse problema, alem do número -1 precisar ser isolado entre parenteses
18.    para o operador de negativação ter maior precedência, sempre é bom converter o longword
19.    para integer, se possivel.
20.}
21. 
22.unit Unit1;
23. 
24.interface
25. 
26.uses
27.  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
28.  Dialogs, StdCtrls, DateUtils;
29. 
30.type
31.  TForm1 = class(TForm)
32.    Button1: TButton;
33.    Button2: TButton;
34.    procedure Button1Click(Sender: TObject);
35.    procedure Button2Click(Sender: TObject);
36.  private
37.    { Private declarations }
38.  public
39.    { Public declarations }
40.  end;
41. 
42.var
43.  Form1: TForm1;
44. 
45.implementation
46. 
47.{$R *.dfm}
48. 
49.procedure TForm1.Button1Click(Sender: TObject);
50.var
51.  mili: LongWord;
52.begin
53.    mili := MilliSecondOfTheDay(now);
54. 
55.                                        //NO DELPHI 7:                                                                      |NO DELPHI 2009:
56.    ShowMessage(IntToStr(mili));        //retorna o positivo corretamente                                                   |retorna o positivo corretamente
57.    ShowMessage(IntToStr(-mili));       //não retorna negativo, mas retorna um positivo exageradamente enorme               |ISSO DÁ CERTO, MOSTRA NEGATIVO COMO DEVERIA SER
58.    ShowMessage(IntToStr(-1*mili));     //isso tambem não retorna negativo, mas retorna um positivo exageradamente enorme   |isso não retorna negativo, mas retorna um positivo exageradamente enorme
59.    ShowMessage(IntToStr((-1)*mili));   //isso retorna o negativo corretamente                                              |isso retorna o negativo corretamente
60. 
61.end;
62. 
63.procedure TForm1.Button2Click(Sender: TObject);
64.var
65.  mili: LongWord;
66.begin
67.    mili := MilliSecondOfTheDay(now);
68. 
69.    //FUNCIONA IGUAL TANTO NO NO DELPHI 7 COMO NO 2009
70.    ShowMessage(IntToStr(mili*-1));   //funciona, traz negativo
71.    ShowMessage(IntToStr(mili*(-1))); //funciona, traz negativo
72. 
73.end;
74. 
75.end.
 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?