Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comparar 2 memos (https://www.clubdelphi.com/foros/showthread.php?t=85778)

Mantixd 04-05-2014 13:42:42

Comparar 2 memos
 
Buenas mi duda es que quisiera saber como puedo comparar el texto de 2 memos mandar a 1 tercer memo el texto diferente por ejemplo si tengo en el memo1

Código:

ESTOY EN CLUBDELPHI
y en el memo 2 tengo

Código:

ESTOY EN CLUBDELPHI HACE POCO
que al presionar un boton compare esos 2 memos y mande a un 3er memo el texto diferente que vendria siendo

Código:

HACE POCO
Tengo algo como esto pero no creo estar bien porque obviamente no me envia buenos resultados que digamos


Código Delphi [-]
    for j := 0 to SL.Count - 1 do
       for g := 0 to SL.Count - 1 do


            if (Memo1.Lines[j] = Memo2.Lines[g] ) then
            Memo3.Lines.Add(Memo2.Lines[j]);

nlsgarcia 04-05-2014 16:29:28

Mantixd,

Cita:

Empezado por Mantixd
...como puedo comparar el texto de 2 memos y mandar a 1 tercer memo el texto diferente...

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;
    Label1: TLabel;
    Label2: TLabel;
    Memo3: TMemo;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
   L1, L2 : String;
   Pos : Integer;

begin

   Memo3.Clear;

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

       L1 := Memo1.Lines.Strings[i];
       L2 := Memo2.Lines.Strings[i];
       Pos := AnsiPos(L1,L2);

       if (Pos > 0) then
          Delete(L2,Pos,Length(L1));

       Memo3.Lines.Add(TrimLeft(L2));

   end;

end;

end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, compara línea a línea el texto de TMemo1 con TMemo2 y guarda en TMemo3 el diferencial de TMemo2 menos TMemo1, como se muestra en la imagen:



Espero sea útil :)

Nelson.

Mantixd 04-05-2014 21:05:59

Muchisimas gracias por tu respuesta y si es lo que estoy buscando pero tal vez me falto ser mas especifico o alomejor no entendi bien el codigo, quisiera que leyera los datos de ambos memos pero que no importe como esten ordenados osea


Código:

       
        Memo1                                            Memo2                                    Memo3
                   
ESTOY EN CLUBDELPHI                        HOLA COMO ESTAS                                            BIEN
HOLA COMO ESTAS BIEN                    HACE POCO ESTOY EN CLUBDELPHI                            HACE POCO

No se si me este dando a entender osea que no necesite estar igual el texto en ambos memos que encuentre las palabras sin importar la pocision donde esten

nlsgarcia 04-05-2014 22:46:20

Mantixd,

Cita:

Empezado por Mantixd
...quisiera que leyera los datos de ambos memos pero que no importe como estén ordenados...

Pregunto:

1- ¿Cual es la finalidad de este trabajo? :confused: , la pregunta se refiere a si es un trabajo de universidad (Que universidad, Que cátedra, Que país) o de otro tipo.

2- ¿Que pasa si una línea de Memo1 difiere con más de una línea de Memo2? :confused:

3- ¿Puede poner un ejemplo más completo de la salida requerida con todos los casos posibles?.

Espero sea útil :)

Nelson.

Mantixd 04-05-2014 23:29:01

Es una idea que se me ocurrio jeje

Soy de Mexico estudio en la Universidad Autonoma de Sinaloa (UAS) en la carrera de Ing. de Software pero lo hago como practica ya que no se mucho de delphi jeje y claro me explicare mejor por ejemplo esto esta en el memo1

Código:

        MEMO1                           
    Memo1: TMemo;           
    Memo2: TMemo;           
    Button1: TButton;         
    Label1: TLabel;             
    Label2: TLabel;               
    Memo3: TMemo;
    Label3: TLabel;

En el memo2 tengo casi todos los mismos datos pero con espacios (para que no esten iguales)

Código:

       
        MEMO2
    Memo1: TMemo;
           
    Memo2: TMemo;           
    Button1: TButton;
         
    Label1: TLabel;


y al presionar el boton esto deberia de ocurrir en el memo3

Código:

          MEMO3
    Label2: TLabel;               
    Memo3: TMemo;
    Label3: TLabel;

ya que son los datos diferentes. no se si me habre dado mas a entender

nlsgarcia 04-05-2014 23:53:48

Mantixd,

Cita:

Empezado por Mantixd
...me explicare mejor por ejemplo (Msg #5)...

:confused:

Pregunto: ¿Quieres colocar en Memo3 solamente las líneas que tenga Memo1 y no estén en Memo2?, eso difiere de lo expresado en el Msg #1.

Espero sea útil :)

Nelson.

Mantixd 05-05-2014 00:04:55

Si tienes toda la razon supongo que tengo un gran problema al darme a explicar es exactamente asi como tu preguntaste

Cita:

Pregunto: ¿Quieres colocar en Memo3 solamente las líneas que tenga Memo1 y no estén en Memo2?, eso difiere de lo expresado en el Msg #1.
eso mismo quiero hacer. si una linea esta en memo 1 pero en memo2 NO ESTE, entonces aparezca en el memo3 pero sin importar si tiene espacios o esta en otra pocision del memo que la busque y la compare.


OSEA AMBOS MEMOS TENDRAN LOS MISMOS DATOS PERO REVUELTOS Y SOLO HABRA UN DATO EN EL MEMO1 QUE SERA DIFERENTE Y ESE APARECERA EN EL MEMO3

espero haberme dado a entender mejor un saludo nlsgarcia muchas gracias!

ecfisa 05-05-2014 00:22:02

Cita:

Empezado por Mantixd (Mensaje 476022)
..., quisiera que leyera los datos de ambos memos pero que no importe como esten ordenados osea
Código:

       
Memo1                      Memo2                                    Memo3
                   
ESTOY EN CLUBDELPHI        HOLA COMO ESTAS                          BIEN
HOLA COMO ESTAS BIEN        HACE POCO ESTOY EN CLUBDELPHI            HACE POCO

No se si me este dando a entender osea que no necesite estar igual el texto en ambos memos que encuentre las palabras sin importar la pocision donde esten

Hola.
Código Delphi [-]
procedure TForm1.btnPasarClick(Sender: TObject);
var
  i: Integer;
  TS1,TS2: TStrings;
begin
  Memo3.Clear;
  TS1:= TStringList.Create;
  TS2:= TStringList.Create;
  try
    ExtractStrings([' ',',',';','.'],[],PChar(Memo1.Text),TS1);
    ExtractStrings([' ',',',';','.'],[],PChar(Memo2.Text),TS2);
    // Palabras que existen en Memo1 y en Memo2 no
    for i:= 0 to TS1.Count-1 do
      if TS2.IndexOf(TS1[i])= -1 then
        Memo3.Lines.Add(TS1[i]);
    // Palabras que existen en Memo2 y en Memo1 no
    for i:= 0 to TS2.Count-1 do
      if TS1.IndexOf(TS2[i]) = -1 then
        Memo3.Lines.Add(TS2[i]);
  finally
    TS1.Free;
    TS2.Free;
  end;
end;

Resultado:


Saludos :)

Mantixd 05-05-2014 01:07:41

Muchisimas Gracias ecfisa tu codigo me dio exactamente lo que estaba buscando me alegra mucho que sean tan amables con los nuevos espero poder aprender mucho de uds para despues tmb poder ayudar a los demas muchas gracias ECFISA Y NLSGARCIA! :D

nlsgarcia 05-05-2014 01:13:52

Mantixd,

Cita:

Empezado por nlsgarcia
Pregunto: ¿Quieres colocar en Memo3 solamente las líneas que tenga Memo1 y no estén en Memo2?, eso difiere de lo expresado en el Msg #1.

Cita:

Empezado por Mantixd
...es exactamente así como tu preguntaste...SOLO HABRA UN DATO EN EL MEMO1 QUE SERA DIFERENTE Y ESE APARECERA EN EL MEMO3...

:rolleyes:

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;
    Label1: TLabel;
    Label2: TLabel;
    Memo3: TMemo;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   i,j : Integer;
   L1, L2 : String;
   Match : Boolean;

begin

   Memo3.Clear;

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

      Match := False;

      L1 := Trim(Memo1.Lines.Strings[i]);

      for j := 0 to Memo2.Lines.Count - 1 do
      begin

         L2 := Trim(Memo2.Lines.Strings[j]);

         if CompareText(L1,L2) = 0 then
         begin
            Match := True;
            Break;
         end;

      end;

      if not Match then
         Memo3.Lines.Add(L1);

   end;

end;

end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, coloca en TMemo3 solamente las líneas que tenga TMemo1 y no estén en TMemo2?, como se muestra en la siguiente imagen:



Nota: En el código propuesto se eliminan los espacios en blanco al principio y final de las líneas a comparar, pero no los internos por lo cual puede haber diferencias en las comparaciones por desigualdad de los espacios en blanco de las líneas a comparar.

Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 05:24:53.

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