AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sortieren eines Array of record

Ein Thema von ebi · begonnen am 8. Sep 2024 · letzter Beitrag vom 13. Sep 2024
Antwort Antwort
ebi

Registriert seit: 8. Sep 2024
11 Beiträge
 
Delphi 12 Athens
 
#1

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 09:37
Hallo Hr. Raabe,

vielen Dank, werde versuchen Ihren Quellcode zuverstehen.

Herzliche Grüße.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#2

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 09:55
Hallo Hr. Raabe
Hier im Forum sind wir alle per Du.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
ebi

Registriert seit: 8. Sep 2024
11 Beiträge
 
Delphi 12 Athens
 
#3

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 11:39
Hallo Uwe,

vielen Dank.

Wie muss ich das bei mir einbinden?

Delphi-Quellcode:
procedure TForm_Main.MyObjects_default();
var
  Din, Pal: TSteuerung;
  I: integer;
begin
  // TSteuerung: DIN
  begin
    Din := TSteuerung.Create('DIN');
    SetLength(Din.Nullpunkt, 4);
    Din.Nullpunkt[0] := 'G54';
    Din.Nullpunkt[1] := 'G55';
    Din.Nullpunkt[2] := 'G56';
    Din.Nullpunkt[3] := 'G57';
    SetLength(Din.Parameter, 0);
    SetLength(Din.TAdresse, 0);

    SetLength(Din.Wegbedingung, Length(GCodeA));
    for I := 0 to Length(GCodeA) - 1 do
      begin
        Din.Wegbedingung[I].Wort := GCodeA[I + 1].Wort;
        Din.Wegbedingung[I].Bezeichnung := GCodeA[I + 1].Bezeichnung;
      end;

    SetLength(Din.Schaltfunktion, Length(MCodeA));
    for I := 0 to Length(MCodeA) - 1 do
      begin
        Din.Schaltfunktion[I].Wort := MCodeA[I + 1].Wort;
        Din.Schaltfunktion[I].Bezeichnung := MCodeA[I + 1].Bezeichnung;
      end;
  end;

  // TSteuerung: PAL
  begin
    Pal := TSteuerung.Create('PAL');
    SetLength(Pal.Nullpunkt, 6);
    Pal.Nullpunkt[0] := 'G54';
    Pal.Nullpunkt[1] := 'G55';
    Pal.Nullpunkt[2] := 'G56';
    Pal.Nullpunkt[3] := 'G57';
    Pal.Nullpunkt[4] := 'G58';
    Pal.Nullpunkt[5] := 'G59';
    SetLength(Pal.Parameter, 0);

    SetLength(Pal.Wegbedingung, Length(GCodeB));
    for I := 0 to Length(GCodeB) - 1 do
      begin
        Pal.Wegbedingung[I].Wort := GCodeB[I + 1].Wort;
        Pal.Wegbedingung[I].Bezeichnung := GCodeB[I + 1].Bezeichnung;
      end;

    SetLength(Pal.Schaltfunktion, Length(MCodeB));
    for I := 0 to Length(MCodeB) - 1 do
      begin
        Pal.Schaltfunktion[I].Wort := MCodeB[I + 1].Wort;
        Pal.Schaltfunktion[I].Bezeichnung := MCodeB[I + 1].Bezeichnung;
      end;

    SetLength(Pal.TAdresse, Length(TCodeB));
    for I := 0 to Length(TCodeB) - 1 do
      begin
        Pal.TAdresse[I].Wort := TCodeB[I + 1].Wort;
        Pal.TAdresse[I].Bezeichnung := TCodeB[I + 1].Bezeichnung;
      end;
  end;
  MyObjects.Add(Din);
  MyObjects.Add(Pal);
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#4

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 15:07
Das wurde doch gezeigt?

Es gibt eine Sortierfunktion,
der gibt man einfach sein Array rein
und dann muß man noch irgendwie eine Vergleichsfunktion (Interface) reingeben.

Ohne Comparer wird womöglich falsch sortiert verglichen. (ohne passenden Default-Comparer wird einfach binär verglichen)
Für einfache Typen, wie Integer oder Strings, gibt es einen Default-Comparer ... für den Rest muß man selbst was generieren/übergeben.
https://docwiki.embarcadero.com/Libr...ns.TArray.Sort
https://docwiki.embarcadero.com/Libr...ults.IComparer
https://www.delphipraxis.net/191252-...sortieren.html
...

Es gibt 2 Comparer-Interfaces, einmal ala SameText, mit Boolean-Result und eben ala CompareText, mit -1, 0 oder +1 aka Kleiner, Gleich oder Größer, als Result.
Wenn Funktionen die passende Signatur (Paramerter) besitzen, wie z.B. CompareText, CompareStr, AnsiCompareStr mit 2 Parametern, dann können sie "direkt" genommen werden.

Man baut sich also ein Objekt+Interface oder packt einfach nur eine Methode in ein Delegator-Interface.

Bei mehr als einem Feld in Records, wird das einfach verschachtelt.
Delphi-Quellcode:
function(const Left, Right: TMyRecord): Integer
begin
  Result := ComareText(Left.Feld1, Right.Feld1);
  if Result = 0 then
    Result := ComareText(Left.Feld2, Right.Feld2);
  if Result = 0 then
    Result := ComareText(Left.Feld3, Right.Feld3);
  ...
end
In der Unit Math existieren auch Delphi-Referenz durchsuchenCompareValue für Zahlen, aber man kann es auch selbst machen.
Delphi-Quellcode:
Result := ComareXXXXX(Left.Feld1, Right.Feld1);
// ala
if Left.Feld1 < Right.Feld1 then
  Result := -1
else if Left.Feld1 = Right.Feld1 then
  Result := 0
else {if Left.Feld1 > Right.Feld1 then}
  Result := +1;


Ich bin mir sicher, dass es selbst für Delphi fertige Komponenten für G-Code existieren.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Sep 2024 um 15:25 Uhr)
  Mit Zitat antworten Zitat
ebi

Registriert seit: 8. Sep 2024
11 Beiträge
 
Delphi 12 Athens
 
#5

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 15:16
Hallo,

bitte um Verständnis der Profis.

Mein neuer Delphi-CODE

Delphi-Quellcode:
FUNCTION TCodeSorted(Value: array of TCode): TArray<TCode>;
begin
  SetLength(Result, Length(Value));
  for var I := 0 to Length(Result) - 1 do
    Result[I] := Value[Low(Value) + I];
  TArray.Sort<TCode>(Result, TDelegatedComparer<TCode>.Create(
    FUNCTION(const Left, Right: TCode): integer
    begin
      Result := string.Compare(Left.Wort, Right.Wort, [coDigitAsNumbers]);
    end));
end;




    SetLength(TArray, Length(GCodeB));
    Zaehler := 0;

    var
    arr := TCodeSorted(GCodeB);
    for var rec in arr do
      begin
        TArray[Zaehler].Wort := rec.Wort;
        TArray[Zaehler].Bezeichnung := rec.Bezeichnung;
        Inc(Zaehler);
      end;

    SetLength(Pal.Wegbedingung, Length(TArray));
    for I := 0 to Length(TArray) - 1 do
      begin
        Pal.Wegbedingung[I].Wort := TArray[I].Wort;
        Pal.Wegbedingung[I].Bezeichnung := TArray[I].Bezeichnung;
      end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#6

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 15:29
+1?
und Low+1 aka 0+1 aka immer 1?

[edit] AAAAAAHH, I nicht 1 ... schwer zu erkennen. PS: Darum verwende ich immer nur das keine i, auch wenn ich alle anderen einbuchstabigen Variablen ebenfalls groß schreibe.
Delphi-Quellcode:
for var I := 0 to High(Result) do
  Result[I] := Value[I];
param: array of ... sollte immer mit 0 beginnen, egal was reingegeben wurde.



warum nicht?
Delphi-Quellcode:
FUNCTION TCodeSorted(Value: TArray<TCode>): TArray<TCode>;
begin
  Result := Value;
oder direkt
Delphi-Quellcode:
procedure TCodeSorted(var Value: TArray<TCode>);
begin
[edit] Ahhh OK, die statischen Arrays.
Wobei man es inzwischen auch direkt dynamische Konstanten und Variablen deklarieren kann.
Delphi-Quellcode:
const // oder var
  GCodeB: array of TCode = [
    ...
  ];



Wenn "Wort" nicht eindeutig ist und somit auch noch nach Bezeichnung sortiert werden müsste.
Delphi-Quellcode:
    begin
      Result := string.Compare(Left.Wort, Right.Wort, [coDigitAsNumbers]);
      if Result = 0 then
        Result := string.Compare(Left.Bezeichnung, Right.Bezeichnung, [coDigitAsNumbers]);
    end));
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Sep 2024 um 15:54 Uhr)
  Mit Zitat antworten Zitat
ebi

Registriert seit: 8. Sep 2024
11 Beiträge
 
Delphi 12 Athens
 
#7

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 15:37
hallo himitsu,

vielen Dank, ich werde versuchen Dein Delphi-CODE zu erlernen.

HG
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#8

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 16:03
Wobei man es inzwischen auch direkt dynamische Konstanten und Variablen deklarieren kann.
Delphi-Quellcode:
const // oder var
  GCodeB: array of TCode = [
    ...
  ];
Wird nicht so einfach mit einem array of record...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 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