![]() |
AW: e-mail adressen ordnen im memo
Das geht schon schneller, wenn Du am Anfang Memo1.Lines.BeginUpdate und am Ende Memo1.Lines.EndUpdate aufrufst.
|
AW: e-mail adressen ordnen im memo
Die Bremse dürfte hier dennoch (trotz BeginUpdate/EndUpdate) das Memo sein. Vielleicht temporär in einer SL speichern.
Delphi-Quellcode:
var
SL: TStringList; begin SL:= TStringList.Create; SL.Assign(Memo1.Lines); EmailAddressesSort(SL); Memo1.Lines.Assign(SL); SL.Free; end; |
AW: e-mail adressen ordnen im memo
Und was soll das bringen? Wenn das Memo nicht neu gezeichnet wird, haben wir doch denselben Effekt ohne Hin- und Herkopiererei.
|
AW: e-mail adressen ordnen im memo
Probier's halt aus.
Delphi-Quellcode:
function GetNamePart(const s: string): string;
var I: integer; begin Result:= ''; for I:= 1 to Length(S) do if S[I] = '@' then begin Result:= Copy(S, 1, I-1); Break; end; end; function GetDomainPart(const s: string): string; var I: integer; begin Result:= ''; for I:= 1 to Length(S) do if S[I] = '@' then begin Result:= Copy(S, I+1, Length(S)-I); Break; end; end; procedure QuickSort(const Strings: TStrings; L, R: Integer); var I, J, K: Integer; P: string; begin repeat I:= L; J:= R; K:= (L + R) shr 1; P:= AnsiLowerCase(Trim(Strings[K])); repeat while AnsiLowerCase(Trim(Strings[I])) < P do Inc(I); while AnsiLowerCase(Trim(Strings[J])) > P do Dec(J); if I <= J then begin Strings.Exchange(I, J); Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(Strings, L, J); L:= I; until I >= R; end; procedure EMailAddressesSort(const Strings: TStrings; const SortByDomain: boolean = false); var I, J: integer; T1, T2, D1, D2: string; ExChange: boolean; begin Strings.BeginUpdate; if not SortByDomain then QuickSort(Strings, 0, Strings.Count-1) else begin for I:= 0 to Strings.Count-2 do for J:= I+1 to Strings.Count-1 do begin T1:= AnsiLowerCase(Trim(Strings[I])); T2:= AnsiLowerCase(Trim(Strings[J])); ExChange:= false; if T1 > T2 then ExChange:= true else begin D1:= GetDomainPart(T1); D2:= GetDomainPart(T2); if D1 > D2 then ExChange:= true else if D1 = D2 then if GetNamePart(T1) > GetNamePart(T2) then ExChange:= true; end; if ExChange then Strings.Exchange(I,J); end; end; Strings.EndUpdate; end; procedure TForm1.Button2Click(Sender: TObject); var SL: TStringList; begin SL:= TStringList.Create; SL.Assign(Memo1.Lines); EmailAddressesSort(SL); Memo1.Lines.Assign(SL); SL.Free; end; procedure TForm1.Button3Click(Sender: TObject); begin EmailAddressesSort(Memo1.Lines); end; |
AW: e-mail adressen ordnen im memo
Wenn Du mir jetzt noch erklärst, wieso Du einmal ein Memo und einmal eine TStringlist übergibst anstatt einfach nur TStrings und damit nur eine einzige Sort-Routine benötigst, dann probiere ich es vielleicht tatsächlich.
[edit] Und wenn man schon auf Quicksort umschwenkt: das bringt die TStringList schon von Haus aus mit. [/edit] |
AW: e-mail adressen ordnen im memo
daran hatte ich nicht gedacht, da hast du natürlich recht. aber wie kriegt man dann den lowercase (bei stringlist) in den algo rein?
Edit: DeddyH, hab's entsprehend überarbeitet. Ist aber immer noch ein erheblicher Geschwindigkeitsunterschied!? |
AW: e-mail adressen ordnen im memo
In der allergrößten Not über CustomSort. In der Hilfe steht etwas von einer Property CaseSensitive, aber ich weiß nicht, seit wann es die gibt.
|
AW: e-mail adressen ordnen im memo
Nee, die Bremse ist die Speicherverwaltung des Memos.
BeginUpdate kann schon viel erreichen, aber ein externes Sortieren kann schneller sein. Zumindestens ein Sortierverfahren mit möglichst wenigen lesenden und vorallem schreibenden zu Griffen kann da schon so einiges rausholen. Bei einer TStringList liegen die einzelnen Strings (Zeilen) schon einzeln im Speicher vor und man kann da sehr schnell drauf zugreifen und auch was ändern/verschieben, da nur Zeiger verschoben werden. Beim Memo liegt alles als ein einziger großer String vor, wo beim Tausch zweier Zeilen schonmal der gesamte Memo-Inhalt mehrmals umkopiert werden muß. |
AW: e-mail adressen ordnen im memo
Findet Ihr es nicht selber albern, bei einem Bubblesort über Optimierungen zu schwadronieren? Da ist doch jede Anstrengung verschwendete Zeit, das Ganze ist ja wohl eher als Übungsaufgabe in der Ausbildung zu sehen.
|
AW: e-mail adressen ordnen im memo
Sehe jetzt nicht, daß hier jemand albern ist. BTW: Wenn in Abhängigkeit sortiert werden soll, geht der Quciksort nicht, da dieser auf <= prüft.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz