Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 10.06.03 06:46 
Moin,
kenn mich noch net so gut mit Klassen aus, aber jetzt brauch ich sie.

Hab mir in einer Extra-Unit eine Klasse TProfile von TObject abgeleitet. Die Klasse enthält unter anderem 2 dynamische String-Arrays.
Jetzt verwende ich diese für 2 Variablen profile, die in verschiedenen Formularen definiert sind. Beim Starten wird profile im Hauptformular erzeugt und gefüllt, beim Aufruf des Einstellungsfensters, wird dessen Variable profile erzeugt und dann setze ich sie gleich
ausblenden Delphi-Quelltext
1:
profsetupform.profile:=profile;					

Geht das überhaupt?

Was mir dabei aber als erstes aufgefallen ist (beim Debuggen) ist, dass sofort nach dem Erzeugen der profile-Variable im Einstellungsform diese schon denselben Inhalt hat, wie die in main.

Das ist doch nicht der Sinn von Instanzen? In Java muss man das ganze für ein solches Verhalten als static deklarieren, was mach ich hier falsch?

Gruß und Danke
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Di 10.06.03 09:40 
Ich versteh jetzt nicht was du meinst, aber wenn du zwei verschiedene profile machen willst und nur den Inhalt übernehmen willst, dann mach doch eine Methode und in der übernimmst du nacheinander alle Eigenschaften. Oder schau dir mal TPersistent an, der hat das schon eingebaut (irgendwie...)

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 10.06.03 09:57 
Das ist nicht wirklich das Problem, ich weiß nicht, ob das so funktioniert, deswegen die Zusatzfrage.

Das Hauptproblem besteht darin, dass beide Variablen (profile in mainform und profile in profsetupform) denselben Inhalt haben und zwar schon vor dem Gleichsetzen. Sobald ich in einer was ändere, ist das gleichzeitig in der anderen und ich weiß nicht warum....
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 10.06.03 10:04 
Zeig mal deinen Code (die Klasse und wie du damit arbeitest)...

Anmerkung (falls du das nicht eh schon weißt): dyn. Arrays sind nichts andres als Pointer auf einen Speicherbereich (im Gegensatz zu stat. Arrays)!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 10.06.03 10:19 
Aaaaaalso:
Die Klasse sieht folgendermaßen aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
type Teingangsserver = record
     servername:String;
     server:String;
     username:String;  
     Passwort:String;  
     end;

type Tausgangsserver = record
     servername:String;
     server:String;
     username:String;      
     Passwort:String;
     end;

type Tprofile = class(TObject)
     username:String;
     ordner:String;
     eingangsserver: array of Teingangsserver;
     ausgangsserver: array of Tausgangsserver;
     function IndexOfEingang(name:String):integer;
     function IndexOfAusgang(name:String):integer;
     end;

Die Rümpfe sind ja jetzt unwichtig.

in Mainform ist jetzt eine Variable profile des Typs Tprofile und in profsetupform auch.

Da ich mit verschiedenen Profile arbeite, will ich beim Laden des Profils immer alles neu erstellen, das mach ich mit
ausblenden Delphi-Quelltext
1:
2:
if profile<>nil then profile.Free;
profile:=Tprofile.Create;


Die Einstellungen werden in einer eigenen Unit geladen, deeren Prozedur ich profile als var-Parameter übergebe.

Der springende Punkt ist jetzt das Einstellungsfenster. Wenn die Einstellungen angezeigt werden sollen, mach ich
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if profsetupform.profile=nil then profsetupform.profile:=Tprofile.Create;
profsetupform.profile:=profile;
if profsetupform.ShowModal=mrOK then begin
   //Einstellungen übernehmen
   profile:=profsetupform.profile;
   end;

Damit stelle ich sicher, dass beim ersten Start die Variable profile existiert.

Hab gerade ein bisschen probiert und denke, dass es an der Zuweisung (wie im ersten Beitrag liegt). Kann es sein, dass ich damit die Referenz auf mainform.profile lege? Würde hinkommen, denn wenn ich profsetupform.profile erzeuge, ist es noch leer, erst nach dem ersten Ausführen der Einstellungen ist es immer dasselbe.

Naja, so wie's aussieht, muss ich das Übernehmen der Einstellungen dann doch etwas ausführlicher gestalten *g*.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 10.06.03 10:42 
Einleitung ;):
UGrohne hat folgendes geschrieben:
Aaaaaalso:

deine Variablen profile (die von der MainForm und die von der SetupForm) sind beides nur Objekt-Referenzen, also nur Pointer auf die Objekte! In Delphi sind alle Objekte IMMER nur Referenzen (sofern man die neuen class-Objekte und nicht die alten Pascal-Objekte nimmt), sowas wie die statischen C++-Objekte gibts in Delphi nicht. Damit sollte auch klar sein was bei der Zeile:
ausblenden Delphi-Quelltext
1:
profsetupform.profile:=profile;					

passiert... Du kopierst nicht das Objekt, sondern nur die Referenz des Objekts. D.h. nach dieser Zeile referenzieren beide Objekt-Referenzen dasselbe Objekt und außerdem ist eine Referenz verlorengegangen (-> Speicherleck!)

Schau dir am besten meine beiden Tuts zu OOP und Pointern an (www.x-spy.net/personal), da findest du einiges zu der internen Arbeitsweise von Delphi mit Objekten.

BTW: ich würd deiner Klasse noch einen Dekonstruktor hinzufügen, der die Länge deiner Arrays auf 0 setzt und so den Speicher freigibt...!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 10.06.03 10:47 
Danke für die ausfürhlicher Erklärung, das hab ich vorhin auch vermutet. Hab schon als ich die Zeile geschrieben hab, daran gezweifelt, dass das funktioniert *g*.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 10.06.03 11:25 
Tja.. ;) Aber du könntest eine Methode Assign einführen, die die einzelnen Objekt-Felder kopiert. ACHTUNG: dyn. arrays sind auch nur Pointer, dh. wenn du da eine einfache Zuweisung machst hast du da auch wieder dasselbe Problem - nur eine Kopie der Referenz!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 10.06.03 11:35 
Ja, so wie's aussieht, muss ich das wohl machen, aber das wird wohl das kleinste Problem, nachdem ich jetzt weiß, wie's funktioniert :wink: