Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record im Objekt (https://www.delphipraxis.net/74833-record-im-objekt.html)

davar 9. Aug 2006 12:17


Record im Objekt
 
Hallo Leute,

ich versuche nun, mich mit den Themen Records und Klassen vertraut zu machen, hab aber einige Anfangsschwierigkeiten.

Also, ich möchte eine Klasse "Kundendaten" erstellen. Diese Klasse soll über einen Record namens "Kunde" verfügen. Und mit folgendem Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Db, ZQuery, ZMySqlQuery, ZTransact, ZMySqlTr, ZConnect,
  ZMySqlCon;

type
  TKunde = record
    kundennummer: string;
  end;

  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    ds1: TDataSource;
    db1: TZZMySqlDatabase;
    tr1: TZZMySqlTransact;
    query1: TZZMySqlQuery;
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TKundendaten = class(TObject)
    kunde1 : TKunde;
    procedure Kundesuchen;
  end;

var
  Form1: TForm1;
  Kundendaten: TKundendaten;

implementation

{$R *.DFM}

procedure TKundendaten.Kundesuchen;
begin
Form1.query1.sql.text:= 'SELECT * FROM kundendaten';
Form1.query1.Open;
kunde1.kundennummer:= Form1.query1.fieldbyname('ID').AsString;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Kundendaten.Kundesuchen;
end;

end.
bekomme ich eine Fehlermeldung, und zwar in der Zeile

Delphi-Quellcode:
kunde1.kundennummer:= Form1.query1.fieldbyname('ID').AsString;
Wo denke ich falsch?


MfG

davar

TBx 9. Aug 2006 12:21

Re: Record im Objekt
 
verrätst DU uns evtl. auch die Fehlermeldung?
Die Glaskugelsteuern sind mir einfach zu hoch. :wink:

Gruß

onlinekater

davar 9. Aug 2006 12:35

Re: Record im Objekt
 
Zitat:

Zitat von onlinekater
verrätst DU uns evtl. auch die Fehlermeldung?

wäre wohl von Vorteil.. :oops:

"Zugriffsverletzung bei Adresse ... in Modul 'Project1.exe Schreiben von Adresse ..."

Als wäre hier eine Variable nicht definiert..

Klaus01 9. Aug 2006 12:40

Re: Record im Objekt
 
Kannst Du mal versuchen aus:

Delphi-Quellcode:
type
TKunde = record
  kundennummer: string;
end;
diese zu machen:

Delphi-Quellcode:
type
TKunde = record
  kundennummer: string[255];
end;
Grüße
Klaus

davar 9. Aug 2006 12:44

Re: Record im Objekt
 
Nein, das ändert auch nichts. Gleiche Fehlermeldung.

JasonDX 9. Aug 2006 12:44

Re: Record im Objekt
 
Meine Prognose: Das Record ist gesund, aber die Instanz zeigt auf einen Haufen Altpapier...
ein KundenDaten := TKundenDaten.Create(...) sollte helfen ;)

PS:
Zitat:

Zitat von davar
Delphi-Quellcode:
procedure TKundendaten.Kundesuchen;
begin
  Form1.query1.sql.text:= 'SELECT * FROM kundendaten';
  Form1.query1.Open;
  kunde1.kundennummer:= Form1.query1.fieldbyname('ID').AsString;
end;

Iih, mach das Form1 da wech! :zwinker:

greetz
Mike

mkinzler 9. Aug 2006 12:49

Re: Record im Objekt
 
es sieht auch so aus als ob du die Kundenklasse nie instantiiert hättest.

Hawkeye219 9. Aug 2006 13:10

Re: Record im Objekt
 
Zitat:

Zitat von JasonDX
Iih, mach das Form1 da wech! :zwinker:

In diesem Fall nicht, da Form1 <> Self! :wink:

Gruß Hawkeye

JasonDX 9. Aug 2006 13:13

Re: Record im Objekt
 
Zitat:

Zitat von Hawkeye219
Zitat:

Zitat von JasonDX
Iih, mach das Form1 da wech! :zwinker:

In diesem Fall nicht, da Form1 <> Self! :wink:

Ich weiss, deswegen sollte es IMO auch weg! ;)

greetz
Mike

Klaus01 9. Aug 2006 13:17

Re: Record im Objekt
 
Delphi-Quellcode:
procedure TKundendaten.Kundesuchen;
begin
  Form1.query1.sql.text:= 'SELECT * FROM kundendaten';
  Form1.query1.Open;
  kunde1.kundennummer:= Form1.query1.fieldbyname('ID').AsString;
end;
ich bin da nich so fit mit SQL Querys, aber
wenn ich Select * from kundendaten mache
kommt da nicht mehr als ein String zurück?

Kannst Du mal testhalber das Ergebnis von
Form1.query1.fieldbyname('ID').AsString
als Message oder in ein Memofeld ausgeben?

Grüße
Klaus

davar 9. Aug 2006 13:30

Re: Record im Objekt
 
Zitat:

Zitat von JasonDX
ein KundenDaten := TKundenDaten.Create(...) sollte helfen ;)

Hmmmmm.....

Daran hat es gelegen. Versteh ich aber nicht ganz.

Wenn ich vorher statt

Delphi-Quellcode:
kunde1.kundennummer:= Form1.query1.fieldbyname('ID').AsString;
einfach ein Label angesprochen habe, also

Delphi-Quellcode:
label1.caption:= Form1.query1.fieldbyname('ID').AsString;
dann ging es auch. Aber in beiden Fällen ist doch der Befehl in der Prozedur "TKundendaten.Kundesuchen", also müsste doch, wenn Kundendaten noch nicht erstellt wurde, in beiden Fällen eine Fehlermeldung kommen..

mkinzler 9. Aug 2006 13:30

Re: Record im Objekt
 
Zitat:

ich bin da nich so fit mit SQL Querys, aber
wenn ich Select * from kundendaten mache
kommt da nicht mehr als ein String zurück?
Pro Zeile der Tabelle nur einer.

Aber ich wiederhole meinen Einwand von vorhin:

Wo erzeugst du eine Instanz von TKundendaten?

[Edit:
Zitat:

Delphi-Quellcode:
label1.caption:= Form1.query1.fieldbyname('ID').AsString;

Hier greifst du ja gar nicht auf die klasse zu.]

Sidorion 9. Aug 2006 13:33

Re: Record im Objekt
 
Die Variable Kundendaten ist nicht initialisiert.
a) im FormShow erst Kundendaten:=TKundendaten.Create rufen, dann solltest du die Variable allerdings als Member von TForm1 machen
oder
b) falls Kundendaten global sein soll ne Zugriffsfunktion implementieren.
Delphi-Quellcode:
Function GetKundendaten: TKundendaten;
Begin
  If not Assigned(Kundendaten)
  Then Kundendaten:=TKundendaten.Create;
  Result:=Kundendaten;
End;
Dann solltest Du aber einen Init/final sektion anfügen (direkt vor dem End.)
Delphi-Quellcode:
Initialization
  Kundendaten:=Nil;
Finalization
  GetKundenDaten.Free;


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