AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DynArray: array of TShape

Ein Thema von Char · begonnen am 21. Okt 2003 · letzter Beitrag vom 22. Okt 2003
Antwort Antwort
Seite 1 von 2  1 2      
Char

Registriert seit: 17. Okt 2003
21 Beiträge
 
#1

DynArray: array of TShape

  Alt 21. Okt 2003, 17:45
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?
  Mit Zitat antworten Zitat
Benutzerbild von RomanK
RomanK

Registriert seit: 7. Jun 2002
Ort: Kirchheim unter Teck
1.036 Beiträge
 
Delphi 7 Personal
 
#2

Re: DynArray: array of TShape

  Alt 21. Okt 2003, 17:47
Hoi,
wie wärs mit bissle Code ??
Roman Keller
Krieg ist Gottes Art den Amerikanern Geographie beizubringen!
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#3

Re: DynArray: array of TShape

  Alt 21. Okt 2003, 17:48
Füg mal die Unit "ExtCtrls" in die Uses-Klausel ein.
Alexander
  Mit Zitat antworten Zitat
Char

Registriert seit: 17. Okt 2003
21 Beiträge
 
#4

Re: DynArray: array of TShape

  Alt 21. Okt 2003, 18:06
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:
{ 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 }
Die TShapes werden in einem Array gespeichert:

Delphi-Quellcode:
{ private-Teil }
 FShapeArray: array of TShape;
In der Theorie sollte das funktionieren, doch ein paar Fehler sind noch drin.

Welchen Datentyp muss denn ParentDing im Constructor haben?

Der sieht übrigends su aus:

Delphi-Quellcode:
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;
Ich hoffe ihr könnt mir helfen...

  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: DynArray: array of TShape

  Alt 21. Okt 2003, 19:01
Moin Char,

als Parent solltest Du jedes WinControl nehmen können.
Eine Kompo wird immer relativ zum Parent dargestellt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Char

Registriert seit: 17. Okt 2003
21 Beiträge
 
#6

Re: DynArray: array of TShape

  Alt 22. Okt 2003, 11:35
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:
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;
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).

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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: DynArray: array of TShape

  Alt 22. Okt 2003, 11:42
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Char

Registriert seit: 17. Okt 2003
21 Beiträge
 
#8

Re: DynArray: array of TShape

  Alt 22. Okt 2003, 13:26
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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: DynArray: array of TShape

  Alt 22. Okt 2003, 14:00
Moin Char,

Zitat von Char:
TSCtrl ist selbst geschrieben (also dürfte dann von TObject abgeleitet sein).
Dann vermute ich mal, dass Du

Delphi-Quellcode:
type
  TSCtrl = class
  //...
  end;
geschrieben hast. Das wäre dann identisch mit

Delphi-Quellcode:
type
  TSCtrl = class(TObject)
  //...
  end;
Den Destructor würde ich noch abwandeln:

Delphi-Quellcode:
destructor TShapeControl.Destroy;
var i: integer;
begin

for i:=0 to high(FShapeArray) do
  FShapeArray[i].Free;

SetLength(FShapeArray,0);
inherited;
end;
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.

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Char

Registriert seit: 17. Okt 2003
21 Beiträge
 
#10

Re: DynArray: array of TShape

  Alt 22. Okt 2003, 14:50
Delphi-Quellcode:
destructor TSCtrl.Destroy;
var i: integer;
begin

for i:=0 to high(FShapeArray) do
  FShapeArray[i].Free;

SetLength(FShapeArray,0);
inherited;
end;
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?

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz