Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Zugriff auf Variablen im Record wie FindComponent (https://www.delphipraxis.net/49289-zugriff-auf-variablen-im-record-wie-findcomponent.html)

s.h.a.r.k 8. Jul 2005 12:59


Zugriff auf Variablen im Record wie FindComponent
 
Hallo!

Udn zwar hab ich grad ein mehr oder weniger riesen Problem: Und zwar hab ich ein Record, der ca 100 Datensätze umfasst - brauch ich leider. Jetzt würde ich nur gerne wissen, ob es eine Funktion gibt, die wie FindComponent für eine Komponentensuche auch für Records funktioniert?!

Wenn nicht?! Wie kann ich sowas selber verwirklichen, ohne dass ich meinen kompletten Record abändere?!

Vielen Dank schon mal im Vorraus!

mfg shark

barf00s 8. Jul 2005 13:01

Re: Zugriff auf Variablen im Record wie FindComponent
 
kA ob ich dich richtig verstanden hab, aber dein record landet sicher inner TList oder sowas, ... DER kannst dann ne suchen funktion verpassen, in der alle items durchsuchst und dann bei einer übereinstimmung (je nachdem nach selchem feld des records du suchst) das dingen zurückgegeben wird

s.h.a.r.k 8. Jul 2005 13:15

Re: Zugriff auf Variablen im Record wie FindComponent
 
hm... eigentlich ist es nur ein Record und kein TList-Objekt. Es schaut jedenfalls so aus:
Delphi-Quellcode:
type
  TTestRecord = record
    TestString: String;
    TestInteger: Integer;
    TestBoolean: Boolean;
    { etc. }       
  end;
Und in einer anderen Procedure mag ich dann praktisch eine Funktion haben, die wie folgt funktionieren sollte:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  TestRecordVar = 'TestString', 'TestInteger', 'TestBoolean';
var
  i: Integer;
begin
  i := FindRecordVariable(TestRecordVar[1]);
end;
da es nämlich so viel Datensätze sind, mach ich lieber ein Array mit allen Namen und geh das dann die Reihe nach durch -> Schleife. Und muss somit ich nicht immer 100 Datensätze abklappern! Verstehst du was ich meine?!

mfg shark

barf00s 8. Jul 2005 13:16

Re: Zugriff auf Variablen im Record wie FindComponent
 
sowas geht nich...

im .NET schon

s.h.a.r.k 8. Jul 2005 13:18

Re: Zugriff auf Variablen im Record wie FindComponent
 
[edit]sorry - kein so toller beitrag von mir. nur des ganz regt mich jetzt etwas auf... da muss es doch ne lösung zu geben oder?![/edit]

barf00s 8. Jul 2005 13:20

Re: Zugriff auf Variablen im Record wie FindComponent
 
Delphi-Quellcode:
type
  PRecord = ^TRecord;
  TRecord = record
    Name: shortstring;
    Plz: cardinal;
  end;

var
  xListe: TList; // oder von mir aus auchn olles array (TList is auch nurn array-wrapper fallsdes noch nich wusstest)

procedure AddRecord(xRecord: TRecord);
begin
  xListe.Add(@xRecord);
end;

function SucheRecord(const Name: string): TRecord;
var
  iIndex: integer;

begin
  for iIndex := 0 to xListe.Count - 1 do
    if PRecord(xListe[iIndex])^.Name = Name then begin
      Result := PRecord(xListe[iIndex])^;
      Exit;
    end;
end;

s.h.a.r.k 8. Jul 2005 13:22

Re: Zugriff auf Variablen im Record wie FindComponent
 
und das geht dann auch in delphi 7 oder?!?

Robert_G 8. Jul 2005 13:23

Re: Zugriff auf Variablen im Record wie FindComponent
 
Zitat:

Zitat von barf00s
sowas geht nich...
im .NET schon

Shark, bist du VB'ler, einfach nur faul oder willst du 10GHz CPUs verkaufen? :gruebel:

barf00s 8. Jul 2005 13:23

Re: Zugriff auf Variablen im Record wie FindComponent
 
freilich

< D8 ist sowieso immer die beste wahl - .NET is nich so der hit - aber das ja ne andere sache

Flocke 8. Jul 2005 13:24

Re: Zugriff auf Variablen im Record wie FindComponent
 
@shark: dein Problem klingt eher danach, dass du nicht wirklich ein record brauchst... Kannst du die Daten nicht z.B. in 'ner TStringList abspeichern (mit Name=Wert)?

Robert_G 8. Jul 2005 13:27

Re: Zugriff auf Variablen im Record wie FindComponent
 
Zitat:

Zitat von barf00s
freilich

Ich denke, das war nicht was er will, auch wenn er es noch nicht gesehen hat.
Zitat:

< D8 ist sowieso immer die beste wahl - .NET is nich so der hit - aber das ja ne andere sache
Das versuche ich mal als Aussage von jemanden, der gerne mit Pointern auf primitive Typen spielt, zu respektieren...
Auch wenn ich es genau andersherum sehe (zumindest solange nicht D.Net gemeint ist :zwinker: )

barf00s 8. Jul 2005 13:31

Re: Zugriff auf Variablen im Record wie FindComponent
 
ich bin ja von berufswegen auch .NETler (kein d.net)

s.h.a.r.k 8. Jul 2005 13:34

Re: Zugriff auf Variablen im Record wie FindComponent
 
Zitat:

Zitat von Robert_G
Zitat:

Zitat von barf00s
sowas geht nich...
im .NET schon

Shark, bist du VB'ler, einfach nur faul oder willst du 10GHz CPUs verkaufen? :gruebel:

Darf ich fragen, was der Kommentar soll?! Trägt wohl auch nicht wirklich zum Lösnug meines Problems bei - aber egal.

Jedenfalls sitz ich hier leider nicht am Rechner, wo Delphi drauf is - konnte den Code leider bisher noch nicht testen! Werde ich aber gleich machen.
@barf00s: Schon mal danke für die schnelle hilfe!!!

barf00s 8. Jul 2005 13:45

Re: Zugriff auf Variablen im Record wie FindComponent
 
BESSER wäres ja noch wenn du von "record" auf "class" umstellst, dann brauchst dieses PRecorc() gefricke nich...

Delphi-Quellcode:
uses
  Contnrs; // TObjectList

type
  TEintrag = class
  private
    FName: string;
    FVorname: string;
    FStrasse: string;
    FPlz: integer;
    procedure SetName(const Value: string);
  public
    property Name: string read FName write SetName;
    // ...
  end;

  TEintraege = class(TObjectList)
  private
    function GetItems(Index: integer): TEintrag;
    procedure SetItems(Index: integer; const Value: TEintrag);
  public
    function FindByName(const Name: string): TEintrag;
    proeprty Items[Index: itneger]: TEintrag read GetItems write SetItems; default;
  end;

implementation

function TEintraege.GetItems(Index: integer): TEintrag;
begin
  Result := TEintrag(inherited Items[Index]);
end;

procedure TEintraege.SetItems(Index: integer; const Value: TEintrag);
begin
  inherited Items[Index] := Value;
end;

function TEintraege.FindByName(const Name: string): TEintrag;
var
  iIndex: integer;

begin
  Result := nil;
  for iIndex := 0 to Count - 1 do begin
    if Items[iIndex].Name = Name then begin
      Result := Items[iIndex];
      Exit;
  end;
end;

Robert_G 8. Jul 2005 13:53

Re: Zugriff auf Variablen im Record wie FindComponent
 
Zitat:

Zitat von Robert_G
Zitat:

Zitat von barf00s
freilich

Ich denke, das war nicht was er will, auch wenn er es noch nicht gesehen hat.

:lol: Ich dachte, dass er innerhalb einer Record-"Instanz" auf einzelne Felder per Namen zugreifen will...

Sorum macht das natürlich mehr Sinn. ;)

Willst du eine Art HashTable dürftest du etwas in der Art in der CodeLib finden. (IMHO von alzaimer... :gruebel: )
Bei 100 Einträgen dürften sich die Stringvergleiche noch nicht sooo dramatisch bemerktbar machen, bei mehr Elementen oder bei häufiger Nutzung wäre hier eine HashTable wohl sicher schneller. (Auch wenn ich hier immer noch keinen Sinn für einen Zugriff per String sehen kann... :gruebel: )

s.h.a.r.k 8. Jul 2005 14:04

Re: Zugriff auf Variablen im Record wie FindComponent
 
Vielen Dank für eure Hilfe Leut, aber ich hab das Problem jetzt gelöst! Der erste Tip von barfOOs wars! Danke nochmals! Ich hab zwar keine Ahnung was genau Poniter sind, aber ich verwend sie jetz einfach einmal *lol*


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