Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-05-2023
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Error al aplicar HELPER sobre varios TARRAY

Hola a todos!!

Me estoy encontrando con un problema al usar helper sobre ciertas estructuras de datos, y no se si es un error mío en la forma de aplicar los helpers, o un error de la versión de delphi, detallo el problema:

Con la siguiente estructura de datos y helper todo funciona correctamente y al pulsar el botón ejecuta su proceso sobre cada estructura de datos, y hasta aquí todo correcto:

Código Delphi [-]
type
  TDatoA = record
    A: integer;
  end;

  TDatoB = record
    B: integer;
  end;

  /// 1.)
  TArrayA = Array of TDatoA;
  TArrayB = Array of TDatoB;

  TArrayAHelper = record helper for TArrayA
    procedure Proces_A;
  end;

  TArrayBHelper = record helper for TArrayB
    procedure Proces_B;
  end;

procedure TForm2.Button1Click(Sender: TObject);
var
  A: TArrayA;
  B: TArrayB;
begin
  /// ...
  A.Proces_A;
  B.Proces_B;
end;

Pero si los array de datos en vez de estar definido como en la forma 1 los defino a través de la estructura TArray que internamente se supone que es identico:

Código:
   /// 2.)
   TArrayA = TArray<TDatoA>;
   TArrayB = TArray<TDatoB>;
entonces me aparece un error de compilador indicando:
[dcc32 Error] Unit2.pas(61): E2003 Undeclared identifier: 'Proces_A'

El error básicamente es similar a cuando a una estructura de datos se le pretende asignar varios helpers distintos, pero en este ejemplo concreto son dos estructuras de datos distintas.

La solución pasa por no usar TARRAY, pero ¿realmente es un error de uso de HELPERS? o ¿es un bugs de delphi?
Responder Con Cita
  #2  
Antiguo 12-05-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
A mi esto me compila y se ejecuta perfectamente en Delphi 11.2 Patch 1

NOTA: No uso la etiqueta de Delphi, porque parece que no gestiona bien los símbolos de MayorQue y MenorQue de los genéricos.

Código:
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TDatoA = record
    A: integer;
  end;

  TDatoB = record
    B: integer;
  end;

  /// 2.)
  TArrayA = TArray<TDatoA>;
  TArrayB = TArray<TDatoB>;


  TArrayAHelper = record helper for TArrayA
    procedure Clear;
  end;

  TArrayBHelper = record helper for TArrayB
    procedure Clear;
  end;

  TForm3 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    A: TArrayA;
    B: TArrayB;
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
  /// ...
  A.Clear;
  B.Clear;
end;

{ TArrayAHelper }

procedure TArrayAHelper.Clear;
begin
  var len:integer := Length(Self);
  // form3.Memo1.Lines.Add('Longitud=' + len.ToString);
  for var i:integer := 0 to len-1 do
    Self[i].A := 0;
end;

{ TArrayBHelper }

procedure TArrayBHelper.Clear;
begin
  var len:integer := Length(Self);
  // form3.Memo1.Lines.Add('Longitud=' + len.ToString);
  for var i:integer := 0 to len-1 do
    Self[i].B := 0;
end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 12-05-2023
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Hola Neftali, gracias por responder!!

Con el ejemplo tal y como tu lo has puesto, con el mismo nombre del procedimiento para ambas estructuras, entonces si se compila y ejecuta, pero me pasan varias cosas raras:
- si a las funciones les pongo para que muestre un mensaje e identificar el procedimiento que se esta ejecutando, siempre se ejecuta el proceso de la estructura B y nunca el de la estructura A.
- Si a las estructuras les meto datos, Y ambas estructura son idénticas, entonces los datos si los limpia en ambas, pero si a la estructura A le pongo otra variable por ejemplo un string para que no sean identicas, entonces la estructura A ya no la limpia.
Código Delphi [-]
procedure TArrayAHelper.Clear;
begin
  MessageDlg('TArrayAHelper.Clear', mtInformation, [mbOK], 0);
  ...
end;

{ TArrayBHelper }
procedure TArrayBHelper.Clear;
begin
  MessageDlg('TArrayBHelper.Clear', mtInformation, [mbOK], 0);
  ...
end;

Y si en los helpers a los procesos los llamo de distinta forma para cada estructura, entonces obtengo el mismo error inicial

Código Delphi [-]
  TArrayAHelper = record helper for TArrayA
    procedure ClearA;
  end;

  TArrayBHelper = record helper for TArrayB
    procedure ClearB;
  end;
el error entonces es:
[dcc32 Error] Unit2.pas(69): E2003 Undeclared identifier: 'ClearA'
Responder Con Cita
  #4  
Antiguo 15-05-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
No se, a mi sí me ejecuta los procedimientos correctos y me diferencia entre el A y el B.
Te adjunto la imagen y el proyecto completo, para que lo compares.

Archivos Adjuntos
Tipo de Archivo: zip Generic Array helpers.zip (89,6 KB, 1 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 15-05-2023
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Gracias Neftali por el tiempo dedicado!!

En mi delphi (xe7) con tu proyecto sigo teniendo el problema, imagino que será algo que no esta fino de mi instalación.

Intentare ver como solucionarlo, y de nuevo gracias por el tiempo dedicado!!
Responder Con Cita
  #6  
Antiguo 15-05-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por bucanero Ver Mensaje
Gracias Neftali por el tiempo dedicado!!
En mi delphi (xe7) con tu proyecto sigo teniendo el problema, imagino que será algo que no esta fino de mi instalación.
Intentare ver como solucionarlo, y de nuevo gracias por el tiempo dedicado!!
Es posible que sea un error y esté corregido en las últimas versiones.
Yo lo he probado con una 11 (no se si lo había comentado).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
String to TArray<T> elrayo76 Varios 9 29-06-2022 23:14:27
Función que retorne Tarray<T> movorack OOP 2 23-09-2021 15:30:39
HELPER: Insertar ProgressBar en LISTITEM bucanero Trucos 6 07-09-2018 08:19:28
crear HELPER juank1971 OOP 3 08-02-2018 20:57:17
me marca error al aplicar update Pascual Montes SQL 1 08-06-2005 18:20:50


La franja horaria es GMT +2. Ahora son las 07:39:49.


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
Copyright 1996-2007 Club Delphi