Ir al contenido


Foto

OnGetText y OnSetText del TField


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 enero 2009 - 11:52

¿Alguien conoce el funcionamiento de esos eventos?, ¿son eventos para sustituir un valor del campo por otro?, y si es posible un pequeño ejemplito me sería útil :D.

Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 15 enero 2009 - 12:04

El ejemplo clásico del OnGetText es el de mostrar un campo MEMO en un DBGrid.

Aquí puedes ver un ejemplo.

Salud OS
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 enero 2009 - 12:30

Muchas Gracias Egostar, ahora sé como funcionan ;)

Saludos.
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 15 enero 2009 - 12:41

de manera sencilla, y sin perjuicios para la salud  ^o|

onSetText se dispara cada vez que se quiere escribir en el campo, tiene un parametro llamado Text que contiene el valor a ser escrito en le campo.

onGetText se dispara cada vez que se quiere leer en el campo, aparte de la propiedad Text lleva una llamada DisplayText que determina si se muestra el valor de Text

Otro ejemplo aparte del de Eliseo es un campo boolean, supongamos que trabajamos con Firebird y tenemos el campo con un integer pero en pantalla queremos que aparezca es V o F:

Para mostrar el valor



delphi
  1. procedure TForm1.Table1Campo1GetText(Sender: TField; var Text: String;
  2.  DisplayText: Boolean);
  3. begin
  4.   if Text = '0' then
  5.      Text := 'F'
  6.   else
  7.      Text := 'T';
  8. end;



al momento de grabar



delphi
  1. procedure TForm1.Table1Campo1SetText(Sender: TField; const Text: String);
  2. begin
  3.   if Text = 'V' then
  4.      Sender.AsInteger := 1
  5.   else
  6.      Sender.AsInteger := 0;
  7. end;



Cabe destacar que si no hacemos la asignacion de Text al campo este queda vacio.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 enero 2009 - 12:47

Gracias Eduarcol, tu explicación ha sido muy aclaratoria, muchas gracias ;).

Saludos.
  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 15 enero 2009 - 12:53

nada, que para eso estamos  :p
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 enero 2009 - 01:24

Hola, tengo entendido que el evento OnSetText se dispara cuando se modifica la propiedad Text del campo. Esta propiedad se suele emplear cuando se hace uso de componentes data-ware puesto que los componentes data-ware se valen de esta propiedad para mostrar el contenido del campo en forma textual.

Se necesita emplear una respuesta al evento OnSetText, por lo que entiendo, cuando se hace uso de componentes data-ware y para indicar apropiadamente como interpretar el texto suministrado. Si no se implementa una respuesta a este evento, como bien señala Eduardo, no se asigna un valor, o cuanto mucho dependerá de como implementase el método SetText el objeto Field. ¿Porqué digo esto?

Internamente, dentro de la clase TField, cuando se asigna el contenido de la propiedad Text se dispara el método SetEditText. SetEditText realiza esta sentencias:



delphi
  1. procedure TField.SetEditText(const Value: string);
  2. begin
  3.  if Assigned(FOnSetText) then FOnSetText(Self, Value) else SetText(Value);
  4. end;



¿Que es eso? Simplemente comprueba si se ha implementado una respuesta al evento OnSetText, si se implementó la ejecuta, en otro caso hace uso del método protegido y virtual (prestarle atención a esto) SetText.

La implementacion de SetText en TField está hecha de esta forma:



delphi
  1. procedure TField.SetText(const Value: string);
  2. begin
  3.  SetAsString(Value);
  4. end;



Es decir que va intentar a guardar el valor del campo como formato texto; pero no... en realidad SetAsString en TField lo que hace es arrojar una excepción del tipo EAccessError, por tanto el contenido del campo queda en vacío:



delphi
  1. procedure TField.SetAsString(const Value: string);
  2. begin
  3.  raise AccessError('String'); { Do not localize }
  4. end;



SetAsString está declarado como virtual. Y es así para que los descendientes de TField aprovechen este método para hacer las conversiones de forma apropiada al tipo texto.

Ahora bien. Como SetText es virtual, este método es aprovechado por los descendientes de TField para realizar diferentes operaciones con el texto suministrado con el parámetro a fin de ajustarse a las implementaciones al contexto (por ejemplo un TIntegerField realizará operaciones de texto a enteros) , y de este modo llamar a diversas implementaciones SetAs(....) (en el caso de TIntegerField por ejemplo SetText llamará a SetAsInteger).

Cuando no se implementa una respuesta a OnSetText y queda el campo en vacío se debe a que o bien el descendiente de TField no implementa su propio SetText y por tanto hace uso del SetText de la clase Base, o bien estamos trabajando con la clase base.

Disculpen por el rollo que me he soltado.

Saludos,
  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 enero 2009 - 01:29

¡Excelente Amigo!, cada día aprendo más :) (y), muchas gracias.

Saludos.
  • 0

#9 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 15 enero 2009 - 01:43

Delphius tu que hacias en la universidad???  :o  me parece que en verdad estudiastes jejeje
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 enero 2009 - 01:56

Delphius tu que hacias en la universidad???  :o  me parece que en verdad estudiastes jejeje


Jajaja.
Pues si, :s Estudié los 5 años. :|
Pero además me emborraché, me e.. ré ;) :$, y otras cosas más :o :p.

Pero aunque no lo creas, lo que expuse aqui no lo empecé a ver sino fue hasta la lectura sin-cuenta :| ;) de la cara oculta y una investigación propia de la VCL.
Pero en definitiva, lo terminé de complementar con lo que he leído ahora. Por tanto, si tengo que resumir en cuanto tiempo estudié e investigué en mejor medida el uso de Text en Field diría que no más hace más de 1 hora. :p

Esto lo digo porque estuve reordenando ideas de lo que yo comprendía y tenía entendido. Estuve intentando ordenar ideas para exponerlo aqui, pero al final había desistido hasta que vi tu post. Fue allí cuando se me ocurrió ir al grano de la cuestión y ponerme a reformular y reaprender lo anteriormente leído.

Saludos,
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 15 enero 2009 - 02:10

es que lo dicho, la universidad no se hizo para estudiar, uno aprende a lo que sale... jajja
  • 0




IP.Board spam blocked by CleanTalk.