Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Recordfeld als Parameter übergeben?


Miri - Sa 09.06.07 19:06
Titel: Recordfeld als Parameter übergeben?
Hi zusammen...

wahrscheinlich ist mein Hirn bei der Hitze heute weggeschmolzen, aber ich stehe total auf dem Schlauch. Ich weiß auch nicht so richtig, nach was ich suchen soll, vielleicht fehlen mir einfach die richtigen Worte, mit denen ich die Suche füttern müsste um was zu finden.
Also: ich habe ein Array of Record und will in den einzelnen Recordfeldern nach bestimmten Daten suchen.
Beispiel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
TMyRecord = record
  Feld1 : string;
  Feld2 : integer;
  Feld3 : string;
end;

MyRecordArray : array of TMyRecord;

procedure TForm1.BTN_SuchenClick(Sender: TObject);
var i : integer;
begin
  j := 0;
  for i := 0 to length(MyRecordArray) - 1 do
    if pos('SuchText', MyRecordArray[i].Feld1) > 0 then
      showMessage('Gefunden!');
end;

Nu will ich das aber nicht für Feld2 und Feld3 nochmal schreiben... lässt sich das irgendwie anders lösen? Z.B. indem man der Suchen-Prozedur das Feld, in dem man suchen will, als Parameter übergibt? Oder sonst wie? (Wie ist mir an sich egal *g*, war nur so ne Idee...)

Gruß,
Miri


Robinator - Sa 09.06.07 19:09

Hi,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.BTN_SuchenClick(Sender: TObject);
var i : integer;
begin
  j := 0;
  for i := 0 to length(MyRecordArray) - 1 do
    if pos('SuchText', MyRecordArray[i].Feld1 + MyRecordArray[i].Feld2 + MyRecordArray[i].Feld2 {...}) > 0 then
      showMessage('Gefunden!');
end;


meinst du das in etwa so?
//edit ich glaube nicht^^


Miri - Sa 09.06.07 19:11

Nein, ich will nicht in allen gleichzeitig suchen, sondern immer nur in einem. Aber nicht immer im selben.


JayEff - Sa 09.06.07 19:30

Äh .. Du .. Hm. Willst du einfach nur unterscheiden können, in welchem Feld der Suchstring gefunden wurde? Dann wirst du wohl 2 verschachtelte Schleifen brauchen, eine von low(Array) bis High(array) und darin eine von 0 bis 2. In diese kommt ein case CounterDerInnerenSchleife of 1: In Feld1 suchen; 2: In Feld2 suchen; 3: In Feld3 suchen; end;
Ich würde ein weiteres dynamisches Array einführen, in das du dann während des Schleifendurchlaufes die Suchergebnisse einträgst, falls nötig.
Soviel mal zum Konzept :|
Allerdings weiß ich nicht, ob ich dich richtig verstanden hab :)


Miri - Sa 09.06.07 20:05

Die innere Schleife werde ich nicht brauchen, da ich ja nur in einem Feld suchen will, nicht in allen nacheinander.
Aber das mit dem case wäre ne Maßnahme, dass ich als Parameter einfach ne Zahl eingebe und dann danach entscheide, in welchem Feld gesucht wird... ich hätte halt gehofft, dass man irgendwie um die Abfrage herumkommt, z.B. in dem man z.B. ne Variable Suchfeld hat, die dann den Wert 'Feld1' gesetzt bekommt und ich dann auf MyRecordArray[i].Suchfeld oder so zugreifen kann. Oder ob man die Recordfelder irgendwie über Indizes ansprechen kann, oder so...


JayEff - Sa 09.06.07 20:09

Ich schätze, du könntest mit Pointern arbeiten. Du würdest also einen Pointer auf das Feld, das durchsucht werden soll, zeigen lassen, und es dann durchsuchen. Wie das ganze funktioniert, kann ich dir nicht erklären, dazu versteh ich selbst zu wenig davon ;) Aber such mal nach Suche in: Delphi-Forum, Delphi-Library POINTER TUTORIAL, da dürftest du fündig werden.


Narses - So 10.06.07 13:43

Moin!

user profile iconJayEff hat folgendes geschrieben:
Ich schätze, du könntest mit Pointern arbeiten. Du würdest also einen Pointer auf das Feld, das durchsucht werden soll, zeigen lassen, und es dann durchsuchen.

:? :gruebel: Also, AFAIK wird das auch mit einem Pointer nix, du bräuchtest ja einen Offset in der Record-Struktur, nicht einen Zeiger auf ein Datenelement... :?:

Alternativen aus meiner Sicht:
a) statt record eine Klasse nehmen,
b) mit case arbeiten.
:idea:

cu
Narses


Miri - So 10.06.07 15:52

Danke für die Antworten. Hab's jetzt mit case gelöst, alles andere wäre mir jetzt zu umständlich geworden... ;-)