Está en la página 1de 20

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 Tipos sin signo Byte Word LongWord Cardinal UInt64 Delphi/32 1 byte 2 bytes 4 bytes 4 bytes 8 bytes Delphi/32 1 byte 2 bytes 4 bytes 4 bytes 8 bytes Delphi/64      Delphi/64     

Danysoft | www.danysoft.com | 902 123146 |  info@danysoft.com

2

Double Tamaños de tipos en Delphi 32 y 64-bit Tipos con signo NativeInt Tipos sin signo NativeUInt Delphi/32 4 bytes Delphi/32 4 bytes Delphi/64 8 bytes Delphi/64 8 bytes Danysoft | www.com 3 . NativeUint – 64bits Pointer (todos los punteros) – 64bits Arrays dinámicos – Indexado 64bit Matecática de coma flotante .com | 902 123146 |  info@danysoft.02/10/2011 ¿Cuáles son las diferencias? • • • • NativeInt.danysoft.

02/10/2011 Tipos puntero Delphi 32 u 64-bit Tipos puntero Pointer String Class instance Class reference Interface AnsiString WideString UnicodeString Procedure pointer Dynamic array PAnsiChar PWideChar PChar Delphi/32 Delphi/64 4 bytes 8 bytes La CPU – Modelo de programación Danysoft | www.com 4 .com | 902 123146 |  info@danysoft.danysoft.

aspx • http://msdn.aspx ¿Y esto que significa para Delphi? Danysoft | www.microsoft.microsoft.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.com 5 .danysoft.com | 902 123146 |  info@danysoft.com/en-us/library/7kcdt6fy.com/en-us/magazine/cc300794.

etc… • La misma VCL – Forms.02/10/2011 ¡No te asustes! Delphi 64-bit en Windows • La misma API de Windows – CreateWindowEx. Danysoft | www. Graphics.. PeekMessage.danysoft. Generics. etc. etc. Controls.Collections.com 6 . Classes.com | 902 123146 |  info@danysoft. Menus.. • La misma RTL de Delphi – SysUtils.

HDC.com | 902 123146 |  info@danysoft. • Tlist es ahora un TPointerList. cdecl.danysoft.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 definido definido definido no definido definido definido no definido definido definido definido no definido definido no definido no definido definido definido definido dcc64 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. pascal. • La propiedad Tag es una propiedad de tipo NativeInt (32-bit vs 64-bit) Danysoft | www. Quitar el ^ debería ser suficiente para pasar de 32-bit a 64-bit. 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. Solía ser una PPointerList.. stdcall se ignoran. • safecall todavía “especial” • El antiguo “puntero matemático” puede fallar – Trabaja en 32 y 64bit: MyPtr := PByte(P) + 10.com 7 .).

siempre que la conversión sea correcta Danysoft | www. Usar el TExtendedRec80 si es necesario • • • Puntos de Interés . Los valores SHL/SHR – 32-bit (Integer y otros) solo se cambian en espacios 32-bit.Windows API • SetWindowLong / GetWindowLong deben ser reemplazadas por SetWindowLongPtr / GetWindowLongPtr para GWLP_HINSTANCE. RCX. – Las llamadas a la declaración de SetWindowLong son seguras. Las excepciones funcionan idénticamente.danysoft. – Los punteros pasados por SetWindowLongPtr deben ser convertiros a LONG_PTR y no a Integer / Longint. GWLP_WNDPROC. RDX. • SetWindowLong mapeado a SetWindowLongPtr en Windows. Los cuatro primeros parámetros en registros. Los valores 64-bit en espacios de 64-bit. etc… ya que devuelven punteros y manejadores.com 8 .com | 902 123146 |  info@danysoft.pas. – Ensamblador en línea puede hacer que las excepciones no se escalen si no está escrito correctamente. No existe el tipo Extended en 64-bit.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. R8. R9 (o XMM0-XMM3) Escalado de pila de las excepciones – Sin cambios en el código Delphi Puro.

• Usa LRESULT para convertir los resultados del mensaje – Ejemplo: Message. Danysoft | www. – Ejemplo: Pasar punteros a través de SendMessage SendMessage(hWnd. WM_SETTEXT.danysoft.Windows API • Usa conversión explicita para WPARAM y LPARAM donde sea explícito. incluyendo Integer<->instance.com 9 . LPARAM(@MyCharArray)). • Asegurarnos de que tamaño de usamos (32 vs 64) cuando usemos SHL/SHR.: ARM CPUs…) – Se apoya en rendimiento algorítmico mas que en rendimiento de ensamblador.Result := LRESULT(Self). 0. – 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.02/10/2011 Puntos de Interés . • 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.com | 902 123146 |  info@danysoft.

com 10 .com | 902 123146 |  info@danysoft.danysoft.02/10/2011 VCL ¿Que hay de nuevo en la VCL? • 64-bit • Estilos VCL Danysoft | www.

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 11 .com | 902 123146 |  info@danysoft.

danysoft.com | 902 123146 |  info@danysoft.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.com 12 . 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.

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.com 13 .danysoft.com | 902 123146 |  info@danysoft.

danysoft.com | 902 123146 |  info@danysoft.02/10/2011 De esto… ¡A esto! Danysoft | www.com 14 .

com | 902 123146 |  info@danysoft. Vcl.02/10/2011 Diseñador de estilos VCL Uso típico • Uses Vcl.com 15 . • TStyleManager.SetStyle(‘Ruby Red Graphite’).Themes.Styles.danysoft. RTL Danysoft | www.

TRect. :) – 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). 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. TSizeF – Versiones en coma flotante Danysoft | www. TLoginCredentialService – Framework extensible y agnostico para servicios de credenciales con soporte para callbacks (éxito. Platform (Win/Mac). sin ActiveX.danysoft. minor OS version. TSize – nuevos métodos y propiedades TPointF. etc) TPoint. TRectF.com 16 . Major. Target: string): Boolean.com | 902 123146 |  info@danysoft.CreateSymLink(const Link.02/10/2011 RTL ¿Qué hay nuevo en la RTL? • • ¡¡64-bit para Windows!!! Macos – Sin COM. fracaso.

procedure Read(Index: Integer. public … procedure Open(ZipFileName: string.12] of string. overload. Path: string = ''..com | 902 123146 |  info@danysoft.7] of string. overload.danysoft. ArchiveFileName: string = ''. CurrencyFormat: Byte.12] of string. ShortMonthNames: array[1. overload. out Bytes: TBytes). OpenMode: TZipMode).. TimePMString: string.. LongTimeFormat: string. overload. ListSeparator: Char. TimeAMString: string. CurrencyDecimals: Byte. overload. procedure Read(Index: Integer. Path: string = ''. CreateSubdirs: Boolean=True). LongMonthNames: array[1.Zip) type TZipFile = class . ShortDateFormat: string. Compression: TZipCompression = zcDeflate). DecimalSeparator: Char.02/10/2011 TFormatSettings (SysUtils) type TFormatSettings = record // System. property FileNames: TArray<string> read GetFileNames. … property FileCount: Integer read GetFileCount.. TwoDigitYearCenturyWindow: Word. procedure ExtractAll(Path: string = ''). ShortDayNames: array[1. procedure Read(FileName: string. TZipFile (System. … end.SysUtils … CurrencyString: string. procedure Add(FileName: string. ShortTimeFormat: string. overload. out Stream: TStream). … end. procedure Open(ZipFileStream: TStream. Danysoft | www. ThousandSeparator: Char. overload. procedure Close. LongDateFormat: string. procedure Extract(Index: Integer. DateSeparator: Char. LongDayNames: array[1.. CreateSubdirs: Boolean=True). TimeSeparator: Char.7] of string.com 17 . out Stream: TStream). OpenMode: TZipMode). procedure Extract(FileName: string. overload.

TPointF (System. procedure SetLocation(const P: TPoint). overload. Rhs: TPointF): Boolean. overload. function Ceiling: TPoint. const Callback: TLoginFunc): Boolean. overload. class function GetLoginCredentials(const Context: string. … function Add(const Point: TPointF): TPointF. procedure SetLocation(const P: TPointF).02/10/2011 TLoginCredentialService type TLoginCredentialService = class sealed public const Default = ''. overload. overload. Y: Single). overload. class operator Equal(const Lhs. overload. constructor Create(P: TPoint). overload. const Callback: TLoginEvent): Boolean. class operator Subtract(const Lhs. Y: Single). class operator Add(const Lhs. //do not localize … strict private class var FLoginHandlers: TStringList. function Subtract(const Point: TPoint): TPointF. function Subtract(const Point: TPointF): TPointF. overload. var Username.com | 902 123146 |  info@danysoft. end. static. class function GetLoginCredentials(const Context: string. overload. function IsZero: Boolean. const HandlerEvent: TLoginCredentialEvent). Rhs: TPointF): TPointF. function Round: TPoint. static. class function GetLoginCredentialEvent(const Context: string): TLoginCredentialEvent. Y: Single.danysoft. Domain: string): Boolean. static. Rhs: TPointF): TPointF. class function IndexOfHandler(const Context: TLoginCredentialEvent): Integer. procedure SetLocation(const X.Types) type TPointF = record X: Single. end. static. function Truncate: TPoint. strict private class constructor Create. function Distance(const P2: TPointF): Double. const HandlerEvent: TLoginCredentialEvent). constructor Create(const X.com 18 . class function GetLoginCredentials(const Context: string. DefaultUsrPw = 'DefaultUsrPw'. public constructor Create(const P: TPointF). Rhs: TPointF): Boolean. class operator NotEqual(const Lhs. Danysoft | www. Password: string): Boolean. static. overload. // do not localize DefaultUsrPwDm = 'DefaultUsrPwDm'. Password. class function GetLoginCredentials(const Context: string. function Add(const Point: TPoint): TPointF. public class procedure RegisterLoginHandler(const Context: string. var Username. class procedure UnregisterLoginHandler(const Context: string. static. Sender: TObject. class destructor Destroy. overload. static. overload. overload.

com 19 .com | 902 123146 |  info@danysoft.danysoft.02/10/2011 C++ ¿Qué hay de nuevo en C++? • • • • • FireMonkey Live Bindings DataSnap RTTI extendido Auditorías y métricas Danysoft | www.

com 20 .com | 902 123146 |  info@danysoft.danysoft.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.