Ir al contenido


Foto

[RESUELTO] Ayuda sobre Tcolection


  • Por favor identifícate para responder
28 respuestas en este tema

#21 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 23 junio 2010 - 11:38

Hola Compañeros, he empezado nuevamente desde 0 leído mucho código y demás, y lo que tengo asta ahora es esto


delphi
  1. unit Prueba32;
  2.  
  3. interface
  4.  
  5. uses Classes,SysUtils, Db, DBGrids, Grids;
  6.  
  7. type
  8.  
  9.   tdbp32= class;
  10.  
  11.   TMiColumn= Class(TColumn)
  12.   private
  13.     FPrueba: String;
  14.     Fgrip: Tdbp32;
  15.     procedure SetPrueba(value: String);
  16.   public
  17.     constructor create(collection: TCollection);override;
  18.     destructor Destroy; override;
  19.     procedure Assign(source: TPersistent); override;
  20.     property Grid : tDbp32 read FGrip ;
  21.   published
  22.     property Prueba: string read FPrueba write SetPrueba;
  23.   End;
  24.  
  25.   TMiGridColumn = Class(TDBGridColumns)
  26.     function GetItem(AIndex: integer): TMiColumn;
  27.     procedure SetItem(AIndex: integer; const Value: TMiColumn);
  28.   public
  29.     function Add: TMiColumn;
  30. //    function IndexOf(ItemName:string):integer;
  31. //    function ValueOf(ItemName:string):String;
  32.     function ValueOfIndex(aIndex:integer):string;
  33.     procedure Assign(Source: TPersistent); override;
  34.     property Items[AIndex: integer] : TMiColumn read GetItem write SetItem;
  35.   End;
  36.  
  37.   TDBP32 = class(TDBGrid)
  38.   Private
  39.     function GetColumns: TMiGridColumn;
  40.     procedure SetColumns(Value: TMiGridColumn);
  41.   protected
  42.     { Protected declarations }
  43.     function CreateColumns: TDBGridColumns; override;
  44.   public
  45.     constructor Create(AOwner: TComponent); override;
  46.     destructor Destroy; override;
  47.     property Columns: TMiGridColumn read GetColumns write SetColumns;
  48.     function ValueOfIndex(aIndex:integer):string;
  49.   published
  50.   end;
  51.  
  52. procedure Register;
  53.  
  54. implementation
  55.  
  56. procedure Register;
  57. begin
  58.   RegisterComponents('PRUEBAS', [tdbp32]);
  59. end;
  60.  
  61. {TDBP32}
  62. Function TDBP32.GetColumns: TMiGridColumn;
  63. begin
  64.   Result := TMiGridColumn(inherited Columns)
  65. end;
  66.  
  67. procedure TDBP32.SetColumns(Value: TMiGridColumn);
  68. begin
  69.   TMiGridColumn(Columns).Assign(Value)
  70. end;
  71.  
  72. function TDBP32.CreateColumns: TDBGridColumns;
  73. begin
  74.     Result := TDBGridColumns.Create(Self, TMiColumn);
  75. end;
  76.  
  77. constructor TDBP32.Create(AOwner: TComponent);
  78. var Fcol:TDBGridColumns;
  79. begin
  80.   inherited;
  81.   Fcol:=TDBGridColumns.Create(Self, TMiColumn);
  82. end;
  83.  
  84. destructor TDBP32.Destroy;
  85. begin
  86.   inherited Destroy;
  87. end;
  88.  
  89. function TDBP32.ValueOfIndex(aIndex:integer):string;
  90. begin
  91.   result := Columns.ValueOfIndex(aIndex);
  92. end;
  93.  
  94. {TMiGridColumn}
  95. function TMiGridColumn.GetItem(AIndex: Integer): TMiColumn;
  96. begin
  97.   Result:= TMiColumn(inherited Items[aIndex]);
  98. end;
  99.  
  100. procedure TMiGridColumn.SetItem(AIndex: integer; const Value: TMiColumn);
  101. begin
  102.   inherited SetItem(AIndex, Value);
  103. end;
  104.  
  105. function TMiGridColumn.Add: TMiColumn;
  106. begin
  107.   Result:= TMiColumn(inherited Add);
  108. end;
  109.  
  110. Function TMiGridColumn.ValueOfIndex(aIndex:integer):string;
  111. begin
  112.   if (aIndex >=0) and (aIndex < Count)  then Result:= items[aIndex].Prueba
  113.                                         else Result:='';
  114. end;
  115.  
  116. procedure TMiGridColumn.Assign(Source: TPersistent);
  117. var V_valor:TMiGridColumn;
  118.     V_loop: integer;
  119. begin
  120.     if (Source is TMiGridColumn) then
  121.     begin
  122.       V_valor:=TMiGridColumn(Source);
  123.       Clear;
  124.       for V_loop := 0 to v_Valor.Count - 1 do
  125.         add.Assign(v_Valor.Items[V_loop]);
  126.     end Else Inherited;
  127. end;
  128.  
  129. {TMicolumn}
  130. constructor TMiColumn.Create(collection: TCollection);
  131. begin
  132.     inherited Create(collection);
  133.     FPrueba:='';
  134. end;
  135.  
  136. Destructor TMiColumn.Destroy;
  137. begin
  138.     inherited;
  139. end;
  140.  
  141. procedure TMiColumn.SetPrueba(value: string);
  142. begin
  143.   if FPrueba<>value then FPrueba:=value;
  144.  
  145. end;
  146.  
  147. procedure TMiColumn.Assign(source: TPersistent);
  148. var V_valor:TMiColumn;
  149. begin
  150.   if (source is TMiColumn) then  V_valor:=TMiColumn(source)
  151.                             else  inherited;
  152. end;
  153.  
  154. end.



lo que ocurre es que ahora no da fallos pero no puedo hacer la llamada convencionalmente


delphi
  1. tdbp321.Columns[Column.ID].Prueba:='123';



tengo que hacerlo de la siguiente manera


delphi
  1. tdbp321.Columns.Items[Column.ID].Prueba:='123';



Me podéis decir que estoy haciendo mal y si no es mucho pedir mostrarme el código con la corrección.


  • 0

#22 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 23 junio 2010 - 01:49

En donde pones esto:


delphi
  1.     property Columns: TMiGridColumn read GetColumns write SetColumns;



Cambia por esto:



delphi
  1.     property Columns: TMiGridColumn read GetColumns write SetColumns default;



Saludos
  • 0

#23 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 23 junio 2010 - 02:34

Hola HEctor encantado de que me eches una mano, te comento hice lo que me dijiste  y me da un error en esa linea



delphi
  1. [DCC Error] Prueba32.pas(80): E2029 Expression expected but ';' found



Me imagino que es que falta algo después del Default.
  • 0

#24 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 23 junio 2010 - 02:57

Hola José Luis.

Tienes razón, lo escribí de memoria y por eso te envía un error de sintáxis.

Lo correcto es esto:



delphi
  1.     property Columns: TMiGridColumn read GetColumns write SetColumns; default;



Saludos

  • 0

#25 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 24 junio 2010 - 12:41

Hector cambiada la linea y ahora me tira el siguiente error


delphi
  1. [DCC Error] Prueba32.pas(80): E2132 Default property must be an array property


  • 0

#26 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 24 junio 2010 - 01:25

Hola hector Según mi libro de

Los Tomos de Delphi®:
“Delphi sin problemas”

no se puede hacer lo que mi insinúas.

Default property must be an array property
Posible causa de error
Puede haber declarado una propiedad que no es de tipo array como la propiedad
por defecto de la clase. Por ejemplo, la siguiente declaración de propiedad
generará este mensaje de error:
property Twiggy: String read FTwiggy wri te FTwiggy; default;
Solución rápida
Borre la directiva Default de la declaración de la propiedad. Sola mente es posible
designar una propiedad de tipo array como lapropiedad por defecto de la
clase. Por ejemplo, lo siguiente es aceptable:
type
TComputer = class
. . .
property Clones[Index: Integer]: String
read FNetPC write SetNetPC; default;
Información adicional
La ventaja de especificar una propiedad de tipo array como propiedad por
defecto es que luego puede acceder a esa propiedad en el código sin tener que

especificar el nombre de la propiedad. Por ejemplo, a la propiedad declarada
arriba se le podría asignar un valor así:
var
PC: TComputer;
. . .
PC[ii] := Compaq;
En otras palabras, como es la propiedad por defecto, no es necesario escribir el
nombre de la propiedad cuando se hace una asignación, así:
PC.Clones[ii] := PackardBell;






  • 0

#27 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 24 junio 2010 - 11:57

Ups.  :|

Tienes toda la razón, esto solamente funciona si las propiedades son arreglos.

Bueno, pero podemos tomar otra estrategia.



delphi
  1. unit Prueba32;
  2.  
  3. interface
  4.  
  5. uses Classes,SysUtils, Db, DBGrids, Grids,
  6. RTLConsts {<-- se añadió por la constante SListIndexError};
  7.  
  8. type
  9.  
  10.   tdbp32= class;
  11.  
  12.   TMiColumn= Class(TColumn)
  13.   private
  14.     FPrueba: String;
  15.     Fgrip: Tdbp32;
  16.     procedure SetPrueba(value: String);
  17.   public
  18.     constructor Create(collection: TCollection);override;
  19.     destructor Destroy; override;
  20.     procedure Assign(source: TPersistent); override;
  21.     property Grid : tDbp32 read FGrip ;
  22.   published
  23.     property Prueba: string read FPrueba write SetPrueba;
  24.   End;
  25.  
  26.   TMiGridColumn = Class(TDBGridColumns)
  27.     function GetItem(AIndex: integer): TMiColumn;
  28.     procedure SetItem(AIndex: integer; const Value: TMiColumn);
  29.   public
  30.     function Add: TMiColumn;
  31. //    function IndexOf(ItemName:string):integer;
  32. //    function ValueOf(ItemName:string):String;
  33.     function ValueOfIndex(aIndex:integer):string;
  34.     procedure Assign(Source: TPersistent); override;
  35.     property Items[AIndex: integer] : TMiColumn read GetItem write SetItem;
  36.   End;
  37.  
  38.   TDBP32 = class(TDBGrid)
  39.   Private
  40.     function GetColumn(Index: Integer): TMiColumn; // <--- Se añadió esta línea y se eliminó la función GetColumns
  41.     procedure SetColumn(Index: Integer; const Value: TMiColumn); // <--- Se añadió esta línea y se eliminó la función SetColumns
  42.   protected
  43.     { Protected declarations }
  44.     function CreateColumns: TDBGridColumns; override;
  45.   public
  46.     constructor Create(AOwner: TComponent); override;
  47.     destructor Destroy; override;
  48.     property Columns[Index:Integer]: TMiColumn read GetColumn write SetColumn; // <--- Se modificó esta línea
  49.     function ValueOfIndex(aIndex:integer):string;
  50.   published
  51.   end;
  52.  
  53. procedure Register;
  54.  
  55. implementation
  56.  
  57. procedure Register;
  58. begin
  59.   RegisterComponents('PRUEBAS', [tdbp32]);
  60. end;
  61.  
  62. {TDBP32}
  63. function TDBP32.GetColumn(Index: Integer): TMiColumn;
  64. begin
  65.   //Una validación para saber si el índice está dentro del rango correcto
  66.   if (Index<0) or (Index>=inherited Columns.Count) then
  67.     TList.Error('Columns '+SListIndexError, Index);
  68.   Result:= TMiColumn(inherited Columns[Index]);
  69. end;
  70.  
  71.  
  72. procedure TDBP32.SetColumn(Index: Integer; const Value: TMiColumn);
  73. begin
  74.   //Una validación para saber si el índice está dentro del rango correcto
  75.   if (Index<0) or (Index>=inherited Columns.Count) then
  76.     TList.Error('Columns '+SListIndexError, Index);
  77.   TMiColumn(inherited Columns[Index]).Assign(Value);
  78. end;
  79.  
  80. function TDBP32.CreateColumns: TDBGridColumns;
  81. begin
  82.     Result := TDBGridColumns.Create(Self, TMiColumn);
  83. end;
  84.  
  85. constructor TDBP32.Create(AOwner: TComponent);
  86. var Fcol:TDBGridColumns;
  87. begin
  88.   inherited;
  89.   Fcol:=TDBGridColumns.Create(Self, TMiColumn);
  90. end;
  91.  
  92. destructor TDBP32.Destroy;
  93. begin
  94.   inherited Destroy;
  95. end;
  96.  
  97. function TDBP32.ValueOfIndex(aIndex:integer):string;
  98. begin
  99.   result := TMiGridColumn(inherited Columns).ValueOfIndex(aIndex);
  100. end;
  101.  
  102. {TMiGridColumn}
  103. function TMiGridColumn.GetItem(AIndex: Integer): TMiColumn;
  104. begin
  105.   Result:= TMiColumn(inherited Items[aIndex]);
  106. end;
  107.  
  108. procedure TMiGridColumn.SetItem(AIndex: integer; const Value: TMiColumn);
  109. begin
  110.   inherited SetItem(AIndex, Value);
  111. end;
  112.  
  113. function TMiGridColumn.Add: TMiColumn;
  114. begin
  115.   Result:= TMiColumn(inherited Add);
  116. end;
  117.  
  118. Function TMiGridColumn.ValueOfIndex(aIndex:integer):string;
  119. begin
  120.   if (aIndex >=0) and (aIndex < Count)  then Result:= items[aIndex].Prueba
  121.                                         else Result:='';
  122. end;
  123.  
  124. procedure TMiGridColumn.Assign(Source: TPersistent);
  125. var V_valor:TMiGridColumn;
  126.     V_loop: integer;
  127. begin
  128.     if (Source is TMiGridColumn) then
  129.     begin
  130.       V_valor:=TMiGridColumn(Source);
  131.       Clear;
  132.       for V_loop := 0 to v_Valor.Count - 1 do
  133.         add.Assign(v_Valor.Items[V_loop]);
  134.     end Else Inherited;
  135. end;
  136.  
  137. {TMicolumn}
  138. constructor TMiColumn.Create(collection: TCollection);
  139. begin
  140.     inherited Create(collection);
  141.     FPrueba:='';
  142. end;
  143.  
  144. Destructor TMiColumn.Destroy;
  145. begin
  146.     inherited;
  147. end;
  148.  
  149. procedure TMiColumn.SetPrueba(value: string);
  150. begin
  151.   if FPrueba<>value then FPrueba:=value;
  152.  
  153. end;
  154.  
  155. procedure TMiColumn.Assign(source: TPersistent);
  156. var V_valor:TMiColumn;
  157. begin
  158.   if (source is TMiColumn) then  V_valor:=TMiColumn(source)
  159.                             else  inherited;
  160. end;
  161.  
  162. end.



Espero haber acertado esta vez  :tongue:

Saludos

  • 0

#28 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 24 junio 2010 - 12:36

:shocked: Quedo asombrado ante su sabiduría, ahora me toca estudiar el código para poder asimilarlo, pero como siempre me quito el sombrero ante su ingenio y mil gracias Hector.
  • 0

#29 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 24 junio 2010 - 12:41

Ah que bien amigo Desart y muchas gracias Hector, como lo dijo Desart me quito el sombrero :)  (y)

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.