Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion('string').membervar (https://www.delphipraxis.net/33627-funktion-string-membervar.html)

Pseudemys Nelsoni 10. Nov 2004 11:59


Funktion('string').membervar
 
moin,

siehe topic, kann ich sowas irgendwie hinbekommen? ich möchte das der teil: "funktion('irgendeinstring')" den rekord zurückgibt wo die membervariable "irgendeinstring" ist und dann halt mit .membervar weiterarbeiten. schwer zu erklären was ich meine aber vielleicht verstehts ja jemand. ich machs mal "bildlicher" *g*

sagen wir mal ich habe folgendes:

Delphi-Quellcode:
type
  TMeinRekord = record
    name: string;
    nickname: string;
  end;

var
  MeinRekordArray: array[0..9] of TMeinRekord;

...

procedure irgendwas;
begin
  EineFunktion('peter').nickname
end;

ich möchte also das mir "einefunktion" den passenden (anhand des namens) rekord liefert und möchte dann dessen nickname bekommen...

wie mach ich das? das mit einer schleife gesucht werden muss ist mir klar, ich weiss nur nicht wie ich die funktion dann mit ".nickname" verbinde

Bernhard Geyer 10. Nov 2004 12:08

Re: Funktion('string').membervar
 
Delphi-Quellcode:
procedure EineFunktion(SearchName: String): TMeinRekord;
begin
  ...
  ...
  result := MeinRekordArray[i];
end;
Das Problem ist jedoch, das du eine Kopie deines Records bekommst.

choose 10. Nov 2004 12:09

Re: Funktion('string').membervar
 
Hallo Pseudemys Nelsoni,

so sollte es i.A. klappen:
Delphi-Quellcode:
function GetRecordFromArrayThatMatchtesCriteria(const ACriteria: TCriteria): TMyRecord;
var
  i: Integer;
begin
  for i := Low(AnArray) to High(AnArray) do
    if RecordsMatchesCriteria(AnArray[i], ACriteria) then
    begin
      Result := AnArray[i];
      Exit;
    end;
   
  // no record found
  raise ERecordNotFound.Create('No suitable record found', ACriteria);
end;

Ultimator 10. Nov 2004 12:12

Re: Funktion('string').membervar
 
@ Bernhard Geyer:
Das geht nicht, so wie ich deinen Quelltext sehe. Bei Prozeduren kannst du kein Result zurückgeben, dazu musst du eine Funktion definieren ;-)

jim_raynor 10. Nov 2004 12:16

Re: Funktion('string').membervar
 
Nur mal so für mich :shock:

Was denn TCriteria und RecordsMatchesCriteria. Das kenn ich ja noch garnicht. War das nur als Beispiel gedacht, oder gibts das wirklich?

Pseudemys Nelsoni 10. Nov 2004 12:22

Re: Funktion('string').membervar
 
moin, danke für die antwort :)

choose 10. Nov 2004 12:28

Re: Funktion('string').membervar
 
Zitat:

Zitat von jim_raynor
TCriteria und RecordsMatchesCriteria [..] gibts das wirklich?

Selbstverständlich sind diese Dinge durch konkrete Implementierungen zu ersetzen (obleich eine generische Routine mit etwas Mehraufwand ebenfalls erstellbar ist) und dienen zur Verdeutlichung eines möglichen Lösungsweges, ohne auf Details eingehen zu müssen.

himitsu 10. Nov 2004 13:07

Re: Funktion('string').membervar
 
und was spricht gegen dein einfachen und bewährten Weg?
Delphi-Quellcode:
type
  TMeinRekord = record
    name: string;
    nickname: string;
  end;

var
  MeinRekordArray: array[0..9] of TMeinRekord;

function EineFunktion(s: string): TMeinRekord;
...

function EineFunktion_nickname(s: string): string;
begin
  result := EineFunktion(s).nickname;
end;

...

procedure irgendwas;
begin
  EineFunktion_nickname('peter')
end;

choose 10. Nov 2004 13:14

Re: Funktion('string').membervar
 
Ich kann auf den ersten Blick keinen Vorteil bei Deinem Ansatz erkennen, himitsu. Die Daten stehen weiterhin nur als Kopie zur Verfügung, es ist mehr Aufwand (zur Entwicklung sowie geringfügig zur Laufzeit) und bei einer Änderung der Struktur des Records oder Änderung der Bezeichnungen ist es erforderlich, die Zugriffsfunktionen anzupassen...

Übersehe ich etwas? Wo hat sich diese Art des Zugriffs bisher bewährt? :gruebel:

Pseudemys Nelsoni 10. Nov 2004 13:21

Re: Funktion('string').membervar
 
hm, das stimmt, das es ne kopie ist ist doof, das bringt mir recht wenig.... könnte ich einen pointer verwenden?

Pseudemys Nelsoni 17. Nov 2004 13:20

Re: Funktion('string').membervar
 
*hochschieb* :-D


ich muss einer membervariablen meines rekords(der zurückgegeben wird) doch auch einen wert zuweisen können. Ich brauche soetwas wie das hier:

Delphi-Quellcode:
MeineFunktion('andy').nickname := 'iAmAndy'


das kann doch nicht unmöglich sein oder :?:

choose 17. Nov 2004 13:48

Re: Funktion('string').membervar
 
In diesem Fall musst Du mit Referenzen arbeiten. Verwende hierzu entweder direkt Exemplar von Klassen statt Records oder erstelle einen weiteren Typen hier:
Delphi-Quellcode:
type
  PMyRecord = ^TMyRecord;
von dem der Rückgabewert Deiner Funktion sein sollte.

Während Du im klassichen Pascal so einen Pointer auf Dein Record bei der Verwendung derefenzieren musstest
Delphi-Quellcode:
var
  myReference: PMyRecord;
begin
  // !ensure that myReference points to valid data!
  myReference^.AField := AValue
ist das in Delphi nicht länger erforderlich, so dass Dein Aufruf der Form
Delphi-Quellcode:
function MyFunction(const AString: string): PMyRecord;
//..
MyFunction(AValue).AField := AnotherValue;
möglich ist. Du benötigst jedoch ein Konzept für den Fall, dass keine passende Referenz gefunden wurde (zB das Auslösen einer Exception), damit Du nur auf gültigen arbeitest.

Jens Schumann 17. Nov 2004 15:08

Re: Funktion('string').membervar
 
Hallo,
wie wäre es denn wenn man aufhört in Records zu denken und statt dessen in Objekten denkt.
Dann ist das mit der Kopie auch kein Problem mehr.

Pseudemys Nelsoni 17. Nov 2004 15:30

Re: Funktion('string').membervar
 
@choose, danke, so gehts ^^

@jens, wenn ich z.b nur 3 variablen habe, wäre eine klasse doch nicht nötig oder? vorallem ist das create/destroy nervig bei klassen :\


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 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