AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kopie einer Instanz

Ein Thema von stoermi · begonnen am 29. Dez 2004 · letzter Beitrag vom 29. Dez 2004
Antwort Antwort
stoermi

Registriert seit: 1. Dez 2004
Ort: im Wald von Thüringen
75 Beiträge
 
Delphi 6 Enterprise
 
#1

Kopie einer Instanz

  Alt 29. Dez 2004, 17:18
Hallo!
Ich habe ein Problem mit einer Instanz einer eigenen Klasse.
Hier die Unit, in der das Problem auftritt...

Delphi-Quellcode:
unit buchungAnlegen;

interface

uses
...

type
  TBuchungAnlegenForm = class(TForm)
...
  end;

var
  BuchungAnlegenForm: TBuchungAnlegenForm;

implementation

{$R *.dfm}


procedure TBuchungAnlegenForm.KndEinfBtnClick(Sender: TObject);
begin
  if KundeAngebenForm.ShowModal = mrOK then
  begin
    edName.Text := KundeAngebenForm.neuerKunde.name;
    edVName.Text := KundeAngebenForm.neuerKunde.vorname;
    edStr.Text := KundeAngebenForm.neuerKunde.strasse;
    edHnr.Text := KundeAngebenForm.neuerKunde.hausnummer;
    edPlz.Text := KundeAngebenForm.neuerKunde.plz;
    edOrt.Text := KundeAngebenForm.neuerKunde.ort;
    [b]aktKunde := KundeAngebenForm.neuerKunde;
    KundeAngebenForm.neuerKunde.Free;[/b]
    BuchAufnBtn.Enabled := True;
  end;
end;

procedure TBuchungAnlegenForm.BuchAufnBtnClick(Sender: TObject);
var umb: Shortint;
    rab: Single;
    s: ShortString;
begin
  s := cbRabatt.Items[cbRabatt.ItemIndex];
  Delete(s, Length(s), 1); //Prozentzeichen entfernen
  rab := StrToFloat(s) / 100; //in Gleitkomma umrechnen und durch 100 teilen
  umb := cbBuch.ItemIndex;

  with BuchungTab do
  begin
    Active := True;
    Append;
    FieldByName('Kunde').AsInteger := [b]aktKunde.id[/b];
    FieldByName('Zimmer').AsString := aktZimmer;
    FieldByName('Anreise').AsDateTime := aktDatum;
    FieldByName('Abreise').AsDateTime := dtpAbreise.Date;
    FieldByName('Rabatt').AsFloat := rab;
    FieldByName('Umbuch').AsInteger := umb;
    Post;
    Active := False;
  end;

  FBuchung := TBuchung.Create(aktZimmer, aktKunde, aktDatum, dtpAbreise.Date, umb, rab);

...

end;

end.
In der ersten Procedure werden Edits mit den Werten der Instanz gefüllt. Das klappt super.
Dann wird die Instanz in eine Formular-eigene Instanz kopiert und die Instanz des fremden Formulars gelöscht.

Wenn ich dann jedoch in der zweiten Prozedure auf diese neue Instanz zugriefen möchte, sind die Daten weg!

Hängt das damit zusammen, dass ich mit xInst := gForm.yInst keine richtige Kopie erstelle? Ich habe das irgend wo mal gelesen, dass man nur die Adresse kopiert, und wenn man das dann free-setzt, ist es weg.

Wie macht man das dann??? Ist wahrscheinlich eine dumme Frage, aber ich bin halt dummer Anfänger! Und gefunden hab ich dazu irgedwie nix!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Kopie einer Instanz

  Alt 29. Dez 2004, 17:36
Moin!

Deine Vermutung ist richtig - du hast nach der Zuweisung 2 Variablen die beide auf ein und dieselbe Instanz verweisen. Daher ist ein Free bei einer der Variablen gleichzeitig der Tod der anderen Variable - sie zeigt ja auf die gleiche Stelle.

Um eine Instanz ordentlich zu kopieren solltest du dir einen Copy Constructor anlegen - also ein Konstruktor der als Parameter eine Instanz gleichen Typs annimmt und dann darin alle Daten kopiert.

Beispiel:
Delphi-Quellcode:
Type
  TBeispiel = Class
  Private
    fDaten : Integer;
    fAnderes : String;

  Public
    Constructor Create; Overload;
    Constructor Create(ABeispiel : TBeispiel); Overload;
  End;

....

Constructor TBeispiel.Create(ABeispiel : TBeispiel);
Begin
  Inherited Create; // muss man nicht, ich weiss, ich mach's trotzdem

  fDaten := ABeispiel.fDaten;
  fAnderes := ABeispiel.fAnderes;
End;
MfG
Muetze1
  Mit Zitat antworten Zitat
stoermi

Registriert seit: 1. Dez 2004
Ort: im Wald von Thüringen
75 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Kopie einer Instanz

  Alt 29. Dez 2004, 17:46
Danke!
War meine Vermutung also doch richtig!
Hab aber gedacht, dass es da einen richtigen Copy-Befehl gibt, und danach gesucht und nix gefunden!
Tschau!
stoermi
  Mit Zitat antworten Zitat
stoermi

Registriert seit: 1. Dez 2004
Ort: im Wald von Thüringen
75 Beiträge
 
Delphi 6 Enterprise
 
#4

Noch eine Frage: Kopie einer Instanz

  Alt 29. Dez 2004, 18:09
Dazu habe ich jetzt noch eine Frage!

Wie verhält es sich hier:

Delphi-Quellcode:
      myKunde := TKunde.Create(daten);
      myBuchung := TBuchung.Create(myKunde, BuchungenQuery.FieldByName('Anreise').AsDateTime, BuchungenQuery.FieldByName('Abreise').AsDateTime, BuchungenQuery.FieldByName('Umbuch').AsInteger, BuchungenQuery.FieldByName('Rabatt').AsFloat);
      zimmerObj[i].buchung := TBuchung.Create(myBuchung);
      myBuchung.Free;
      myKunde.Free;
Zunächst wird eine Kunden-Instanz gebildet.
Diese ist dann Teil einer Instanz von Buchung (siehe im TBuchung.Create)
Kann ich diese Kunden-Instanz dann freisetzten, oder verhält es sich dann genau so?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Kopie einer Instanz

  Alt 29. Dez 2004, 19:30
Moin!

Da verhält es sich genauso: TBuchung bekommt ungültige Daten beim Zugriff auf die übergebene Kundeninstanz weil du genau diese Instanz freigegeben hast.

MfG
Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 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