![]() |
Item aus einem Record als Parameter einer Prozedur?
Guten Abend DP,
leider muss ich nochmal stören, da ich erneut auf ein Problem gestoßen bin. Ich habe eine Klasse, die als privates Attribut ein dynamisches Array of TPerson (Name: "index") hat. Das Record (TPerson) hat Items mit den Datentypen Integer, Real & String. Das Record möchte ich nun zB. nach dem Namen sortieren. Dafür habe ich gerade eine Prozedur geschrieben, die das erledigt. Nun verfügt mein Record aber auch zB. über das Item Stadt - wie kann ich meine Prozedur nun so umschreiben, dass sie je nach Parameter nach etwas anderem sortiert. Die Prozedur sieht so aus (wahrs. kennt ihr bessere Varianten, aber diese hab ich selbst (und wahrscheinlich auch tausende Andere vor mir) "selbst" erarbeitet):
Delphi-Quellcode:
Natürlich könnte ich die Prozedur kopieren, in "sortByStadt" umbennen und "Name" durch "Stadt" ersetzen, doch dabei würde ich ja nichts lernen.
procedure TBlub.sortByName();
var i, j, k: Integer; temp: TPerson; begin for i := 1 to Length(index) - 1 do begin j := i; while not (j = 0) do begin if Length(index[j - 1].Name) > Length(index[j].Name) then begin // der kleinere String (von der Länge her) nach vorne temp := index[j]; index[j] := index[j - 1]; index[j - 1] := temp; end; for k := 1 to Min(Length(index[j - 1].Name), Length(index[j].Name)) do begin if ord(index[j].Name[k]) < ord(index[j - 1].Name[k]) then begin temp := index[j]; index[j] := index[j - 1]; index[j - 1] := temp; break end else if ord(index[j].Name[k]) = ord(index[j - 1].Name[k]) then Continue else break; end; Dec(j); end; end; end; Also eig. ist die Frage dieses Threads: Wie kann ich die Prozedur so abstrahieren, dass ich als Parameter zB. "Name" angeben kann und dann das Array nach "Name" hin sortiert wird. Liebe Grüße, Max |
AW: Item aus einem Record als Parameter einer Prozedur?
So einfach gar nicht. Da müsste man tief in die RTTI-Trickkiste greifen
|
AW: Item aus einem Record als Parameter einer Prozedur?
Zitat:
|
AW: Item aus einem Record als Parameter einer Prozedur?
mh.. Währe es nicht sinnvoll, wenn er seiner Procedure ein Parameter mit übergibt? Mal so als Idee
Delphi-Quellcode:
und inerhalb seiner Procedure
sortBy(Name);
sortBy(Stadt);
Delphi-Quellcode:
Anstatt nun Name, Stadt müsste dafür ebend der Parameter hin!
if Length(index[j - 1].Name) > Length(index[j].Name) then
if Length(index[j - 1].Stadt) > Length(index[j].Stadt) then Müsste zwar erst selbst überlegen wie es umzusetzen ist, aber machbar währe es schon oder? gruss alfold |
AW: Item aus einem Record als Parameter einer Prozedur?
Wie willst Du aber einen Parameter auf ein Recordfeld abbilden?
|
AW: Item aus einem Record als Parameter einer Prozedur?
mhh... das ist ja der Pferdefuss dabei:wink: :grübel:
|
AW: Item aus einem Record als Parameter einer Prozedur?
du könntest innerhalb einer weiteren Prozedur entscheiden lassen, welcher Wert zurückgegeben wird. Da es sich hier aber wohl um verschiedene Typen handelt, wird es schwer, nur eine Prozedur zum sortieren zu verwenden. Ich finde es wesentlich einfacher, hier für jedes Feld, wie Delphi-intern auch, nur eine Vergleichsprozedur anzulegen und das QuickSort in der Hauptprozedur auszuführen.
Ich hoffe du verstehst das so. Wenn nicht, schau dir mal an, wie TList das Sortieren handhabt. Bernhard |
AW: Item aus einem Record als Parameter einer Prozedur?
Zitat:
Ich hab verschiedene Prozeduren für Strings, Integers und Reals. |
AW: Item aus einem Record als Parameter einer Prozedur?
Er meint es in etwa so:
Delphi-Quellcode:
procedure TBlub.sortBy( what: string);
begin if UpperCase(what) = 'NAME' then sortByName; if UpperCase(what) = 'STADT' then sortByStadt; ... |
AW: Item aus einem Record als Parameter einer Prozedur?
Zitat:
Schönen Abend noch. :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 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 by Thomas Breitkreuz