02/10/2011 Demo 64-bit y Estilos VCL Delphi 64-bit Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 1 02/10/2011 ¿Qué permanece igual? • Integer, Longint, Cardinal – todavía 32bits • Int64, UInt64 – todavía 64bits • UnicodeString, AnsiString, WideString • Exceptions • Runtime Library (RTL) • SysUtils, Classes, etc… Tamaños de tipos en Delphi 32 y 64-bit Tipos con signo ShortInt SmallInt LongInt Integer Int64 Delphi/32 1 byte 2 bytes 4 bytes 4 bytes 8 bytes Delphi/64 Tipos sin signo Byte Word LongWord Cardinal UInt64 Delphi/32 1 byte 2 bytes 4 bytes 4 bytes 8 bytes Delphi/64 Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 2 02/10/2011 ¿Cuáles son las diferencias? • • • • NativeInt, NativeUint – 64bits Pointer (todos los punteros) – 64bits Arrays dinámicos – Indexado 64bit Matecática de coma flotante - Double Tamaños de tipos en Delphi 32 y 64-bit Tipos con signo NativeInt Delphi/32 4 bytes Delphi/64 8 bytes Tipos sin signo NativeUInt Delphi/32 4 bytes Delphi/64 8 bytes Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 3 02/10/2011 Tipos puntero Delphi 32 u 64-bit Tipos puntero Delphi/32 Delphi/64 Pointer String Class instance Class reference Interface AnsiString WideString UnicodeString Procedure pointer Dynamic array PAnsiChar PWideChar PChar 4 bytes 8 bytes La CPU – Modelo de programación Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 4 02/10/2011 Instrucciones y direcciones • Espacio de direccionamiento de 64 bit • Limitado por el hardware disponible • Mismo conjunto de instrucciones del núcleo de Intel • Nuevo prefijo REX para las instrucciones 64bit • Direccionamiento relativo al RIP • Saltos – Relativos +/- 2GB • Alineamiento de pila de 16 byte • Online resources • http://msdn.microsoft.com/en-us/magazine/cc300794.aspx • http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx ¿Y esto que significa para Delphi? Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 5 02/10/2011 ¡No te asustes! Delphi 64-bit en Windows • La misma API de Windows – CreateWindowEx, PeekMessage, etc.. • La misma RTL de Delphi – SysUtils, Classes, Generics.Collections, etc… • La misma VCL – Forms, Graphics, Controls, Menus, etc.. Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 6 02/10/2011 Condicionales predefinidos • Categoría Identificador • Compiler DCC definido VER230 definido • Platform MSWINDOWS WIN32 WIN64 • CPU CPU386 CPUX86 CPUX64 • Availability ASSEMBLER UNICODE dcc32 definido dcc64 definido definido definido no definido definido definido no definido definido definido definido no definido definido no definido no definido definido definido definido Delphi 64-bit en Windows – puntos de interés • SizeOf(Pointer) <> SizeOf(Integer) – Conversión Integer<->Pointer fallará en 64bit – SizeOf(THandle) = SizeOf(Pointer) – Todos los manejadores = SizeOf(Pointer) (HWND, HDC, etc..). • Todo el código debe ser 64bit – Se debe tener las versiones de 64bit de la librerías externas • Una y solo una convección de llamada – register, pascal, cdecl, stdcall se ignoran. • safecall todavía “especial” • El antiguo “puntero matemático” puede fallar – Trabaja en 32 y 64bit: MyPtr := PByte(P) + 10; • Tlist es ahora un TPointerList. Solía ser una PPointerList. Quitar el ^ debería ser suficiente para pasar de 32-bit a 64-bit. • La propiedad Tag es una propiedad de tipo NativeInt (32-bit vs 64-bit) Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 7 02/10/2011 Delphi 64-bit en Windows – puntos de interés • • • • Ensamblado en línea – No se puede mezclar bloques asm blocks con Pascal – Solo a nivel procedural los bloques asm se soportan – La pila debe ser de 16-byte, alineada a cada instrucción de llamada – Define variables locales para el almacenamiento temporal – No modificar el puntero de pila RSP – Nueva convención de llamada unificada. Los cuatro primeros parámetros en registros, RCX, RDX, R8, R9 (o XMM0-XMM3) Escalado de pila de las excepciones – Sin cambios en el código Delphi Puro. Las excepciones funcionan idénticamente. – Ensamblador en línea puede hacer que las excepciones no se escalen si no está escrito correctamente. Los valores SHL/SHR – 32-bit (Integer y otros) solo se cambian en espacios 32-bit. Los valores 64-bit en espacios de 64-bit. No existe el tipo Extended en 64-bit. Usar el TExtendedRec80 si es necesario Puntos de Interés - Windows API • SetWindowLong / GetWindowLong deben ser reemplazadas por SetWindowLongPtr / GetWindowLongPtr para GWLP_HINSTANCE, GWLP_WNDPROC, etc… ya que devuelven punteros y manejadores. – Los punteros pasados por SetWindowLongPtr deben ser convertiros a LONG_PTR y no a Integer / Longint. • SetWindowLong mapeado a SetWindowLongPtr en Windows.pas. – Las llamadas a la declaración de SetWindowLong son seguras, siempre que la conversión sea correcta Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 8 02/10/2011 Puntos de Interés - Windows API • Usa conversión explicita para WPARAM y LPARAM donde sea explícito. – Ejemplo: Pasar punteros a través de SendMessage SendMessage(hWnd, WM_SETTEXT, 0, LPARAM(@MyCharArray)); • Usa LRESULT para convertir los resultados del mensaje – Ejemplo: Message.Result := LRESULT(Self); • Los registros de rotura de los mensajes (TWMxxx) han cambiado – Alineamiento cambia y tamaño de los campos ¿Qué podemos hacer hoy? • Localizar todas la conversiones Integer<->Pointer, incluyendo Integer<->instance. – Comprobar las asunciones de tamaño de puntero • Asegurarnos de que las dependencias externas son 64bit – Librerías de imagenes/bitmap – Librerías de interfaces de Hardware – Controles ActiveX • Considerar la reescritura del ASM en Pascal puro – Mejor portabilidad futura (ej.: ARM CPUs…) – Se apoya en rendimiento algorítmico mas que en rendimiento de ensamblador. • Asegurarnos de que tamaño de usamos (32 vs 64) cuando usemos SHL/SHR. Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 9 02/10/2011 VCL ¿Que hay de nuevo en la VCL? • 64-bit • Estilos VCL Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 10 02/10/2011 Estilos VCL Los temas hasta Delphi/C++Builder XE • Solo 1 "theme" soportado (Windows nativo) • Eran necesarios productos externos para cambiar el aspecto de las apps VCL • Actualmente crear “skins” para los controles de Windows – Requería enlazar con WndProc – Interceptar los mensajes de los controles • Separar los controles necesarios como controles personalizados – Descendientes de TCustomControl / TGraphicControl Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 11 02/10/2011 VCL Styles • • • • • Multiple styles provided/supported Custom style file creation Custom style classes Pluggable style engine Works with TWinControl and TGraphicControl descendants Estilos VCL • • • • TThemeServices reemplazados por TCustomStyleServices – Extiende TThemeServices con más partes, estados y métodos TStyleEngine – Procesa los mensajes a los controles – Llamadas a StyleServices para renderizar partes TStyleManager – Nos provee de • LoadFromFile • LoadFromResource • RegisterStyle • RegisterStyleClass – Asocia un extensión con una clase de estilo • SetStyle • Selección de estilos • Selección de motor de estilos Permite estilos personalizados – Crear un fichero de estilo (utilizando la herramienta de creación suministrada) – Implementa un descendiente de TCustomStyleServices para mostrar partes directamente Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 12 02/10/2011 ¿A qué se puede aplicar estilos? • TMainMenu/TPopupMenu (a la barra de menú aunque no a las partes que aparecen) • Controles Ribbon • Diálogos OS Project Options | Appearance Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 13 02/10/2011 De esto… ¡A esto! Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 14 02/10/2011 Diseñador de estilos VCL Uso típico • Uses Vcl.Styles, Vcl.Themes; • TStyleManager.SetStyle(‘Ruby Red Graphite’); RTL Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 15 02/10/2011 RTL ¿Qué hay nuevo en la RTL? • • • ¡¡64-bit para Windows!!! Macos – Sin COM, sin ActiveX. :) – Las características específicas de Windows se han mapeado a equivalente en función de la disponibilidad TOS Versión – • • • • • • Architecture (32/64-bit), Platform (Win/Mac), Major, minor OS version, Service Pack info TFormatSettings – Reemplaza los valores globales de formato (que no existen en MacOSX) TZipFile – soporte multi plataforma de Zip Rutinas de manejo de ficheros SymLinks en IOUtils y SysUtils – class function TFile.CreateSymLink(const Link, Target: string): Boolean; TLoginCredentialService – Framework extensible y agnostico para servicios de credenciales con soporte para callbacks (éxito, fracaso, etc) TPoint, TRect, TSize – nuevos métodos y propiedades TPointF, TRectF, TSizeF – Versiones en coma flotante Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 16 02/10/2011 TFormatSettings (SysUtils) type TFormatSettings = record // System.SysUtils … CurrencyString: string; CurrencyFormat: Byte; CurrencyDecimals: Byte; DateSeparator: Char; TimeSeparator: Char; ListSeparator: Char; ShortDateFormat: string; LongDateFormat: string; TimeAMString: string; TimePMString: string; ShortTimeFormat: string; LongTimeFormat: string; ShortMonthNames: array[1..12] of string; LongMonthNames: array[1..12] of string; ShortDayNames: array[1..7] of string; LongDayNames: array[1..7] of string; ThousandSeparator: Char; DecimalSeparator: Char; TwoDigitYearCenturyWindow: Word; … end; TZipFile (System.Zip) type TZipFile = class .. public … procedure Open(ZipFileName: string; OpenMode: TZipMode); overload; procedure Open(ZipFileStream: TStream; OpenMode: TZipMode); overload; procedure Close; procedure Extract(FileName: string; Path: string = ''; CreateSubdirs: Boolean=True); overload; procedure Extract(Index: Integer; Path: string = ''; CreateSubdirs: Boolean=True); overload; procedure ExtractAll(Path: string = ''); procedure Read(Index: Integer; out Bytes: TBytes); overload; procedure Read(FileName: string; out Stream: TStream); overload; procedure Read(Index: Integer; out Stream: TStream); overload; procedure Add(FileName: string; ArchiveFileName: string = ''; Compression: TZipCompression = zcDeflate); overload; … property FileCount: Integer read GetFileCount; property FileNames: TArray<string> read GetFileNames; … end; Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 17 02/10/2011 TLoginCredentialService type TLoginCredentialService = class sealed public const Default = ''; DefaultUsrPw = 'DefaultUsrPw'; // do not localize DefaultUsrPwDm = 'DefaultUsrPwDm'; //do not localize … strict private class var FLoginHandlers: TStringList; strict private class constructor Create; class destructor Destroy; class function IndexOfHandler(const Context: TLoginCredentialEvent): Integer; public class procedure RegisterLoginHandler(const Context: string; const HandlerEvent: TLoginCredentialEvent); static; class procedure UnregisterLoginHandler(const Context: string; const HandlerEvent: TLoginCredentialEvent); static; class function GetLoginCredentialEvent(const Context: string): TLoginCredentialEvent; static; class function GetLoginCredentials(const Context: string; Sender: TObject; const Callback: TLoginEvent): Boolean; overload; static; class function GetLoginCredentials(const Context: string; const Callback: TLoginFunc): Boolean; overload; static; class function GetLoginCredentials(const Context: string; var Username, Password: string): Boolean; overload; static; class function GetLoginCredentials(const Context: string; var Username, Password, Domain: string): Boolean; overload; static; end; TPointF (System.Types) type TPointF = record X: Single; Y: Single; public constructor Create(const P: TPointF); overload; constructor Create(const X, Y: Single); overload; constructor Create(P: TPoint); overload; class operator Equal(const Lhs, Rhs: TPointF): Boolean; class operator NotEqual(const Lhs, Rhs: TPointF): Boolean; class operator Add(const Lhs, Rhs: TPointF): TPointF; class operator Subtract(const Lhs, Rhs: TPointF): TPointF; function Distance(const P2: TPointF): Double; procedure SetLocation(const X, Y: Single); overload; procedure SetLocation(const P: TPointF); overload; procedure SetLocation(const P: TPoint); overload; … function Add(const Point: TPointF): TPointF; overload; function Add(const Point: TPoint): TPointF; overload; function Subtract(const Point: TPointF): TPointF; overload; function Subtract(const Point: TPoint): TPointF; overload; function IsZero: Boolean; function Ceiling: TPoint; function Truncate: TPoint; function Round: TPoint; end; Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 18 02/10/2011 C++ ¿Qué hay de nuevo en C++? • • • • • FireMonkey Live Bindings DataSnap RTTI extendido Auditorías y métricas Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 19 02/10/2011 Demostraciones Demostraciones • 32-bit/64-bit Fish Facts con estilo • Fish Facts con estilo en C++ • Fish Facts con estilos y Live Bindings Danysoft | www.danysoft.com | 902 123146 | info@danysoft.com 20