Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Neue Klasse und im constructor Access Violation
hui1991 - Fr 03.08.07 16:21
Titel: Neue Klasse und im constructor Access Violation
Hallo,
ich habe mal versucht Variablen zuerstellen während der Laufzeit, dies habe ich mit Array und TStringlist geschafft, etz hat die Klasse aber ein Problem beim Create. Es macht ein Error. So sieht der Abschnitt aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| type TValueTyp = Byte;
const StringValue: TValueTyp = 1; IntegerValue: TValueTyp = 2; DoubleValue: TValueTyp = 3;
type EWrongVariable = class(Exception); EWrongVariableTyp = class(Exception);
type TTypValues = Pointer;
type TTypValue = record Typen: TValueTyp; end;
type TFeldInteger = record FTyp: TTypValue; FFeld: Integer; end;
type TFeldExtended = record FTyp: TTypValue; FFeld: Double; end;
type TFeldString = record FTyp: TTypValue; FFeld: string; end;
type TFeld = record FFeldInteger: array of TFeldInteger; FFeldExtended: array of TFeldExtended; FFeldString: array of TFeldString; end;
type TMyList = class private FName: TStrings; FFeld: TFeld; public constructor Create; procedure Create2; procedure Free; function Count: Integer; procedure Add(TypValue: TValueTyp; NewValue: TTypValues; ValueName: string); procedure Delete(ValueName: string); procedure Clear; function GetStringValue(ValueName: string): string; function GetExtendedValue(ValueName: string): Double; function GetIntegerValue(ValueName: string): Integer; procedure SetValue(NewValue: TTypValues; ValueName: string); end; |
Das hier ist der Constructor:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| constructor TMyList.Create; begin inherited; try FName := TStringlist.Create; SetLength(FFeld.FFeldInteger, 0); SetLength(FFeld.FFeldExtended, 0); SetLength(FFeld.FFeldString, 0); except ShowMessage('Zum Teufel nochmal warum kommt dieser Fehler?!'); end; end; |
Das komische, wenn ich alles weg mache also das nur noch das hier da ist:
Delphi-Quelltext
1: 2: 3: 4:
| constructor TMyList.Create; begin end; |
Da ich keine passenden Begriffe habe, kann ich nirgends suchen :(
Ich verzweifle schon dran, ich möchte weiter proggen, blos dieser Create Fehler versaut mir alles.
Alles was ich machen will, hängt mit dieser Klasse zusammen :(
Ich brauche eure hilfe.
MfG
hui1991
Moderiert von
Christian S.: b- durch highlight-Tags ersetzt
Narses - Fr 03.08.07 17:13
Moin!
Hier mein Testprojekt mit deinem (Kern-)Code, allerdings etwas berichtigt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
const StringValue = 1; IntegerValue = 2; DoubleValue = 3;
type EWrongVariable = class(Exception); EWrongVariableTyp = class(Exception);
TValueTyp = Byte;
TTypValues = Pointer;
TTypValue = record Typen: TValueTyp; end;
TFeldInteger = record FTyp: TTypValue; FFeld: Integer; end;
TFeldExtended = record FTyp: TTypValue; FFeld: Double; end;
TFeldString = record FTyp: TTypValue; FFeld: string; end;
TFeld = record FFeldInteger: array of TFeldInteger; FFeldExtended: array of TFeldExtended; FFeldString: array of TFeldString; end;
TMyList = class private FName: TStrings; FFeld: TFeld; public constructor Create; destructor Destroy; override; end;
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
constructor TMyList.Create; begin inherited Create; try FName := TStringlist.Create; SetLength(FFeld.FFeldInteger, 0); SetLength(FFeld.FFeldExtended, 0); SetLength(FFeld.FFeldString, 0); except ShowMessage('Zum Teufel nochmal warum kommt dieser Fehler?!'); end; end;
destructor TMyList.Destroy; begin FFeld.FFeldString := NIL; FFeld.FFeldExtended := NIL; FFeld.FFeldInteger := NIL; FName.Free; inherited; end;
procedure TForm1.Button1Click(Sender: TObject); var tmp: TMyList; begin tmp := TMyList.Create; tmp.Free; end;
end. |
So funktioniert´s jedenfalls; keine Exception beim Klick auf den Button. :nixweiss:
Tipp: Wenn du eine TStringList anlegst, dann solltest du auch eine solche Deklarieren, statt TStrings. :idea:
cu
Narses
hui1991 - Fr 03.08.07 18:10
Hi,
also ich hab alles so gemacht wie du und alles eingebunden blos beim Create vom TStringlist kommt bei mir immernoch eine Zugriffsverletzung :(
Ich weis net was der Fehler ist. Könnte das am OpenGL liegen das mit eingebunden ist?
Ich werde das mal in ein anderes Projekt stecken. Schauen was dann passiert.
Ergebniss, hier ist alles in ein neues Projekt gepackt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
const StringValue = 1; IntegerValue = 2; DoubleValue = 3;
type EWrongVariable = class(Exception); EWrongVariableTyp = class(Exception);
TValueTyp = Byte;
TTypValues = Pointer;
TTypValue = record Typen: TValueTyp; end;
TFeldInteger = record FTyp: TTypValue; FFeld: Integer; end;
TFeldExtended = record FTyp: TTypValue; FFeld: Double; end;
TFeldString = record FTyp: TTypValue; FFeld: string; end;
TFeld = record FFeldInteger: array of TFeldInteger; FFeldExtended: array of TFeldExtended; FFeldString: array of TFeldString; end;
TMyList = class(TObject) private FName: TStrings; FFeld: TFeld; public constructor Create; destructor Destroy; override; end;
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1; liste: TMyList; PIntegerV: Integer; PStringV: String; PDoubleV: Double;
implementation
{$R *.dfm}
destructor TMyList.Destroy; begin FFeld.FFeldString := NIL; FFeld.FFeldExtended := NIL; FFeld.FFeldInteger := NIL; FName.Free; inherited; end;
constructor TMyList.Create; begin inherited Create; try FName := TStringlist.Create; SetLength(FFeld.FFeldInteger, 0); SetLength(FFeld.FFeldExtended, 0); SetLength(FFeld.FFeldString, 0); except ShowMessage('Zum Teufel nochmal warum kommt dieser Fehler'); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin liste.Create; end;
end. |
Das sollte eigentlich genau gleich sein wie von dir. Blos der Fehler ist immernoch beim
FName := TStringlist.Create;
Das lustige ist, wenn ich das auskommentiere ist es auf der Zeile mit
SetLength(FFeld.FFeldInteger, 0);.
Zeigt mir den Fehler, ich finde ihn leider nicht :(
Das Teil sollte doch gleich sein wie von dir :(
Hab das komplett mal als Archiv im Zipformat angehängt.
MfG
hui1991
Narses - Fr 03.08.07 19:57
Moin!
hui1991 hat folgendes geschrieben: |
Zeigt mir den Fehler, ich finde ihn leider nicht |
Aber gerne doch: :)
hui1991 hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.FormCreate(Sender: TObject); begin liste := TMyList.Create; end; | |
"Kaum macht man´s richtig, geht´s!" :mahn: ;)
cu
Narses
hui1991 - Fr 03.08.07 20:44
Vielen Dank,
ich sollte lieber ein Programm erstellen das es vergleicht, blos naja ist auch Arbeit.
Vllt. mal genauer code vergleichen ^^
Naja kleiner Fehler -> große Wirkung
MfG
hui1991
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!