Newsgroup: it.comp.lang.delphi
Titolo: TStringList e CustomSort

Sto lavorando con due StringList e ho implementato una mia procedura di
ordinamento. Lavorando perō con liste piuttosto grandi (l'ordinamento arriva
a impiegare anche pių di una decina di secondi) avrei l'esigenza di
permettere all'utente di interrompere l'operazione. Sapete se č possibile?
-- 
Lis
ICQ#: 162857023, 
Mercatino: 
http://snurl.com/sito_lis
FAQ di it.comp.lang.delphi: 
http://snipurl.com/faq_icld

Se la procedura di ordinamento è tua dichiara una variabile booleana globale (es. UscitaSort)
Procedure Form1.MioOrdinamento;
Begin
    UscitaSort := False;
    - Questo è un'esempio... il Repeat Until o While Do dovresti averlo nella procedura di ordinamento no? -
    Repeat
        - Ordinamento -
       Application.ProcessMessages;     // Questa è indispensabile
    Until (Ordinato) Or (UscitaSort);
End;
Nella maschera di attesa ordinamento inserisci un bottone di Interruzione operazione con la procedura come questa:
Procedure TForm1.Button1Click(Sender : TObject);
Begin
   UscitaSort := True;
End;
Spero di essere stato chiaro non è semplice spiegare cosi'
--
Ciao,
David (
www.utilityweb.net
)

 Spero di essere stato chiaro non è semplice spiegare cosi'
Ho capito il tuo discorso ma il mio caso è un pò diverso: non ho una
funzione MioOrdinamento che processa la lista e la ordina ma è la lista
(TStringList) che ha un metodo CustomSort che esegue la mia procedura.
Questo metodo si utilizza quando non va bene il metodo standard di
ordinamento TStringList.Sort. Se guardi i metodi Sort e CustomSort di una
TStringList capisci meglio quello di cui sto parlando.
grazie comunque


Lis
Ciao MassimoB
 

un bel metodo ma una prova non costa niente :)
interessato dal tuo problema oggi ho provato il sistema
che ti avevo proposto, poichč spiegarlo potrebbe
risultare meno preciso e piů lungo che leggerlo ho
postato la demo che ho realizzato per testare il tutto.
ho inserito commentandola {} anche un'opzione con
eccezione tipizzata, ti basta dichiarare un tuo tipo di
eccezione da sollevare nel caso di conclusione inattesa
dell'ordinamento e sostituire il tuo tipo al posto di
EMiaEccezioneStopOrdinamento.
Ciao MassimoB
-----------------------------------------------------------------
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ButtonOrder: TButton;
    ButtonStop: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ButtonOrderClick(Sender: TObject);
    procedure ButtonStopClick(Sender: TObject);
  private
    { Private declarations }
    myStrings: TStringList;
  public
    { Public declarations }
    Stop: Boolean;
  end;
  function ListCompare(List: TStringList; Index1,
                       Index2: Integer): Integer;
var
  Form1: TForm1;
implementation
{$R *.dfm}
function ListCompare(List: TStringList; Index1,
  Index2: Integer): Integer;
begin
  //processa i messaggi del MainThread
  Application.ProcessMessages;
  if Form1.Stop Then
    //Solleva una Typed exception
    {Raise EMiaEccezioneStopOrdinamento.Create(
                'ordinamento Interrotto');}
    //Solleva una Silent exception
    //Commentarlo in caso di Typed Exception
    Abort;
  //Ordinamento elementi in comparazione esempio
  If StrToInt(List[Index1])>StrToInt(List[Index2]) Then
    Result := 1;
  If StrToInt(List[Index1])=StrToInt(List[Index2]) Then
    Result := 0;
  If StrToInt(List[Index1])<StrToInt(List[Index2]) Then
    Result := -1;
  //Simula un ordinamento lungo
  Sleep(1);
end;
procedure TForm1.FormCreate(Sender: TObject);
Var I: Integer;
begin
  //Crea la lista
  myStrings := TStringList.Create;
  //Carica la lista
  For I := 30000 DownTo 0 Do
    myStrings.Add(InttoStr(I));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  //Rialscia la memoria della lista
  myStrings.Free;
end;
procedure TForm1.ButtonOrderClick(Sender: TObject);
begin
  Stop := false;
  //Cursore che indicha che
  //l'interfaccia č attiva
  //durante l'ordinamento
  Screen.Cursor :=crAppStart ;
  try
    try
      //imposta ed esegue l'ordinamento
      myStrings.CustomSort(@ListCompare);
    Except
 
    {
       //nel caso di Typed Exception
       On E: EMiaEccezioneStopOrdinamento Do
         //Messaggio Utente
         ShowMessage(E.Message);
    //nel caso di altro tipo di eccezione
    Else
      //Risolleva la prima eccezione 
      //nella lista delle eccezioni
      HandleException;
    }
      //Messaggio Utente
      //Commentarlo in caso di Typed Exception
      ShowMessage('Ordinamento interrotto');
    End;
  finally
    //Cursore che indicha che
    //l'interfaccia non č attiva
    Screen.Cursor := crHourGlass;
    //Visualizza la lista ordinata
    Memo1.Clear;
    try Memo1.Lines := myStrings;
    Finally Screen.Cursor := crDefault; 
    End;
  end;
end;
procedure TForm1.ButtonStopClick(Sender: TObject);
begin
  Stop := true;
end;
-----------------------------------------------------------------

 EMiaEccezioneStopOrdinamento.
Inoravo l'esistenza dell'istruzione Abort e funziona perfettamente!
grazie
