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
}
Última edición por agustinh8080 fecha: 16-10-2007 a las 03:30:37.
|