Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [OOP] Instanzen durchlaufen (https://www.delphipraxis.net/113719-%5Boop%5D-instanzen-durchlaufen.html)

quendolineDD 13. Mai 2008 16:39


[OOP] Instanzen durchlaufen
 
Hallo Community. Suche nun schon eine weile und grübel über mein Problem nach, wie ich dies früher gelöst habe.
Ich habe eine Klasse
Delphi-Quellcode:
type
  TKunde = class(TObject)
  private
    fKID       : Integer;
    fName      : String;
    fVorname   : String;
    fAnschrift : TAnschrift;
    fGebdatum  : TDate;

  public
    constructor create (const kunden_id: integer);
    destructor destroy;

    function getid: integer;

    function find_customer_by_name(s: string): integer;

    property Name      : String     read fName       write fName;
    property Vorname   : string     read fVorname    write fVorname;
    property Anschrift : TAnschrift read fAnschrift  write fAnschrift;
    property Gebdatum  : TDate      read fGebdatum   write fGebdatum;
  end;
Im Programm übergebe ich den Namen eines Kunden, welchen ich schon bei der Instanzierung gleichzeitig in die ComboBox eingeschrieben habe an die Funktion.
Delphi-Quellcode:
SQL.Add(format(SQL_SELECT_CALLCOUNT_YEAR_AT_WEEKEND, [k.find_customer_by_name(ComboBox1.Items[ComboBox1.ItemIndex])]));
Nun möchte ich in meiner Funktion alle einzelnen Instanzen der Klasse durchlaufen um die jeweiligen Namen mit dem zu vergleichen und die ID zurückzugeben...
Delphi-Quellcode:
function TKunde.find_customer_by_name(s: string): integer;
var
s1: string;
i : integer;
begin
result := 0;

  s1 := copy(s, 0, pos(',',s)-2);
  delete(s, 1, pos(',',s));

    if (fName=s1) and (fVorname=s) then
      result := fKID;
end;
Hier fehlt dann mein weiteres Verständnis für OOP ... Wie kann ich die einzelnen Instanzen in einer Schleife o.ä. durchlaufen und mit den Werten vergleichen?

sirius 13. Mai 2008 16:41

Re: [OOP] Instanzen durchlaufen
 
Du brauchst eine weitere Klasse TKundenListe. In dieser kannst du dann einen Kunden suchen. Vorrausgesetzt, du hast alle Kunden darin gespeichert.

quendolineDD 13. Mai 2008 16:51

Re: [OOP] Instanzen durchlaufen
 
D.h. eine Klasse als TStringList / TObjectlist? Und dann registriere ich beim Create des TKunden diese Instanz in der Liste?

EDIT: Hab es auf anderem Weg gelöst.
Delphi-Quellcode:
ComboBox1.Items.AddObject(k.displayname, TKunde);
Delphi-Quellcode:
SQL.Add(format(SQL_SELECT_CALLCOUNT_YEAR_AT_WEEKEND, [TKunde(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).getid]));
So komme ich genau zu der ID des jeweiligen Kunden.

Trotzdem danke für eure Lösungsansätze.

Arbiedz 13. Mai 2008 18:08

Re: [OOP] Instanzen durchlaufen
 
Huhu,

statt
Delphi-Quellcode:
ComboBox1.Items.AddObject(k.displayname, TKunde);
sollte es vermutlich
Delphi-Quellcode:
ComboBox1.Items.AddObject(k.displayname, k);
heißen... ;)

Muetze1 13. Mai 2008 19:10

Re: [OOP] Instanzen durchlaufen
 
... und bitte noch das Override; beim Destructor ergänzen. (Du solltest dazu sogar eine Meldung vom Compiler bekommen: "Destroy verdeckt virtuelle Methode von TObject" o.ä.)

Luckie 14. Mai 2008 08:03

Re: [OOP] Instanzen durchlaufen
 
Ein Tutorial dazu gibt es hier: http://www.michael-puff.de/Artikel/2...er_Klassen.php

Jelly 14. Mai 2008 08:42

Re: [OOP] Instanzen durchlaufen
 
Die Methode find_customer_by_name hat nichts in der TKunde Klasse zu suchen, sondern gehört in die Listen- bzw. Collectionklasse.

christian_r 14. Mai 2008 08:46

Re: [OOP] Instanzen durchlaufen
 
Zitat:

Zitat von Muetze1
... und bitte noch das Override; beim Destructor ergänzen. (Du solltest dazu sogar eine Meldung vom Compiler bekommen: "Destroy verdeckt virtuelle Methode von TObject" o.ä.)

Ebenso gibt's eine Meldung beim Konstruktor "Create". Allerdings schafft override in der bisherigen Form keine Abhilfe, da die Paramter mit der geerbten Klasse nicht übereinstimmen. Entweder reintroduce oder besser noch die Kunden-ID nach dem Erstellen der jeweiligen Instanz zuweisen, aber dafür override verwenden. Musste ich mich auch neulich überzeugen lassen. ;) http://www.delphipraxis.net/internal...=881088#881088


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr.

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