OnGetText y OnSetText del TField
Comenzado por
enecumene
, ene 15 2009 11:52
10 respuestas en este tema
#1
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 .
Saludos.
Saludos.
#2
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
Aquí puedes ver un ejemplo.
Salud OS
#3
Escrito 15 enero 2009 - 12:30
Muchas Gracias Egostar, ahora sé como funcionan
Saludos.
Saludos.
#4
Escrito 15 enero 2009 - 12:41
de manera sencilla, y sin perjuicios para la salud
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
al momento de grabar
Cabe destacar que si no hacemos la asignacion de Text al campo este queda vacio.
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
procedure TForm1.Table1Campo1GetText(Sender: TField; var Text: String; DisplayText: Boolean); begin if Text = '0' then Text := 'F' else Text := 'T'; end;
al momento de grabar
delphi
procedure TForm1.Table1Campo1SetText(Sender: TField; const Text: String); begin if Text = 'V' then Sender.AsInteger := 1 else Sender.AsInteger := 0; end;
Cabe destacar que si no hacemos la asignacion de Text al campo este queda vacio.
#5
Escrito 15 enero 2009 - 12:47
Gracias Eduarcol, tu explicación ha sido muy aclaratoria, muchas gracias .
Saludos.
Saludos.
#6
Escrito 15 enero 2009 - 12:53
nada, que para eso estamos
#7
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:
¿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:
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:
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,
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
procedure TField.SetEditText(const Value: string); begin if Assigned(FOnSetText) then FOnSetText(Self, Value) else SetText(Value); 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
procedure TField.SetText(const Value: string); begin SetAsString(Value); 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
procedure TField.SetAsString(const Value: string); begin raise AccessError('String'); { Do not localize } 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,
#8
Escrito 15 enero 2009 - 01:29
¡Excelente Amigo!, cada día aprendo más , muchas gracias.
Saludos.
Saludos.
#9
Escrito 15 enero 2009 - 01:43
Delphius tu que hacias en la universidad??? me parece que en verdad estudiastes jejeje
#10
Escrito 15 enero 2009 - 01:56
Delphius tu que hacias en la universidad??? me parece que en verdad estudiastes jejeje
Jajaja.
Pues si, Estudié los 5 años.
Pero además me emborraché, me e.. ré :$, y otras cosas más .
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.
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,
#11
Escrito 15 enero 2009 - 02:10
es que lo dicho, la universidad no se hizo para estudiar, uno aprende a lo que sale... jajja