![]() |
Kopie einer Instanz
Hallo!
Ich habe ein Problem mit einer Instanz einer eigenen Klasse. Hier die Unit, in der das Problem auftritt...
Delphi-Quellcode:
In der ersten Procedure werden Edits mit den Werten der Instanz gefüllt. Das klappt super.
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. 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! |
Re: Kopie einer Instanz
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:
MfG
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; Muetze1 |
Re: Kopie einer Instanz
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 |
Noch eine Frage: Kopie einer Instanz
Dazu habe ich jetzt noch eine Frage!
Wie verhält es sich hier:
Delphi-Quellcode:
Zunächst wird eine Kunden-Instanz gebildet.
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; 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? |
Re: Kopie einer Instanz
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 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