Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TDatabase mit Assign kopieren? (https://www.delphipraxis.net/26329-tdatabase-mit-assign-kopieren.html)

sepp001 22. Jul 2004 09:20


TDatabase mit Assign kopieren?
 
Hallo,

die Methode Assign der TDatabase scheint nicht zu funktionieren (D7). Ich kann nicht Datbase1.Assign(Database2) durchführen. Weiss jemand Rat?

Ciao,
sepp001

trifid 22. Jul 2004 10:15

Re: TDatabase mit Assign kopieren?
 
Hallo sepp001,

Zitat:

Datbase1.Assign(Database2) durchführen. Weiss jemand Rat?
Code:
Datbase1 := Database2;

Bernhard Geyer 22. Jul 2004 10:32

Re: TDatabase mit Assign kopieren?
 
Zitat:

Zitat von trifid
Code:
Datbase1 := Database2;

Ich glaube nicht deine Lösung das gewünschte ist. Damit wird ja nur der Referenzzeiger kopiert.

Ich denke eher das eine Assign von einer TDatabase auf eine andere auch nicht sinnvoll ist, da ja z.B. das Property DatabaseName eindeutig sein muss.
Schau einfach mal in den Delphi-Source-Code ob für TDatabase überhaupt ein überladene Version der Assign-Methode definiert ist?

shmia 22. Jul 2004 10:38

Re: TDatabase mit Assign kopieren?
 
Zitat:

Zitat von sepp001
die Methode Assign der TDatabase scheint nicht zu funktionieren (D7). Ich kann nicht Datbase1.Assign(Database2) durchführen.

Anscheinend hat Borland (so wie ich auch) keinen Sinn darin gesehen ein TDatabase-Objekt
einem anderen TDatabase-Objekt zuzuweisen.
Du kannst die Eigenschaften ja von Aussen zuweisen:
Delphi-Quellcode:
Database2.Databasename := Database1.Databasename;
Database2.LoginPrompt := Database1.LoginPrompt;
...
Wenn die beiden Objekte exakt die gleichen Eigenschaften haben, würde dies sicher die
Performance der BDE stören.
Wenn die beiden Objekte nicht genau die gleichen Eigenschaften haben, brauchst du auch kein
Assign.
Vielleicht bist du auch nur schreibfaul und wolltest folgendes:
Delphi-Quellcode:
Database2.Assign(Database1);
Database2.Databasename := 'irgendneandereDB';
aber das kann man auch vergessen, da bei Assign auch die Eigenschaft Connected kopiert worden wäre.

trifid 22. Jul 2004 10:52

Re: TDatabase mit Assign kopieren?
 
@Bernhard,

Zitat:

Damit wird ja nur der Referenzzeiger kopiert.
schnell, einfach und es funktioniert

Die Frage müsste von sepp001 anders gestellt werden.
@sepp001
Wieso willst du oder für was brauchst du einen Database.Assign, was willst du damit bezwecken?
Welches Problem hast du überhaupt, damit du auf einen Database.Assign gekommen bist?

Zitat:

Ich denke eher das eine Assign von einer TDatabase auf eine andere auch nicht sinnvoll ist, da ja z.B. das Property DatabaseName eindeutig sein muss.
genau und deswegen gibt es nur 2 Möglichkeiten
- direkte Objektzuweisung per Referenz
- neue Instanz erzeugen und jedes einzelne Property mit den Werten der Source-Instanz füllen
dabei darf aber der Database.Name nicht identisch sein oder mit einen Zähler versehen
DatabaseNeu.Name := Database1.Name + IntToStr (n);

sepp001 22. Jul 2004 11:09

Re: TDatabase mit Assign kopieren?
 
Hallo:

Sinn und Zweck der ganzen Angelegenheit:

ich will eine Database-Komponente an eine DLL übergeben. Da mir die DLL aber ohne meinen Einfluss an der original übergebenen herumpfuscht (da sie, wie richtig bemerkt, als Referenz übergeben wird), möchte ich eine exakte Kopie rüberschieben.

Bleibt wohl doch nur der Weg über die Propertybelegung... :(

Ciao,
sepp001

trifid 22. Jul 2004 13:27

Re: TDatabase mit Assign kopieren?
 
@sepp001,

Zitat:

Da mir die DLL aber ohne meinen Einfluss an der original übergebenen herumpfuscht (da sie, wie richtig bemerkt, als Referenz übergeben wird), möchte ich eine exakte Kopie rüberschieben.
Aber das "herumpfuschen" programmierst ja du in deiner DLL, damit die Database-Komponente verändert wird.
Wenn eine Verbindung über ein Database-Objekt mal steht, was soll man dann noch viel verändern wollen?
Ich will nur damit ausdrücken, dass du nochmals deinen Source analysieren solltest wo Veränderungen im Database-Objekt der DLL entstehen (könnten).
Häufig ist in der DLL oder im Form das Database.Active := True gesetzt, und dann fetzt es natürlich.

Bernhard Geyer 22. Jul 2004 13:37

Re: TDatabase mit Assign kopieren?
 
Zitat:

Zitat von trifid
@Bernhard,

Zitat:

Damit wird ja nur der Referenzzeiger kopiert.
schnell, einfach und es funktioniert

Ist aber nicht das, was mit Assign realisiert wird. Assign kopiert den Zustand eines Objekt in ein anderes Objekt. Die Zuweisung mittels := biegt nur den Zeiger um, so daß beide auf das gleiche Objekt zeigen.

Wenn nun beide Objekt nicht per Formular-Verwaltung gesichert sind, sondern dynamisch erzeugt werden, hast Du danach ein schönes Speicherleck bzw. kracht es wenn du beim zweiten Objekt die Free-Methode aufrufst.

trifid 22. Jul 2004 14:31

Re: TDatabase mit Assign kopieren?
 
@Bernhard,
Zitat:

Ist aber nicht das, was mit Assign realisiert wird. Assign kopiert den Zustand eines Objekt in ein anderes Objekt. Die Zuweisung mittels := biegt nur den Zeiger um, so daß beide auf das gleiche Objekt zeigen.
Korrekt.

Zitat:

Wenn nun beide Objekt nicht per Formular-Verwaltung gesichert sind, sondern dynamisch erzeugt werden, hast Du danach ein schönes Speicherleck bzw. kracht es wenn du beim zweiten Objekt die Free-Methode aufrufst.
a1) ich gehe davon aus, wenn einer eine Referenz übergibt,
a2) dann weiss er auch was er damit macht
b) wenn eine Referenz einer DLL übergeben wird, dann gehört auch kein .Free in die DLL die dieses Referenz-Objekt zerstören könnte
c1) wenn dynamisch Objekte erstellt werden, dann a2)
c2) ist sowie immer vorsicht geboten
c3) wird auch der Aufwand größer um die dynamischen Objekte wieder zu zerstören (ObjektListen, Interface, RTTI, etc.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 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 by Thomas Breitkreuz