AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Kann auf Funktion nicht zugreifen obwohl Objekt erstellt...
Thema durchsuchen
Ansicht
Themen-Optionen

Kann auf Funktion nicht zugreifen obwohl Objekt erstellt...

Ein Thema von Andreas L. · begonnen am 6. Nov 2008 · letzter Beitrag vom 6. Nov 2008
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

Kann auf Funktion nicht zugreifen obwohl Objekt erstellt...

  Alt 6. Nov 2008, 16:06
Hi,

wenn ich auf die Funktion Count meiner ObjectList zugreife bekomme ich folgende Access Violation

Zitat:
---------------------------
XXX
---------------------------
Zugriffsverletzung bei Adresse 0045EFB4 in Modul 'XXX.exe'. Lesen von Adresse 00000030.
---------------------------
OK
---------------------------
Hier der Code:

Delphi-Quellcode:
unit XXX;

interface

uses
  SysUtils, Classes, ContNrs, IniFiles, XXXUtils;

type
  { forward declarations }
  TStores = class;
  TStore = class;

  TXXX = class(TComponent)
  private
    FStores: TStores;
  protected
    { Protected-Deklarationen }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure LoadFromFile(FileName: String);
    procedure SaveToFile(FileName: String);
    property Stores: TStores read FStores;
  published
    { Published-Deklarationen }
  end;

  TStores = class(TComponent)
  private
    FStores: TObjectList;
  protected
    procedure SetStore(Index: Integer; Value: TStore);
    function GetStore(Index: Integer):TStore;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function Add:Integer;
    function Count:Integer;
    procedure Delete(Index: Integer);
    property Stores[Index: Integer]: TStore read GetStore write SetStore; default;
  end;

  TStore = class(TComponent)
  private
    FName: String;
    FAdress: String;
    FWebsite: String;
    FFavorite: Boolean;
    FTelephone: String;
  published
    property Name: String read FName write FName;
    property Adress: String read FAdress write FAdress;
    property Website: String read FWebsite write FWebsite;
    property Favorite: Boolean read FFavorite write FFavorite;
    property Telephone: String read FTelephone write FTelephone;
  end;

implementation

{ TXXX }
constructor TXXX.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FStores := TStores.Create(Self);
end;

destructor TXXX.Destroy;
begin
  FStores.Free;
  inherited Destroy;
end;

procedure TXXX.LoadFromFile(FileName: string);
var
  ini: TMemIniFile;
  i: Integer;
begin
  ini := TMemIniFile.Create(FileName);

  //read stores
  for i := 0 to ini.ReadInteger('Stores', 'Count', 0) -1 do
  begin
    with Stores[Stores.Add] do
    begin
      Name := ini.ReadString('Stores', 'Name' + IntToStr(i), '');
      Adress := UnEscapeLineBreaks(ini.ReadString('Stores', 'Adress' + IntToStr(i), ''));
      Website := ini.ReadString('Stores', 'Website' + IntToStr(i), '');
      Favorite := ini.ReadBool('Stores', 'Favorite' + IntToStr(i), False);
      Telephone := ini.ReadString('Stores', 'Telephone' + IntToStr(i), '');
    end;
  end;

  ini.Free;
end;

procedure TXXX.SaveToFile(FileName: string);
var
  ini: TMemIniFile;
  i: Integer;
begin
  ini := TMemIniFile.Create(FileName);
  ini.Clear;

  //write stores
  ini.WriteInteger('Stores', 'Count', Stores.Count);
  for i := 0 to Stores.Count -1 do
  begin
    with Stores[i] do
    begin
      ini.WriteString('Stores', 'Name' + IntTostr(i), Name);
      ini.WriteString('Stores', 'Adress' + IntTostr(i), Adress);
      ini.WriteString('Stores', 'Website' + IntTostr(i), Website);
      ini.WriteBool('Stores', 'Favorite' + IntToStr(i), Favorite);
      ini.WriteString('Stores', 'Telephone' + IntTostr(i), Telephone);
    end;
  end;

  ini.UpdateFile;
  ini.Free;
end;

{ TStores }
constructor TStores.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FStores := TObjectList.Create;
end;

destructor TStores.Destroy;
begin
  FStores.Free;
  inherited Destroy;
end;

procedure TStores.SetStore(Index: Integer; Value: TStore);
begin
  FStores[Index] := Value;
end;

function TStores.GetStore(Index: Integer):TStore;
begin
  Result := FStores[Index] as TStore;
end;

function TStores.Add:Integer;
var
  NewStore: TStore;
begin
  NewStore := TStore.Create(Self);
  Result := FStores.Add(NewStore);
end;

function TStores.Count:Integer;
begin
  Result := FStores.Count;
end;

procedure TStores.Delete(Index: Integer);
begin
  FStores.Delete(Index);
end;

end.
FStores wird doch ordentlich erstellt, warum kann ich auf Count nicht zugreifen?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Kann auf Funktion nicht zugreifen obwohl Objekt erstellt

  Alt 6. Nov 2008, 16:27
Zitat:
with Stores[Stores.Add] do
Müsste das nichtwith FStores[Stores.Add] do heißen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#3

Re: Kann auf Funktion nicht zugreifen obwohl Objekt erstellt

  Alt 6. Nov 2008, 19:34
Zitat von DeddyH:
Zitat:
with Stores[Stores.Add] do
Müsste das nichtwith FStores[Stores.Add] do heißen?
Ich steuer die Eigenschaft Stores halt direkt an und nicht über die Variable. Denke nicht das, dass falsch ist, oder?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Kann auf Funktion nicht zugreifen obwohl Objekt erstellt

  Alt 6. Nov 2008, 19:37
In welcher Zeile genau kommt die Meldung? Und hast du mal einen Haltepunkt gesetzt und die verschiedenen Objecte in die Watchlist gepackt?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#5

Re: Kann auf Funktion nicht zugreifen obwohl Objekt erstellt

  Alt 6. Nov 2008, 19:41
Zitat von SirThornberry:
In welcher Zeile genau kommt die Meldung? Und hast du mal einen Haltepunkt gesetzt und die verschiedenen Objecte in die Watchlist gepackt?
Beim Aufruf von FStores.Count kommt der Fehler.
Delphi-Quellcode:
function TStores.Count:Integer;
begin
  Result := FStores.Count;
end;
Wie soll mir die Liste der überwachten Ausdrücke helfen?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Kann auf Funktion nicht zugreifen obwohl Objekt erstellt

  Alt 6. Nov 2008, 19:44
Und an welcher Stelle rufst du das auf?
Die Liste der überwachten Ausdrücke soll dir in soweit helfen das du siehst welche Objecte und darin enthaltenen Objecte instanziert sind. Denn deine Zugriffsverletzung deutet sehr darauf hinn das auf ein nicht instanziertes Object zugegriffen wird.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#7

Re: Kann auf Funktion nicht zugreifen obwohl Objekt erstellt

  Alt 6. Nov 2008, 19:53
Der Fehler tritt beim Aufruf von SaveToFile auf. Beim überwachen von FStores wird mir folgendes angezeigt:
Zitat:
E2003 Undefinierter Bezeichner: 'FStores'
In meinem Demo-Programm (welches die SaveToFile-Routine aufruft) wird aber zuvor mit Add und Delete was hinzugefügt bzw. entfernt. Also muss FStores existieren.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Kann auf Funktion nicht zugreifen obwohl Objekt erstellt

  Alt 6. Nov 2008, 20:00
Und wenn du wie Detlef schon bemerkt hast direkt auf das Feld und nicht auf die Property zugreifst?
Markus Kinzler
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#9

Re: Kann auf Funktion nicht zugreifen obwohl Objekt erstellt

  Alt 6. Nov 2008, 20:04
Fehler gefunden. Hab im Demoprojekt die Instanz meiner Komponente zuerst als lokale Variable erzeugt und dann auf global umgestellt. Dabei hab ich vergessen die lokalen Variablen zu entfernen... *mehr Kaffee brauch*
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:44 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