![]() |
Problem mit Tpbject
Hi,
hab wieder einmal ein Problem mit einer selbst konstuierten Klasse.
Delphi-Quellcode:
Sobald ich die Form schliesse (habe vorher den Button gedrückt) bekomme ich eine Zugriffsverletzung.
unit Uarray;
interface uses math; TYPE Tarray=class(tobject) private arr:array of integer; maximum,minimum:integer; procedure setl(a:integer); function Maxa:integer; function Mina:integer; public { Public-Deklarationen } procedure assign(arr0:array of integer); end; implementation procedure Tarray.assign(arr0:array of integer); var n:integer; begin setl(length(arr0)); For n:=0 to length(arr0)-1 do arr[n]:=arr0[n]; Maxa; MinA end; procedure Tarray.setl(a:integer); begin setlength(arr,a); end; function Tarray.Maxa:integer; begin maximum:=MaxIntValue(arr); end; function Tarray.Mina:integer; begin minimum:=MinIntValue(arr); end; end. procedure TForm1.Button1Click(Sender: TObject); var s:tarray;t:array[1..1000] of integer; begin s.Create; s.assign(t); s.Free; end; Kommentiere ich s.assign(t); aus so verschwindet mein Button von der Hauptform, sobald ich ihn gedrückt habe.... Versteh überhaupt nichts mehr. Viele Grüsse! |
Re: Problem mit Tpbject
Delphi-Quellcode:
:zwinker:
s := TArray.Create();
|
Re: Problem mit Tpbject
wie erzeugt man ein Object?
Delphi-Quellcode:
so jedenfalls nicht :zwinker:
s.Create;
[edit] menno :cry: |
Re: Problem mit Tpbject
Wäre soetwas nicht auch beim debuggen aufgefallen? Dafür ist es gedacht.
|
Re: Problem mit Tpbject
Hi,
ich bin ein solchiges Rindvieh! Vielen Dank! Worker: der Debugger meckert überhaupt nicht, ansonsten hätte ich den Beitrag nicht geschrieben. |
Re: Problem mit Tpbject
Zitat:
Zitat:
Ich schrieb, dass dieses Problem beim debuggen hätte auffallen müssen, wenn man sich das Objekt, das man vermeintlich erzeugt hat, im Debugger anschaut. Hättest Du die Maus über die Objektvariable geführt, dann hättest Du gesehen, dass Dein Objekt aus einer willkürlichen Anzahl willkürlicher Werte besteht - und da kann dann ja wohl etwas bei der Instanziierung nicht ganz korrekt gelaufen sein, oder?! ![]() |
Re: Problem mit Tpbject
der Debugger würde hier nur meckern (wäre schön wenn das ginge),
wenn man die Funktion bzw. den Constructor so markieren könnte/würde, daß diese nicht über eine Objekt-Variable aufrufbar wäre. |
Re: Problem mit Tpbject
Ich kann dir nur empfehlen ein const vor dem Array Parameter im Assign() zu schreiben, damit Delphi beim Aufruf nicht erstmal dein riesiges Array kopieren muss...
|
Re: Problem mit Tpbject
@R2009: Könntest du dem Thema bitte einen aussagekräftigeren Titel geben der das Problem wenigstens ansatzweise beschreibt? :)
|
Re: Problem mit Tpbject
Nein,
1.) das Problem war zu Anfang überhaupt nicht fassbar, somit ist der Titel in Ordnung. 2.) Das Problem hat sich erledigt. 3.) Ich weiss nicht wie man den Titel ändert. Viele Grüsse |
Re: Problem mit Tpbject
Deine Assign-Methode ist auch falsch; ich hab das mal verbessert:
Delphi-Quellcode:
TYPE
Tarray=class(TPersistent) private arr:array of integer; maximum,minimum:integer; procedure setl(a:integer); function Maxa:integer; function Mina:integer; public { Public-Deklarationen } procedure Assign(Source: TPersistent); override; end; implementation procedure Tarray.Assign(Source: TPersistent); var n:integer; begin if Source is Tarray then begin // arr := Copy(TArray(Source).arr, 0, length(TArray(Source).arr)-1); arr := Slice(TArray(Source).arr, length(TArray(Source).arr)-1); end else inherited; end; |
Re: Problem mit Tpbject
Zitat:
Man sich ohne Problem sein eigenes System inklusive Assign() bauen ohne auch nur TPersistent zu verwenden. Das maximale was man hätte sagen können an der originalen Implementierung, dass er lieben einen Typ beim Parameter verwenden sollte (TIntegerDynArray aus Types z.B. oder eigener Type) und Assign() für Erweiterungen virtual zu machen. Aber das mit TPersistent sehe ich nicht ein und vor allem das die nicht Nutzung von TPersistent hier als falsch gebrandmarkt wird. /EDIT: und zu deiner nun "richtigen" Version auch mal ein paar Anmerkungen: - warum gibst du bei Copy() noch Anfang und Ende an? Bei einer Array Kopie ist dies nicht möglich, dafür gibt es Slice(). Bei Copy mit Array gibt es nur einen möglichen Parameter: das Quell-Array. - warum verwendest du Slice() wo du doch keinen Teilabschnitt haben willst vom Original? Der Slice() Code ist entsprechend aufwendiger als Copy |
Re: Problem mit Tpbject
Hi shmia,
falsch ist wohl relativ. Hab halt Tobject verwendet. Das aus gutem Grund. In diesem Fall ist mein eigenes assign völlig korrekt. Aber jetzt zu deiner Lösung:
Delphi-Quellcode:
Fehlermeldung beim compilieren. Slice erlaubt nur Open array element!
procedure Tarray.Assign(Source: TPersistent);
var n:integer; begin if Source is Tarray then begin arr := Slice(TArray(Source).arr, length(TArray(Source).arr)-1) <<<---------------------- Sort; Maxa; MinA; kleinster_fehlender_Wert:=Min_wert; end else inherited; end; Vielen dank und viele Grüsse |
Re: Problem mit Tpbject
Zitat:
Ich sag mal wenn man irgendwo eine Methode Assign nennt, dann muss man im Universum der VCL auch richtig machen. (wird ja immer wieder falsch gemacht, weil das Prinzip dahinter nicht ganz einfach ist) Man darf natürlich jederzeit eigene Zuweisungsmethoden schreiben, dann sollte man aber nicht direkt den Namen Assign verwenden:
Delphi-Quellcode:
Mit dem Vorschlag oben, geht die Klasse sowohl konform mit den Regeln der VCL
TYPE
TIntArray = array of integer; // oder gleich TIntegerDynArray Tarray=class(TPersistent) private arr:TIntArray; maximum,minimum:integer; procedure setl(a:integer); function Maxa:integer; function Mina:integer; public { Public-Deklarationen } procedure Assign(Source: TPersistent); override; procedure AssignArrray(const value:TIntArray); end; und erfüllt ausserdem die Forderung, dass man auch Arrays zuweisen kann.
Delphi-Quellcode:
Was jetzt noch fehlt, sind zwei weitere Konstruktoren:
var
a, b : Tarray; test : TIntArray; begin a := Tarray.Create; b := Tarray.Create; setLength(test, 3); test[0] := 7; test[1] := 23; test[2] := 29; a.AssignArray(test); b.Assign(a); // b enthält jetzt den Inhalt von "test"
Delphi-Quellcode:
constructor Create; overload;
constructor Create(const AArray:Tarray); overload; // das ist ein sogenannter Copy-Konstruktor constructor Create(const AArray:TIntArray); overload; |
Re: Problem mit Tpbject
Zitat:
Zitat:
Zitat:
Zitat:
Grundlegend: Der Delphi Compiler kann objekt-orientierten Code übersetzen und dabei gelten nur die Regeln die dieser definiert. Dabei gibt es bis auf die paar Schlüsselwörter und Basisklasse TObject (was optional ist bei der Angabe) nichts weiter zu beachten. Alles was man dann implementiert oder nennt ist in seinem eigenen Interesse. /EDIT: Zitat:
Vor allem da man sich für ein sauberere OOP Konzept diese überladenen Konstruktoren sparen sollte, stellen sie nichts anderes dar als eine Zusammenfassung des Standardkonstruktoraufrufs und anschliessendem Assign() Aufruf. Wenn du nun schon Assign() implementierst, dann brauchst du keine überladenen Konstruktoren mehr. Vor allem sehe ich auch hier nicht ein, dass dieses als "fehlend" gekennzeichnet wird. Die fehlen ganz und gar nicht. Die sind überflüssig und erschweren jede weitere Ableitung. |
Re: Problem mit Tpbject
Hi Leute,
bleibt ruhig ihr braucht doch deswegen nicht zu streiten. Muetze, obwohl ich auf deiner Seite stehe, dein Ton ist schon etwas rau. Shmia: wenn du schon meinen Code korrigierst dann solltest du das auch so machen, dass es funktioniert. Viele Grüsse, danke und ruhig bleiben! |
Re: Problem mit Tpbject
@R2009
[OT] Vielleicht solltest auch Du mal an Deinem Ton arbeiten. 1. Wenn ein Moderator Dich bittet, den Titel Deines Beitrages zu ändern, dann solltest Du Dir das auch zu Herzen nehmen, denn diese Bitte kommt wohl kaum ohne Grund - und wenn es nur um die Korrektur Deiner Rechtschreibfehler ginge.... Aber unter 'Problem mit Tpbject' kann man sich in der Tat sehr viel oder sehr wenig vorstellen. Etwas präzisieren hätte man es wohl können, oder? Oder willst Du damit erreichen, dass möglichst viele Leute Deinen Thread lesen, um herauszufinden, um was es geht? 2. Zitat:
Du versuchst hier im Forum, Leute, die irgendetwas falsch machen, zu bekehren, bist aber selber keinen Deut besser und kannst dann nichteinmal Dein Fehlverhalten eingestehen, wenn man (ein Moderator) Dich darauf aufmerksam macht. [/OT] |
Re: Problem mit Tpbject
Hi worker,
wenn du etwas gegen mich hast machen wir das bitte ausserhalb des Threads ab. Viele Grüsse |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 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