Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Guardar datos de renglón (https://www.clubdelphi.com/foros/showthread.php?t=85772)

Mantixd 01-05-2014 00:39:54

Guardar datos de renglón
 
Buenas tardes mi duda es la siguiente, supongamos que tengo un arreglo

Código Delphi [-]
 DirAsm: Array[1..73] of string =  ('ALIGN','.ALPHA','ASSUME','.CODE','COMM','COMMENT',
                                        '.CONST','.CREF','.DATA','DB','DD','DF','DOSSEG','DQ',
                                        'DT','DW','ELSE','END','ENDIF','ENDM','ENDP','ENDS','EQU',
                                        '.ERRnn','EVEN','EXITM','EXTRN','.FARDATA','.FARDATA?',
                                        'GROUP','IF','IF1','IF2','IFB','IFDEF','IFDIF','IFE','IFIDN',
                                        'IFNB','IFNDEF','INCLUDE','INCLUDELIB','IRP','IRPC','LABEL',
                                        '.LALL','.LFCOND','.LIST','LOCAL','MACRO','.MODEL','NAME',
                                        'ORG','OUT','PAGE','PROC','PUBLIC','PURGE','.RADIX','RECORD',
                                        'REPT','.SALL','SEGMENT','.SEQ','.SFCOND','.STACK','STRUC',
                                        'SUBTTL','.TFCOND','TITLE','.XALL','.XCREF','.XLIST');

Tengo un memo donde escribo una palabra y la comparo con ese arreglo, ahora mi duda es como hacer que cuando encuentre esa palabra me tome todos los datos que estan en ese renglon y me los guarde en otro memo POR EJEMPLO SUPONGAMOS QUE EN EL MEMO ESCRIBO ESTO:

HOLA DB HOLA

La palabra que encontraria al compararse el memo con el arreglo seria DB por lo tanto quiero que tome todo el renglon

HOLA DB HOLA

y me lo guarde en otro memo, la comparacion ya la tengo pero no se como tomar solo los datos de ese renglon y los guarde en el memo de ante mano muchas gracias espero puedan ayudarme :D

ecfisa 01-05-2014 02:24:33

Cita:

Empezado por Mantixd (Mensaje 475906)
Tengo un memo donde escribo una palabra y la comparo con ese arreglo, ahora mi duda es como hacer que cuando encuentre esa palabra me tome todos los datos que estan en ese renglon y me los guarde en otro memo POR EJEMPLO SUPONGAMOS QUE EN EL MEMO ESCRIBO ESTO:

HOLA DB HOLA

La palabra que encontraria al compararse el memo con el arreglo seria DB por lo tanto quiero que tome todo el renglon

HOLA DB HOLA

y me lo guarde en otro memo...

Hola Mantixd.

Según entiendo de tu mensaje, podrías hacer:
Código Delphi [-]
...
const
  DIRASM: array[1..73] of string = ( ... );

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
var
  i: Integer;
begin
  if Key = #13 then
    for i:= Low(DIRASM) to High(DIRASM) do
      if AnsiPos(DIRASM[i],Memo1.Lines[Memo1.Lines.Count-1]) <> 0 then
        Memo2.Lines.Add(Memo1.Lines[Memo1.Lines.Count-1]);
end;

Saludos :)

ecfisa 01-05-2014 02:39:54

Hola de nuevo.

No especificaste en que momento querías transferir las líneas. En el mensaje anterior se van pasando de forma interactiva (a medida que agregás una nueva línea), pero si deseas hacerlo de forma diferida:
Código Delphi [-]
procedure TForm1.btnPasarLineasClick(Sender: TObject);
var
  i,j: Integer;
begin
  for i:= 0 to Memo1.Lines.Count-1 do
    for j:= Low(DIRASM) to High(DIRASM) do
      if AnsiPos(DIRASM[j], Memo1.Lines[i]) <> 0 then
        Memo2.Lines.Add(Memo1.Lines[i]);
end;

Saludos :)

Mantixd 01-05-2014 09:50:20

Si tienes razon disculpame quiero hacerlo al presionar un boton ese mismo boton comparara el memo con el arreglo y pues ara esa funcion, muchas gracias por tu respuesta eres muy amable :)

Pero creo que tampoco no me di a entender bien en mi explicacion jeje no solo quiero que me lea el primer renglon si no que me busque en todo el memo donde esta dato del arreglo y ya me lo mande al memo2 por ejemplo si tengo este codigo
Cita:

.model small
.stack
.data

Feliz db "=>$"
Serio db "=]$"
Decepcionado db "=/$"
Triste db "=<$"
Me deberia de poner estos datos en el memo2

Cita:

Feliz db "=>$"
Serio db "=]$"
Decepcionado db "=/$"
Triste db "=<$"

dec 01-05-2014 10:40:59

Hola,

El código que te muestra el compañero en su anterior mensaje hace exactamente lo que tú precisas: buscar en todo el "Memo1" y almacenar en "Memo2" sólo las líneas en que se hubieran encontrado las palabras "clave". Lo que pasa es que para hacer eso tienes que recorrer el "Memo1" tal como lo hace el compañero, línea por línea, buscando en cada línea por cada palabra "clave".

Mantixd 01-05-2014 10:55:00

Lo que pasa es que al poner el codigo por ejemplo

Código Delphi [-]
const
 DirAsm: Array[1..74] of string =  ('db','ALIGN','.ALPHA','ASSUME','.CODE','COMM','COMMENT',
                                        '.CONST','.CREF','.DATA','DB','DD','DF','DOSSEG','DQ',
                                        'DT','DW','ELSE','END','ENDIF','ENDM','ENDP','ENDS','EQU',
                                        '.ERRnn','EVEN','EXITM','EXTRN','.FARDATA','.FARDATA?',
                                        'GROUP','IF','IF1','IF2','IFB','IFDEF','IFDIF','IFE','IFIDN',
                                        'IFNB','IFNDEF','INCLUDE','INCLUDELIB','IRP','IRPC','LABEL',
                                        '.LALL','.LFCOND','.LIST','LOCAL','MACRO','.MODEL','NAME',
                                        'ORG','OUT','PAGE','PROC','PUBLIC','PURGE','.RADIX','RECORD',
                                        'REPT','.SALL','SEGMENT','.SEQ','.SFCOND','.STACK','STRUC',
                                        'SUBTTL','.TFCOND','TITLE','.XALL','.XCREF','.XLIST');



procedure TForm1.SpeedButton2Click(Sender: TObject);
var
i:Integer;

begin

    for i:= Low(DIRASM) to High(DIRASM) do
      if AnsiPos(DIRASM[i],Memo1.Lines[Memo1.Lines.Count-1]) <> 0 then
        Memo2.Lines.Add(Memo1.Lines[Memo1.Lines.Count-1]);
end;

en el memo1 escribo esto

Código:

Feliz        db "=>$"
 Serio        db "=]$"
 Decepcionado db "=/$"
 Triste      db "=<$"

y presiono el boton para que haga la comparacion y solo me manda esto al memo2

Código:

Triste      db "=<$"
y pues se supone que el codigo esta bien no entiendo muy bien lo que pasa soy algo nuevo en esto :/

dec 01-05-2014 10:59:39

Hola,

Lo que pasa es que el código que tú utilizas:

Código Delphi [-]
var
  i:Integer;
begin
  for i:= Low(DIRASM) to High(DIRASM) do
    if AnsiPos(DIRASM[i],Memo1.Lines[Memo1.Lines.Count-1]) <> 0 then
      Memo2.Lines.Add(Memo1.Lines[Memo1.Lines.Count-1]);
end;

... no es el mismo que el que Daniel te propone arriba:

Código Delphi [-]
procedure TForm1.btnPasarLineasClick(Sender: TObject);
var
  i,j: Integer;
begin
  for i:= 0 to Memo1.Lines.Count-1 do
    for j:= Low(DIRASM) to High(DIRASM) do
      if AnsiPos(DIRASM[j], Memo1.Lines[i]) <> 0 then
        Memo2.Lines.Add(Memo1.Lines[i]);
end;

Mantixd 01-05-2014 11:36:07

Si entiendo a lo que te refieres lo que pasa es que yo lo acomode segun a mi modo porque lo que quiero es que al hacer click en un boton me lea automaticamente todo el memo1 y los datos encontrados los mande todos juntos al memo2, eso es lo que supongo yo que no me di a explicar bien.
Lo que el compañero me brindo (LO CUAL AGRADESCO MUCHISIMO) funciona al darle a una tecla o con un click pero yo lo que quiero es agregar un boton y al presionar ese boton lea todo y ponga lo encontrado en el memo2, muchas gracias por tus comentarios y consejos y lamento las molestias.

dec 01-05-2014 14:13:21

Hola,

No tienes que disculparte, pero, el código que ha puesto Daniel más arriba hace exactamente lo que precisas:

Código Delphi [-]
procedure TForm1.btnPasarLineasClick(Sender: TObject);
var
  i,j: Integer;
begin
  for i:= 0 to Memo1.Lines.Count-1 do
    for j:= Low(DIRASM) to High(DIRASM) do
      if AnsiPos(DIRASM[j], Memo1.Lines[i]) <> 0 then
        Memo2.Lines.Add(Memo1.Lines[i]);
end;

Ahí se recorre el "Memo1" línea a línea, se busca cada palabra clave en cada línea, y, si se encuentra, se añade la línea al "Memo2".

nlsgarcia 01-05-2014 16:54:55

Mantixd,

Cita:

Empezado por Mantixd
...lo que quiero es que al hacer click en un botón me lea automáticamente todo el Memo1 y los datos encontrados (comparara el memo con el arreglo) los mande todos juntos al Memo2...

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  RegAsm: Array[1..74] of string =  ('db','ALIGN','.ALPHA','ASSUME','.CODE','COMM','COMMENT',
                                     '.CONST','.CREF','.DATA','DB','DD','DF','DOSSEG','DQ',
                                     'DT','DW','ELSE','END','ENDIF','ENDM','ENDP','ENDS','EQU',
                                     '.ERRnn','EVEN','EXITM','EXTRN','.FARDATA','.FARDATA?',
                                     'GROUP','IF','IF1','IF2','IFB','IFDEF','IFDIF','IFE','IFIDN',
                                     'IFNB','IFNDEF','INCLUDE','INCLUDELIB','IRP','IRPC','LABEL',
                                     '.LALL','.LFCOND','.LIST','LOCAL','MACRO','.MODEL','NAME',
                                     'ORG','OUT','PAGE','PROC','PUBLIC','PURGE','.RADIX','RECORD',
                                     'REPT','.SALL','SEGMENT','.SEQ','.SFCOND','.STACK','STRUC',
                                     'SUBTTL','.TFCOND','TITLE','.XALL','.XCREF','.XLIST');

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Selecciona los Registros de Assembler de un TMemo con base en un Arreglo
procedure TForm1.Button1Click(Sender: TObject);
var
   SL: TStringList;
   i, j, k : Integer;
   Token : String;
   AuxStr : String;

begin

   SL := TStringList.Create;

   Memo2.Clear;

   for i := 0 to Memo1.Lines.Count - 1 do
   begin

      AuxStr := Memo1.Lines[i];

      for j := 1 to Length(AuxStr) do
      begin
         if (AuxStr[j] <> ' ') and (AuxStr[j] <> ',') then
            Token := Token + AuxStr[j]
         else
         begin
            SL.Add(Token);
            Token := EmptyStr;
         end
      end;

      SL.Add(Token);
      Token := EmptyStr;

      for j := 0 to SL.Count - 1 do
         for k := Low(RegAsm) to High(RegAsm) do
            if SL[j] = RegAsm[k] then
               Memo2.Lines.Add(Memo1.Lines[i]);

      SL.Clear;

   end;

   SL.Free;

end;

end.
El código anterior en Delphi 7 y Windows 7 Professional x32, analiza cada línea del TMemo1, las compara tipo Case Sensitive con un arreglo y si haya una ocurrencia copia dicha línea a TMemo2, siguiendo el mismo comportamiento sugerido en el ejemplo del Msg #4.

Espero sea útil :)

Nelson.

Mantixd 01-05-2014 19:48:35

Muchas gracias nelson lo que es no saber mucho acerca de delphi lo bueno es que gracias a uds. Uno puede aprender mucho mas lo unico que vi es que en el memo 2 me imprime el dato 2 veces por ejemplo pongo

HOLA DB HOLA

y me lo imprime en el memo2

HOLA DB HOLA
HOLA DB HOLA

Muchisimas gracias a todos de verdad han sido de gran ayuda!

nlsgarcia 01-05-2014 20:12:54

Mantixd,

Cita:

Empezado por Mantixd
...lo unico que vi es que en el Memo 2 me imprime el dato (HOLA DB HOLA) 2 veces...

:confused:

Revisa estas imágenes:





Las imágenes anteriores fueron tomadas del código sugerido en el Msg #10, funcionando correctamente según lo esperado, siguiendo el mismo comportamiento sugerido en el ejemplo del Msg #4.

Espero que sea útil :)

Nelson.

ecfisa 01-05-2014 20:31:19

Hola Mantixd.

No voy a agregar nada a lo que David ha explicado perfectamente.

Solo se me ocurre mencionar que si deseas que funcione tanto para lo escrito en minúsculas como para mayúsculas, sólo hay que aplicar la función UpperCase a la línea que se está revisando:
Código Delphi [-]
procedure TForm1.btnPasarClick(Sender: TObject);
var
  i, j: Integer;
begin
  for i:= 0 to Memo1.Lines.Count-1 do
    for j:= Low(DIRASM) to High(DIRASM) do
      if AnsiPos(DIRASM[j], UpperCase( Memo1.Lines[i] )) <> 0 then 
        Memo2.Lines.Add(Memo1.Lines[i]);
end;

Saludos :)

Mantixd 01-05-2014 20:36:07

Claro que me fue de mas util, y fue mi error lo que pasa es que vi en otras publicaciones el mismo codigo que tu mismo habias posteado pero para que lo imprimiera en un listbox creo jeje y en ese codigo pusiste esta linea asi

Código Delphi [-]
 if UpperCase(SL[j]) = UpperCase(DirAsm[k]) then

y pues en este codigo ya no pusiste la parte del UpperCase y yo si la habia dejado jeje y por eso me imprimia doble ya ahora si quedo todo solucionado muchas gracias Nelson!

Pedron 03-05-2014 01:54:00

Hola disculpen perdon que me entrometa por aqui, este codigo si me puede servir mucho pero lo que yo estoy buscando es que me imprima en un memo2 todos los datos que sean diferentes al arreglo, por ejemplo si tengo


Código Delphi [-]
HOLA DB HOLA

Que solo me guarde el

HOLA HOLA

lo que tengo es esto pero pues creo que me hace falta algo agradeceria mucho su ayuda

Código Delphi [-]
        SL := TStringList.Create;

  // ListBox5.Clear;

   for i := 0 to Memo1.Lines.Count - 1 do
   begin

      AuxStr := Memo1.Lines[i];

      for j := 1 to Length(AuxStr) do
      begin
         if (AuxStr[j] <> ' ') and (AuxStr[j] <> ',')
         then

            Token := Token + AuxStr[j]
         else
         begin
            SL.Add(Token);
            Token := EmptyStr;
         end
      end;

      SL.Add(Token);
      Token := EmptyStr;

      for j := 0 to SL.Count - 1 do
       for k := Low(DirAsm) to High(DirAsm) do

            if (UpperCase(Memo1.Lines[i])) <> (UpperCase(DirAsm[k]))


             then



              Memo2.Lines.Add(Memo1.Lines[i]);

nlsgarcia 03-05-2014 03:59:03

Pedron,

Cita:

...estoy buscando es que me imprima en un memo2 todos los datos que sean diferentes al arreglo...ejemplo...HOLA DB HOLA...guarde...HOLA HOLA...

Revisa este código:
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
   SL: TStringList;
   i, j, k : Integer;
   Token : String;
   AuxStr : String;

begin

   SL := TStringList.Create;

   Memo2.Clear;

   for i := 0 to Memo1.Lines.Count - 1 do
   begin

      AuxStr := Memo1.Lines[i];

      for j := 1 to Length(AuxStr) do
      begin
         if (AuxStr[j] <> ' ') and (AuxStr[j] <> ',') then
            Token := Token + AuxStr[j]
         else
         begin
            SL.Add(Token);
            Token := EmptyStr;
         end
      end;

      SL.Add(Token);
      Token := EmptyStr;

      for j := SL.Count - 1 downto 0 do
         for k := Low(RegAsm) to High(RegAsm) do
            if SL[j] = RegAsm[k] then
               SL.Delete(j);

      for j := 0 to SL.Count - 1 do
         Token := Token + SL[j] + ' ';

      Memo2.Lines.Add(Token);
      Token := EmptyStr;

      SL.Clear;

   end;

   SL.Free;

end;
El código anterior en Delphi 7 y Windows 7 Professional x32, analiza cada línea de TMemo1, las compara tipo Case Sensitive con un arreglo y copia dicha línea a TMemo2 eliminando cualquier ocurrencia encontrada.

Espero sea útil :)

Nelson.

Pedron 03-05-2014 04:48:01

1 Archivos Adjunto(s)
Hola nlsgarcia Muchisimas gracias por tu respuesta tan rapida probe el codigo que me mandaste probe con elementos que no estan dentro del arreglo y pues los pone en el memo2 pero al poner un elemento que si esta dentro del arreglo me manda este error de ante mano muchisimas gracias. :D

nlsgarcia 03-05-2014 06:22:53

Pedron,

Cita:

Empezado por Pedron
...probé con elementos que no están dentro del arreglo y pues los pone en el Memo2 pero al poner un elemento que si esta dentro del arreglo me manda este error...List Index Out of Bounds...

:confused:

Revisa esta imagen:



El código sugerido en el Msg #16 funciona según lo esperado como se puede apreciar en la imagen anterior.

Pregunto:

1- ¿Modificastes el código sugerido en el Msg #16?

2- ¿Que data utilizastes en el Memo1 que origino el error?, ¿Que valores tienes en el arreglo de comparación?.

Espero sea útil :)

Nelson.

Pedron 03-05-2014 08:40:19

Código Delphi [-]


const
  RegAsm : Array[1..30] of string = ('AX','BX','CX','DX','AH','AL',
                                     'BH','BL','BP','CH','CL','CS',
                                     'DH','DL','DI','DS', 'GS', 'IP',
                                     'SI','SP','SS', 'ES',
                                     'EAX','EBP','EBX','ECX',
                                     'EDI','EDX','EIP','ESIFE');

procedure TForm1.Button1Click(Sender: TObject);
var
 SL: TStringList;
   i, j, k : Integer;
   Token : String;
   AuxStr : String;

begin

  SL := TStringList.Create;

  Memo2.Clear;

   for i := 0 to Memo1.Lines.Count - 1 do
   begin

      AuxStr := Memo1.Lines[i];

      for j := 1 to Length(AuxStr) do
      begin
         if (AuxStr[j] <> ' ') and (AuxStr[j] <> ',') then
            Token := Token + AuxStr[j]
         else
         begin
            SL.Add(Token);
            Token := EmptyStr;
         end
      end;

      SL.Add(Token);
      Token := EmptyStr;

      for j := SL.Count - 1 downto 0 do
         for k := Low(RegAsm) to High(RegAsm) do
            if SL[j] = RegAsm[k] then
               SL.Delete(j);

      for j := 0 to SL.Count - 1 do
         Token := Token + SL[j] + ' ';

      Memo2.Lines.Add(Token);
      Token := EmptyStr;

      SL.Clear;

   end;

   SL.Free;
end;

ese es mi codigo que utilizo no le he cambiado ningun dato a tu codigo que me mandaste y pues al momento de poner AX me da ese error espero y puedas ayudarme saludos y muchas gracias!

ecfisa 03-05-2014 09:51:39

Hola Pedron.

Ya habías creado un hilo con la consulta del mensaje #15, por favor no dupliques los temas ya que dificultan las búsquedas posteriores.

Código Delphi [-]
...
implementation

var
 Nemos: TStrings;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Nemos:= TStringList.Create;
  Nemos.CommaText:= 'ALIGN,.ALPHA,ASSUME,.CODE,COMM,COMMENT,.CONST,.CREF,'+
    '.DATA,DB,DD,DF,DOSSEG,DQ,DT,DW,ELSE,END,ENDIF,ENDM,ENDP,ENDS,EQU,.ERRnn,'+
    'EVEN,EXITM,EXTRN,.FARDATA,.FARDATA?,GROUP,IF,IF1,IF2,IFB,IFDEF,IFDIF,IFE,'+
    'IFIDN,IFNB,IFNDEF,INCLUDE,INCLUDELIB,IRP,IRPC,LABEL,.LALL,.LFCOND,.LIST,'+
    'LOCAL,MACRO,.MODEL,NAME,ORG,OUT,PAGE,PROC,PUBLIC,PURGE,.RADIX,RECORD,'+
    'REPT,.SALL,SEGMENT,.SEQ,.SFCOND,.STACK,STRUC,SUBTTL,.TFCOND,TITLE,.XALL'+
    ',.XCREF,.XLIST';
end;

procedure TForm1.btnProcesarClick(Sender: TObject);
var
  TS: TStrings;
  i,j: Integer;
  s: string;
begin
  Memo2.Clear;
  for i:= 0 to Memo1.Lines.Count-1 do
  begin
    TS:= TStringList.Create;
    try
      s:= EmptyStr;
      ExtractStrings([' '], [], PChar(Memo1.Lines[i]), TS);
      for j:= 0 to TS.Count-1 do
        if Nemos.IndexOf(TS[j]) = -1 then  s:= s + TS[j] + ' ';
      Memo2.Lines.Add(s);
    finally
      TS.Free;
    end;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Nemos.Free;
end;
end.

Resultado:


Saludos :)


La franja horaria es GMT +2. Ahora son las 16:32:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi