Ver Mensaje Individual
  #2  
Antiguo 16-10-2007
agustinh8080 agustinh8080 is offline
Registrado
 
Registrado: mar 2007
Posts: 2
Reputación: 0
agustinh8080 Va por buen camino
Talking 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.
Responder Con Cita