Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Plötzlich ist der Zeiger = NIL (https://www.delphipraxis.net/165241-ploetzlich-ist-der-zeiger-%3D-nil.html)

Impulz 20. Dez 2011 07:47

Delphi-Version: 5

Plötzlich ist der Zeiger = NIL
 
Guten Morgen liebe Community,

Ich habe mal wieder ein Problem mit meiner Datenbankoberfläche.
Ich war schon soweit, dass alles funktionierte und alles fertig war nur dann musste ich umdenken. Der Grund dafür war, dass man die ID's in meinem ListView und StringGrid nicht sehen sollte und auch nicht drauf schreibend zugreifen sollte.

also blendete ich die ID aus... dabei spielte ich einbisschen hier und da rum und sehe nun das der zeiger auf mein Objekt NIL ist... aber komischer weise nur wenn ich Hinzufügen drücke.. beim Löschen und beim bearbeiten ist nix los... läuft alles...

hier etwas Code, vielleicht sieht jemand etwas.

wenn mehr code benötigt wird sagt bescheid:


Code:
procedure TStartseite.Hinzufgen1Click(Sender: TObject);
var
  Kunde: TKunde;
  Buch: TBuch;
  Sendung: TSendung;
  Autor: TAutor;

begin
  Dateneditieren.StrGrAuswahl.Cells[0,0]:='';
  Dateneditieren.StrGrAuswahl.Cells[1,0]:='';
  if IsPositiveResult(Dateneditieren.ShowModal()) then
  begin
    case (rgAuswahl.ItemIndex) of
      0 : begin
            Kunde := TKunde.Create(Kunde.id,Dateneditieren.StrGrAuswahl.Cells[0,0],Dateneditieren.strgrauswahl.cells[1,0]); //hier ist die exception//
            connect.LegeKundeAn(Kunde);
            addKundetoLV(Kunde);
          end;
      1 : begin
            Sendung:= TSendung.Create(Sendung.ID,Dateneditieren.StrGrAuswahl.Cells[0,0],Dateneditieren.strgrauswahl.cells[1,0]);
            connect.LegeSendungAn(Sendung);
            addSendungetoLV(Sendung);
          end;
      2 : begin
            Autor:= TAutor.Create(Autor.ID,dateneditieren.StrGrAuswahl.Cells[0,0],Dateneditieren.strgrauswahl.cells[1,0]);
            connect.LegeAutorAn(Autor);
            addAutortoLV(Autor);
          end;
      3 : begin
            Buch:= TBuch.Create(buch.ID,StrToInt(Dateneditieren.StrGrAuswahl.Cells[0,0]),Dateneditieren.StrGrAuswahl.Cells[1,0]);
            connect.LegeBuchAn(Buch);
            addBuchtoLV(Buch);
          end;
    else
      begin
        ShowMessage('Ups, beim Anlegen des Kunden lief etwas schief');
      end;
    end;
  end;
end;
hier ist der teil von der Kunden Unit (wir nehmen diese als beispiel)


Code:
constructor TKunde.Create(AKunden_ID:Integer; AVorname, ANachname: string);
begin
  inherited Create();

  self.FKunden_ID:= AKunden_ID;
  self.FKunden_Vorname:= AVorname;
  self.FKunden_Nachname:= ANachname;
end;
die beiden Funktionen:

Code:
function TStartseite.addKundetoLV(AKunde: TKunde): TKundeList;
var
  myItemAddKtoLV: TListItem;
begin
  myItemAddKtoLV:= lvAuswahl.Items.Add;
  myItemAddKtoLV.Caption:=(AKunde.Vorname);
  myItemAddKtoLV.SubItems.Add(AKunde.Nachname);
end;
Code:
procedure TDataconnect.LegeKundeAn(Akunde: TKunde);
var
  neuerKuQuery: TIBOQuery;
  neuerKuTransa:TIBOTransaction;
begin
  neuerKuQuery:= TIBOQuery.Create(nil);
  neuerKuTransa:= TIBOTransaction.Create(nil);
  neuerKuTransa.IB_Connection:=neuerKuQuery.IB_Connection ;
  try
    neuerKuQuery.IB_Connection:= FDataBase;
    neuerKuTransa.IB_Connection:= FDatabase;
    try
      neuerKuQuery.SQL.Text:= 'INSERT INTO KUNDEN (Vorname,Nachname) Values ('+QuotedStr(Akunde.Vorname)+','+QuotedStr(Akunde.Nachname)+') returning Kunden_ID';
      neuerKuQuery.ExecSQL;
      Akunde.ID := neuerKuQuery.ParamByName('Kunden_ID').AsInteger;
      neuerKuTransa.Commit;
    Except
      on E : Exception do
      begin
        ShowMessage('FEHLER IN Lege Kunde AN');
        neuerKuTransa.Rollback;
      end;
    end;
  Finally
    neuerKuQuery.Free;
    neuerKuTransa.Free;
  end;
end;



vielen vielen Dank im vorraus für eure zeit und hilfe


liebe grüße

DeddyH 20. Dez 2011 07:55

AW: Plötzlich ist der Zeiger = NIL
 
Zitat:

Delphi-Quellcode:
Kunde := TKunde.Create(Kunde.id...

Du versuchst, bereits im Konstruktor auf die Property id der gerade zu erstellenden Instanz zuzugreifen. Das kann ja nicht funktionieren.

Impulz 20. Dez 2011 08:04

AW: Plötzlich ist der Zeiger = NIL
 
wenn ich die ID weglasse denn funktioniert das auch nicht.

ich muss ja das create aufrufen, oder stehe ich da auf dem schlauch?

himitsu 20. Dez 2011 08:11

AW: Plötzlich ist der Zeiger = NIL
 
Nein, denn Kunde gibt es doch nicht ... worauf willst du da casten? [edit] grade stand da ja noch eine andere Frage :angle:


Dort noch nicht auf die ID Kunde zugreifen.



Wozu willst du Kunden denn seine "eigene" ID zuweisen?
Wenn, dann mach das innerhalb des Create.

(wenn es seine Eigene ist, dann wird er die doch schon wissen und muß sie nicht erneut bekommen :gruebel)

Impulz 20. Dez 2011 08:11

AW: Plötzlich ist der Zeiger = NIL
 
Habs schon, hab einfach eine Integer Var deklariert jetzt klappts :)

danke mal wieder für deine Hilfe :)

DeddyH 20. Dez 2011 08:13

AW: Plötzlich ist der Zeiger = NIL
 
Die IDs werden ja vermutlich von der DB vergeben (per Generator und Trigger). Daher würde ich entweder eine Methode zum Anlegen neuer Kunden schreiben oder einfach eine 0 als ID übergeben, welche nach dem Speichern automatisch aus der DB ermittelt und im Objekt aktualisiert wird.


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