Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Item aus einem Record als Parameter einer Prozedur? (https://www.delphipraxis.net/153936-item-aus-einem-record-als-parameter-einer-prozedur.html)

aurikel_Max 20. Aug 2010 17:41

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:
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;
Natürlich könnte ich die Prozedur kopieren, in "sortByStadt" umbennen und "Name" durch "Stadt" ersetzen, doch dabei würde ich ja nichts lernen.
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

mkinzler 20. Aug 2010 18:17

AW: Item aus einem Record als Parameter einer Prozedur?
 
So einfach gar nicht. Da müsste man tief in die RTTI-Trickkiste greifen

aurikel_Max 20. Aug 2010 18:33

AW: Item aus einem Record als Parameter einer Prozedur?
 
Zitat:

Zitat von mkinzler (Beitrag 1043842)
So einfach gar nicht. Da müsste man tief in die RTTI-Trickkiste greifen

Okay, also lieber für jedes Item eine eigene Prozedur?

alfold 20. Aug 2010 18:34

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:
sortBy(Name);
sortBy(Stadt);
und inerhalb seiner Procedure
Delphi-Quellcode:
if Length(index[j - 1].Name) > Length(index[j].Name) then
if Length(index[j - 1].Stadt) > Length(index[j].Stadt) then
Anstatt nun Name, Stadt müsste dafür ebend der Parameter hin!

Müsste zwar erst selbst überlegen wie es umzusetzen ist, aber machbar währe es schon oder?

gruss alfold

DeddyH 20. Aug 2010 18:40

AW: Item aus einem Record als Parameter einer Prozedur?
 
Wie willst Du aber einen Parameter auf ein Recordfeld abbilden?

alfold 20. Aug 2010 18:51

AW: Item aus einem Record als Parameter einer Prozedur?
 
mhh... das ist ja der Pferdefuss dabei:wink: :grübel:

rollstuhlfahrer 20. Aug 2010 18:58

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

aurikel_Max 20. Aug 2010 19:08

AW: Item aus einem Record als Parameter einer Prozedur?
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1043854)
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.
Bernhard

Ich hoffe, ich verstehe dich nun nicht falsch, aber hab ich nicht die gleichen Typen, bei zB. Stadt (String) und Name (String)?
Ich hab verschiedene Prozeduren für Strings, Integers und Reals.

mkinzler 20. Aug 2010 19:17

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;
...

aurikel_Max 20. Aug 2010 19:20

AW: Item aus einem Record als Parameter einer Prozedur?
 
Zitat:

Zitat von mkinzler (Beitrag 1043856)
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;
...

Ah .. ich verstehe, Danke. Nun, ich werd mir nun mal etwas beim Star Trek Enterprise schauen überlegen.

Schönen Abend noch. :coder:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz