Von anderer Klasse aus Objekte in der TForm erstellen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
m3zz0m1x
Beiträge: 12
Registriert: Do 25. Feb 2010, 13:50

Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von m3zz0m1x »

hi also ich habe folgendes Problem, ich habe die klasse BLBrick (ein L-förmiger Tetrisstein). diese hat einen constructor, der 4 shapes, in L-förmiger Gruppierung in der tform erstellen soll (runterlaufen usw muss er erstmal ja gar nicht nur er muss DA SEIN :D

also habe ich die tshapes deklariert (aktivshape ist ein array[1..4] of Tshape) und in BLBrick.create werde sie dann erstellt. allerdings erscheinen sie nicht in der tform :( kann mri jemand sagen wie ich das hinbekomme?

Code: Alles auswählen

constructor BLBrick.create;
var i,f: integer;
begin
for i := 1 to 4 do
    begin
    activebrick[i]:=Tshape.create(Form1);
    with activebrick[i] do
         begin
              parent:= Form1;
              width:=20;
              height:=20;
              shape:= stRectangle;
              tag:=i;
              visible:=true;
              if i = 1 then f:= random(4);
              case f of
                   0: brush.color:= clred;
                   1: brush.color:= clblue;
                   2: brush.color:= cllime;
                   3: brush.color:= clyellow;
                   4: brush.color:= clFuchsia;
              end;
              case i of
                   1: begin
                      left:=200;
                      top := 60;
                      end;
                   2: begin
                      left:=200;
                      top := 80;
                      end;
                   3: begin
                      left:=200;
                      top := 100;
                      end;
                   4: begin
                      left:=220;
                      top := 800;
                      end;
              end;
         end;
    end;
end;

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von theo »

Bei mir funktioniert das. Das Problem liegt wahrsch. nicht in dem gezeigten Code.

Ein paar kleine Tipps, welche die Lesbarkeit für andere leichter machen:

Benenne Klassen mit einem T. Also TBLBrick
Benenne Felder mit einem f. Also fActiveBrick
Beginne Arrays bei 0. Also fActiveBrick: Array[0..3] of TShape;

Das findest du vielleicht pingelig, hilft dir aber auf die Dauer auch.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von Socke »

In der Regel geht man beim Erzeugen von Objekten von Oben nach Unten vor. Das heißt, dass ein Objekt alle Objekte erzeugt, die es selbst braucht und keine anderen - erst recht nicht für andere Objekte.

Bei dir wäre das also:
TForm erzeugt BLBrick.
BLBrick erzeugt TShape
usw.

Wenn BLBrick nur zum Verwalten der Shapes gedacht ist, reicht TObjekt als direkter Vorfahr aus. Wenn du aber von TComponent ableitest, können die Shapes automatisch von von deinem BLBrick freigegeben werden, wenn dieser selbst frei gegeben wird.

Code: Alles auswählen

type
BLBrick = class(TComponent)
constructor Create(TheOwner: TComponent); override;
end;
// ...
constructor BLBrick.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  FShape1 := TShape.Create(Self);  // Self -> Ein Objekt der Klasse BLBrick
  // usw. mit den anderen Shapes
end;
 
// Objekt erzeugen
procedure TForm1.ErzeugeStein;
begin
  FBLBrick1 := BLBrick.Create(Self); // Self -> Ein Objekt der Klasse TForm1; kann, muss aber nicht, das gleiche wie Form1 sein
end;
Derzeit übergibst du Form1 als Eigentümer (Owner) und dein Form gibt die Shapes auch wieder frei (wenn dies nicht vorher schon geschehen ist). Dabei verwendest du die globale Variable Form1 direkt. Für einen Anfänger (und das scheinst du zu sein, aber ich war auch mal einer :D), ist das kein großer Fehler; Objektorientiert ist das aber nicht die eleganteste Lösung (das wäre wohl TComponent).

Zu deiner Frage: Objekte werden erzeugt, Parent und Positionen gesetzt. Sollte von der Theorie her funktionieren (habs aber nicht getestet).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von lrlr »

es fehlt vielleicht einfach nur ein


FBLBrick := TBLBrick.Create;

zum testen am besten in einen ButtonOnClick..

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von mschnell »

Ist Parent korrekt gesetzt ?
Sonst sieht man nix.

-Michael
Zuletzt geändert von mschnell am Do 1. Jul 2010, 14:50, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von theo »

mschnell hat geschrieben:Ist Parent korrekt gesetzt ?
Parent ist da.
Aber was ich immer wieder loswerden muss: Das "with" Konstrukt ist meiner Meinung nach eine Quelle von Unleserlichkeit und Missverständnissen (siehe mschnell's post).
Ich würde dringend davon abraten.

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von hendy »

warum soll with schlecht sein?
Ich benutze es selber auch, hatte noch nie Probleme damit
Dankt monta !!

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von theo »

hendy hat geschrieben:warum soll with schlecht sein?
Ich benutze es selber auch, hatte noch nie Probleme damit
Kann schon sein, aber es ist trotzdem eine Fehlerquelle und v.a. unleserlich, gerade bei längerem Code.
Du müsstest eigentlich alle Properties und Methoden auswendig kennen. Allein das ist kaum möglich.

z.B:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  With PaintBox1 do
  begin
    Color:=clRed;
    Icon:=MyIcon;
  end;
end;
Dieser Code compiliert und ist richtig.
Aber du musst schon wissen, dass sich Color jetzt auf Paintbox1 und Icon auf TForm1 bezieht.
Code Completion zeigt dir nat. auch die Eigenschaften von beiden an!

Ausserdem musst du dann die TForm1 mit Self anführen.
Also Self.Color:=Color;

Es geht schon, hat aber schon oft zu Ärger geführt.

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von hendy »

ich benutze das hauptsächlich so

Code: Alles auswählen

type
Htest = record
  x,y,xsize,ysize:integer;
  andereEigenschaften:string;
end;
 
 
//blablabla
 
procedure 1;
begin
  with <instance of HTest> do
   x:= 12;
   y:=12;
   xsize:= 12;
   ysize:=4;
   andereEigenschaften := 'irgendwas';
   end;
end;
Also in selbst definierten records ^^
Dankt monta !!

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von lrlr »

ich mach auch keine with

in 2 von 100 fällen würd ich auch sagen es ist .... steht eh schon alles oben..
und die 2 fälle mach ich der "Einheitlichkeit" halber auch nicht..

in D5 hat es sich auch nicht debuggen lassen (mit maus drauf fahren, um den wert zu erfragen... das ist der hauptgrund für mich)
oder noch viel schlimmer, der falsche wert wird angezeigt... (der ohne with..)

im "akuellen" 2007 weiß ich es nicht, weil ich (wie gesagt) keine with habe ;-)

im lazarus lässt es sich mit und ohne nicht debuggen, trotzdem..

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von theo »

@hendy:
Ja, in gut kontrollierbaren, kurzen Teilen ist es vertretbar.
Aber so wie m3zz0m1x es benutzt, ist es nicht zu empfehlen.
Damit verschenkt man einfach eine Gratis-Kontrolle durch den Compiler.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von mschnell »

hendy hat geschrieben:warum soll with schlecht sein?
Ich finde with unübersichtlich, aber das ist natürlich Geschmackssache. Aber der Debugger unterstützt with nicht:

Code: Alles auswählen

var
  a: record i1, i2: integer; end;
  i1, i2: Integer;
begin
  i1:=5;
  i2:=6;
  with a do begin
    i1 := 1;
    i2 := 2;
  end;
  a.i2 := 3
  Caption:=IntToStr(a.i1)+IntToStr(a.i2)+IntToStr(i1)+IntToStr(i2);
end;
Maus über i2 im with zeigt das falsche i2. a.i2 wird korrekt gezeigt.
-Michael

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von Socke »

Das mit dem Mouseover ist ein nettes Feature, das ich noch nicht kannte. Seit wann gibts das denn?

Persönlich bevorzuge ich aber die umfangreichere Ausgabe des großen Dialoges (Start -> Prüfen/Ändern oder Strg+F7). Damit kann man mittlerweile auch Zeiger auf einen Record dereferenzieren oder ganze Objekte debuggen. Ob man dann im Quelltext mit with oder ohne schreibt, ist dann so ziemlich egal.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von lrlr »

(wir reden von delphi, oder ?)

im D5 gab es dass auf jeden fall schon ..

>Ob man dann im Quelltext mit with oder ohne schreibt, ist dann so ziemlich egal.

nich ganz, weil die markierte variable ja bei strg-F7 übernommen wird... und man sich mit "with" das selber zusammenschusern muss..

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Von anderer Klasse aus Objekte in der TForm erstellen

Beitrag von Socke »

lrlr hat geschrieben:(wir reden von delphi, oder ?)
also ich nicht :P
In meinem Delphi 7 funktioniert das MouseOver-Feature nicht; bei Strg+F7 wird nur der aktuell markierte String kopiert, nichts eindeutig Identifizierendes.
Aber hier kann man ja auch keine Objekte Debuggen...
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten