Autor Beitrag
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: So 26.04.15 20:19 
also erst muss ich formdestroy aufrufen, dass die gelöscht werden (oder sind die das dann schon? o.O) und dann muss ich ja eigentlich meiner meinung nach nur wieder mit der schleife von 0 bis N-1 die SHapes erzeugen wie am anfang davor auch also so oder so
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  Shape := TShape.Create(self); // Shape-Objekt erzeugen, als Eigentümer das Formular (=Self) angeben
    Shape.Parent := Self; // das neue Shape soll auf dem Formular (=Self) angezeigt werden
    snr := x +y *N +1;
    Shape.Name := 'Shape'+inttostr(snr); // Name der Komponente
    Shape.Left := 10+x*25;
    Shape.Top := 80+y*25;
    Shape.Width := 25;
    Shape.Height := 25;
    Shape.OnMouseDown := @Shape1MouseDown; // so weist man eine Methode zu
    FeldShape[x,y] := Shape;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 26.04.15 20:31 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
also erst muss ich formdestroy aufrufen, dass die gelöscht werden
FormDestroy aufrufen ist nicht so schlau - jedenfalls dann nicht, wenn du das Formular noch weiter nutzen möchtest. :P

Aber du kannst einen Button "btnShapesLoeschen" anlegen und das darüber abwickeln (also dann im FormDestory den Buttonhandler aufrufen, so wie wir das bei Lesen/Schreiben auch gemacht haben; das kannst du dann auch für die neue Idee nutzen). :nixweiss: Dann kann man zwischendurch auch mal (zum Entwickeln! später muss der Button natürlich wieder aus der Formular raus!) so anklicken zum Testen. ;)

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
(oder sind die das dann schon? o.O) und dann muss ich ja eigentlich meiner meinung nach nur wieder mit der schleife von 0 bis N-1 die SHapes erzeugen wie am anfang davor auch
Jup. Auch hier: wie wäre es mit einem Button "btnShapesAnlegen"? :zwinker:

Wir haben aber noch ein ganz anderes, richtig krasses Problem... :? schon gefunden? :lupe:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: So 26.04.15 20:39 
also das shapeanlegen funktioniert schon mal :)

in den andern prozeduren wussten die ja nicht was N jetzt ist, also hab ich überall N := TrackBar1.Position; eingefügt

und bei dem löschbutton überlege ich grad noch

Moderiert von user profile iconNarses: Beiträge zusammengefasst

al ich hab das jetzt so gemacht
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
 procedure TForm1.btnShapesanlegenClick(Sender: TObject);
var snr,y,x : integer;
    shape : TShape;
begin
  btnShapesLoeschenClick(self);
  N := TrackBar1.Position; // N vorbelegen (wird ja gleich benutzt)
  ClientHeight := N*25+100// nach oben verschoben
  ClientWidth := N*25+20;
  for y := 0 to N-1 do
   for x := 0 to N-1 do begin
    Shape := TShape.Create(self); // Shape-Objekt erzeugen, als Eigentümer das Formular (=Self) angeben
    Shape.Parent := Self; // das neue Shape soll auf dem Formular (=Self) angezeigt werden
    snr := x +y *N +1;
    Shape.Name := 'Shape'+inttostr(snr); // Name der Komponente
    Shape.Left := 10+x*25;
    Shape.Top := 80+y*25;
    Shape.Width := 25;
    Shape.Height := 25;
    Shape.OnMouseDown := @Shape1MouseDown; // so weist man eine Methode zu
    FeldShape[x,y] := Shape;
   end;

end;

procedure TForm1.btnShapesLoeschenClick(Sender: TObject);
var y, x: Integer;
begin
    for y := 0 to Nmax-1 do
    for x := 0 to Nmax-1 do begin
      if Assigned(FeldShape[x,y]) then begin // mit Assigned() kann man prüfen, ob einer (Zeiger-)Variablen ein Wert zugewiesen ist
        FeldShape[x,y].Free; // Komponente freigeben
        FeldShape[x,y] := nil// Referenz entfernen
      end;
   end;
end;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 27.04.15 11:16 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
also das shapeanlegen funktioniert schon mal :)
Naja, wenn du die Shapes selbst freigeben willst (was wir ja nun für das Ändern der Größe tun müssen), dann darfst du hier nicht "Self" übergeben, sondern "nil": :!:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.btnShapesanlegenClick(Sender: TObject);
//...
  for y := 0 to N-1 do
   for x := 0 to N-1 do begin
    Shape := TShape.Create(self); // das hier geht nicht, wenn man die Shapes selbst freigeben will!
    Shape.Parent := Self; // das neue Shape soll auf dem Formular (=Self) angezeigt werden

Wenn du Komponenten dem Formular übergibst (=wenn du "Self" in die Klammern schreibst), dann kann das üble Folgen haben, wenn du das Programm beendest (Exceptions etc.) und vorher diese Komponenten selbst freigegeben hast! :idea:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
in den andern prozeduren wussten die ja nicht was N jetzt ist, also hab ich überall N := TrackBar1.Position; eingefügt
Eigentlich muss das nur an zwei Stellen hin: im FormCreate (zum Vorbelegen beim Programmstart) und dann beim Erzeugen der neuen Shapes. :gruebel: Was genau meinst du also mit "überall"? :lupe: :nixweiss:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
al ich hab das jetzt so gemacht
Sieht schonmal gar nicht schlecht aus. :zustimm:

Zeig doch nochmal bitte deine FormCreate und FormDestroy-Methoden. :les:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 28.04.15 13:46 
Moin!

Wie sieht´s aus? :lupe: Probleme? 8) Egal was du machst, ob mit Self oder nil als Parameter für die Shape-Erzeugung - es gibt immer irgendwo Exceptions? :P Könnte das der Grund sein, wieso hier so viel Stille herrscht... ? :zwinker:

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Wir haben aber noch ein ganz anderes, richtig krasses Problem... :? schon gefunden? :lupe:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Di 28.04.15 20:24 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
procedure TForm1.FormCreate(Sender: TObject);
var snr,y,x : integer;
    shape : TShape;
begin
  trackbar1.Max := NMax;
  N := TrackBar1.Position;
  ClientHeight := N*25+100;
  ClientWidth := 620;
  for y := 0 to N-1 do
   for x := 0 to N-1 do begin
    Shape := TShape.Create(Nil);
    Shape.Parent := Self;
    snr := x +y *N +1;
    Shape.Name := 'Shape'+inttostr(snr);
    Shape.Left := 10+x*25;
    Shape.Top := 80+y*25;
    Shape.Width := 25;
    Shape.Height := 25;
    Shape.OnMouseDown := @Shape1MouseDown;
    FeldShape[x,y] := Shape;
   end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
  var
    y, x: Integer;
begin
  for y := 0 to Nmax-1 do
    for x := 0 to Nmax-1 do begin
      if Assigned(FeldShape[x,y]) then begin
        FeldShape[x,y].Free;
        FeldShape[x,y] := nil;
      end;
   end;
end;

also das wären erstmal formcreate und formdestroy, aber die exceptions nerven halt total
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 28.04.15 20:50 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
also das wären erstmal formcreate und formdestroy,
OK, danke. Aber hattest du nicht bereits Buttons für die Funktionalität (Shapes anlegen/löschen) erstellt? Dann kannst du doch den Button-Click-Handler aufrufen. ;) (und musst den Code nicht zweimal schreiben :idea:)

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
aber die exceptions nerven halt total
Wir müssen ein "nil" übergeben, da führt kein Weg dran vorbei, sonst dürfen wir die Shapes nicht freigeben. :nixweiss: Also müssen wir die Ursache für die Exceptions suchen. Dazu sollten wir erstmal rausfinden, wann die denn ganz genau auftreten (normalerweise hilft die IDE dir ja und zeigt die Stelle im Code :think:). Wo passiert´s denn? :lupe:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Mo 04.05.15 20:59 
ausblenden Delphi-Quelltext
1:
  if (Shape.Brush.Color = clBlack) then					

die zeile ruft das auf also in der lesenprozedure
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btnLesenClick(Sender: TObject);
var x, y, snr: Integer;
    Shape: TShape;
begin
  N := TrackBar1.Position;
    for y := 0 to N-1 do
        for x := 0 to N-1 do begin
            snr := x +y *N +1;
            Shape := TShape(FindComponent('Shape' +IntToStr(snr)));
            if (Shape.Brush.Color = clBlack) then
               Feld[x,y] := True
            else
               Feld[x,y] := False;
        end;
end;


und das mit dem formdestroy/create dann so? O.o
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TForm1.FormCreate(Sender: TObject);
var snr,y,x : integer;
    shape : TShape;
begin
  trackbar1.Max := NMax;
  N := TrackBar1.Position;
  ClientHeight := N*25+100;
  ClientWidth := 620;
  for y := 0 to N-1 do
   for x := 0 to N-1 do begin
    Shape := TShape.Create(Nil);
    Shape.Parent := Self;
    snr := x +y *N +1;
    Shape.Name := 'Shape'+inttostr(snr);
    Shape.Left := 10+x*25;
    Shape.Top := 80+y*25;
    Shape.Width := 25;
    Shape.Height := 25;
    Shape.OnMouseDown := @Shape1MouseDown;
    FeldShape[x,y] := Shape;
   end;
  btnShapesAnlegenClick(self)
end;

procedure TForm1.FormDestroy(Sender: TObject);
  var
    y, x: Integer;
begin
  for y := 0 to Nmax-1 do
    for x := 0 to Nmax-1 do begin
      if Assigned(FeldShape[x,y]) then begin
        FeldShape[x,y].Free;
        FeldShape[x,y] := nil;
      end;
   end;
  btnShapesLoeschenClick(self);
end;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 04.05.15 22:11 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
  if (Shape.Brush.Color = clBlack) then					
die zeile ruft das auf also in der lesenprozedure
Ja, genau. Hier wird eine Exception geworfen, weil hier:
ausblenden Delphi-Quelltext
1:
Shape := TShape(FindComponent('Shape' +IntToStr(snr)));					
das Shape nicht mehr gefunden wird (FindComponent liefert dann ein nil = nicht gefunden zurück). :idea: Aber warum? :gruebel: Ganz einfach: da wir beim Erzeugen des Shapes nil übergeben haben, gehört die Komponente nun wirklich uns und nicht mehr dem Formular - da (=im Formular) sucht FindComponent aber.

Wie kommen wir nun weiter? Ganz einfach, wir heben doch schon eine Referenz auf die Shapes in FeldShape auf, dann können wir diese ebenfalls nutzen, um auf die Shapes zuzugreifen, statt über den Namen der Komponente jedes mal danach suchen zu müssen. :think: Ganz konkret also so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.btnLesenClick(Sender: TObject);
  var
    x, y: Integer;
begin
  for y := 0 to N-1 do
    for x := 0 to N-1 do
      if (FeldShape[x,y].Brush.Color = clBlack) then // direkt auf das Shape zu greifen, statt erst danach zu suchen ;)
        Feld[x,y] := True
      else
        Feld[x,y] := False;
end;




user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
und das mit dem formdestroy/create dann so? O.o
Eher nicht. :? Nochmal kurz zur Erinnerung, was wir an dieser Stelle mit den Buttons tun: das ist ein Zwischenschritt, um die Funktionalität (Shapes erstellen/löschen) zum Testen auch mal so zwischendurch probieren zu können. Du solltest also das, was eigentlich getan werden muss, in den Button-Handler verlagern und dann in den Formularmethoden nur noch aufrufen. Konkret:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.btnShapesAnlegenClick(Sender: TObject);
  var
    x, y: Integer;
begin
  N := TrackBar1.Position;
  for y := 0 to N-1 do
    for x := 0 to N-1 do begin
      FeldShape[x,y] := TShape.Create(Nil); // die Hilfsvariable "Shape" können wir uns sparen, wenn wir direkt das FeldShape nehmen ;)
      FeldShape[x,y].Parent := Self; // und den Namen brauchen wir auch nicht mehr, wir suchen ja nicht mehr danach
      FeldShape[x,y].Left := 10+x*25;
      FeldShape[x,y].Top := 80+y*25;
      FeldShape[x,y].Width := 25;
      FeldShape[x,y].Height := 25;
      FeldShape[x,y].OnMouseDown := @Shape1MouseDown;
    end;
end;

Und dann im FormCreate nur noch:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Trackbar1.Max := NMax;
  ClientHeight := N*25+100;
  ClientWidth := 620;
  btnShapesAnlegenClick(self);
end;


Deine Aufgaben sind nun:
  • Die FindComponent-Aufrufe durch direkte Zugriffe auf FeldShape[] zu ersetzen (damit wir die Exceptions loswerden)
  • Den Button-Handler btnShapesLoeschenClick() analog zum Erstellen der Shapes umschreiben
  • FormDestroy "bereinigen"

Dann sollte es eigentlich keine Exceptions mehr geben und wir sind bereit für den letzten Schritt: Reaktion auf Änderung der Trackbar. ;)

Dann leg mal los. :zustimm:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Mo 18.05.15 12:16 
So jetzt hab ich endlich mal daran gedacht, hier wieder zu schreiben. Zur Zeit komme ich einfach nicht mehr zum programmieren, vielleicht später mal wieder, und das Projekt habe ich schon vor einiger Zeit mit dem damaligen Stand abgegeben. Deshalb möchte ich mich noch mal sehr bedanken für deine Hilfe.

Für diesen Beitrag haben gedankt: FinnO, Mathematiker, Narses, ub60
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 18.05.15 22:48 
Hat da Forum eine Chance zu erfahren, ob das Ergebnis Deiner Mühe und im weiteren Sinne der Mühe vieler hier dem kritischen Blicke Deines Fachlehrers standhielt (=Benotung), liebe Nini?

Sicher wird das nicht nur diejenigen interessieren, die sich so rührend Deiner annahmen. Dein Erscheinen hier im Forum führte nicht nur zu einer neuen Dialogform - der reinen Tutor-Zögling-Beziehung -, sondern auch zur Auslagerung ursprünglich bei Dir angesiedelten "peripheren", dafür dann aber umso hitzigeren Meinungstausches.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Mo 08.06.15 20:56 
Heute habe ich jetzt endlich die Info-Hausarbeit Game of life zurückbekommen, hab eine 1 :) :party: endlich mal ne 1 in info, bei der ich das Gefühl habe, auch wirklich was gelernt und verstanden zu haben, auch wenn es natürlich noch verbesserungswürdig ist. Dafür noch einmeieinmal ein Riesendankeschön :)

Für diesen Beitrag haben gedankt: Delphi-Laie, klassiknerd, Mathematiker, Narses, Nersgatt, ub60
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.06.15 21:06 
Meine Anerkennung für das verdiente Ergebnis Deiner Audauer und Deines Fleißes, die/den aber auch etliche andere Forumsteilnehmer aufbrachten!


Zuletzt bearbeitet von Delphi-Laie am Di 09.06.15 10:56, insgesamt 1-mal bearbeitet
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 09.06.15 08:22 
Sehr gut! Im wahrsten Sinne des Wortes. :zustimm:

Hier wird ja öfters nach Hausaufgabenhilfe gefragt. Aber Dein Durchhaltevermögen, Einsatz und Willen zum Lernen hat noch niemand gezeigt. Ich ziehe meinen Hut vor Dir, weiter so!
Und Dank natürlich an Narses, der mit einer Engelsgeduld viel Zeit für die Hilfe aufgebracht hat.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 11.06.15 17:42 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
endlich mal ne 1 in info, bei der ich das Gefühl habe, auch wirklich was gelernt und verstanden zu haben,
:zustimm: Das hast du dir redlich verdient, meinen Respekt für dein Engagement. :party:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
Dafür noch einmeieinmal ein Riesendankeschön :)
:beer:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
auch wenn es natürlich noch verbesserungswürdig ist.
Wie schon mal angedeutet: du bist herzlich willkommen an dem Projekt weiterzuarbeiten, melde dich einfach, wenn du Zeit und Lust hast. ;) Vielleicht hast du ja tatsächlich die Informatik als interessantes Hobby entdeckt... :zwinker:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.