Hm, also prinzipiell müsste das denk' ich funktionieren.
Standard-Fehler bei Klassen ist wohl, dass die Instanz nicht oder nicht richtig erzeugt wurde.
In deinem Fall:
Code:
Thema:=MO_Aufgabe.Create;
Wie gesagt das ist der Standard-Fehler und obiges die Standard-Antwort dazu.
Wenn das nicht hilft, kannst du ja mal überprüfen ob die Instanz aus einem anderen Grund nicht richtig erstellt wurde. Oder du versuchst mal statt einem "Array of MO_Aufgabe" einen "Array of Integer" zum Beispiel, wobei mich das überraschen würde wenn das funktioniert. Ob der shortstring etwas damit zu tun haben kann, weiß ich auch nicht, da ich normalerweise nur strings verwende. Im zweifelsfall also mal auskommentieren.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Kann Schläfer da nur zustimmen. Ich denke auch, dass du die Klasse nicht ganz richtig erstellst. Bzw falsch benutzt. Es gehört schon einiges dazu um Delphi da aus dem Tritt zu bringen. Ich habe es noch nicht geschafft und ich versuche das seit 12 Jahren. Falls es nicht klappen sollte, dann wäre es das Beste, wenn du ein bisschen mehr Code postest. Also auch die Stellen an denen du NeueAufgabe aufrufst.
Kleine Anmerkung zum Array. Array of MO_Aufgabe oder Array of Integer sind für Delphi ziemlich gleich. Intern ist es nur ein Array auf einen 32 Bit Wert. Allerdings wenn du Klassen benutzt, dann musst du dafür sorgen, dass die Instanzen auch anständig initialisiert werden. Bzw später, dass die Instanzen auch wieder sauber freigegeben werden. Also mit anderen Worten du müsstest die Instanz die du mit MO_Aufgabe.Create; bekommst an die passende Arraystelle packen.
PS: Anstelle eines Arrays kannst du auch eine TList oder eine TObjectList benutzen. Die sind dafür da um eine unbestimmte Anzahl an Pointern oder Klassen aufnehmen zu können. Die Arrayverwaltung würde dann intern in der Klasse passieren. TObjectList besitzt aber auch die Möglichkeit die Instanzen die du hinzugefügt hast auch wieder zu löschen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Was du vorallem nicht vergessen darfst ist, wenn du das Array verlängerst auch die Instanzen in den neu erstellten Feldern zu erstellen. Standardmäßig steht da nämlich irgendein mist drin, was halt gerade in dem Speicherbereich stand, wo das Array gelandet ist.
Du müsstest also für jedes neu angelegte Array-Element auch
Code:
Aufgabe[x]:= TMO_Aufgabe.Create
ausführen (wobei x natürlich der Index des neuen Feldes ist).
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
grey hat geschrieben:
allerdings muss man das mit der zuweisung machen - nur thema.create geht nicht.
Das ist vollkommen richtig. Den Konstruktor musst du IMMER mit Klassename.Konstruktor aufrufen. Thema ist ja noch komplett leer. Du musst der Variable erst einmal irgendwas zuweisen. Und dazu solltest du einen Konstruktor aufrufen. Das geht aber nur wenn du weißt welche Klasse du haben willst. Also der Klassennamen muss bekannt sein). Also zum Beispiel TObject.Create. Dort bekommst du dann als Rückgabewert eine Instanz von TObject. Ob Ob du diese jetzt in eine Variable packst oder sonst etwas damit anstellst ist dir überlassen.
PS: Der Konstruktor muss auch nicht zwingend Create heißen. Allerdings empfielt es sich nicht den anders zu benennen. Außer man hat SEHR triftige Gründe.
Die da wären ? - mir würde spontan nur das ärgern seiner mitmenschen einfallen
werd mal nen projekt-thread eröffnen - wie ihr hier sicherlich gesehn habt (oder auch nicht ) arbeite ich nämlich grade an einem aufgabenplaner bzw projektmanagement system
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Na, ich habe z.B. den Grund, dass ich bei meinen GUI-Elementen einen Konstruktor für die automatische Erzeugung verbraten muss, die zwar geplant aber noch nicht implementiert ist. Aber den Konstruktor gibt es schon. Dieser Konstruktor heißt „Create“ und übernimmt zwei Parameter. Ich brauche für die händische Erzeugung aber einen zusätzlichen Konstruktor, der viel mehr Parameter aufnehmen muss, der heißt bei mir „CreateExt“, was soviel heißen soll wie „CreateExtended“.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja genau. So etwas ist zum Beispiel ein Grund dafür. Bei meiner glBitmap habe ich ca 6-7 Konstruktoren. Alle mittels overload gekennzeichnet nur bei einem sind die Parametertypen mit einem Anderem identisch. Also musste der einen neuen Namen bekommen.
PS: So lange der Grund für dich wichtig genug ist, dann reicht das ja auch schon aus.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Das sollte dich aber nicht am Overload hindern, oder?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Das funktioniert. Allerdings möchte ich so etwas nicht tun.
In dem Konstruktor „TTestTypeNew.Create(AName: String; AParent: TObject);“ muss der richtige geerbete Konstruktor aufgerufen werden. Wenn man jetzt nicht wirklich sattelfest ist (nicht jeder ist immer 100% leistungsfähig), nimmt man den falschen Konstruktor, nämlich den „Create“ ohne Parameter. In meinem Fall würde das zu einem Laufzeitfehler führen. Aus diesem Grund ziehe ich es vor, die Vererbung etwas deutlicher zu machen und einen anderen Namen zu vergeben, OBWOHL Du recht hast und es möglich und zulässig ist, einen überladenen Konstruktor mit dem gleichen Namen zu haben.
Der Compiler kommt nicht durcheinander, zugegeben. Aber ich vielleicht.
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.