AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie kann ich einen Record "echt" kopieren...?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann ich einen Record "echt" kopieren...?

Ein Thema von meggles · begonnen am 12. Mär 2004 · letzter Beitrag vom 12. Mär 2004
Antwort Antwort
Seite 1 von 2  1 2      
meggles
(Gast)

n/a Beiträge
 
#1

Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 09:49
Moin beisammen!
Mein Emailclient schafft mich noch ganz...
Eine Email wird durch folgenden Record beschrieben:

Delphi-Quellcode:
  TEmail = record
      id : integer;
      ordner_id : integer;
      von,
      replyto,
      an,
      cc,
      bcc : TIdEMailAddressList;
      betreff : string;
      Text : string;
      datum : TDateTime;
      prio : smallint;
      gelesen : Boolean;
      marke : boolean;
      beantwortet : boolean;
      eingang : boolean;
      schutz : boolean;
  end;
Die in der Listview angezeigten Emails enstprechend in einem Array:
  vEmailliste : array of TEmail; Wird eine Email doppelt angeklickt, wird das Detailfenster geöffnet. Dieses enthält, um mit der Email arbeiten zu können eine Variable ebenfalls vom Typ TEMail.
Delphi-Quellcode:
vfNeueEmail := TfEmail.Create(Application);
  vfNeueEmail.vEmail := vemailliste[listviewEmails.itemindex];
Und nun zum Problem: Beim Öffnen, Schließen und erneuten Öffnen derselben Mail bekomme ich eine Zugriffsverletzung. Ich vermute auch, zu wissen, wieso: nach der Zuweisung verweist vfNeueEmail.vEmail auf den selben Wert wie vemailliste[listviewEmails.itemindex]. Schließe ich die Detailansicht, wird auch vfNeueEmail.vEmail freigegeben - und somit ja der Wert, auf den vemailliste[listviewEmails.itemindex] verweist. Erneutes Öffnen der Email bedeutet also einen Zugriff auf einen Arraywert, den es nicht mehr gibt. Wie also kann ich vEmail eine "echte Kopie" geben?

Danke im Voraus - schönen stressfreien Tag

Simon
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 10:16
NachvfNeueEmail.vEmail := vemailliste[listviewEmails.itemindex]; enthält vfNeueEmail.vEmail eine Kopie des Records aus vemailliste. Bevor Du vfNeueEmail freigibst
musste den Record wieder in das Array schreiben.vemailliste[listviewEmails.itemindex]:=vfNeueEmail.vEmail vfNeueEmail.vEmail enthält einen Record. Records werden nicht freigeben.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von CenBells
CenBells

Registriert seit: 30. Mär 2003
Ort: Kiel urspr. Lübeck
176 Beiträge
 
Delphi 7 Professional
 
#3

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 11:22
Zitat von Jens Schumann:
NachvfNeueEmail.vEmail := vemailliste[listviewEmails.itemindex]; enthält vfNeueEmail.vEmail eine Kopie des Records aus vemailliste. Bevor Du vfNeueEmail freigibst
musste den Record wieder in das Array schreiben.vemailliste[listviewEmails.itemindex]:=vfNeueEmail.vEmail vfNeueEmail.vEmail enthält einen Record. Records werden nicht freigeben.
Hallo,

das macht doch auch keinen sinn. Wenn du sagst, daß vfNeueEmail.vEmail eine kopie enthalten würde, müsstest du den record nicht zurück ins array schreiben - der Record würde ja immer noch im Array stehen.
Mit echt kopieren würde ich mir mal die methode assign einer stringlist anschauen. Da siehst du, daß die wert wirklich "kopiert" werden.
das müsste also so aussehen
Delphi-Quellcode:
procedure copyEmail(var Source, Dest: TEmail);
begin
  Dest.id := Source.id ;
  // etc
end;
musst natürlich vorher sicher stellen, daß Dest auch schon alloziiert wurde.

Gruß
Ken
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 11:34
Zitat von CenBells:
das macht doch auch keinen sinn. Wenn du sagst, daß vfNeueEmail.vEmail eine kopie enthalten würde, müsstest du den record nicht zurück ins array schreiben - der Record würde ja immer noch im Array stehen.
Mit echt kopieren würde ich mir mal die methode assign einer stringlist anschauen. Da siehst du, daß die wert wirklich "kopiert" werden.
das müsste also so aussehen
Delphi-Quellcode:
procedure copyEmail(var Source, Dest: TEmail);
begin
  Dest.id := Source.id ;
  // etc
end;
musst natürlich vorher sicher stellen, daß Dest auch schon alloziiert wurde.
Ein Record ist kein Object Da wird nichts alloziert oder so. Du gehst davon aus, das mit vfNeueEmail.vEmail:=vemailliste[listviewEmails.itemindex]; eine Referenz auf den Record übergeben wird. Dem ist nicht so. Gerade weil vfNeueEmail.vEmail eine Kopie enthält muss der Record zurück ins Array geschrieben werden.
Hier ein Beispiel:
Delphi-Quellcode:
var
  a : Array of Integer;
  b : Integer;
...
  a[1]:=42;
  b:=a[1];
  // b enthält jetzt 42 und a[1] auch
  b:=73;
  // b enhält jetzt 73 und a[1] enthält jetzt 42
  // Damit a[1] den Wert von b enthält muss jetzt folgendes passieren
  a[1]:=b;
In dem Beispiel entspricht vemailliste a und vfNeueEmail.vEmail b.
Ich hoffe jetzt ist es deutlich geworden.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von CenBells
CenBells

Registriert seit: 30. Mär 2003
Ort: Kiel urspr. Lübeck
176 Beiträge
 
Delphi 7 Professional
 
#5

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 11:44
Hallo,

aber wenn ich meggles verstanden habe, kommt das problem beim erneuten zugriff auf das element des arrays... Und dort sollte ja immernoch der ursprüngliche wert drinstehen, oder etwa nicht?
Wenn da immer noch der ursprüngliche wert drinsteht, dann sollte doch aber kein fehler beim erneuten öffnen kommen, oder?
Das ein Record kein Objekt ist, war mir auch vorher schon klar, aber kann es in diesem fall nicht irgendwie damit zusammenhängen, daß die TIdEmailAddresslisten freigegeben werden, wenn die instanz von vfNeueEmail freigegeben wird und damit auch das record nicht mehr referenziert wird? Wobei, das wäre ja bald java like, daß man sich um speicher nicht mehr kümmern müsste *G* Also, was passiert mit den instanzen von TIdEmailAdressList?

Gruß
Ken
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 11:49
Zitat von CenBells:
aber wenn ich meggles verstanden habe, kommt das problem beim erneuten zugriff auf das element des arrays... Und dort sollte ja immernoch der ursprüngliche wert drinstehen, oder etwa nicht
Das glaube ich nicht. Ich glaube, dass die SV an anderer Stelle kommt und meggles nur glaubt sie würde da auftauchen. In dem Array muss der alte Wert stehen.

Ein grundsätzlichen Fehler von meggles ist auch die Verwendung eines dyn. Array anstatt TList oder einer verketteten Liste oder ähnliches.

Neulich hat Luckie hier geschrieben, dass er festgestellt hätte, dass ein dyn. Array freigeben wird, wenn der Gültigkeitsbereich verlassen wird. Ich als erstes in diese Richtung suchen.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
meggles
(Gast)

n/a Beiträge
 
#7

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 12:07
Hi,
danke erstmal für Eure Hilfe.
Delphi-Quellcode:
  vfNeueEmail := TfEmail.Create(Application);
  vfNeueEmail.vEmail := vemailliste[lvemails.itemindex];
  showmessage(vfNeueEmail.vemail.betreff);
1. Emailöffnen: alles bestens, Showmessage zeigt mir den Betreff an.
2. Email schließen.
3. Email wieder öffnen: nix Showmessage, Schutzverletzung. Mauszeiger auf "...vemail.betreff" zeigt auch Schutzverletzung an.
Das passiert mit jeder Email, die ich shcon einmal offen hatte, also siehts doch danach aus, dass ich mir der Reihe nach die Arrayeinträge abschieße. Ou Mann!
Noch irgendeine Idee?
Zitat:
Ein grundsätzlichen Fehler von meggles ist auch die Verwendung eines dyn. Array anstatt TList oder einer verketteten Liste oder ähnliches.
@Jens: Wieso grundsätrzlicher Fehler?

Vielen Dank!

Simon
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#8

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 12:57
Code:
vfNeueEmail := TfEmail.Create(Application);
vfNeueEmail.vEmail^ := vemailliste[listviewEmails.itemindex]^;
  Mit Zitat antworten Zitat
meggles
(Gast)

n/a Beiträge
 
#9

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 13:31
ui ui ui, Stoxx,
kannst Du mir da ein, zwei Zeilen Erklärung dazuschreiben? Ich verstehe zwar, dass Du jetzt mit Pointern arbeitest, aber - wieso...?
THX!
Simon
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Wie kann ich einen Record "echt" kopieren...?

  Alt 12. Mär 2004, 13:45
Hallo meggles,
bitte zeige mal etwas mehr Code. Evt. die komplette unit.

Ich persönlich halte von dyn. Array's gar nichts. Das ist so VB-mäßig.
Deshalb habe ich hier von einem grundsätzlichen Fehler geschrieben.

Ich würde die eMail Daten auch nicht als Record, sondern als Objekt mit TList
verwalten. Dann wird nämlich tatsächlich "nur" eine Referenz übergeben.
Dieses ganze Zeug mit Kopien und SV gibt es dann nicht mehr.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:31 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