Jak zrobić poprawne Sortowanie w Memo, liczb od 0 do 9999?

0

Jak zrobić poprawne Sortowanie w Memo, liczb od 0 do 9999, rosnąco?
W Delphi 11?
Mam taki kod

//Funkcja sortująca
function TformDeeplTranslate.SortByNumberAfterDot(List: TStringList; Index1,
  Index2: Integer): Integer;
var
Num1, Num2: Integer;
Line1, Line2: string;
begin
 // Pobieramy linie z listy na podstawie indeksów
  Line1 := List[Index1];
  Line2 := List[Index2];

  // Przycinamy początek linii do pierwszej kropki
  Line1 := Copy(Line1, Pos('.', Line1) + 1, Length(Line1));
  Line2 := Copy(Line2, Pos('.', Line2) + 1, Length(Line2));

  // Konwertujemy przycięte fragmenty na liczby całkowite
  Num1 := StrToIntDef(Line1, 0);
  Num2 := StrToIntDef(Line2, 0);

  // Porównujemy liczby
  Result := CompareValue(Num1, Num2);
end;

//kod przycisku
procedure TformDeeplTranslate.ToolButton2Click(Sender: TObject);
var
  t: TStringList;
  i: Integer;
  Line: string;
begin
  t := TStringList.Create;
  try
    // Dodajemy wszystkie linie z Memo2 do TStringList t
    t.Assign(Memo2.Lines);
    // Sortujemy linie w TStringList t
     CustomSort(SortByNumberAfterDot);
    // Wyświetlamy posortowane linie w Memo1
    Memo1.Lines.Assign(t);
  finally
    t.Free;
  end;
end;

błąd wyskakuje

[dcc32 Error]  E2035 Not enough actual parameters
0

ta funkcja sortujaca nie moze byc w TformDeeplTranslate, zobacz przyklad:
https://stackoverflow.com/questions/22812881/custom-sort-a-delphi-tstringlist-name-value-pairs-as-integers

0

Via GPT

Błąd wynika z tego, że funkcja CustomSort wymaga dwóch parametrów, a wywołujesz ją z jednym. Musisz przekazać do niej dwa parametry: funkcję sortującą oraz TListCompare zdefiniowany w jednostce Generics.Defaults, który wybiera, czy sortowanie ma być rosnące czy malejące.

Poprawiony kod przycisku powinien wyglądać tak:

procedure TformDeeplTranslate.ToolButton2Click(Sender: TObject);
var
  t: TStringList;
begin
  t := TStringList.Create;
  try
    // Dodajemy wszystkie linie z Memo2 do TStringList t
    t.Assign(Memo2.Lines);
    // Sortujemy linie w TStringList t
    t.CustomSort(SortByNumberAfterDot);
    // Wyświetlamy posortowane linie w Memo1
    Memo1.Lines.Assign(t);
  finally
    t.Free;
  end;
end;

Upewnij się, że jednostka Generics.Defaults została dodana do klauzuli uses na początku pliku, jeśli jeszcze nie jest. Dodaj:

uses
  Generics.Defaults;

Ogólnie rzecz biorąc, Generics.Defaults zawiera różne funkcje pomocnicze związane z typami generycznymi, takie jak porównywanie, sortowanie itp.

0

Dziękuje za odpowiedzi, ciekawe że, w c# udało mi się zrobić bardzo szybko a w Delphi jakoś nie bardzo..

5

Być może dlatego, że po prostu Delphi znasz słabiej niż C#, albo że twoja umiejętność programowania bardziej opiera się o stosowanie zapamiętanych schematów, a w mniejszym stopniu o abstrakcyjne i algorytmiczne myślenie.

Język nie ma znaczenia — liczy się jedynie znajomość jego składni, jego biblioteki standardowej oraz o algorytmiczne myślenie. Wtedy każdy problem sprowadza się do jego rozgryzienia i wymyślenia rozwiązania (algorytmiczne myślenie), wybrania typów danych i funkcji (znajomość biblioteki standardowej) oraz zapis kodu algorytmu w formie zrozumiałej dla kompilatora (znajomość składni).

1 użytkowników online, w tym zalogowanych: 0, gości: 1