![]() |
DynArray: array of TShape
Hallo,
bei mir kommt folgender Fehler, wenn ich ein dynamisches Array von TShape-Objekten machen möchte: [Fehler] USCtrl.pas(11): Undefinierter Bezeichner: 'TShape' Kann man keine Arrays von solchen Objekten machen? Wenn doch, wie? |
Re: DynArray: array of TShape
Hoi,
wie wärs mit bissle Code ?? |
Re: DynArray: array of TShape
Füg mal die Unit "ExtCtrls" in die Uses-Klausel ein.
|
Re: DynArray: array of TShape
Ok, danke, das hat diesen Fehler schonmal beseitigt.
Ich habe (versucht) eine Klasse zu schreiben, die in der Lage ist (so ziemlich) beliebig viele TShape-Komponenten zu erzeugen und zu verwalten. Sie enthält bis jetzt die Methoden
Delphi-Quellcode:
Die TShapes werden in einem Array gespeichert:
{ public-Teil }
procedure Move(x,y: integer; whichOne: integer = 0); { <- Position eines einzelnen oder aller Shapes verändern } procedure Del(whichOne: integer = 0); { <- Einzelne oder alle Shapes löschen } procedure Show(show: boolean = true; whichOne: integer = 0); { <- Einzelne oder alle Shapes anzeigen lassen } procedure Resize(width,height: integer; whichOne: integer = 0); { <- Größe eines einzelnen oder aller Shapes verändern } constructor Create(howMany,iWidth,iHeight: integer; { <- constructor, dem die "Startwerte" übergeben werden } BrushStyle: TBrushStyle = bsSolid; PenStyle: TPenStyle = psSolid; ParentDing: TWinControl); { <- ???} destructor Free; { <- destructor, der erst alle TShapes free't und dann die Klasse ansich }
Delphi-Quellcode:
In der Theorie sollte das funktionieren, doch ein paar Fehler sind noch drin.
{ private-Teil }
FShapeArray: array of TShape; Welchen Datentyp muss denn ParentDing im Constructor haben? Der sieht übrigends su aus:
Delphi-Quellcode:
Ich hoffe ihr könnt mir helfen...
constructor TShapeControl.Create(howMany,iWidth,iHeight: integer;
BrushStyle: TBrushStyle = bsSolid; PenStyle: TPenStyle = psSolid; Parent: TWinControl); { <- ??? } var i: integer; begin SetLength(FShapeArray, howMany); for i:=0 to high(FShapeArray) do FShapeArray[i] := TShape.Create(self); with FShapeArray[i] do begin parent := ParentDing; { <- ParentDing } height := iHeight; width := iWidth; left := 0; top := 0; brush.style := BrushStyle; pen.style := PenStyle; end; end; :dp: |
Re: DynArray: array of TShape
Moin Char,
als Parent solltest Du jedes WinControl nehmen können. Eine Kompo wird immer relativ zum Parent dargestellt. |
Re: DynArray: array of TShape
So, nun ist nurnoch ein Fehler drin:
[Fehler] USCtrl.pas(36): Inkompatible Typen: 'TComponent' und 'TSCtrl' Und zwar im Constructor wenn die einzelnen Shape-objekte erstellt werden:
Delphi-Quellcode:
Ich vermute, das ist, weil ich bei create(self) das self eben für meine Klasse TSCtrl steht, eigentlich aber etwas anderes sein sollte (ein TCOntrol eben).
constructor TShapeControl.Create(howMany,iWidth,iHeight: integer;
BrushStyle: TBrushStyle = bsSolid; PenStyle: TPenStyle = psSolid; ParentObj: TWinControl = nil); var i: integer; begin SetLength(FShapeArray, howMany); for i:=0 to high(FShapeArray) do begin FShapeArray[i] := TShape.Create(self); { <- Da ist der Fehler} with FShapeArray[i] do begin parent := ParentObj; height := iHeight; width := iWidth; left := 0; top := 0; brush.style := BrushStyle; pen.style := PenStyle; end; end; end; Mein Problem ist, dass ich überhaupt nicht weiß, warum bei TShape.create überhaupt ein Parameter angegeben werden muss, was er zu bedeuten hat und wie er in meinem Fall aussehen müsste. Genauso ist das beim Parameter meines Constructors ParentObj. Der muss nämlich einen Startwert haben. Ich hab einfach nil genommen, weil mir nichts besseres eingefallen ist. Am liebsten würde ich das so haben, dass als ParentObj standardmäßig das Hauptformular des Projektes genommen wird. Geht das? |
Re: DynArray: array of TShape
Moin Char,
von welcher Klasse ist denn TSCtrl abgeleitet? Der Owner den Du bei TShape.Create angeben sollst dient in gewisser Weise zur Resourcenverwaltung. Wird eine Komponente zerstört, die Owner für andere Objekte ist, werden diese auch zerstört. Gibst Du als Owner nil an, so musst Du selber dafür sorgen, dass die Objekt wieder freigegeben werden. |
Re: DynArray: array of TShape
TSCtrl ist selbst geschrieben (also dürfte dann von TObject abgeleitet sein).
Die Shapes werden sowieso selbst wieder zerstört, wenn das TSCtrl-Objekt gefreet wird oder fehlt da was?
Delphi-Quellcode:
destructor TShapeControl.Free;
var i: integer; begin for i:=0 to high(FShapeArray) do FShapeArray[i].Free; SetLength(FShapeArray,0); end; Also muss ich beim constructor TShape.create(nil) machen. Was muss nun als "Startwert" bei ParentObj stehen, damit TShape.parent gleich dem Hauptformular des Projektes ist? Oder geht nil da? |
Re: DynArray: array of TShape
Moin Char,
Zitat:
Delphi-Quellcode:
geschrieben hast. Das wäre dann identisch mit
type
TSCtrl = class //... end;
Delphi-Quellcode:
Den Destructor würde ich noch abwandeln:
type
TSCtrl = class(TObject) //... end;
Delphi-Quellcode:
Das inherited ist zwar bei Ableitung von TObject nicht zwingend erforderlich, da es hier nichts zu erben gibt, aber besser man gewöhnt sich dran, dann kann man es nicht so leicht vergessen, wenn es mal erforderlich ist.
destructor TShapeControl.Destroy;
var i: integer; begin for i:=0 to high(FShapeArray) do FShapeArray[i].Free; SetLength(FShapeArray,0); inherited; end; Bei dieser Konstruktion, bei der Du die Shapes selber wieder freigibst, kannst Du natürlich problemlos nil als Owner übergeben. Wenn das Hauptformular der Parent sein soll, dann solltest Du einfach dieses als Parameter im constructor übergeben. |
Re: DynArray: array of TShape
Delphi-Quellcode:
Du nimmst also Destroy statt Free. Warum? Was ist der Unterschied zu Free? Ich kenn mich damit nicht aus (merkt man sicher ;) ), aber sollte man normalerweise nicht Free benutzen?
destructor TSCtrl.Destroy;
var i: integer; begin for i:=0 to high(FShapeArray) do FShapeArray[i].Free; SetLength(FShapeArray,0); inherited; end; Was bedeutet/bewirkt inherited? Dann noch eine Frage: Wenn das Programm beendet wird, werden dann alle Objekte automatisch destroyed oder freed oder muss ich den destructor von meiner Klasse selbst aufrufen? Ich gehe von letzterem aus. Danke schonmal, es sind keine Fehler mehr zu finden. Nur eben diese Fragen noch. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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 by Thomas Breitkreuz