PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Klassenproblem in Delphi


Einfachkrank
2004-01-03, 17:13:26
Hi,

Mein Problem: Ich habe mir eine total simple Klasse mit zwei Prozeduren geschrieben und drei Variablen. Wenn ich mir im Programm jetzt ein Instanz anlege und auf deren Variablen zugreifen möchte, kommt aber ein Windows Speicherfehler, als wäre kein Speicher für sie bereitgestellt worden, aber sie sind statisch angelegt...
Muss ich bei Delphi noch zusätzlich was wegen Konstruktoren bedenken, oder an was liegt das?

MFG Einfachkrank

Xmas@home
2004-01-03, 17:19:48
Original geschrieben von Einfachkrank
Hi,

Mein Problem: Ich habe mir eine total simple Klasse mit zwei Prozeduren geschrieben und drei Variablen. Wenn ich mir im Programm jetzt ein Instanz anlege und auf deren Variablen zugreifen möchte, kommt aber ein Windows Speicherfehler, als wäre kein Speicher für sie bereitgestellt worden, aber sie sind statisch angelegt...
Muss ich bei Delphi noch zusätzlich was wegen Konstruktoren bedenken, oder an was liegt das?

MFG Einfachkrank
Variablen welchen Typs?

Einfachkrank
2004-01-03, 18:42:09
Original geschrieben von Xmas@home
Variablen welchen Typs?
Einfacher Integer:

CAndPart = class
x, y: integer;
color: integer;
procedure MoveTo(nx, ny: integer);
procedure Draw;
end;


// ...
procedure CAndPart.MoveTo(nx, ny: integer);
begin
x := nx;
y := ny;
end;
// ...
Und wenn ich die Prozedur MoveTo aufrufe, hängt sich das Programm mit einer Speicherfehlermeldung an der Stelle auf, an der er x einen neuen Wert zuweisen will...

EDIT: Ach, ich hab dasselbe auch mal in ner Konsolen Anwendung ausprobiert, aber da funktioniert das ganze. Es gibt nur Problem wenn ich diese Klasse in ner normalen Windows Anwendung von Delphi nutze.

Darkstar
2004-01-03, 22:42:29
Original geschrieben von Einfachkrank Und wenn ich die Prozedur MoveTo aufrufe, hängt sich das Programm mit einer Speicherfehlermeldung an der Stelle auf, an der er x einen neuen Wert zuweisen will...Klingt für mich so, als wäre die Instanz der Klasse – aus was für Gründen auch immer – nicht vorhanden.

Einfachkrank
2004-01-04, 13:01:42
Original geschrieben von Darkstar
Klingt für mich so, als wäre die Instanz der Klasse – aus was für Gründen auch immer – nicht vorhanden.
Genau, das dacht ich auch schon, aber jetzt kommts noch besser. Ich habe mir anstatt einer statischen Klasse einen Pointer angelegt und diesen dann am Programmanfang eben mit new() initialisiert und am Programmende wieder mit dispose() gelöscht. Jetzt liesen sich den Variablen x und y Werte zuweisen, aber nicht der Variable color...
Ich raff das net. Ich glaub ich installier meinen Compiler mal neu :)

Einfachkrank
2004-01-04, 19:14:57
Hat jemand ne Idee?

Crushinator
2004-01-05, 12:05:34
Kannst Du bitte einen Ausschnitt von Deinem Code, am Besten á la "Hello World" inkl. Initialisierung bzw. Instanzierung posten?

Einfachkrank
2004-01-05, 17:04:11
Da gibts eigentlich nicht viel! Hab einfache eine neue Anwendung mit Delphi 5.0 angelegt in die automatisch erzeugte unit1.pas die Klasse CAndPart geschrieben:

CAndPart = class
x, y: integer;
color: integer;
procedure MoveTo(nx, ny: integer);
procedure Draw;
end;


// ...
procedure CAndPart.MoveTo(nx, ny: integer);
begin
x := nx;
y := ny;
end;
Die Draw Funktion ist nichts besonderes und so weit kommt das Programm eh nicht...
Dann hab ich einfach eine Instanz so angelegt:

var
// ...
Test: CAndPart;
Mehr ist es nicht. Und wie gesagt, der Compiler macht gar keine Fehlermeldungen(logischerweise, da das Programm läuft), aber wenn einer Variable der Klasse ein Wert zugewiesen werden soll, hängt sich das Programm auf...
Die Funktion MoveTo rufe ich einfach über einen Ok-Button so auf:
procedure TMainWindow.btTestClick(Sender: TObject);
begin
Test.MoveTo(10, 10);
Test.Draw;
end;

Darkstar
2004-01-05, 17:41:34
Geht es vielleicht so?
var
// Objekt deklarieren
Test: CAndPart;

begin
// Objekt erzeugen
Test:= CAndPart.Create;



// Objekt freigeben
Test.Free; // alternativ: FreeAndNil(Test);
end;

Crushinator
2004-01-05, 19:57:36
@Einfachkrank

Test: CAndPart;

bedeutet, daß Du nur ein Zeiger vom Typ CAndPart deklariert hast. Er muß natürlich erst durch "Test := CAndPart.Create;" auf die richtige Adresse (der Instanz) gesetzt werden, bevor man die Elemente benutzen kann. Am Ende sollte man ihn auch wieder mit .Free freigeben.

Das, was DarkStar gepostet hat wäre z.B. absolut richtig.

Xmas
2004-01-05, 20:22:12
Die übliche C++-Umsteiger-Krankheit ;)

Einfachkrank
2004-01-06, 01:06:58
Jaaaaa! Wie geil - so gehts wirklich.

@Xmas
Zum Glück ist es kein Umstieg, sondern nur eine vorübergehende Umstellung ;) ich vertrage das Delphi nicht so gut wie gutes altes C/C++, wobei Delphi schon nicht schlecht ist.