Delphi - almacenar amplias dentro de un programa -- delphi campo con unicode campo con delphi-7 campo con widestring camp Relacionados El problema

Delphi - Store WideStrings inside a program


-2
vote

problema

Español

En el pasado utilicé archivos INI para almacenar texto Unicode, pero ahora necesito almacenar texto Unicode en el ejecutable. ¿Cómo puedo lograr esto?

Quiero almacenar estas letras:

  @Path("{p:/?}{ente:(([a-zA-Z]{3})?)}/getEnabledServices") public RicercheAttive getEnabledServices(@PathParam("ente") String ente) {     ... } 5  
Original en ingles

In the past I used INI-Files to store unicode text, but now I need to store unicode text in the executable. How can I achieve this?

I want to store these letters:

xc4x81xc4x8dxc4x93xc5xabxc4xabxc5xa1xc4xb7xc4xbcxc5x86xc5xbe 
           
         
         

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Si definitivamente necesita usar Delphi 7 hay algunas variantes:

  1. Tienda de cadenas en recursos vinculados al archivo ejecutable.

  2. Tienda de cuerdas en una gran memorización o lo mismo, ubicado en el módulo de datos global o en cualquier otro componente visual o no visual y acceda a él por índice. Es posible porque las cuerdas en los recursos de Delphi almacenados en forma codificada XML. P.ej. Su ejemplo de Símbolos āčēūīšķļņž se almacenará como āčēūīšķļņž

  3. Tienda de cadenas codificadas con XML o codificadas basadas en constantes de cadena dentro de su código.

Para la conversión de cadena puede usar ENVDECD.PAS, XDOM.PAS o algunas funciones de System.Pas como UTF8ENCODE / UTF8DECODE.

Para mostrar y editar las cadenas de Unicode en los formularios de Delphi, puede usar un conjunto especial de controles de Unicode como TNT Unicode Controls o subclase Original Delphi Controles y realizan algunas otras soluciones para usted, como se describe en este extracto de comentarios en TNTControls.PAS (parte de los controles de TNT Unicode):

Windows NT proporciona soporte para Windows nativo Unicode. Agregar Unicode apoya a un Descendiente de Twincontrol, anular CreatewindowHandle () y llamar Createunicodehandle ().

Una razón importante por la que esto funciona es porque el VCL solo usa el ANSI versión de EnviarMessage () - SendmessAgea (). Si llamas a SendmessAgea () en un Unicode Ventana, Windows se ocupa de la conversión ANSI / UNICODE automáticamente. Entonces Por ejemplo, si el VCL envía WM_settext a una ventana usando Sendmessagea, Windows en realidad espera un Pansichar incluso si la ventana de destino es un unicode ventana. Por lo tanto, la calificación enviada con PCHERS no causa problemas.

Un problema en el VCL tiene que ver con el método tControl.perform (). Llevar a cabo() Llama el procedimiento de la ventana directamente y asume una ventana ANSI. Esto es un Problema Si, por ejemplo, se realiza las llamadas VCL (WM_STETXT, ...) Pasando en un Pansichar, que eventualmente se pasa hacia abajo de defwindowprocw () que espera un pwidechar.

Esta es la razón de Subclassunicodecontrol (). Este procedimiento Subclase el Windows WNDPROC, y el puntero de TwinTontrol.WindowProc. Va a determinar si el El mensaje vino de Windows o si se llamaba la ventanaPROC directamente. Entonces Llame a SendMessAgea () para que Windows realice la conversión adecuada en Ciertos mensajes de texto.

Otro problema tiene que ver con Twincontrol.DokeyPress (). Es Llamado desde el WM_CHAR mensaje. Lanza el Widechar a un Ansichar, y envía el carácter resultante para Defwindowproc. Para evitar esto, el defwindowproc es Subclase también. Windowproc hará que un mensaje WM_CHAR sea seguro para el código de manejo ANSI por convertir el código de caracteres para #Ff antes de pasarlo. Almacena el widechar original en el . Sumergido campo de Twmchar. El código #FF se convierte de nuevo al Widechar antes de pasar a Defwindowproc.

 

If you definitely need to use Delphi 7 there are some variants:

  1. Store strings in resources linked to executable file.

  2. Store strings in big memo or same thing, located on global data module or any other visual or non-visual component and access it by index. It's possible because strings in Delphi resources stored in XML-encoded form. E.g. your symbols example xc4x81xc4x8dxc4x93xc5xabxc4xabxc5xa1xc4xb7xc4xbcxc5x86xc5xbe will be stored as āčēūīšķļņž

  3. Store XML-encoded or Base64-encoded strings in string constants inside your code.

For string conversion you can use EncdDecd.pas , xdom.pas or some functions of System.pas like UTF8Encode/UTF8Decode.

To display and edit Unicode strings in Delphi forms you can use special set of Unicode controls like TNT Unicode Controls or subclass original Delphi controls and do some other workarounds by yourself, like described in this excerpt from comments in TntControls.pas (part of TNT Unicode Controls):

Windows NT provides support for native Unicode windows. To add Unicode support to a TWinControl descendant, override CreateWindowHandle() and call CreateUnicodeHandle().

One major reason this works is because the VCL only uses the ANSI version of SendMessage() -- SendMessageA(). If you call SendMessageA() on a UNICODE window, Windows deals with the ANSI/UNICODE conversion automatically. So for example, if the VCL sends WM_SETTEXT to a window using SendMessageA, Windows actually expects a PAnsiChar even if the target window is a UNICODE window. So caling SendMessageA with PChars causes no problems.

A problem in the VCL has to do with the TControl.Perform() method. Perform() calls the window procedure directly and assumes an ANSI window. This is a problem if, for example, the VCL calls Perform(WM_SETTEXT, ...) passing in a PAnsiChar which eventually gets passed downto DefWindowProcW() which expects a PWideChar.

This is the reason for SubClassUnicodeControl(). This procedure will subclass the Windows WndProc, and the TWinControl.WindowProc pointer. It will determine if the message came from Windows or if the WindowProc was called directly. It will then call SendMessageA() for Windows to perform proper conversion on certain text messages.

Another problem has to do with TWinControl.DoKeyPress(). It is called from the WM_CHAR message. It casts the WideChar to an AnsiChar, and sends the resulting character to DefWindowProc. In order to avoid this, the DefWindowProc is subclassed as well. WindowProc will make a WM_CHAR message safe for ANSI handling code by converting the char code to #FF before passing it on. It stores the original WideChar in the .Unused field of TWMChar. The code #FF is converted back to the WideChar before passing onto DefWindowProc.

 
 
   
   
3
 
vote

Si desea guardar los archivos INI Unicode, puede intentar el siguiente código. Los archivos se guardan en UTF8 codificando .

También puede echar un vistazo a esta biblioteca de unicode donde puede encontrar un montón de funciones de ayuda.

  uses IniFiles;  function WideStringToUTF8(const Value: WideString): AnsiString; var   BufferLen: Integer; begin   Result := '';    if Value <> '' then   begin     BufferLen := WideCharToMultiByte(CP_UTF8, 0, PWideChar(Value), -1, nil, 0, nil, nil);     SetLength(Result, BufferLen - 1);     if BufferLen > 1 then       WideCharToMultiByte(CP_UTF8, 0, PWideChar(Value), -1, PAnsiChar(Result), BufferLen - 1, nil, nil);   end; end;  function UTF8ToWideString(const Value: AnsiString): WideString; var   BufferLen: integer; begin   Result := '';    if Value <> '' then   begin     BufferLen := MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(Value), -1, nil, 0);     SetLength(Result, BufferLen - 1);     if BufferLen > 1 then       MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(Value), -1, PWideChar(Result), BufferLen - 1);   end; end;  procedure TForm1.Button1Click(Sender: TObject); var   IniFile: TIniFile; const   UnicodeValue = WideString(#$0101#$010D#$0113#$016B#$012B#$0161); begin   IniFile := TIniFile.Create('C: est.ini');    try     IniFile.WriteString('Section', 'Key', WideStringToUTF8(UnicodeValue));     IniFile.UpdateFile;   finally     IniFile.Free;   end; end;  procedure TForm1.Button2Click(Sender: TObject); var   IniFile: TIniFile;   UnicodeValue: WideString; begin   IniFile := TIniFile.Create('C: est.ini');    try     UnicodeValue := UTF8ToWideString(IniFile.ReadString('Section', 'Key', 'Default'));     MessageBoxW(Handle, PWideChar(UnicodeValue), 'Caption', 0);   finally     IniFile.Free;   end; end;   

ingrese la descripción de la imagen aquí
con Delphi 2007 en Windows 7 Enterprise SP de 64 bits

 

If you want to save the Unicode INI files then you might try the following code. The files are saved in UTF8 encoding.

Also you might take a look at this Unicode library where you can find a lot of helper functions.

uses IniFiles;  function WideStringToUTF8(const Value: WideString): AnsiString; var   BufferLen: Integer; begin   Result := '';    if Value <> '' then   begin     BufferLen := WideCharToMultiByte(CP_UTF8, 0, PWideChar(Value), -1, nil, 0, nil, nil);     SetLength(Result, BufferLen - 1);     if BufferLen > 1 then       WideCharToMultiByte(CP_UTF8, 0, PWideChar(Value), -1, PAnsiChar(Result), BufferLen - 1, nil, nil);   end; end;  function UTF8ToWideString(const Value: AnsiString): WideString; var   BufferLen: integer; begin   Result := '';    if Value <> '' then   begin     BufferLen := MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(Value), -1, nil, 0);     SetLength(Result, BufferLen - 1);     if BufferLen > 1 then       MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(Value), -1, PWideChar(Result), BufferLen - 1);   end; end;  procedure TForm1.Button1Click(Sender: TObject); var   IniFile: TIniFile; const   UnicodeValue = WideString(#$0101#$010D#$0113#$016B#$012B#$0161); begin   IniFile := TIniFile.Create('C:\test.ini');    try     IniFile.WriteString('Section', 'Key', WideStringToUTF8(UnicodeValue));     IniFile.UpdateFile;   finally     IniFile.Free;   end; end;  procedure TForm1.Button2Click(Sender: TObject); var   IniFile: TIniFile;   UnicodeValue: WideString; begin   IniFile := TIniFile.Create('C:\test.ini');    try     UnicodeValue := UTF8ToWideString(IniFile.ReadString('Section', 'Key', 'Default'));     MessageBoxW(Handle, PWideChar(UnicodeValue), 'Caption', 0);   finally     IniFile.Free;   end; end; 

enter image description here
with Delphi 2007 on 64-bit Windows 7 Enterprise SP 1

 
 
0
 
vote

hacer

  const MyString = WideString('Teksts latvie'#$0161'u valod'#$0101);   
 

Do

const MyString = WideString('Teksts latvie'#$0161'u valod'#$0101); 
 
 
         
         
0
 
vote

Simple, la idea es encontrar un componente no visual, que puede almacenar texto y almacenar su texto allí. Prefiero que dicho componente también pueda proporcionarle un editor para editar el texto en el tiempo de diseño.

Hay una llamada de componente FormResource que puede hacer esto. Yo uso TUniScript . Creo que hay otros componentes similares. Sin embargo, no encontré un componente utilizable de la biblioteca estándar.

 

Simple, the idea is to find a non-visual component, which can store text and store your text there. Prefer that such component can also provide you an editor to edit the text in design time.

There is a component call FormResource which can do this. I use TUniScript. I believe there are other similar components. However, I did not find a usable component from the standard library.

 
 
0
 
vote

El enfoque Widestring(#$65E5#$672C) no funciona, porque Delphi 7 simplemente no espera más de un byte para el # , por lo que el resultado es, por mucho, no lo que esperas Al ir más allá de 255 o $ FF.

Otro enfoque WideChar($65E5)+ WideChar($672C) se puede usar para almacenar codificados unicode solo en su código fuente al saber que debe tener un const // UTF-8 of the two graphemes 日 and 本, needing 3 bytes each NIPPON: #$E6#$97#$A5#$E6#$9C#$AC; var sUtf16: Widestring; begin // Internally these are 2 WORDs: $65E5 and $672C sUtf16:= UTF8ToWideString( NIPPON ); 3 al inicio de la asignación (que puede También sea un literal vacío) para que el compilador entienda qué tipo de datos desea:

  const   // Compiler error "Imcompatible types"   WONT_COMPILE: WideChar($65E5)+ WideChar($672C);    // 日本   NIPPON: Widestring('')+ WideChar($65E5)+ WideChar($672C);   

se ve incómodo, pero seguramente tiene sus textos UTF-16 en Delphi 7.

Alternativamente, almacene sus constantes en UTF-8, que es ASCII SAFE, de esa manera puede usar # fácilmente. Una ventaja es, que es mucho menos engorroso escribir en su código fuente. Una desventaja es que nunca puede usar la constante directamente, pero tiene que convertirlo a UTF-16 primero:

  const   // UTF-8 of the two graphemes 日 and 本, needing 3 bytes each   NIPPON: #$E6#$97#$A5#$E6#$9C#$AC; var   sUtf16: Widestring; begin   // Internally these are 2 WORDs: $65E5 and $672C   sUtf16:= UTF8ToWideString( NIPPON );   
 

The approach Widestring(#$65E5#$672C) does not work, because Delphi 7 just doesn't expect more than one byte for the #, so the outcome is by far not what you expect when going above 255 or $FF.

Another approach WideChar($65E5)+ WideChar($672C) can be used to store single Unicode codepoints in your source code when knowing that you need to have a Widestring at the start of the assignment (which can also be an empty literal) so the compiler understands which datatype you want:

const   // Compiler error "Imcompatible types"   WONT_COMPILE: WideChar($65E5)+ WideChar($672C);    // xe6x97xa5xe6x9cxac   NIPPON: Widestring('')+ WideChar($65E5)+ WideChar($672C); 

Looks cumbersome, but surely has your UTF-16 texts in Delphi 7.

Alternatively, store your constants in UTF-8, which is ASCII safe - that way you can use # easily. One advantage is, that it's a lot less cumbersome to write in your source code. One disadvantage is, that you can never use the constant directly, but have to convert it to UTF-16 first:

const   // UTF-8 of the two graphemes xe6x97xa5 and xe6x9cxac, needing 3 bytes each   NIPPON: #$E6#$97#$A5#$E6#$9C#$AC; var   sUtf16: Widestring; begin   // Internally these are 2 WORDs: $65E5 and $672C   sUtf16:= UTF8ToWideString( NIPPON ); 
 
 

Relacionados problema

1  ¿Cómo el número de palabra de pase a fondo?  ( How pass word number to widestring ) 
En primer lugar, lamento que no pueda describir mi problema. Lo que tengo es la palabra número 65025, que es 0xfe01 o 11111110 00000001 en binario. Y quiero...

52  ¿Qué es exactamente el prefijo l en C ++?  ( What exactly is the l prefix in c ) 
Yo entiendo lo que hace: especifica un literal de cadena como un const wchar_t * (cadena de caracteres anchos) en lugar de SetScrollContainer0 (caracteres...

1  Plantilla Char / WCAR_T, STRING / WSTRING, COUT / WCOUT, REGEXP / WREGEX (o cualquier solución posible)  ( Template char wchar t string wstring cout wcout regexp wregex or any possibl ) 
Estoy tratando con char y wchar_t . Estoy escribiendo una clase de cuerdas auxiliares que pone algunas expresiones regulares (con impulso) a algunas cade...

1  ¿Cómo lanzar war_t en int para mostrar el punto de código?  ( How to cast wchar t into int for displaying the code point ) 
Tengo una función simple en mi programa, cuando estaba deseando meterme con Unicode y hacer cosas con eso. En esta función, deseé mostrar el valor del código ...

1  MS Word OLE Automation, ADO y Personajes Extranjeros  ( Ms word ole automation ado and foreign characters ) 
Estoy tratando de exportar textos de ancho de la base de datos (ADO / MSC Access) al documento MS Word (Delphi 7), pero los caracteres extraños no se transfie...

3  ¿Cómo llamar a esta función Delphi de C #?  ( How to call this delphi function from c ) 
Estoy teniendo problemas para llamar a una función de Delphi de C # (intentó leer o escribir la memoria protegida), y se preguntaba cuál debería ser la forma ...

1  Encontrar la longitud de las cuerdas de carácter ancho  ( Finding length of wide character strings ) 
Para encontrar la longitud de las cadenas de caracteres no amplias, usamos la función strlen : #include <stdio.h> #include <wchar.h> #include <string.h> ...

8  C ++: ¿Amplios caracteres que se envían incorrectamente?  ( C wide characters outputting incorrectly ) 
Mi código es básicamente esto: wstring japan = L"日本"; wstring message = L"Welcome! Japan is "; message += japan; wprintf(message.c_str()); Estoy dese...

2  ¿Cuál es la mejor manera de encontrar dolores de cabeza de cuerdas anchas como L "% S"?  ( What is the best way to find wide string headaches such as ls ) 
Aquí hay un ejemplo de uno de los dolores de cabeza que quiero decir: Tenemos un proyecto multiplataforma que utiliza principalmente cadenas de Unicode para...

21  ¿Es necesario convertir la cuerda a Widesing en Delphi?  ( Is it necessary to convert string to widestring in delphi ) 
Encontré una función API de Windows que realiza "comparación natural" de cadenas. Se define como sigue: int StrCmpLogicalW( LPCWSTR psz1, LPCWSTR p...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos