![]() |
Problem mit Klasse und EInvalidPointer
Also ich habe eine Klasse in einer Unit, mein Problem ist das ich einen EInvalidPointer-Fehler bekomme ohne ersichtlichen Grund. In meiner Hauptunit tue ich nicht viel ich lege ein neues Objekt der Klasse an und führe eine Funktion der Klasse aus. Ich bekomme auch eine Warnung das das Objekt möglicherweise nicht Initialisiert wurde, aber ich möchte/brauche und habe keinen Konstruktor/Dekonstruktor ?!
Diese Funktion legt die größe eines Dynamischen Arrays von einem Record fest. Das Funktioniert nur wenn ich das Array in "public" anlege, warum ? wenn ich es als private anlege funktioniert es nicht. Dabei sollte es eigendlich private sein und das die Funktion als public definiert ist sollte doch wohl auch keine Probleme machen. Ich frage mich weshalb da Object Pascal einen unterschied macht. So, also wenn ich es als public definiere komme ich wenigstens ans ende der Funktion erst wenn ich aus der Funktion wieder zurück zur Hauptunit springe kommt der Fehler und das Programm bricht ab. Also eigendlich ist es eine procedure und sie scheint auch zu funktionieren. |
Re: Problem mit Klasse und EInvalidPointer
Du musst keinen eigenen Constructor definieren. Allerdings musst du ein Objekt ganz normal mit Variable:=TKlasse.Create erstellen. Wenn du nur eine Variable hast, wird das Objekt selber noch nicht angelegt.
Delphi-Quellcode:
[edit]Zumindestens Warnungen sollte man ernst nehmen. Es sind nicht umsonst Warnungen ;)
var
myObj: TMyClass; begin myObj:=TMyClass.Create; // Mache was mit myObj // Speicher wieder freigeben. myObj.Free; |
Re: Problem mit Klasse und EInvalidPointer
danke schonmal für die schnelle Antwort
also ich hab das jetzt eingebunden was du gesagt hast aber der fehler kommt leider immernoch. |
Re: Problem mit Klasse und EInvalidPointer
Tja, dann. Quellcode her. Wahrsagen können wir nicht ;)
|
Re: Problem mit Klasse und EInvalidPointer
HI!
Herzlich Willkommen in der DP. Wie sieht denn dein Quellcode im Moment aus? Poste ihn am besten mal hier. Ciao Frederic |
Re: Problem mit Klasse und EInvalidPointer
ok also hier die Klasse (auszugsweise)
Delphi-Quellcode:
so und hier die unit die die klasse aufruft
unit Bricks;
interface uses SysUtils, IniFiles; type brick = record x, y : Integer; // x, y Position des Bricks (auf dem Bildschirm) world_y : Integer; // die y Welt koordinate w, h : Integer; // die Breite und Höhe, Breite muss durch 16 teilbar sein (...) end; {* Diese Klasse ist für das Anlegen, Zeichnen und Bewegen der * Bricks zuständig. *} TBricks = class private {* zugriff auf die Brick INI Datei *} iniFile : TIniFile; public {* In diesem dynamischen Array von Bricks sind alle Bricks gespeichert *} bricks : Array of brick; {* läd die INI Datei im Filename, legt entsprächend viele bricks an und * speichert die Daten in dem bricks Array *} procedure CreateFromINI(Filename : String); end; implementation {* läd die INI Datei im Filename, legt entsprächend viele bricks an und * speichert die Daten in dem bricks Array *} procedure TBricks.CreateFromINI(Filename : String); var i,i2 : Integer; i2str : String; begin iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0))+Filename); Write('Suche Bricks in '+Filename+'...'); // suche nach Bricks in Datei und speichere die Anzahl in i i := 1; while iniFile.ReadString('brick'+IntToStr(i), 'x', 'NULL') <> 'NULL' do Inc(i); Dec(i); Writeln(IntToStr(i)+' Brick gefunden'); // um Speicherleaks zu vermeiden wird setLength nur einmal aufgerufen setLength(bricks,i); Write('Speichere Bricks in dynamisches Array...'); for i2 := 1 to i do begin i2str := IntToStr(i2); bricks[i2].x := StrToInt(iniFile.ReadString('brick'+i2str, 'x', '0')); bricks[i2].world_y := StrToInt(iniFile.ReadString('brick'+i2str, 'world_y', '0')); bricks[i2].w := StrToInt(iniFile.ReadString('brick'+i2str, 'w', '0')); bricks[i2].h := StrToInt(iniFile.ReadString('brick'+i2str, 'h', '0')); (...) end; Writeln('done'); iniFile.Free; end; end.
Delphi-Quellcode:
program main;
{$APPTYPE CONSOLE} uses SysUtils, Bricks in 'Bricks.pas'; var OBricks : TBricks; begin { TODO -oUser -cConsole Main : Hier Code einfügen } OBricks:=TBricks.Create; OBricks.CreateFromINI('bricks.ini'); OBricks.Free; end. |
Re: Problem mit Klasse und EInvalidPointer
dynamische Arrays in Delphi beginnen bei 0. Du musst also deine Schleife ändern:
for i2 := 0 to i-1 do |
Re: Problem mit Klasse und EInvalidPointer
das wars dann wohl jetzt funktionierts ! also big thx !
Irgendwie ist das mit den Arrays in Delphi ziemlich verwirrend. Normalerweise programmiere ich in C/C++ nur jetzt halt weil ich das in meiner Ausbildung lerne und da haben sie uns erzählt das Delphi bei Arrays mit 1 anfängt zu zählen. Naja wie auch immer jetzt funzt es ja. Das ging ja echt mal schnell mit der Lösung meines Problems. Tolle Community ich hoffe das ich auch irgendwann mal was dazu beitragen kann :) |
Re: Problem mit Klasse und EInvalidPointer
Zitat:
Bei statischen Arrays mag das stimmen, da man dort den Index selber festlegen kann. z.B.:
Delphi-Quellcode:
Dann würde der Index auch tatsächlich erst bei eins anfangen. Aber in allen anderen Fällen mit 0.
type
TTestArray = Array[1..10] of Integer Nicht das da jemand Delphi mit VB verwechselt hat :roll2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz