Recent

Author Topic: pregunta sobre ayudantes de clase  (Read 3252 times)

zelda16bit

  • Full Member
  • ***
  • Posts: 118
pregunta sobre ayudantes de clase
« on: June 13, 2021, 05:09:18 pm »
Pues otra parte del manual donde hay ejemplos que no me resultan sencillos de entender. :o

Estoy en el apartado 9.7 del manual:
https://castle-engine.io/modern_pascal_introduction.html#_class_helpers

Si podeis explicarme esto con un ejemplo mas claro se agradecera.Un saludo!!
« Last Edit: June 13, 2021, 09:13:55 pm by zelda16bit »

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: pregunta sobre ayudantes de clase
« Reply #1 on: June 13, 2021, 06:02:11 pm »
Aquí va un ejemplo sacado de la vida real ;)

Supón que quieres añadir métodos a una clase, digamos TStringList, pero no quieres derivar una clase hija para añadirlos, por ejemplo porque otras funciones o procedimientos esperan (o devuelven) esa clase o porque quieres aplicarlos a una propiedad de ese tipo (e.g. TMemo.Lines). La solución es usar un class helper.

Supón que quieres que el nuevo método te de el último índice de las líneas; vamos a llamarlo LastIndex y la implementación, simplísima, es que devuelva Count-1. Ya puestos, vamos a añadir también un método que nos dé la última cadena.

Todo junto sería:

Code: Pascal  [Select][+][-]
  1. unit StrListHlp;
  2.  
  3. type
  4.  
  5.   { TStrListHelper }
  6.  
  7.   TStrListHelper = class helper for TStringList
  8.     function LastIndex: Integer;
  9.     function LastLine: String;
  10.   end;
  11.  
  12. implementation
  13.  
  14. { TStrListHelper }
  15.  
  16. { Date cuenta que accedemos a propiedades de StringList:
  17.   Count, Strings, etc.
  18.   como si estuviéramos dentro de la definición de la clase }
  19.  
  20. function TStrListHelper.LastIndex: Integer;
  21. begin
  22.   Result := Count - 1;
  23. end;
  24.  
  25. function TStrListHelper.LastLine: String;
  26. begin
  27.   if LastIndex >= 0 then
  28.     Result := Strings[LastIndex]
  29.   else
  30.     Result := ''; {Aunque quizá deberíamos alzar una excepción...}
  31. end;
  32.  
  33. end.

Y ya está; a partir de ahí puedes usar esos dos métodos como si hubieran estado en la clase desde el principio con sólo añadir la unidad a la cláusula uses. Como ejemplo, el típico bucle para recorrer las líneas de un memo quedaría como:
Code: Pascal  [Select][+][-]
  1. for i := 0 to MiMemo.Lines.LastIndex do
  2.   {... lo que quieras ...};

¿Qué? ¿Fácil o no? ;D
« Last Edit: June 13, 2021, 06:05:28 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: pregunta sobre ayudantes de clase
« Reply #2 on: June 13, 2021, 09:22:25 pm »
Pues me temo que esta vez no me resulta facil y de hecho sigo sin entender. %)

De donde sale TStringList,es una clase interna de pascal o alguna que haz hecho tu,no la veo por ninguna parte.

Luego creas dos metodos que comentas que son para la clase TStringList.pero como no veo la clase TStringList,tampoco veo como la creas y accedes a esos metodos y de que forma lo haces.

Por lo que comentas parece algo parecido a las interfaces,pero al no ver la clase pues no se todavia como y que hacer. :-\

mosquito

  • Full Member
  • ***
  • Posts: 138
Re: pregunta sobre ayudantes de clase
« Reply #3 on: June 13, 2021, 09:54:30 pm »
https://www.freepascal.org/docs-html/current/rtl/classes/index.html

https://www.freepascal.org/docs-html/current/rtl/classes/tstringlist.html

TStringList es una clase, que se usa muy frecuentemente, tanto en aplicaciones GUI como CMD, es como el pan nuestro de cada día (si vives en la cara premiada del planeta). Por eso el maestro te la pone ahí, pero podría haber puesto cualquier otra.

Si quieres ver su auténtico potencial bucea no sólo en esta clase, sino en sus papis (TStrings, TPersistent, etc.).
« Last Edit: June 13, 2021, 10:08:27 pm by mosquito »

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: pregunta sobre ayudantes de clase
« Reply #4 on: June 14, 2021, 06:17:56 am »
La clase "base" no importa tanto, sino que para extender cualquier clase antes tenías sólo una opción: crear una clase hija. Los helpers te dan otra opción que es más o menos equivalente a extender la clase in situ, que resulta muy útil si no quieres (o no puedes) crear una clase nueva.
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: pregunta sobre ayudantes de clase
« Reply #5 on: June 14, 2021, 02:36:34 pm »
He practicado un poco con esto y ya he podido entenderlo,la verdad es que esta chulo esto y no lo he visto en ningun otro lenguaje.

 

TinyPortal © 2005-2018