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/)
-   -   Record property über Variable aufrufen (https://www.delphipraxis.net/172384-record-property-ueber-variable-aufrufen.html)

Immortalem 30. Dez 2012 18:28


Record property über Variable aufrufen
 
Guten Abend zusammen,
Ich habe folgendes Problem:

Delphi-Quellcode:
function CDatabase.Search(SearchString : String; StartPos, EndPos : Integer; ToSearchIn : String) : TIntArray;
Var
   i : Integer;
Begin
     If (StartPos >= 0) and (EndPos >= 0) and (EndPos < FileSize(_Datei)) then
     Begin
          For i := StartPos to EndPos do
          Begin
               _aktuellerRecord := i;
               LeseZeile();
               If _RAdresse.Name = SearchString then //Um diese Zeile geht es
               Begin
                    SetLength(Result, Length(Result) + 1);
                    Result[Length(Result) - 1] := i;
               end;
          end;
     end;
     ShowMessage('Kein Datensatz gefunden.');
end;

Dieser Quzellcode funktioniert zwar einwandfrei, doch nun möchte ich die Procedur so umstrukturieren, dass sie so aussieht:

Delphi-Quellcode:
function CDatabase.Search(SearchString : String; StartPos, EndPos : Integer; ToSearchIn : String) : TIntArray;
Var
   i : Integer;
Begin
     If (StartPos >= 0) and (EndPos >= 0) and (EndPos < FileSize(_Datei)) then
     Begin
          For i := StartPos to EndPos do
          Begin
               _aktuellerRecord := i;
               LeseZeile();
               If _RAdresse.ToSerachIn = SearchString then  //Um diese Zeile geht es
               Begin
                    SetLength(Result, Length(Result) + 1);
                    Result[Length(Result) - 1] := i;
               end;
          end;
     end;
     ShowMessage('Kein Datensatz gefunden.');
end;
Wie dies schon zeigt soll dadurch dem Record gesagt werden, von wo denn der Wert genommen werden soll.

Der Record sieht so aus:

Delphi-Quellcode:
    TAdresse = record
             Vorname, Name, Strasse, Ort, Tel, Mail : string[50];
             Plz, BuchstabenID : Integer;
    end;
Ich möchte hier nicht hören, dass ich da nen Case selector einbauen kann sondern eine praktikable Lösung. Dieses Problem hatte ich nun schon öfters ohne eine Lösung zu finden und möchte nun gerne endlich eine Lösung dafür haben. Und RTTI Varianten fallen weg, da diese meines Wissens nach erst ab Delphi 2010 gibt und ich Delphi 5 habe.

Bjoerk 30. Dez 2012 19:03

AW: Record property über Variable aufrufen
 
Ich hab keine Ahnung was du möchtest. :gruebel:

Das ?

Delphi-Quellcode:
type
  TAdressString = string[50];

  TAdresse = record
    Vorname, Name, Strasse, Ort, Tel, Mail : TAdressString;
    Plz, BuchstabenID : Integer;
    property ToSerachIn: TAdressString read Name;
  end;

Immortalem 30. Dez 2012 19:06

AW: Record property über Variable aufrufen
 
Nein nicht wirklich. Es soll hier nicht nur der Name gescuht werden können, sondern auch der Vorname die Telefonnummer(hier ja ein string) usw.

Deswegen soll dann in ToSearchIn übergeben werden, wonach denn nun gesucht wird(Vorname etc. pp)

Volker Z. 30. Dez 2012 19:32

AW: Record property über Variable aufrufen
 
Ist es vielleicht das was Du suchst:

Delphi-Quellcode:
If (ToSerachIn = 'Name') and (_RAdresse.Name = SearchString) then //Um diese Zeile geht es
  Begin
    SetLength(Result, Length(Result) + 1);
    Result[Length(Result) - 1] := i;
    continue
  end;

If (ToSerachIn = 'Vorname') and (_RAdresse.Vorname = SearchString) then //Um diese Zeile geht es
  Begin
    SetLength(Result, Length(Result) + 1);
    Result[Length(Result) - 1] := i;
    continue
  end;

  // usw.
Gruß

Immortalem 30. Dez 2012 19:37

AW: Record property über Variable aufrufen
 
Zitat:

Ich möchte hier nicht hören, dass ich da nen Case selector einbauen kann
Es entspricht zwar dem Prinzip von dem was ich suche aber ist nicht die Lösung die ich meine, denn wie die Lösung aussehen soll habe ich ja oben geschrieben.

Bjoerk 30. Dez 2012 20:15

AW: Record property über Variable aufrufen
 
Achso. Jetzt versteh' ich. Nein, mit einer property geht das meines Wissens nicht, hierzu ist eine function erforderlich.

Zum Beispiel so:

Delphi-Quellcode:
type
  TSearchFlag = (sfVorname, sfName, sfStrasse, sfOrt, sfTel, sfMail);
  TAdresse = record
    ..
    function ToSearchIn(const SearchFlag: TSearchFlag): string;
  end;

..

function TAdresse.ToSearchIn(const SearchFlag: TSearchFlag): string;
begin
  case SearchFlag of
    sfVorname:
      Result := Vorname;
    sfName:
      Result := Name;
    sfStrasse:
      Result := Strasse;
    sfOrt:
      Result := Ort;
    sfTel:
      Result := Tel;
    sfMail:
      Result := Mail;
    else
      Result := '';
  end;
end;

function CDatabase.Search(const SearchString: String; const StartPos, EndPos: Integer;
  const SearchFlag: TSearchFlag): TIntArray;
Begin
  ..

  If _RAdresse.ToSearchIn(SearchFlag) = SearchString then // Um diese Zeile geht es
  ..

end;

p80286 30. Dez 2012 20:29

AW: Record property über Variable aufrufen
 
Zitat:

Zitat von Immortalem (Beitrag 1197188)
Ich möchte hier nicht hören, dass ich da nen Case selector einbauen kann sondern eine praktikable Lösung.

Dadurch disqualifiziert sich, glaube ich Deine Lösung.
(Leider habe ich keine Idee wie man es besser als mit
Delphi-Quellcode:
case
lösen könnte.

Gruß
K-H

sx2008 31. Dez 2012 10:55

AW: Record property über Variable aufrufen
 
Vielleicht möchtest du ja über deinen Tellerrand hinausschauen und mal was Neues probieren.
Es gibt da z.B. sogenannte Memory-Datasets.
Diese Komponenten können beliebige tabellenartige Daten speichern, sortieren und suchen.
Ein Memory-Dataset ist im Prinzip ein Array of Record aber auf weit abstrakterer Ebene.

Ein weiterer Vorteil ist, dass man ein DBGrid direkt anbinden kann und damit sofort eine
Anzeige- und Editiermöglichkeit der Daten hat.

Immortalem 31. Dez 2012 11:27

AW: Record property über Variable aufrufen
 
Danke für die Antwort und ich werde es mir sicherlich anschauen, aber leider ist es in diesem Fall nicht erlaubt, da wir mit einer Datei of REcord und zwar dem oben genannten Record arbeiten müssen.

Beim Versuch die Lösung zu implementieren, die mir hier bisher am bete gefällt:

Delphi-Quellcode:
  TAdresse = record
     ..
     function ToSearchIn(const SearchFlag: TSearchFlag): string;
   end;
läuft mein Delphi leider auf einen Fehler.

In der Zeile function .... wird ein end; erwartet.

Volker Z. 31. Dez 2012 12:58

AW: Record property über Variable aufrufen
 
Zitat:

Delphi-Quellcode:
  TAdresse = record
    ..
    function ToSearchIn(const SearchFlag: TSearchFlag): string;
  end;
läuft mein Delphi leider auf einen Fehler.
Diese Variante wird in Delphi 5 nicht unterstützt.

Gruß


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