Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   LongWord(pc^) := $3D3D3D3D; typecast delphi 2009 win32 (https://www.clubdelphi.com/foros/showthread.php?t=64053)

JXJ 14-03-2009 05:01:04

LongWord(pc^) := $3D3D3D3D; typecast delphi 2009 win32
 
estoy probando delphi 2009. win32
con un proyecto que tengo.. y donde se hace typecast
obtengo el error
[DCC Error] SimpleXML.pas(709): E2089 Invalid typecast

Código Delphi [-]
procedure OctetToChars(po: POctet; aCount: Integer; pc: PChars);
var
    o: Integer;
begin
    if aCount = 1 then begin
        o := po.a shl 16;
        LongWord(pc^) := $3D3D3D3D;
        pc.a := Base64Map[(o shr 18) and $3F];
        pc.b := Base64Map[(o shr 12) and $3F];
    end
    else if aCount = 2 then begin
        o := po.a shl 16 or po.b shl 8;
        LongWord(pc^) := $3D3D3D3D;
        pc.a := Base64Map[(o shr 18) and $3F];
        pc.b := Base64Map[(o shr 12) and $3F];
        pc.c := Base64Map[(o shr 6) and $3F];
    end
    else if aCount > 2 then begin
        o := po.a shl 16 or po.b shl 8 or po.c;
        LongWord(pc^) := $3D3D3D3D;
        pc.a := Base64Map[(o shr 18) and $3F];
        pc.b := Base64Map[(o shr 12) and $3F];
        pc.c := Base64Map[(o shr 6) and $3F];
        pc.d := Base64Map[o and $3F];
    end;
end;

¿alguna idea de como hacer el typecast?

cHackAll 14-03-2009 21:21:18

Disculpa la ignorancia pero desconozco el tipo "PChars"... es un array of PChar? un puntero de un array of PChar?

PCardinal(pc)^
PIntegerArray(pc)[666]

JXJ 15-03-2009 00:41:12

si asi es....es un arrary de pchar..

estoy convirtiendo la version modificada de synedit.
el synedit Studio..

para que sea compatible con delphi 2009 win32

http://yaoqiaofeng.blog.163.com/blog...7101974839201/

de aqui lo descargas.

http://www.box.net/shared/jt3hcg79zr

LongWord(pc^) := $3D3D3D3D;

es el archivo simplexml.pas
hasta donde he logrado convertir a delphi 2009 win32
por que una vez compilado e instalador pasare a su uso y ver si todo va bien.

la unidad con la definicion de pchars

Código Delphi [-]

unit SimpleXML;

{$I SynUniHighlighter.inc}

interface

uses
  Windows, SysUtils, Classes;

const
  BinXmlSignatureSize = Length('< binary-xml >');
  BinXmlSignature: String = '< binary-xml >';

  BINXML_USE_WIDE_CHARS = 1;
  BINXML_COMPRESSED = 2;

  XSTR_NULL = '{{null}}';
  
  NODE_INVALID = $00000000;
  NODE_ELEMENT = $00000001;
  NODE_ATTRIBUTE = $00000002;
  NODE_TEXT = $00000003;
  NODE_CDATA_SECTION = $00000004;
  NODE_ENTITY_REFERENCE = $00000005;
  NODE_ENTITY = $00000006;
  NODE_PROCESSING_INSTRUCTION = $00000007;
  NODE_COMMENT = $00000008;
  NODE_DOCUMENT = $00000009;
  NODE_DOCUMENT_TYPE = $0000000A;
  NODE_DOCUMENT_FRAGMENT = $0000000B;
  NODE_NOTATION = $0000000C;


implementation

uses
{$IFDEF SYN_COMPILER_6_UP}
  Variants, DateUtils;
{$ELSE}
  SimpleXML_D5Emulate;
{$ENDIF}


function IsXmlDataString(const aData: String): Boolean;
var
  i: Integer;
begin
  Result := Copy(aData, 1, BinXmlSignatureSize) = BinXmlSignature;
  if not Result then begin
    i := 1;
    while (i <= Length(aData)) and (aData[i] in [#10, #13, #9, ' ']) do
      Inc(i);
    Result := Copy(aData, i, Length(')) = ';
  end;
end;

function XmlIsInBinaryFormat(const aData: String): Boolean;
begin
  Result := Copy(aData, 1, BinXmlSignatureSize) = BinXmlSignature
end;

var
  Base64Map: array [0..63] of Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

type
  PChars = ^TChars;
  TChars = packed record a, b, c, d: Char end;
  POctet = ^TOctet;
  TOctet = packed record a, b, c: Byte; end;

procedure OctetToChars(po: POctet; aCount: Integer; pc: PChars);

var
  o: Integer;
begin
  if aCount = 1 then begin
    o := po.a shl 16;
    LongWord(pc^) := $3D3D3D3D;
    pc.a := Base64Map[(o shr 18) and $3F];
    pc.b := Base64Map[(o shr 12) and $3F];
  end
  else if aCount = 2 then begin
    o := po.a shl 16 or po.b shl 8;
    LongWord(pc^) := $3D3D3D3D;
    pc.a := Base64Map[(o shr 18) and $3F];
    pc.b := Base64Map[(o shr 12) and $3F];
    pc.c := Base64Map[(o shr 6) and $3F];
  end
  else if aCount > 2 then begin
    o := po.a shl 16 or po.b shl 8 or po.c;
    LongWord(pc^) := $3D3D3D3D;
    pc.a := Base64Map[(o shr 18) and $3F];
    pc.b := Base64Map[(o shr 12) and $3F];
    pc.c := Base64Map[(o shr 6) and $3F];
    pc.d := Base64Map[o and $3F];
  end;
end;

function BinToBase64(const aBin; aSize, aMaxLineLength: Integer): String;
var
  o: POctet;
  c: PChars;
  aCount: Integer;
  i: Integer;
begin
  o := @aBin;
  aCount := aSize;
  SetLength(Result, ((aCount + 2) div 3)*4);
  c := PChars(Result);
  while aCount > 0 do begin
    OctetToChars(o, aCount, c);
    Inc(o);
    Inc(c);
    Dec(aCount, 3);
  end;
  if aMaxLineLength > 0 then begin
    i := aMaxLineLength;
    while i <= Length(Result) do begin
      Insert(#13#10, Result, i);
      Inc(i, 2 + aMaxLineLength);
    end
  end;
end;

function CharTo6Bit(c: Char): Byte;
begin
  if (c >= 'A') and (c <= 'Z') then
    Result := Ord(c) - Ord('A')
  else if (c >= 'a') and (c <= 'z') then
    Result := Ord(c) - Ord('a') + 26
  else if (c >= '0') and (c <= '9') then
    Result := Ord(c) - Ord('0') + 52
  else if c = '+' then
    Result := 62
  else if c = '/' then
    Result := 63
  else
    Result := 0
end;

Al González 15-03-2009 00:45:38

Según este archivo que me tomé la libertad de buscar:
http://mailz.googlecode.com/svn/trunk/SimpleXml.pas, los tipos POctet y PChars están declarados así en esa unidad:
Código Delphi [-]
type
  PChars = ^TChars;
  TChars = packed record a, b, c, d: Char end;
  POctet = ^TOctet;
  TOctet = packed record a, b, c: Byte; end;

El problema es que, debido a la introducción del Unicode, en Delphi 2009 el tipo Char (tradicionalmente de un byte de tamaño y equivalente a AnsiChar) pasa a ser un WideChar (de dos bytes), haciendo que la estructura compacta TChars deje de ser de sólo 4 bytes (el tamaño de un LongWord).

La solución, está en esta recomendación del Dr. Bob:
Cita:

Delphi 2009 Character types are Char, AnsiChar and WideChar, where Char defaults to WideChar. In previous versions of Delphi, a Char would be equivalent to an AnsiChar. In order to ensure existing code compiler without changes in behaviour, change Char to AnsiChar (as well as PChar to PAnsiChar).
De tal manera que esa parte del código quede como lo dejaron aquí: http://www.google.com/codesearch/p?h.../XStrUtils.pas
Código Delphi [-]
type
        PChars = ^TChars;
        TChars = packed record a, b, c, d: AnsiChar end;
        POctet = ^TOctet;
        TOctet = packed record a, b, c: Byte; end;

Con ese pequeño cambio ya no te aparecerá el error.

Saludos.

Al González. :)

P.D. Ahora veo que ya nos diste una referencia para encontrar el archivo, confirmándose lo del Char.

JXJ 15-03-2009 04:35:58


[cHackAll]

Al González



gracias a ambos
estoy revisando.. y parece que por ahi va.. pero no.. logra compilar..

hay que seguir revisando..

cHackAll 15-03-2009 22:19:54

Cita:

Empezado por JXJ (Mensaje 341478)
...pero no.. logra compilar..

:eek: ni si quiera con las nota de Al y la mia?

Código Delphi [-]
TChars = packed record a, b, c, d: AnsiChar end;

// . . .

 PCardinal(pc)^ := $3D3D3D3D;

JXJ 16-03-2009 06:06:52

asi es.. ..

por que se usa

Código Delphi [-]
var
//  Base64Map: array [0..63] of Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  Base64Map: array [0..63] of AnsiChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

y es un array de char.
al se rusado por bin to char

Código Delphi [-]
//function CharTo6Bit(c: Char): Byte;
function CharTo6Bit(c: AnsiChar): Byte;
begin
  if (c >= 'A') and (c <= 'Z') then
    Result := Ord(c) - Ord('A')
  else if (c >= 'a') and (c <= 'z') then
    Result := Ord(c) - Ord('a') + 26
  else if (c >= '0') and (c <= '9') then
    Result := Ord(c) - Ord('0') + 52
  else if c = '+' then
    Result := 62
  else if c = '/' then
    Result := 63
  else
    Result := 0
end;

asi compila e instala. pero
la funcionalidad de usar highlighters con la funcionalidad agregada de
codefolding, y el resaltado de varios lenguajes de programacion.

no se logra por que esta basada en archivos XML
y estos los lee basado en char. y byte

entonces a esperar a que el chino lo actualize de delphi 2009.

por que me gusta por que es casi el la misma funcionalidad del ide delphi 2009
ademas de el codefolding que no es como del ide delphi 2006 y en adelante
sino que esta marcado con una barrita que no corre por completo en el gutter
sino por secciones. eso ayuda mucho a distinguir donde termina
un procedure, funcion.


y ademas. por que tiene la barrita qeu cambia de color con el estado de edicion de la linea


kikin 14-04-2009 18:37:26

jajaja revivi un post..

roman 14-04-2009 18:51:37

Cita:

Empezado por JXJ (Mensaje 341472)
estoy convirtiendo la version modificada de synedit.
el synedit Studio..

para que sea compatible con delphi 2009 win32

¿Y no has probado con la versión unicode de las synedit? Al parecer, tiene ya un soporte preliminar para delphi 2009. Quizá sea más sencillo partir de ahí.

// Saludos

JXJ 16-04-2009 00:59:02

kikin .. Roman.
gracias por su interes.


el soporte para delphi 2009 de los unisynedit. es bueno
pero las caracteristicas de codefolding y la barrita de lado izquierdo
del synedit Studio. son las que me interesan.

y hacer funcionar el codefolding, depende de leer un archivo xml.

hasta ahora no he logrado hacer funcionar componentes de terceros
que manipulan archivos xml en delphi 2009.

Mas que nada por el BOM. y por que se lee caracter por caracter
y hacer que AnsiString. WideString, y String. compile y se ejecute bien
con el compilador de delphi 2009, hasta ahora me es imposible..


La franja horaria es GMT +2. Ahora son las 18:31:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi