[Erledigt] Problem mit Objektliste in einer Klasse

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

[Erledigt] Problem mit Objektliste in einer Klasse

Beitragvon MacWomble » 22. Sep 2019, 18:09 [Erledigt] Problem mit Objektliste in einer Klasse

Hallo,

ich habe ein Problem mit meinen Klassen.
Ich erzeuge ein Objekt der Klasse TAkte (cuakten). Hierin enthalten ist eine Objektliste Akte.Adressen aus TAktenAdressen.
Das erstmalige Einlesen funktioniert.
Wenn ich ButtonAdresseZuweisen betätige, wird eine Adressliste aufgerufen und einige Daten der Adresse (das ist eine andere Klasse!) zu Akte.Adressen geadded.
Ich habe eine Ausgabe über writeline, welche mir die neue Adresse mit anzeigt. So weit - so gut.

Sobald ich aber die procedure TAktenEditor.btnAdtresseZuweisenClick verlasse (z.B. durch InitGridAdressen) ist die neu zugewiesene Akte.Adresse aber nicht mehr da.

Anm. 1: der Quellcode ist stark gekürzt!
Anm. 2: Die Klassen funktionieren unabhängig voneinander, das Problem ist nur mit Adressen in der Akte,

Code: Alles auswählen
unit fuakteneditor;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, Grids, ComCtrls,
  cuakte, cuaktenstatus, cudokument, cuhistorie, cuaktenadresse, cuadresse, fuadressauswahl, Types;
 
type
 
  { TAktenEditor }
 
  TAktenEditor = class(TForm)
 ...
    procedure btnAdtresseZuweisenClick(Sender: TObject);
...    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    procedure Init;
    procedure FillAktenStatus;
    procedure InitGridAktenAdresse;
public
    procedure GetAkte;//(Akte: TAkte);
    procedure SetAkte;//(Akte: TAkte);
  protected
    function GetHistorienIndex: integer;
    function GetCellText(ACol, ARow: integer): string;
  end;
 
var
  AktenEditor: TAktenEditor;
  AktenstatusListe: TAktenstatusListe;
  Adresse: TAktenAdresse;
  AktenAdressListe: TAktenAdressListe;
    Akte: TAkte;   //aus Verzweiflung hier platziert, war zuvor unter Private
 
function CallAktenEditor(A: TAkte): integer;
function CallNewAktenEditor: integer;
 
implementation
 
{ CallAktenEditor }
function CallAktenEditor(A: TAkte): integer;  //Hier wird eine zuvor gewählte Akte übergeben. Akte.Adressen ist noch nicht mit Daten gefüllt!
var
  F: TAktenEditor;
  i: integer;
begin
  F := TAktenEditor.Create(nil);
  try
    F.Position := poMainFormCenter;
    Akte := TAkte.Create;
   Akte := A;
    Akte.FillAdressen;
    F.SetAkte;//(Akte);
 
 
 
    if F.ShowModal = mrOk then
    begin
      F.GetAkte;//(Akte);         // Hier geht die neue Adresse verloren
 
 
      // TODO: Delete this
      for i := 0 to Akte.Adressen.Count - 1 do
        writeln(IntToStr(Akte.Adressen.Items[i].ID) + ' get Akte ' + Akte.Adressen.Items[i].Adresszeile);
 
      Akte.WriteAndGetID(Akte);
      Akte.Adressen.WriteListData(Akte.ID);
 
      Result := Akte.ID;
    end;
  finally
    FreeAndNil(Akte);
    F.Free;
  end;
end;
 
...
 
{$R *.frm}
 
{ TAktenEditor }
 
...
 
procedure TAktenEditor.btnAdtresseZuweisenClick(Sender: TObject);
var
  A: TAdresse;
  TempObj: TAktenAdresse;
  s: string;
  i: integer;
begin
  if ListeAdresse(A) then
  begin
    //TODO: Aktenadresse eintragen
    TempObj := TAktenAdresse.Create;
    TempObj.ID := 0;
    TempObj.IDAdresse := A.iD;
    TempObj.IDAdressart := A.IDAdressArt;
    s := A.Anrede + ' ' + A.Vorname + ' ' + A.FirmaZuname + ' ' + A.Firma2;
    TempObj.Adresszeile := s;
    TempObj.Zeichen := 'Abc';
 
    Akte.Adressen.Add(TempObj);
 
    FreeAndNil(TempObj);
    // Hier scheint alles OK, die neue Adresse ist angebunden
 
    // TODO: Delete this
     for i := 0 to Akte.Adressen.Count - 1 do
       writeln(IntToStr(Akte.Adressen.Items[i].ID) + ' Adresse übernommen ' + Akte.Adressen.Items[i].Adresszeile);
 
    InitGridAktenAdresse;
  end;
end;
...
{ FormCreate }
procedure TAktenEditor.FormCreate(Sender: TObject);
begin
  AktenAdressListe := TAktenAdressListe.Create();
  AktenstatusListe := TAktenstatusListe.Create();
  FillAktenStatus;
end;
 
{ FormDestroy }
procedure TAktenEditor.FormDestroy(Sender: TObject);
begin
  FreeAndNil(AktenAdressListe);
  FreeAndNil(AktenstatusListe);
end;
...
{ Akte aus Formular Einlesen }
procedure TAktenEditor.GetAkte;//(Akte: TAkte);
begin
  if Akte <> nil then
  begin
    if cbSstatus.ItemIndex >= 0 then
      Akte.IDAktenstatus := PtrUInt(cbSstatus.Items.Objects[cbSstatus.ItemIndex]);
 
    Akte.Nummer := StrToInt(edNummer.Text);
...
    Akte.Notiz := memAnmerkungen.Text;
  end;
end;
 
{ Formular Daten Zuweisen }
procedure TAktenEditor.SetAkte;//(Akte: TAkte);
var
  AIndex: integer;
  Str: string;
begin
  if Akte <> nil then
  begin
    AIndex := cbSstatus.Items.IndexOfObject(TObject(PtrInt(Akte.IDAktenstatus)));
    if AIndex >= 0 then
      cbSstatus.ItemIndex := AIndex;
 
    edNummer.Text := IntToStr(Akte.Nummer);
...
    memAnmerkungen.Text := Akte.Notiz;
 
    //AktenAdressListe.ReadByAktenID(Akte.ID);
    InitGridAktenAdresse;
  end;
end;
 
...
end.
 


Code: Alles auswählen
unit cuakte;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LazLogger, DBCtrls, Contnrs, dtm_basis, cuAdresse, cuaktenadresse;
 
type
 
  { TAkte }
 
  TAkte = class(TObject)
  private
    fIsChanged: boolean;
    fID: integer;
    fIDAktenstatus: integer;
 
    fAktenzeichen: string;
    fJahr: integer;
    fNummer: integer;
    fSache: string;
    fGrund: string;
    fNotiz: string;
 
    { Nur lesen aus AkteStatus }
    fStatus: string;
 
    { Nur lesen aus Color }
    fIDColor: integer;
    fColorn: string;
    fColorh: string;
    fColornfont: string;
    fColorhfont: string;
 
    { Aktenadressen }
    fAdressen: TAktenAdressListe;
 
  public
    procedure SetIDAktenstatus(const aValue: integer);
    procedure SetAktenzeichen(const aValue: string);
    procedure SetJahr(const aValue: integer);
    procedure SetNummer(const aValue: integer);
    procedure SetSache(const aValue: string);
    procedure SetGrund(const aValue: string);
    procedure SetNotiz(const aValue: string);
    procedure FillAdressen;
 
    procedure CopyFrom(AValue: TAkte);
    function WriteAndGetID(AValue: TAkte): integer;
 
    property IsChanged: boolean read fIsChanged write fIsChanged default False;
    property ID: integer read fID write fID default -1;
    property IDAktenstatus: integer read fIDAktenstatus write SetIDAktenstatus default -1;
 
    property Aktenzeichen: string read fAktenzeichen write SetAktenzeichen;
    property Jahr: integer read fJahr write SetJahr;
    property Nummer: integer read fNummer write SetNummer;
    property Sache: string read fSache write SetSache;
    property Grund: string read fGrund write SetGrund;
    property Notiz: string read fNotiz write SetNotiz;
 
    { Nur lesen aus AkteStatus }
    property Status: string read fStatus write fStatus;
 
    { Nur lesen aus Color }
    property IDColor: integer read fIDColor write fIDColor;
    property Colorn: string read fColorn write fColorn;
    property Colorh: string read fColorh write fColorh;
    property Colornfont: string read fColornfont write fColornfont;
    property Colorhfont: string read fColorhfont write fColorhfont;
 
    property Adressen: TAktenAdressListe read fAdressen write fAdressen;
  end;
 
  { TAktenListe }
 
  TAktenListe = class(TObjectList)
  private
    procedure ReadListData(Query: string);
 
    function GetItem(AIndex: integer): TAkte;
    procedure SetItem(AIndex: integer; const AValue: TAkte);
  public
    procedure ReadAll;
    procedure WriteListData;
    procedure DeleteByID(aID: integer);
 
    function IndexOf(aID: integer): integer;
    property Items[AIndex: integer]: TAkte read GetItem write SetItem; default;
  end;
 
var
  AktenListe: TAktenListe;
 
 
implementation
 
{ TAktenListe }
 
 
 
function TAktenListe.GetItem(AIndex: integer): TAkte;
begin
 Result := TAkte(inherited Items[AIndex]);
end;
 
procedure TAktenListe.SetItem(AIndex: integer; const AValue: TAkte);
begin
  TAkte(inherited Items[AIndex]).CopyFrom(AValue);
end;
 
{ TAkte }
...
 
initialization
  AktenListe := TAktenListe.Create;
 
finalization
  AktenListe.Free;
 
end.


Code: Alles auswählen
unit cuaktenadresse;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LazLogger, DBCtrls, Contnrs, dtm_basis;
 
type
 
  { TAktenAdresse }
 
  TAktenAdresse = class(TObject)
  private
    fIsChanged: boolean;
    fID: integer;
    fIDAdressart: integer;
    fIDAdresse: integer;
    fIDKontakt: integer;
    fIDAkte: integer;
    fPosition: integer;
    fZeichen: string;
 
    { Nur lesen }
    fAdresszeile: string;
    fAdressart: string;
 
    { Nur lesen aus Color }
    fIDColor: integer;
    fColorn: string;
    fColorh: string;
    fColornfont: string;
    fColorhfont: string;
  public
    procedure SetIDAdressart(const aValue: integer);
    procedure SetIDAdresse(const aValue: integer);
    procedure SetIDKontakt(const aValue: integer);
    procedure SetIDAkte(const aValue: integer);
    procedure SetPosition(const aValue: integer);
    procedure SetZeichen(const aValue: string);
 
    procedure CopyFrom(AValue: TAktenAdresse);
 
    property IsChanged: boolean read fIsChanged write fIsChanged default False;
    property ID: integer read fID write fID default -1;
    property IDAdressart: integer read fIDAdressart write SetIDAdressart;
    property IDAdresse: integer read fIDAdresse write SetIDAdresse;
    property IDKontakt: integer read fIDKontakt write SetIDKontakt;
    property IDAkte: integer read fIDAkte write SetIDAkte;
    property Position: integer read fPosition write SetPosition;
    property Zeichen: string read fZeichen write SetZeichen;
 
    { Nur lesen }
    property Adresszeile: string read fAdresszeile write fAdresszeile;
    property Adressart: string read fAdressart write fAdressart;
 
    { Nur lesen aus Color }
    property IDColor: integer read fIDColor write fIDColor;
    property Colorn: string read fColorn write fColorn;
    property Colorh: string read fColorh write fColorh;
    property Colornfont: string read fColornfont write fColornfont;
    property Colorhfont: string read fColorhfont write fColorhfont;
  end;
 
  { TAktenAdressListe }
 
  TAktenAdressListe = class(TObjectList)
  private
    procedure ReadListData(Query: string);
 
    function GetItem(AIndex: integer): TAktenAdresse;
    procedure SetItem(AIndex: integer; const AValue: TAktenAdresse);
  public
    procedure ReadAll(w: string);
    procedure ReadByAktenID(IDAkte: integer);
    procedure WriteListData(IDAkte: integer);
    procedure DeleteByID(aID: integer);
 
    property Items[AIndex: integer]: TAktenAdresse read GetItem write SetItem; default;
  end;
 
var
   AktenAdressListe: TAktenAdressListe;
 
 
implementation
 
{ TAktenAdressListe }
 
procedure TAktenAdressListe.ReadByAktenID(IDAkte: integer);
var
  w: string;
begin
  w := 'WHERE fk_akte = ' + IntToStr(IDAkte);
  ReadAll(w);
end;
 
function TAktenAdressListe.GetItem(AIndex: integer): TAktenAdresse;
begin
  Result := TAktenAdresse(inherited Items[AIndex]);
end;
 
procedure TAktenAdressListe.SetItem(AIndex: integer; const AValue: TAktenAdresse);
begin
  TAktenAdresse(inherited Items[AIndex]).CopyFrom(AValue);
end;
 
{ TAktenAdresse }
 
...
 
initialization
  AktenAdressListe := TAktenAdressListe.Create;
 
finalization
  AktenAdressListe.Free;
 
end.
Zuletzt geändert von MacWomble am 23. Sep 2019, 13:38, insgesamt 3-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
Lazarusforum e. V.
 
Beiträge: 927
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.1 v. 18.02.2020/ FP 3.3.1 Rev 2002180516 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon MacWomble » 23. Sep 2019, 07:31 Re: Problem mit Objektliste in einer Klasse

Ich habe jetzt heraus gefunden, dass der Fehler an früherer Stelle bereits ist:

Code: Alles auswählen
procedure TAktenEditor.btnAdtresseZuweisenClick(Sender: TObject);
var
  A: TAdresse;
  TempObj: TAktenAdresse;
  s: string;
  i: integer;
begin
  if ListeAdresse(A) then
  begin
    //TODO: Aktenadresse eintragen
    TempObj := TAktenAdresse.Create;
    TempObj.ID := 0;
    TempObj.IDAdresse := A.iD;
    TempObj.IDAdressart := A.IDAdressArt;
    s := A.Anrede + ' ' + A.Vorname + ' ' + A.FirmaZuname + ' ' + A.Firma2;
    TempObj.Adresszeile := s;
    TempObj.Zeichen := 'Abc';//TODO: adresszeichen abfragen !
 
    Akte.Adressen.Add(TempObj)// Wenn ich hier einen Breakpoint setze und Akte.Adressen.count abfrage, erhalte ich 3. Das ist hier richtig.
 
    FreeAndNil(TempObj);
 
 
    // TODO: Delete this
     for i := 0 to Akte.Adressen.Count - 1 do   // Die Schleife wird richtigerweise drei mal durchlaufen
       writeln(IntToStr(Akte.Adressen.Items[i].ID) + ' Adresse übernommen ' + Akte.Adressen.Items[i].Adresszeile); // und hier bekomme ich einen SIGSEGV in GetItem im dritten Durchlauf, also beim neuen Eintrag.
 


Code: Alles auswählen
function TAktenAdressListe.GetItem(AIndex: integer): TAktenAdresse;
begin
  Result := TAktenAdresse(inherited Items[AIndex]); // Der Fehler scheint genau hier aufzutreten !
end;     


Vermutlich habe ich ein Problem mit
Code: Alles auswählen
initialization
  AktenAdressListe := TAktenAdressListe.Create;
 
finalization
  AktenAdressListe.Free;


und es wird auf die AktenAdressListe anstelle von Akte.Adressen zugegriffen?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
Lazarusforum e. V.
 
Beiträge: 927
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.1 v. 18.02.2020/ FP 3.3.1 Rev 2002180516 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon fliegermichl » 23. Sep 2019, 08:45 Re: Problem mit Objektliste in einer Klasse

Hmm also ich habe jetzt keine Lust hunderte von Programmzeilen zu analysieren aber eins ist mir ins Auge gesprungen.
An dieser Stelle
Code: Alles auswählen
 
function CallAktenEditor(A: TAkte): integer;  //Hier wird eine zuvor gewählte Akte übergeben. Akte.Adressen ist noch nicht mit Daten gefüllt!
var
  F: TAktenEditor;
  i: integer;
begin
  F := TAktenEditor.Create(nil);
  try
    F.Position := poMainFormCenter;
    Akte := TAkte.Create;   // <- Hier wird eine neue Instanz von TAkte erzeugt
   Akte := A;               // <- und hier gleich mit der übergebenen Instanz überbügelt.
    Akte.FillAdressen;
    F.SetAkte;//(Akte);
    ...
 

Ich vermute mal, daß so etwas ähnliches das Problem auslöst.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 465
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon MacWomble » 23. Sep 2019, 09:48 Re: Problem mit Objektliste in einer Klasse

Du hast recht, das gefällt mir auch nicht. Das A kommt aus einer anderen Unit, und da ich dieses in der Form F benötige, habe ich 'Akte' in der aktuellen Unit erzeugt.
Könnte ich dies auch anders realisieren?
Wie kann ich 'a' in der neuen Unit bzw. der aufgerufenen Form F sichtbar machen?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
Lazarusforum e. V.
 
Beiträge: 927
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.1 v. 18.02.2020/ FP 3.3.1 Rev 2002180516 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon m.fuchs » 23. Sep 2019, 09:50 Re: Problem mit Objektliste in einer Klasse

Wenn du das A da reingegeben hast, dann ist es bereits nutzbar. Du kannst direkt darauf zugreifen und muss keine neue TAkte erzeugen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2171
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon MacWomble » 23. Sep 2019, 10:03 Re: Problem mit Objektliste in einer Klasse

Das A ist aber noch außerhalb der Form F. Oder sehe ich das falsch? Deswegen habe ich F.Akte erzeugt.
Sollte ich die Funktion CallAktenEditor in TAktenEditor.CallAktenEditor ändern, oder gibt es einen anderen Weg, das A weiter zu reichen?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
Lazarusforum e. V.
 
Beiträge: 927
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.1 v. 18.02.2020/ FP 3.3.1 Rev 2002180516 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon m.fuchs » 23. Sep 2019, 10:13 Re: Problem mit Objektliste in einer Klasse

Du kannst auch einfach eine neue Property oder Feld in dein Formular einbauen (vom Type TAkte) und diesem das A zuweisen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2171
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon fliegermichl » 23. Sep 2019, 11:06 Re: Problem mit Objektliste in einer Klasse

Wenn mit TKlasse.Create eine Instanz von TKlasse erzeugt wird, dann wird Speicher für die privaten Felder reserviert und diese mit Null Werten initialisiert. Zurückgegeben wird ein Zeiger auf die neu erzeugte Instanz.
Es spielt überhaupt keine Rolle in welcher Unit oder welchem Formular das passiert.

Du musst nur aufpassen wenn dieser Zeiger in lokalen Prozeduren erzeugt wird.
z.B.
Code: Alles auswählen
 
procedure TForm.ErzeugeObjekt;
var A : TAkte;
begin
 A := TAkte.Create;
 unit2.BearbeiteAkte(A);
end;
 


Hier wird eine Instanz der Klasse TAkte erzeugt und der lokalen Variablen A zugewiesen.
Der Aufruf von unit2.BearbeiteAkte(A) übergibt diese Variable und unit2.BearbeiteAkte kann ganz normal damit arbeiten.
Wenn jetzt jedoch die procedure ErzeugeObjekt verlassen wird, dann existiert die Instanz der Klasse immer noch, Du hast aber keinen Zugriff mehr darauf weil die lokale Variable nicht mehr existiert.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 465
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon MacWomble » 23. Sep 2019, 11:19 Re: Problem mit Objektliste in einer Klasse

So weit habe ich das ja verstanden und funktioniert es ja auch.

Ich habe eine Unit mit der Funktion 'CallAktenEditor(A: TAkte) welche ich von extern aufrufen kann. Innerhalb dieser Funktion ist A bekannt.
In CallAktenEditor erzeuge ich dynamisch eine Form F und lasse diese anzeigen. Innerhalb dieser Form F soll nun A auch bekannt sein - und hier liegt mein erstes Problem.

Wenn ich ein Property zur Form hinzufüge, kann ich das A diesem Property zuweisen. Aber dann wäre doch (der Inhalt von) A auch doppelt im Speicher?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
Lazarusforum e. V.
 
Beiträge: 927
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.1 v. 18.02.2020/ FP 3.3.1 Rev 2002180516 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon m.fuchs » 23. Sep 2019, 11:25 Re: Problem mit Objektliste in einer Klasse

MacWomble hat geschrieben:Wenn ich ein Property zur Form hinzufüge, kann ich das A diesem Property zuweisen. Aber dann wäre doch (der Inhalt von) A auch doppelt im Speicher?

Nein, mit der Zuweisung wird nur die Referenz auf ein Objekt zugewiesen. Die Objektdaten selber liegen nur einmal im Speicher vor. Das ist ja das Schöne daran. Man kann zuweisen und zuweisen ohne das Daten kopiert werden müssen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2171
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon m.fuchs » 23. Sep 2019, 11:30 Re: Problem mit Objektliste in einer Klasse

Hier noch ein kleines Beispiel zur Verdeutlichung:

Code: Alles auswählen
program ReferenzBeispiel;
{$MODE ObjFpc}
{$H+}
 
uses
  Classes, SysUtils;
 
type
  TTestClass = class(TObject)
    private
      FData: String;
    public
      property Data: String read FData write FData;
  end;
 
var
  a, b, c: TTestClass;
 
begin
  a := TTestClass.Create;
  a.Data := 'Blafasel';
  b := a;
  WriteLn(b.Data);
  c := b;
  c.Data := 'Muuuuuh';
  WriteLn(a.Data);
  FreeAndNil(a);
end.
 


Ausgabe:
Code: Alles auswählen
Blafasel
Muuuuuh
 
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2171
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon MacWomble » 23. Sep 2019, 11:44 Re: Problem mit Objektliste in einer Klasse

Soweit ist das nun auch etwas klarer.

Ich versuche das jetzt erst mal umzusetzen ....

Nachtrag: Nach dem ich einige :shock: Creates entfernt habe und die Klasse in ein Property der Form packte, bin ich nun ein gutes Stück weiter.

Vielen Dank für eure Tipps und Hilfe! :P
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
Lazarusforum e. V.
 
Beiträge: 927
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.1 v. 18.02.2020/ FP 3.3.1 Rev 2002180516 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon fliegermichl » 24. Sep 2019, 13:08 Re: Problem mit Objektliste in einer Klasse

m.fuchs hat geschrieben:var
a, b, c: TTestClass;
 
begin
a := TTestClass.Create;
a.Data := 'Blafasel';
b := a;
WriteLn(b.Data);
c := b;
c.Data := 'Muuuuuh';
WriteLn(a.Data);
FreeAndNil(a);
end.
 [/code]


Wobei man beachten muss, dass nach FreeAndNil(a) in a ein nil Zeiger steht. In b und c steht noch immer die Speichertadresse an der vorher die Klasseninstanz untergebracht war. Ein Zugriff darauf würde sofort mit einer Zugriffsverletzung quittiert.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 465
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried