Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi shape1+1 ? (https://www.delphipraxis.net/42556-shape1-1-a.html)

Potestas 20. Mär 2005 19:14


shape1+1 ?
 
Hi,
folgendes Problem:
Ich habe einen Array der einen Würfel mit [x,y,z] erstellt und möchte diesen nun visualisieren.
Die Idee:
ich habe mehrere kleine shapes die ich nun nacheinander in einer Schleife anspreche und je nachdem, ob der Wert im Array false oder true ist, eine andere Farbe zuweise.
Wenn die Schleife durchläuft wir der Array immer umus diesen nun visualisieren.
Die Idee: us diesen nun visualisieren.
Die Idee: ein Feld erweitert, doch wie kann ich innerhalb einer Schleife
den Shape erweitern (wenn überhaupt möglich)
Dachte erst an so etwas:

Zitat:

var shape= TShape
-----
shape:=shape +1
shape.brush.color:=clyellow
Das geht so leider nicht.

1. Ist die Frage in der richtigen Kategorie? :dp:
2. Ist das verständlich ausgedrückt? :wiejetzt:
3. Kann mir jemand da helfen/Tipp geben .... ? :coder2:

MFG Potestas

Matze 20. Mär 2005 19:26

Re: shape1+1 ?
 
Suche mal nach Hier im Forum suchenFindComponent.

Nachtrag: Herzlich wollkommen! :hello:

Pr0g 20. Mär 2005 19:52

Re: shape1+1 ?
 
Nim eine TObjectList, damit lassen sich die Shapes besser verwalten (da du bspw. per Delete, Insert auf bestimmte Positionen zugreifen kannst und dich nicht um eine Verschiebung der anderen kümmern musst) und bei der Freigabe werden auch alle Objekte gleich mit freigegeben. Hier mal ein Beispiel:

Pack die Units "Contnrs" (TObjectList) und "ExtCtrls" (TShape) in die Uses-Klauses am Anfang deines Codes. Dann definierst du eine Variable der ObjectList:
Delphi-Quellcode:
...
  private
    { Private-Deklarationen }
    ShapeList: TObjectList;
...
Im OnCreate der Form erzeugst du die Liste und im Destroy gibst du sie wieder frei:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  //Objectlist erzeugen
  ShapeList := TObjectList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //Instanz freigeben (alle Objekte in der Liste werden mit freigegeben)
  ShapeList.Free;
end;
Nun hast du einen Button (als Beispiel) um ein paar Shapes zu erzeugen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  Shape: TShape;
begin
  //10 Shapes erzeugen
  for i := 1 to 10 do
  begin
    Shape := TShape.Create(Self);
    Shape.Parent := Self;
    Shape.Name := 'Shape' + IntToStr(i);
    Shape.Left := 10 * i + 10;
    Shape.Top := 10;
    Shape.Width := 5;
    Shape.Height := 5;
    ShapeList.Add(Shape);
  end;
end;
Jetzt kannst du ganz leicht auf die Shapes zugreifen, bspw. über einen zweiten Button:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  //auf die Shapes in der Liste zugreifen, bzw. durch
  //die Schleife auf alle
  for i := 0 to ShapeList.Count - 1 do
    TShape(ShapeList[i]).Brush.Color := clLime;
end;
MfG Pr0g

Potestas 20. Mär 2005 20:06

Re: shape1+1 ?
 
erstmal danke für die Begrüßung und die schnelle Hilfe :)
Werde mal versuchen, ob ich das so hinbekomme, denn ich arbeite erst seit knapp zwei Monat mit Delphi, aber das wird bestimmt schon :)

Also erstmal danke im vorraus, falls was nichts klar ist meld ich mich wieder :)

PS.:

"Contnrs" (TObjectList) << Datei nicht gefunden: 'Contnrs.dcu'
Benutze die Delphi 3 Version. Ist die Falsch geschrieben, oder existiert die in der 3er nicht nicht

malo 20. Mär 2005 22:53

Re: shape1+1 ?
 
Also, geschrieben ist sie richtig. Statt der TObjectList kannst du auch ein Array of TShape nehmen. Sieht in etwa so aus:

Delphi-Quellcode:
var
  ShapeArray: array[0..10] of TShape; //deklarieren

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
  for i := 0 to 10 do
    ShapeArray[i] := TShape.Create(self); // erzeugen
end;
Jetzt kannst du mit ShapeArray[i] auf die einzelnen Shapes zugreifen. ;)

Pr0g 20. Mär 2005 23:01

Re: shape1+1 ?
 
Dann aber das Freigeben nicht vergessen.

malo 20. Mär 2005 23:05

Re: shape1+1 ?
 
Zitat:

Zitat von Pr0g
Dann aber das Freigeben nicht vergessen.

stimmt. Folgendes fehlt dann noch:

Delphi-Quellcode:
TForm1.FormClose(Sender: TObject);
var i: integer;
begin
  for i := 0 to 10 do
    ShapeArray[i].Free;
end;

Christian Seehase 20. Mär 2005 23:13

Re: shape1+1 ?
 
Moin Malo,

wenn Du die Shapes so erzeugst:

Delphi-Quellcode:
ShapeArray[i] := TShape.Create(self); // erzeugen
müssen sie nicht freigegeben werden, da dies der Owner (in diesem Falle das Formular), automatisch erledigt.

malo 20. Mär 2005 23:37

Re: shape1+1 ?
 
Zitat:

Zitat von Pr0g
Dann aber das Freigeben nicht vergessen.

stimmt. Folgendes fehlt dann noch:

Delphi-Quellcode:
TForm1.FormClose(Sender: TObject);
var i: integer;
begin
  for i := 0 to 10 do
    ShapeArray[i].Free;
end;
//edit: :oops: Das kommt davon, wenn man ne halbe Stunde nicht am PC ist :mrgreen:

Pr0g 20. Mär 2005 23:40

Re: shape1+1 ?
 
Warum postest du das nach ner halben Stunden nochmal? :lol:

@Christian Seehase: Stimmt, das hatte ich nicht bedacht.

malo 20. Mär 2005 23:41

Re: shape1+1 ?
 
Zitat:

Zitat von Pr0g
Warum postest du das nach ner halben Stunden nochmal? :lol:

Ich hatte ja schon geschrieben, nur noch nicht abgeschickt :oops:

Airblader 21. Mär 2005 05:20

Re: shape1+1 ?
 
Zitat:

Zitat von malo
Zitat:

Zitat von Pr0g
Warum postest du das nach ner halben Stunden nochmal? :lol:

Ich hatte ja schon geschrieben, nur noch nicht abgeschickt :oops:

Doch, hattest du schon.
Vertrau mir, ich weiss es :zwinker: :mrgreen:

Potestas 21. Mär 2005 10:29

Re: shape1+1 ?
 
So ich habe das alles mal so eingebaut, wie es eigentlich sollte. Gibt da nur nen Problem:
Zitat:

oncreate:
ShapeArray[i] := TShape.Create(self); // erzeugen
ist das alles was er braucht, damit er die erstellt? Die Shapes werden scheinbar erstellt, doch sind nicht sichtbar.
Zitat:

//10 Shapes erzeugen
for i := 1 to 10 do
begin
Shape := TShape.Create(Self);
Shape.Parent := Self;
Shape.Name := 'Shape' + IntToStr(i);
Shape.Left := 10 * i + 10;
Shape.Top := 10;
Shape.Width := 5;
Shape.Height := 5;
ShapeList.Add(Shape);
end;
Ich hab diesen Teil nun komplett weggelassen, doch ich bin mir sicher, das sowas in der Art doch auch oben bei dem ShapeArray stehen muss ?!

malo 21. Mär 2005 10:36

Re: shape1+1 ?
 
Du kannst den Teil (fast) übernehmen. Ändere nur jedes "Shape" in "ShapeArray[i]".
Delphi-Quellcode:
 Shape.Name := 'Shape' + IntToStr(i);
und
Delphi-Quellcode:
 ShapeList.Add(Shape);
musst du nur ganz weglassen ;)

Potestas 21. Mär 2005 10:48

Re: shape1+1 ?
 
Wooooooohohoho :)
Funktioniert :)
Ihr seid die besten --> Vielen Dank an euch alle für die Tipps,Hilfe und Ausdauer
Weiß ja nun wo ich Hilfe bekomme wenn ich hänge


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 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