PDA

Ver la Versión Completa : Mostrar texto de un DBMemo a partir de un caracter


exequielmatias1
09-08-2013, 21:58:33
Hola gente genia! ja les cuento, tengo un dbmemo conectada a una base de datos, en los campos memo, el texto, contiene muchos codigos y caracteres , yo solo quiero mostrar el texto en el memo que por ejemplo empieza despues de un caracter y termina con el mismo ej #texto texto texto# antes y despues se ven codigos que no me interesan, que codigo puedo usar?

ecfisa
09-08-2013, 22:51:48
Hola exequielmatias1.

Podes usar el evento AfterScroll del TDataSet.

...
implementation

uses StrUtils;

const
DELIM = '#';

procedure TForm1.DataSetAfterScroll(DataSet: TDataSet);
var
p1, p2: Integer;
begin
with DBMemo1 do
begin
p1 := Pos(DELIM, Text) + 1;
p2 := PosEx(DELIM, Text, p1);
if (p1 > 0) and (p2 > 0) then
Text := Copy(Text, p1, p2 - p1);
end;
end;
...


Saludos :)

exequielmatias1
10-08-2013, 20:48:39
Gracias ecfisa!! me salio perfecto, pero solo me recupera la primer linea que encuentra, quiero hacerlo con un while para que busque en todo el texto, pero algo mal estoy haciendo, no se me ocurre como poner el while en este codigo. gracias! :)

ecfisa
10-08-2013, 22:31:29
Hola exequielmatias1.

Para que te muestre todos aquellos caracteres del texto que estén comprendidos entre dos delimitadores:

...
uses StrUtils;

const
DELIM = '#';


procedure TForm1.DataSetAfterScroll(DataSet: TDataSet);
var
p1, p2: Integer;
s1, aux : string;
begin
s1 := DBMemo1.Text;
repeat
p1 := Pos(DELIM, s1);
p2 := PosEx(DELIM, s1, p1 + 1);
if (p1 <> 0) then
begin
aux := aux + Copy(s1, p1+1, p2 - p1 -1) + ' ';
Delete(s1, 1, p2);
end;
until (p1 = 0) or (p1 > p2);
if Length(s1) <> Length(DBMemo1.Text) then
DBMemo1.Text := aux;
end;


Saludos :)

exequielmatias1
20-08-2013, 18:39:43
hola! gracias por tu respuesta, lamentablemente con el ultimo codigo solo me devuelve la primer linea..

te explico mas o menos lo que intento hacer..
tengo un dbmemo conectada desde un ADOQuery una base de datos en access.
En uno de los campos memo, contiene texto con muchos codigos y caracteres , yo solo quiero mostrar un codigo que esta dentro del memo que siempre empieza por ej. con SABxxxx luego son 4 letras diferentes pero siempre en total son 8 caracteres.
por ejemplo mi texto del memo es:
xtxtxtxtxtxtxtyxtxtxt #SABAEIOU#txtxtxtxtxtxt @@textotextotexto # SABUOIEA# textotextotextotexto (..)*100
y quiero que en mi dbmemo solo muestre
SABAEIOU
SABUOIEA

ademas otro dato este codigo de 8 caracteres antes tiene un # y termina con un #
luego este codigo lo comparo con otra tabla y me tiene que devolver en un edit el dato de referencia a ese codigo.. espero ser claro >

ecfisa
20-08-2013, 22:54:03
Hola exequielmatias1.

Supongo que algo no has copiado bien, ya que el código que te puse en el mensaje anterior hace exáctamente lo que buscas.

Te adjunto un demo con dos TDBMemos y un TDBNavigator para que puedas probar con tranquilidad. El primer DBMemo muestra el texto original y el segundo sólo las subcadenas.

Usé la tabla biolife.db con BDE dado que no uso Access y solo dispongo de las tablas que trae Delphi (ninguna con memo). Pero el código funcionará del mismo modo con los componentes ADO.

Recordá que al extraer las subcadenas en el evento AfterScroll, luego de modificado el texto, deberás mover el cursor para ver los cambios.

Saludos. :)

exequielmatias1
21-08-2013, 16:01:04
Gracias ecfisa por tu paciencia!! logre hacer lo que me necesitaba, solo me falta comparar esas 8 letras con una tabla y mostrar el valor que corresponde, por ahora puedo validar solo del primer campo de 8 letras, pero cuando tengo mas campos seguidos no los puedo validar a todos.
voy a seguir buscando sino hare otro post.