Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Schlüssel


mars - Fr 21.02.03 17:25
Titel: Schlüssel
Ich weiss, der Titel dieses Threads ist nicht sehr aussagekräftig, aber ich weiss wirklich nicht, wie ich mein Problem genauer beschreiben könnte. Here it comes:
Ich übergebe einer Funktion einen Record-Typ, welchen sie bearbeiten soll. Nun wird diese Funktion mehrmals aufgerufen, soll aber nicht immer das gleiche Feld des Records bearbeiten. Zur Verdeutlichung:

Quelltext
1:
2:
3:
4:
5:
6:
type beispieltyp= record
 grösse: Integer;
 länge: Integer;
end;

var beispiel: beispieltyp;


Die Funktion sieht (bis jetzt) folgendermassen aus:

Quelltext
1:
2:
3:
4:
5:
6:
function irgendwas(var t: beispieltyp);
begin
...
inc(t.grösse)
...
end;


Ich möchte nun aber statt dem .grösse beim zweiten aufruf der funktion das Feld .länge verändern. Welchen Typ müste ich als Parameter in dieser Funktion also angeben, um eine Art Schlüssel zu erhalten. Damit es noch etwas verständlicher wird (ich hoffe natürlich, es ist schon... :wink:)wäre hier mein ziel:

Quelltext
1:
2:
3:
4:
5:
6:
function irgendwas(var t:beispieltyp, schlüssel: schlüsseltyp)
begin
...
inc(t.schlüssel);
...
end;


und der Funktionsaufruf würde dann zb so aussehen:

Quelltext
1:
2:
3:
irgendwas(beispiel, grösse);
...
irgendwas(beispiel, länge);


Wenn mir das jemand erklären könnte, wäre das wirklich super! :D

Danke im Voraus![/b]


MSCH - Fr 21.02.03 20:03
Titel: re: Schlüssel
Hallo,
Gutes Beispiel wie mans nicht machen sollte. Erstelle doch ein Objekt und stelle entsprechende Funktionen zur Verfügung:


Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  Tbeispiel = TClass
    Groesse: Integer;
    Laenge: Integer;
    procedure IncGroesse(value:Integer);
    procedure IncLaenge(value:Integer);
  end;

...

Quelltext
1:
2:
3:
4:
5:
procedure Tbeispiel.IncGroesse;
begin inc(Groesse,value);end;

procedure Tbeispiel.IncLaenge;
begin inc(Laenge,value);end;


Verwende die Klasse wie folgt:
...

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  Beispiel: Tbeispiel;
begin
  Beispiel:= Tbeispiel.Create;
  Beispiel.IncLaenge(1); 
  Beispiel.IncGroesse(-1);
  ...
  Beispiel.Free;
end;

Viel Erfolg


derDoc - Fr 21.02.03 20:13

Also zuerst muss ich MSCH zustimmen, denn das ist wirklich ein negativ Beispiel. Aber wenn du trotzdem wissen willst, wie man das machen könnte ist hier ein Vorschlag:

Du definierst einen Typ als array [0..1] of String mit den Möglichkeiten Groesse und Laenge. Dann setzt du diesen Typ als Variablentyp ein und fragst über case of ab, ob der eine oder der andere übergeben ist.


mars - Fr 21.02.03 23:15

danke mal für die antworten.

@MSCH: natürlich sinds nicht so einfache Funktionen wie inc(). das war ja nur zur Verdeutlichung. Genau genommen soll beim ersten Funktionsaufruf ein Feld des array-records mit Quicksort sortiert werden, beim zweiten mal ein anderer Teil.

@DerDoc: ja sowas habe ich mir schon auch überlegt, aber der Quellcode sollte eben auch noch schön aussehen, deshalb kann ich mir sowas nicht erlauben :wink:

Ich werde mir also was anderes überlegen müssen. Trotzdem vielen Dank.


mars - Sa 22.02.03 09:33

etwas würde mich hier aber schon noch interessieren. Warum sollte man das nicht machen? Und weshalb ist das ein Negativ-Beispiel?


MSCH - Sa 22.02.03 13:30
Titel: Negativ vs. Positiv
Hi,
negativ darum, wenn du immer die gleiche Funktion die auf ein und dieselbe Variable zugreift, ggf. ein dutzend mal im Quellcode hast und ggf. dann auch überall ändern musst. Borland hat ja darum aus Pascal (procedurale Sprache) viele Erweiterungen reingebastelt und eine Klassen (Objekt) orientierte Sprache gemacht. Positiv deshalb, Du deklariert ein Objekt, zugehörige Variablen und Funktionen einmal und verwendest diese im gesamten Quelltext. Zukünftige Erweiterungen deines Programmes beschränken sich dann auf die Objekte. Weiterhin ist die Vererbarkeit von Klassen. Hierüber jetzt was zu posten würde etwas den Rahmen sprengen, vieleicht schaust du mal in Delphi Büchern nach. Dort ist i.d.R. gut die Vererbung beschrieben.
Grüße
MSCH


mars - Sa 22.02.03 15:02

Leider verstehe ich dich nicht ganz, denn ich will ja die Funktion genau nicht mehrere Male im Quellcode haben und immer anpassen müssen. Deshalb habe ich ja nach einem Schlüssel gesucht. Natürlich ist mir klar, dass Objekten die perfekte Lösung wären, aber wenn du meinen gesamten Quellcode anschauen würdest, sähest du, dass dies nicht möglich ist.


MSCH - Sa 22.02.03 15:43
Titel: geht nicht gibts nicht!
mars hat folgendes geschrieben:
Leider verstehe ich dich nicht ganz, denn ich will ja die Funktion genau nicht mehrere Male im Quellcode haben und immer anpassen müssen. Deshalb habe ich ja nach einem Schlüssel gesucht. Natürlich ist mir klar, dass Objekten die perfekte Lösung wären, aber wenn du meinen gesamten Quellcode anschauen würdest, sähest du, dass dies nicht möglich ist.


Hi, das glaube ich dir nicht, dass es nicht geht.
:roll: Überlege mal, was ist, wenn ein Datentyp hinzukommt? Du müsstest nicht nur den Schlüssel ändern sondern auch die aufrufenden Routinen. Ersetz doch einfach Record mit Class füge die Funktion hinzu und schon hast du eine schöne Objektorientierte Sprache. Wenn Du dann noch eine Basisklasse definierst und für jeden Datentyp einfach eine Ableitung sprich Vererbung machst, ist's noch einfacher.
Und - ein Objekt ist erst vorhanden, wenn es eine Instanz (mit New bzw. Create) gibt, schont den Arbeitsspeicher.
Grüße
MSCH


mars - Sa 22.02.03 17:24

Dann musst du mir aber schon erklären, wie das funktionieren soll:
Ich habe nämlich einen Array des Typs Record. Und dieser Array soll nun zuerst nach Record.Integer1 sortiert werden; dann kommen einige Zeilen Quellcode und dann soll das gleiche Array nach Record.Integer2 sortiert werden.

Wie soll das nun mit Objekten gehen?!? Also wenn du mir das erklären kannst...dann... :wink:


MSCH - Sa 22.02.03 22:01
Titel: Beispiel
HI
Ein Beispiel würde hier einige Seiten füllen sorry :( , aber wenn du dir die Quelltexte von TSTRINGLIST anschaust und statt Strings ein Objekt nimmst, hast du die Lösung. Du musst dort nicht alle Funktionen übernehmen, nur die fürs einfügen, verschieben und löschen.
Dass ist deine Basisklasse. Nun leitest du eine weitere ab und überschreibst die Sortierroutinen (e.g. Feld_1). Dann leitest Du wieder eine Klasse ab und überschreibst wieder die Sortierroutine (e.g.Feld_2).

MFG MSCH


HeLe - So 02.03.03 11:52

du kannst die objekte auch einfach in eine tobjectlist schmeißen und dann mittels der sort-methode sortieren. diese methode erwartet eine vergleichsfunktion als parameter, wodurch du nach jedem beliebigen schlüssel sortieren kannst


mars - So 02.03.03 13:04

@HeLe: Danke. Genau das werde ich jetzt machen.