Zugriffsverletzung bei einem Objekt in TCombobox

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
MelSch
Beiträge: 4
Registriert: Mi 27. Mai 2015, 19:00
OS, Lazarus, FPC: Win 8/8.1/10, 1.4.x, 2.6.4 (Laz. & FPC meistens aktuell)
CPU-Target: 64Bit
Wohnort: Duisburg
Kontaktdaten:

Zugriffsverletzung bei einem Objekt in TCombobox

Beitrag von MelSch »

Hi Leute,

dies hier ist mein erster Post. Ich bin momentan dabei ein Schallplattenverwaltungsprogramm zu erstellen und möchte in einer Combobox die möglichen Zustandsbeschreibungen der Schallplatten (Mint, Very Good, Good, Worn, Fair) speichern... klappt auch. Ich füge aber mittels der Prozedur...

Code: Alles auswählen

procedure TfrmMain.AddSingleStatement(ACaption, AText: String; ACombobox: TComboBox);
var
  LObject: TObject;
begin
  LObject := TObject(AText);
  ACombobox.Items.AddObject(ACaption, LObject);
end;


...auch ein Objekt hinzu. Etwas dirty, aber in einem Fall funktioniert es ja auch. Doch bei den o.g. Beispiel füge ich als Objekt die jeweilige ID aus der Datenbanktabelle hinzu, also: M, VG, G, W, F. Also übergebe ich Praktisch als Beispiel

Code: Alles auswählen

AddSingleStatement('Very Good', 'VG', cbQualityStates)


doch beim Aufrufen von

Code: Alles auswählen

String(cbQualityStates.Items.Objects[cbQualityStates.ItemIndex])


wirft mir Lazarus eine Zugriffsverletzung SIVGSEV....

Sorry, wenn das unklar ausgedrückt ist :( könnte mir dennoch jemand weiterhelfen? Ich verzweifle! Notfalls gebe ich auch weitere Quellcodeauszüge raus.

Vielen Dank :)
Zuletzt geändert von MelSch am Mi 3. Jun 2015, 10:47, insgesamt 1-mal geändert.
Alles lief nach Plan - doch der Plan war schlecht

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Zugriffsverletzung beim einem Objekt in TCombobox

Beitrag von m.fuchs »

Tja, da stimmt dann wohl etwas nicht mit der ganzen Casterei. Ich könnte mich jedes Mal übergeben, wenn ich sowas sehe. Bau dir doch ein sauberes Datenobjekt, welches du an das entsprechende Item hängst und gut ist es.
Und ein paar Checks um sicherzustellen, dass sich wirklich das richtige in dem Objekt befindet könnten auch nicht schaden.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zugriffsverletzung beim einem Objekt in TCombobox

Beitrag von mse »

MelSch hat geschrieben:

Code: Alles auswählen

procedure TfrmMain.AddSingleStatement(ACaption, AText: String; ACombobox: TComboBox);
var
  LObject: TObject;
begin
  LObject := TObject(AText); <<<<<<-----
 


"AText" ist vom Typ "string". "string" ist in der Standardeinstellung = AnsiString, ein pointer auf die Struktur TAnsiRec (rtl/inc/astrings.inc):

Code: Alles auswählen

 
{
  This file contains the implementation of the AnsiString type,
  and all things that are needed for it.
  AnsiString is defined as a 'silent' pchar :
  a pchar that points to :
 
  @-8  : SizeInt for reference count;
  @-4  : SizeInt for size;
  @    : String + Terminating #0;
  Pchar(Ansistring) is a valid typecast.
  So AS[i] is converted to the address @AS+i-1.
 
  Constants should be assigned a reference count of -1
  Meaning that they can't be disposed of.
}

 
Type
  PAnsiRec = ^TAnsiRec;
  TAnsiRec = Packed Record
    Ref,
    Len   : SizeInt;
    First : Char;
  end;
 

"AnsiString" ist referenzgezählt, der Compiler gibt den Speicher frei, sobald die Daten nicht mehr benötigt werden. "LObject := TObject(AText)" wird vom Compiler nur deshalb akzeptiert, da TObject ebenfalls ein pointer ist, allerdings ein pointer auf etwas ganz anderes...
Meinst du vielleicht

Code: Alles auswählen

 
LObject := Tmeinobject.create(AText);
 

?

MelSch
Beiträge: 4
Registriert: Mi 27. Mai 2015, 19:00
OS, Lazarus, FPC: Win 8/8.1/10, 1.4.x, 2.6.4 (Laz. & FPC meistens aktuell)
CPU-Target: 64Bit
Wohnort: Duisburg
Kontaktdaten:

Re: Zugriffsverletzung beim einem Objekt in TCombobox

Beitrag von MelSch »

Vielen Dank für eure Tipps, werde ich dann mal umsetzen :)
Finde es echt cool, wenn sich Leute direkt mit meinem Problem auseinandersetzen und mir helfen, Danke!! :)
Alles lief nach Plan - doch der Plan war schlecht

MelSch
Beiträge: 4
Registriert: Mi 27. Mai 2015, 19:00
OS, Lazarus, FPC: Win 8/8.1/10, 1.4.x, 2.6.4 (Laz. & FPC meistens aktuell)
CPU-Target: 64Bit
Wohnort: Duisburg
Kontaktdaten:

Re: Zugriffsverletzung beim einem Objekt in TCombobox

Beitrag von MelSch »

Zur Info: Das mit dem eigenen Objekt hat funktioniert ;) ist ja echt voll easy :lol:
Alles lief nach Plan - doch der Plan war schlecht

Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Zugriffsverletzung beim einem Objekt in TCombobox

Beitrag von Warf »

An sich müsste dein Code allerdings auch funktionieren, bzw bei mir funktioniert es auch super, ich wüsste auch nicht warum es nicht funktionieren sollte, der Cast in ein TObject ist ja dennoch ein Pointer, egal ob das jetzt TObject, String oder simpel Pointer ist, es ändert ja nichts daran dass auch an dieser Stelle der Referenzzähler greift und merkt: Ahh hier war eine Zuweisung. Dem Ref Zähler ist ja egal ob es gecastet ist oder nicht.

Den Referenzzähler kann man nur mit tricks, sowas wie Move umgehen. Dein Fehler muss irgendwo anders liegen, denn bei mir funktioniert das ganze Einwand frei.

Besitzt du zufällig Items die Ohne Objekt hinzugefügt wurden, oder veränderst du die Objekte an anderer Stelle nocheinmal?

MelSch
Beiträge: 4
Registriert: Mi 27. Mai 2015, 19:00
OS, Lazarus, FPC: Win 8/8.1/10, 1.4.x, 2.6.4 (Laz. & FPC meistens aktuell)
CPU-Target: 64Bit
Wohnort: Duisburg
Kontaktdaten:

Re: Zugriffsverletzung beim einem Objekt in TCombobox

Beitrag von MelSch »

Hey, sorry dass ich jetzt erst antworte. Nein, ich erstelle die Items nur über die Funktion AddSingleStatement, also bekommt jedes Item ein Objekt zugewiesen. Geändert werden die Objekte nicht, lediglich wird beim Auswählen der TabSheets halt als "Refresh" die Comboboxen geleert und neu gefüllt (also Items + Objects). Habe mich selbst dumm und dämlich gesucht, aber keine Stelle gefunden, die verdächtig klingt.

Hatte mir ja deshalb (wie mir geraten wurde) ein eigenes Objekt TDBObjectInfo gebastelt, welches die Infos aufnimmt und als Objekt für jedes Item übergeben wird. Funktioniert top! :mrgreen:
Alles lief nach Plan - doch der Plan war schlecht

Antworten