AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung beim Freigeben von Objekten

Ein Thema von stifflersmom · begonnen am 20. Feb 2018 · letzter Beitrag vom 22. Feb 2018
Antwort Antwort
Seite 1 von 2  1 2      
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Zugriffsverletzung beim Freigeben von Objekten

  Alt 20. Feb 2018, 08:33
Moin,
ich seh hier gerade meinen Fehler nicht, vielleicht schubst mich mal jemand in die richtige Richtung.

Ich fülle eine ComboBox mit einem erstellten Objekt und addObject. Das und der Zugriff darauf funktionieren, so weit ich das sehe, einwandfrei.
Aber in meiner Routine zum Freigeben des Speichers beim Schließen des Formulars knallts... aber warum?

Das Objekt:
Code:
type
  TGenericArticleModule = class
  private
    fCaption: string;
    fBg_Nr: Integer;
    property caption: string read fCaption;
    property Bg_nr: Integer read fBg_Nr;
    constructor Create(const caption: string; const bg_nr: Integer);
  end;
Das Hinzufügen zur Combobox:
Code:
procedure TfGenericArticle.GetModules;
var
  gaModule: TGenericArticleModule;
  sAssemblyGroup: string;
  iBg_nr: Integer;
begin
  if q_Work.Active then
    q_work.Close;
  q_work.SQL.Text := sSql_GenericArticleModule;
  q_work.Open;
  while not q_work.Eof do
    begin
      sAssemblyGroup := q_work.FieldByName('assembly_group_description').AsString;
      iBg_nr := q_work.fieldByname('bg_nr').AsInteger;
      gaModule := TGenericArticleModule.Create(sAssemblyGroup, iBg_nr);
      cb_module.Items.AddObject(sAssemblyGroup, gaModule);
      q_work.Next;
    end;
  if q_work.Active then
    q_work.Free;
end;
Und hier die Routine zum Freigeben des Speichers, wird beim Close des Formulars aufgerufen:
Code:
procedure TfGenericArticle.FreeObjects(targetList: Tstrings);
var
  I: Integer;
begin
  for I := targetList.Count - 1 downto 0 do
    targetList.Objects[i].Free;
end;

procedure TfGenericArticle.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  FreeObjects(cb_module.Items); // Hier kommt die Zugriffsverletzung
end;
Für einen kleinen Tipp wär ich dankbar
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
240 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 20. Feb 2018, 08:39
Hallo,

Dafür wäre der Event OnDestroy praktischer - OnCloseQuery ist eigentlich nur eine Voranfrage und kommt nochmal wenn CanClose false ist.

Ich würde auch noch targetList.Clear aufrufen damit nicht aus versehen die Objekte nochmal abgemeldet werden.

Grüsse,
Julian
.
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 20. Feb 2018, 09:03
Das wars leider nicht.
Knallt immer nocht bei:
Code:
 for I := targetList.Count - 1 downto 0 do
    targetList.Objects[i].Free;
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 20. Feb 2018, 09:08
Am besten mal mit dem Debugger durchgehen und checken, ob nicht evtl. cb_module, cb_module.items oder eines
der Objekte selbst bereits freigegeben wurden.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 20. Feb 2018, 09:15
Das Hinzufügen zur Combobox:
Code:
procedure TfGenericArticle.GetModules;
var
  gaModule: TGenericArticleModule;
  sAssemblyGroup: string;
  iBg_nr: Integer;
begin
  if q_Work.Active then
    q_work.Close;
  q_work.SQL.Text := sSql_GenericArticleModule;
  q_work.Open;
  while not q_work.Eof do
    begin
      sAssemblyGroup := q_work.FieldByName('assembly_group_description').AsString;
      iBg_nr := q_work.fieldByname('bg_nr').AsInteger;
      gaModule := TGenericArticleModule.Create(sAssemblyGroup, iBg_nr);
      cb_module.Items.AddObject(sAssemblyGroup, gaModule);
      q_work.Next;
    end;
  if q_work.Active then
    q_work.Free;
end;
mal was ganz anders: Warum steht da am Ende q_work.Free? Wo wird die erstellt?

Das wars leider nicht.
Knallt immer nocht bei:
Code:
 for I := targetList.Count - 1 downto 0 do
    targetList.Objects[i].Free;
wo genau? bei allen Objekten? nur beim ersten (targetList.Count - 1) nur beim letzten (0)?
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 20. Feb 2018, 09:22
Das q_work.free war Quatsch, hatte ich auch schon gesehen, aber das ist nicht das Problem.

Un knallen tut es definitiv nicht beim ersten Objekt das freigegeben wird, eher so gegen/am Ende der Liste.
ich bin gerade am schauen, ghostwalker hatte auch schon den Tip zu schauen ob ich nicht schon vorher was von den Objekten "gefreet" habe.
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 20. Feb 2018, 09:27
Habs jetzt gefunden und Ghostwalker hatte Recht:
Beim Change der combobox hatte ich eine Variable vom typ TGenericArticleModule deklariert und versehentlich freigegeben.
Hatte aber auch nicht gedacht, dass ich mit der lokalen Variable ein Objekt der Liste in der comboBox rausschmeißen kann.

Nun mach ich es so und alles ist gut:
Code:
procedure TfGenericArticle.cb_moduleChange(Sender: TObject);
var
  sAssemblyGroup:String;
  iBg_Nr:Integer;
begin
  if cb_module.ItemIndex > -1 then
    begin
      sAssemblyGroup :=(cb_module.Items.Objects[cb_module.ItemIndex] as TGenericArticleModule).fCaption;
      iBg_Nr :=(cb_module.Items.Objects[cb_module.ItemIndex] as TGenericArticleModule).fBg_Nr;
      pn_filter.Caption := format('module: %s, BG_NR: %d', [sAssemblyGroup, iBg_Nr]);
    end;
end;
Danke auf jeden Fall!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 20. Feb 2018, 10:08
Delphi-Quellcode:
procedure TfGenericArticle.FreeObjects(targetList: Tstrings);
var
  I: Integer;
begin
  for I := targetList.Count - 1 downto 0 do
    targetList.Objects[i].Free;
  targetList.Clear; ///////////////
end;
Was passiert wohl, wenn das öfters ausgeführt wird?
Und stört es niemanden, wenn jemand das Schließen abbricht, die Form offen lässt, aber dennoch alles weg ist?

Warum keine ObjectList oder ein Dictionary, welche die Objekte selbstständig freigeben, wenn man das Item löscht?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 22. Feb 2018, 08:49
Das fragte ich mich gerade auch.
Nun mach ich es so und alles ist gut
Eben nicht. Das ist unsauberer uncleaner code. Sowas ist fehleranfällig.
Generell sollte man Objects nie verwenden.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Zugriffsverletzung beim Freigeben von Objekten

  Alt 22. Feb 2018, 09:15
.
Generell sollte man Objects nie verwenden.
kannst Du das etwas näher erläutern?
  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 17:24 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