![]() |
Ordenar el contenido de un Memo
Estimados Amigos, sé que esto puede ser algo extraño (x no decir ridículo) pero realmente quisiera q m ayuden indicándome un método rápido, sencillo y eficaz para ordenar el contenido de un Memo, x ej. si contiene datos numéricos en desorden (pero en una sola columna), cómo puedo hacer para que con alguna acción se reordenen de forma ascendente en el mismo Memo. Gracias de antemano x su ayuda y disculpas x recurrir a uds. para algo así...
Drakyto |
Mira Este Pequeño Codigo Que Programe Hace Poco
unit MainOrdenar;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; // Una forma que tiene un boton y un memo implementation {$R *.dfm} type TDatoaOrdenar = procedure (auxLinea:String;Var ResultCadena:String) of object; TOrdena = class procedure estedato(auxLinea:String;Var ResultCadena:String); procedure Sort(A: TStrings); end; Var FDatoaOrdenar:TDatoaOrdenar; Ordenar:TOrdena; procedure TOrdena.estedato(auxLinea:String;Var ResultCadena:String); begin { Este método es para el dato de la linea "auxLinea" que se va a usar para hacer la comparacíón, evidentemente este método se puede reprogramar, es un ejemplo} if length(auxLinea)>1 then ResultCadena:=Copy(auxLinea,2,length(auxLinea)) else ResultCadena:=''; end; procedure TOrdena.Sort(A: TStrings); Function CogerDato(estaCadena:String):String; begin if Assigned(FDatoaOrdenar) then FDatoaOrdenar(estaCadena,Result) else Result:=estaCadena; end; procedure QuickSort(A: TStrings; iLo, iHi: Integer); // Este procedimiento lo saque de los demos y lo adapte a mi necesidad var Lo, Hi : Integer; la_Cadena,Mid, T:String; { Si son números lo que se va a tratar la variable "Mid" debe ser de tipo integer } begin Lo := iLo; Hi := iHi; // Mid := A[(Lo + Hi) div 2]; { Si son números lo que se va a tratar simplemente la linea siguiente quedaría así Mid := IntToStr(CogerDato(A[(Lo + Hi) div 2])); } Mid := CogerDato(A[(Lo + Hi) div 2]); repeat { Si son números lo que se va a tratar simplemente la lineas siguientes quedarían así while IntToStr(CogerDato(A[Lo])) < Mid do Inc(Lo); while IntToStr(CogerDato(A[Hi])) > Mid do Dec(Hi); } while CogerDato(A[Lo]) < Mid do Inc(Lo); while CogerDato(A[Hi]) > Mid do Dec(Hi); if Lo <= Hi then begin // VisualSwap(A[Lo], A[Hi], Lo, Hi); T := A[Lo]; A[Lo] := A[Hi]; A[Hi] := T; Inc(Lo); Dec(Hi); end; until Lo > Hi; if Hi > iLo then QuickSort(A, iLo, Hi); if Lo < iHi then QuickSort(A, Lo, iHi); // if Terminated then Exit; end; begin // QuickSort(A, Low(A), High(A)); FDatoaOrdenar:=estedato; // se el assigna un procedimiento a FDatoaOrdenar QuickSort(A, 0, A.Count-1); end; { Este es un método de un boton puesto en la forma Evidentemente la clase Ordenar debe ser creada para que no de un error } procedure TForm1.Button1Click(Sender: TObject); begin Ordenar.Sort(memo1.Lines); end; initialization Ordenar:=TOrdena.Create; finalization Ordenar.Free; end. // Aca le mando el fuente { Por defecto el algoritmo ordena por la cadena completa que encuentra en el memo pruebe poniendo estos datos en el memo 89 90 14 26 33 48 52 67 76 84 95 corra el ejemplo después comente esta linea // FDatoaOrdenar:=estedato; // se el assigna un procedimiento a FDatoaOrdenar corra el ejemplo y compare los resultados } |
La franja horaria es GMT +2. Ahora son las 07:52:10. |
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