![]() |
Klasse/Methoden
Habe folgendes Problem mit der Klasse vorgaben:
Wenn ich auf Gruppen zugreife, stürzt das Program ab.
Delphi-Quellcode:
[edit=Luckie]Delphi-Tags eingefügt. Mfg, Luckie[/edit]
unit UVorgaben;
interface uses UNimm,Uform2; type tvorgaben = class(tnimm) private public Gruppen : integer; Staebchen : integer; user : boolean; wert_vorgabe : boolean; constructor create; procedure set_gruppen(gruppenstr :string); end; implementation uses sysutils; constructor tvorgaben.create; begin Gruppen:=0; Staebchen:=0; user:=false; wert_vorgabe:=false; end; procedure tvorgaben.set_gruppen(gruppenstr :string); begin form2.edit1.text:= gruppenstr; gruppen:=strtoint(gruppenstr); end; end. |
Re: Klasse/Methoden
Zitat:
Das
Delphi-Quellcode:
kommt mir spanisch vor. Sollte es nicht andersrum heißen?
form2.edit1.text:= gruppenstr;
Erzeugst du die Klasse auch irgendwo, bevor du sie benutzt? Eventuell hilft mein Klassen Tutorial: ![]() |
Re: Klasse/Methoden
Das Textfeld ist nur zur Kontrolle, ob in Gruppen was drinnen steht.
In der nächsten Zeile stürzt es ab mit der Fehlermeldung, dass der Arbeitsspeicher leer ist.(FFFFFF) Ich kann zip und pdf nicht öffnen, bin in der Schule. |
Re: Klasse/Methoden
Du hast da was vergessen :zwinker:
Code:
...:cat:...
constructor tvorgaben.create;
begin [color=#f50000]inherited Create;[/color] Gruppen:=0; Staebchen:=0; user:=false; wert_vorgabe:=false; end; |
Re: Klasse/Methoden
Hi muster2002,
so wie Luckie sagt, erst die Instanz kreieren! Außerdem würde ich die Klasse klarer definieren.
Delphi-Quellcode:
Außerdem ist es nicht sehr elegant innerhalb einer Objectmethode auf eine globale Variable zuzugreifen.
type
TVorgaben = class(tnimm) private FUser: boolean; FWert_Vorgabe: boolean; FStaebchen: integer; FGruppen: integer; procedure SetGruppen(const Value: integer); procedure SetStaebchen(const Value: integer); procedure SetUser(const Value: boolean); procedure SetWert_Vorgabe(const Value: boolean); public constructor create; property Gruppen : integer read FGruppen write SetGruppen; property Staebchen : integer read FStaebchen write SetStaebchen; property user : boolean read FUser write SetUser; property wert_vorgabe : boolean, read FWert_Vorgabe write SetWert_Vorgabe; end; Das tust du in deiner Set-Methode für Form2. Hier solltest du entweder eine Variable FForm2 in deiner Klasse halten und dieses Formular in deinem Create erzeugen, oder ganz darauf verzichten. Gruß oki |
Re: Klasse/Methoden
Mit Inherited funktioniert es nicht, denn ich greife auf die Eigenschaften des Vorfahren überhaupt nicht zu.
Das zweite ist nicht der Fehler! Es werden nur Lese und Schreibrechte zugewiesen! Bitte helft mir! muster2002 |
Re: Klasse/Methoden
Hi,
inherited ist zwingend erforderlich!!!! Da ist es egal, ob du auf Vorfahren zugreifst. Da du einen eigenen Konstruktor definierst mußt du inherited create aufrufen, sonst wird keine Instanz deines Objektes erstellt. Also, mach es einfach mal und du wirst sehen das es funzt. Gruß oki |
Re: Klasse/Methoden
Moin!
Ob du auf Eigenschaften des Vorfahren zugreifst oder nicht ist doch völligst egal. Das Inherited Create muss in den Constructor rein als erstes ... Und bisher wissen wir nicht wie du auf die Klasse von aussen zugreifst, also ob du wirklich eine Instanz anlegst - was ich (und die anderen wohl auch) nicht glauben - weil sonst würde es nicht zu dieser Fehlermeldung kommen.
Delphi-Quellcode:
MfG
Var
Vorgabe : TVorgaben; Begin Vorgabe := TVorgaben.Create; // <--- !!!! Vorgabe.Staebchen := 4; Vorgabe.Gruppen := 17; Vorgabe.Free; End; Muetze1 |
Re: Klasse/Methoden
Ich habe es mit inherited ausprobiert, es liegt nicht daran.
Aber ich lasse es natürlich drin. Ich habe 2 Formulare angelegt und 2 Units. Ich habe die Klasse Vorgabe als Nachfahre von Nimm deklariert. Ich habe die Instanz erzeugt, denn ich habe auf sie zugegriffen, indem ich einfach einen Wert aus der Combobox einem Textfeld zugewiesen habe. Also muss es doch die Klasse Vorfahren geben. Aus dem Quelltext von oben: form2.edit1.text:= gruppenstr; Erst jetzt stürzt es ab: gruppen:=strtoint(gruppenstr); muster2002 P.s. Sorry, für meinen Ausdruck, aber ich bin nicht im Deutsch Leistungskurs. |
Re: Klasse/Methoden
Zitat:
Delphi-Quellcode:
uses Dialogs;
... procedure tvorgaben.set_gruppen(gruppenstr: string); begin ShowMessage(gruppenstr); //keine globalen Variablen, weniger Probleme Gruppen := StrToIntDef(gruppenstr,0); //nicht jeder string-wert ist ein gültiger Integer end; |
Re: Klasse/Methoden
Hallo,
Jetzt noch mal zum Verständnis:
Delphi-Quellcode:
Der Fehler ist in der markierten Zeile?
unit UVorgaben;
interface uses UNimm,Uform2; type tvorgaben = class(tnimm) private public Gruppen : integer; Staebchen : integer; user : boolean; wert_vorgabe : boolean; constructor create; procedure set_gruppen(gruppenstr :string); end; implementation uses sysutils; constructor tvorgaben.create; begin Gruppen:=0; Staebchen:=0; user:=false; wert_vorgabe:=false; end; procedure tvorgaben.set_gruppen(gruppenstr :string); begin form2.edit1.text:= gruppenstr; gruppen:=strtoint(gruppenstr); <--- end; end. Du hast deine Instanz nicht auf folgende Weise erzeugt?
Delphi-Quellcode:
Zumindest lässt deine Beschreibung darauf schließen. Man kann sehr wohl eine Funktion einer nicht erzeugten Instanz ausführen. Sobald du allerdings auf eine Membervariableder Klasse zugreifst, bekommst du den Fehler.
Var
Vorgabe : TVorgaben; Begin Vorgabe := TVorgaben.Create; // <--- !!!! Vorgabe.Staebchen := 4; Vorgabe.Gruppen := 17; Vorgabe.Free; End; Zeig doch mal wie du die Instanz von TVorgaben erzeugst und wie du die Prozedur set_gruppen aufrufst. grüße, daniel |
Re: Klasse/Methoden
Meine Formular Unit
Delphi-Quellcode:
unit UFormular;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls, UVorgaben, UForm2, UForm3; type TForm1 = class(TForm) Label1: TLabel; Panel1: TPanel; StringGrid1: TStringGrid; Edit1: TEdit; Edit2: TEdit; Button2: TButton; Memo1: TMemo; Button3: TButton; Button1: TButton; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen} public { Public-Deklarationen} Vorgaben : TVorgaben; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button2Click(Sender: TObject); begin form2.show; end; procedure TForm1.Button3Click(Sender: TObject); begin close; end; procedure TForm1.FormCreate(Sender: TObject); begin Vorgaben := tVorgaben.create; end; procedure TForm1.Button1Click(Sender: TObject); begin form3.show; end; end. |
Re: Klasse/Methoden
Moin!
1. Ich sehe in der Unit keinen Zugriff auf eine TVorgaben Instanz die schief gehen sollte (bzw. gar keine) 2. Hast du in TNimm auch einen Constructor definiert? Ist der Virtual? Warum hast du ihn bei TVorgabe nicht versteckt bzw. besser: überschrieben? 3. Rufst du inherited Create; im Constructor von TNimm auf, wenn du diesen überschrieben hast? MfG Muetze1 |
Re: Klasse/Methoden
Danke für die Hilfen, habe neu angefangen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 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-2025 by Thomas Breitkreuz