Entwickler-Ecke

Sonstiges (Delphi) - Wie erkennen, ob Fläche schon besetzt?


Bethsoftfan - Do 24.01.08 18:51
Titel: Wie erkennen, ob Fläche schon besetzt?
Wie kann man erkennen, ob auf einer Fläche in einer TScrollbox schon ein TImage liegt?

Mit length gehts irgentwie nit...

PS : suche ergab nichts!

Danke für antworten


Soapy - Do 24.01.08 19:01

Also das sollte man jetzt mal wieder etwas genauer formulieren!
Schäm dich Felix^^ tststs...

Naja also... Es geht mal wieder um das (bei manchen schon bekannte) Spiel.

Wir haben es jetzt geschafft, das die Images auf der Karte dargestellt werden, jedoch kann man diese noch übereinander bauen...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Cursorposx := ScreenToClient(Mouse.CursorPos).X;
cursorposy := ScreenToClient(Mouse.CursorPos).Y;
  Setlength(FImages, length(FImages)+1);
  FImages[length(FImages)-1]:= TImage.Create(self);
  FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages));
  FImages[length(FImages)-1].Parent:= Mainmapscrollbox;
  FImages[length(FImages)-1].height:= 20;
  FImages[length(FImages)-1].width:= 50;
  FImages[length(FImages)-1].Left:= CursorPosX;
  FImages[length(FImages)-1].Top:= CursorPosY;
  FImages[length(FImages)-1].Picture.LoadfromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg');
  Mainmap.Enabled := false;
  Mainmap.Visible := true;


Wie kann ich jetzt ne If-Abfrage da einbauen, die abfragt, ob schon ein Gebäude an der Stelle steht?

Das ganze soll in ner Schleife


Delphi-Quelltext
1:
2:
for i := 1 to length(FImages) do
//if-abfrage


stehen, damit jedes Gebäude überprüft wird!


Jann1k - Do 24.01.08 19:37

schau doch einfach ob die x/y werte mit den werten des cursors übereinstimmen, wenn ja steht da schon ein gebäude


Hidden - Do 24.01.08 20:37

*bin zu faul zum lesen^^*
sind die Gebäude Objekte?
Dann mach doch 'ne function getroffen(h,v) rein.


Soapy - Do 24.01.08 21:02

Die Gebäude sind TImages.
Wir wissen ja nicht wie wir die Images ansprechen sollen!

So geht das nicht:


Delphi-Quelltext
1:
Kaserne+IntToStr(length(FImages)).top                    


leider...


Soapy - Do 24.01.08 21:15

Ich bastel grad an ner Lösung...
Vielen Dank! Wenn sie fertig ist werde ich sie posten!


Xentar - Do 24.01.08 22:09

user profile iconSoapy hat folgendes geschrieben:
Die Gebäude sind TImages.
Wir wissen ja nicht wie wir die Images ansprechen sollen!

So geht das nicht:


Delphi-Quelltext
1:
Kaserne+IntToStr(length(FImages)).top                    


leider...


In dem Quellcode aus deinem ersten Post greifst du doch auch schon auf die Images zu - was ist denn daran jetzt anders?


Soapy - Do 24.01.08 22:42

Jup vielen Dank!
Ich habs jetzt gelöst!
Aber wenn ich dann wenn ich diese Schleife hier ausführe -


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:
38:
39:
40:
41:
42:
while x <= length(FImages) do
x := x+1;
begin
if length(FImages) = 0 Then
  begin
    Setlength(FImages, length(FImages)+1);
    FImages[length(FImages)-1]:= TImage.Create(self);
    FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages));
    FImages[length(FImages)-1].Parent:= Mainmapscrollbox;
    FImages[length(FImages)-1].height:= 20;
    FImages[length(FImages)-1].width:= 50;
    FImages[length(FImages)-1].Left:= CursorPosX;
    FImages[length(FImages)-1].Top:= CursorPosY;
    FImages[length(FImages)-1].Picture.LoadfromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg');
    Mainmap.Enabled := false;
    Mainmap.Visible := true;
    Label1.Caption := FImages[length(FImages)-1].Name;
  end

  else
  if (FImages[Anzahl-1].top >= FImages[x].Top+50then
    begin
    x := x-2;
    label1.Caption := 'gut';
    end
  else
    begin
      Setlength(FImages, length(FImages)+1);
      FImages[length(FImages)-1]:= TImage.Create(self);
      FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages));
      FImages[length(FImages)-1].Parent:= Mainmapscrollbox;
      FImages[length(FImages)-1].height:= 20;
      FImages[length(FImages)-1].width:= 50;
      FImages[length(FImages)-1].Left:= CursorPosX;
      FImages[length(FImages)-1].Top:= CursorPosY;
      FImages[length(FImages)-1].Picture.LoadfromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg');
      Mainmap.Enabled := false;
      Mainmap.Visible := true;
      Label1.Caption := FImages[length(FImages)-1].Name;
    end;
end;
end;


- und dieser Teil -


Delphi-Quelltext
1:
2:
3:
4:
5:
  if (FImages[Anzahl-1].top >= FImages[x].Top+50then
    begin
    x := x-2;
    label1.Caption := 'gut';
    end



- ausgeführt wird blockiert das Programm den "Bau" neuer Häuser!
Man soll danach aber noch Häuser bauen können!
Sieht jemand das Problem?
Ich sehs nach langer Sucherei nicht!
Sorry falls was unklar ist!
Is so viel Code hier drin!


icho2099 - Fr 25.01.08 17:51

wie wäre es denn, wenn du bei den dynamisch erstellten TImages einfach
das OnClick mit einer Methode verknüpfen würdest ?

Klickst du dann auf eine besetzte Stelle, dann reagiert das TImage, welches den
Platz belegt, selber.
Du brauchst dann nicht mühsam rausfinden, welches das ist, das erledigt die VCL
für dich.
In der Methode kannst du dann ja entsprechend reagieren.
Hier ein Beispiel wie man das macht:


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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private-Deklarationen }
    ExePath    : String;

    Procedure IMOnClick(Sender : TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  (* Exepath weil ich die Bilder da liegen habe *)
  ExePath  := ExtractFilePath(Application.ExeName)+'\';
  Randomize;
end;

(* dies ist die Methode, die mit den OnClick Ereignissen *)
(* der dynamisch erzeugten TImages verbunden werden muss *)
Procedure TForm1.IMOnClick(Sender : TObject);
begin
  Application.MessageBox('hier ist besetzt, klick woanders','D e n k s t e',0);
end;

procedure TForm1.FormMouseDown(Sender : TObject;
                               Button : TMouseButton;
                               Shift  : TShiftState;
                               X, Y   : Integer);
Var IM      : TImage;
    IMFName : String;  (* Dateiname für Picture *)
    rx      : Integer;
begin
  (* aus drei möglichen Bildern eines zufällig auswählen *)
  rx := Random(100);
  If rx <= 33 then IMFName := '1.ico' else
  If rx <= 66 then IMFName := '2.ico' else
                   IMFName := '3.ico';
  IMFName := ExePath+IMFName;

  (* neues TImage *)
  IM := TImage.Create(Self);
  (* an Klickposition *)
  IM.Left := X; IM.Top := Y;
  (* Bild laden *)
  IM.Stretch  := False;
  IM.AutoSize := True;
  IM.Picture.LoadFromFile(IMFName);
  IM.Parent := Self;
  (* und hier wird das Onclick des neuen TImage mit der Methode verbunden *)
  IM.OnClick := IMOnClick;
end;

end.


Soapy - Fr 25.01.08 18:36

Huh...
Das sieht ja geil aus!
Ich werde es mal ausprobieren!
Vielen Dank!


Soapy - Fr 25.01.08 23:57


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:
Procedure TForm1.IMOnClick(Sender : TObject);
begin
  Application.MessageBox('hier ist besetzt, klick woanders','D e n k s t e',0);
end;

procedure TForm1.MainMapMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var IM      : TImage;
    IMFName : String;  (* Dateiname für Picture *)
    rx, i, z     : Integer;
begin
  i := i+1;
  if IM.Name = 'Kaserne' Then
    IM.Name := 'Kaserne'+IntToStr(i);
  IM := TImage.Create(Self);
  (* an Klickposition *)
  IM.Left := X-25;
  IM.Top := Y-25;
  (* Bild laden *)
  IM.Stretch  := False;
  IM.AutoSize := False;
  IM.Width := 50;
  IM.Height := 50;
  IM.Picture.LoadFromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg');
  IM.Parent := MainmapScrollbox;
  (* und hier wird das Onclick des neuen TImage mit der Methode verbunden *)
  IM.OnClick := IMOnClick;
  Mainmap.Enabled := false;
end;


So jetzt kann man sie nicht mehr direkt übereinander bauen aber die Bilder überlappen sich noch um höchstens 25px.
Wie lässt sich das vermeiden?


Hidden - Sa 26.01.08 00:20

user profile iconSoapy hat folgendes geschrieben:
So jetzt kann man sie nicht mehr direkt übereinander bauen aber die Bilder überlappen sich noch um höchstens 25px.
Wie lässt sich das vermeiden?

Spontan würd ich sagen das Bild groesser machen als schlichte Lösung.


Xentar - Sa 26.01.08 01:27

user profile iconSoapy hat folgendes geschrieben:
So jetzt kann man sie nicht mehr direkt übereinander bauen aber die Bilder überlappen sich noch um höchstens 25px.
Wie lässt sich das vermeiden?


Schau dir doch mal deinen Source an...
Das neue Bild setzt du an die X Position X - 25.
d.h. wenn du direkt rechts neben ein Bild klickst, wird das neue noch 25 Pixel nach links verschoben, und liegt somit halb über dem alten...

Abhilfe schafft es nur, wenn du diese 25px mit einberechnest, in deine Kollisionsabfrage..
Oder dort wo geklickt wird, landet die obere linke Ecke des Gebäudes - und nicht die Mitte.


Soapy - Sa 26.01.08 11:13

Ich hab ja keine Kollisionsabfrage, nur die onclick-Ereignisroutine für die selbsterzeugenden Images!

Wenn ich jetzt mit dem obenstehenden Code 5 Images erzeuge, wie kann ich dann zum Beispiel die Koordinaten des dritten Abfragen, um diese in der Kollisionsabfrage mit anderen zu vergleichen?


Soapy - Sa 26.01.08 14:28


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:
38:
39:
40:
41:
42:
procedure TForm1.MainMapMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var IMFName : String;  (* Dateiname für Picture *)
    z       : Integer;
begin
  if length(FImages) = 0 then
  begin
    Setlength(FImages, length(FImages)+1);
    FImages[length(FImages)-1]:= TImage.Create(self);
    FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages));
    FImages[length(FImages)-1].Parent:= MainmapScrollbox;
    FImages[length(FImages)-1].height:= 20;
    FImages[length(FImages)-1].width:= 50;
    FImages[length(FImages)-1].Left:= X;
    FImages[length(FImages)-1].Top:= Y;
    FImages[length(FImages)-1].Picture.LoadfromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg');
    FImages[length(FImages)-1].OnClick := IMonclick;
    Mainmap.Enabled := false;
  end
else
  begin
    for z := 0 to length(FImages) do
    begin
      if FImages[length(FImages)-z].top > (FImages[length(FImages)].top+FImages[length(FImages)].height) then
        begin showmessage('geht nicht'end
        else
        begin
          Setlength(FImages, length(FImages)+1);
          FImages[length(FImages)-1]:= TImage.Create(self);
          FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages));
          FImages[length(FImages)-1].Parent:= MainmapScrollbox;
          FImages[length(FImages)-1].height:= 20;
          FImages[length(FImages)-1].width:= 50;
          FImages[length(FImages)-1].Left:= X;
          FImages[length(FImages)-1].Top:= Y;
          FImages[length(FImages)-1].Picture.LoadfromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg');
          FImages[length(FImages)-1].OnClick := IMonclick;
          Mainmap.Enabled := false;
        end;
      end;
  end;
end;


So ich hab das jetzt so gelöst...

Doch leider gibt es mir immer wieder einen Fehler aus, wenn ich das zweite Image erstellen will, alse der Else-Teil ausgeführt wird.
Sieht jemand woran das liegt?


Xentar - Sa 26.01.08 14:52

user profile iconSoapy hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
      if FImages[length(FImages)-z].top > (FImages[length(FImages)].top+FImages[length(FImages)].height) then
....
          FImages[length(FImages)-1]:= TImage.Create(self);



Schreib doch BITTE grundsätzlich die Fehlermeldung dazu..

Und vergleich mal die beiden markierten Blöcke, da steckt der Fehler drin.


Soapy - Sa 26.01.08 15:00

Leider steckt der Fehler dort nicht drin!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
if FImages[length(FImages)-z].top > (FImages[length(FImages)-1].top+FImages[length(FImages)-1].height) then
        begin showmessage('geht nicht'end
        else
        begin
          Setlength(FImages, length(FImages)+1);
          FImages[length(FImages)-1]:= TImage.Create(self);
          FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages));
          FImages[length(FImages)-1].Parent:= MainmapScrollbox;
          FImages[length(FImages)-1].height:= 20;
          FImages[length(FImages)-1].width:= 50;
          FImages[length(FImages)-1].Left:= X;
          FImages[length(FImages)-1].Top:= Y;
          FImages[length(FImages)-1].Picture.LoadfromFile(ExePath+'staemme.jpg');
          FImages[length(FImages)-1].OnClick := IMonclick;
          Mainmap.Enabled := false;
        end;


Habe es jetzt so geändert...

Für die Zukunft werde ich mir merken dass ich die Fehlermeldung dazu schreib!
Nunja, hier ist sie:
Zitat:
Zugriffsverletzung bei Adresse 0046D01F in Modul 'Strategie.exe'. Lesen von Adresse 0000005A.


Xentar - Sa 26.01.08 16:51

2 von 3 Fehlern hast du korrigiert..
bleibt noch das z, dass im ersten Schleifendurchlauf ebenfalls den Wert 0 hat ;)

BTW: Für sowas gibts den Debugger.. Haltepunkte, Variableninhalt anschauen, und solche Sachen.


icho2099 - Sa 26.01.08 17:10

Dein Schleifenzähler z läuft um eine Position zu weit.


Delphi-Quelltext
1:
for z := 0 to length(FImages) do                    


Das Array ist von 0 bis Length(Array)-1 indiziert.

Der Zugriff auf das Length(..)te Arrayelement liefert die Exception, weil die
dort im Speicher stehenden 4 Bytes nicht auf ein TImage verweisen, sondern auf
nicht zugewiesenen Speicher.

Also:

Delphi-Quelltext
1:
for z := 0 to (length(FImages)-1do                    


das sollte dann fehlerfrei laufen.

Um die Kollisionen mit allen TImages zu erkennen, bieten sich die Funktionen
InterSectRect und IsRectEmpty aus der Unit Types an.

IntersectRect mit dem Rechteck des neuen TImage gegen alle schon existierenden
Rechtecke bilden und das Ergebnis jeweils mit IsRectEmpty prüfen.
Ist IsRectEmpty=True für alle Prüfungen, dann gibt es keine Überschneidung des
neuen Rechtecks mit bereits bestehenden und die Fläche ist frei.


Soapy - Sa 26.01.08 17:35


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
    for z := 0 to (length(FImages)-1do
    begin
      if FImages[length(FImages)-z].top > (FImages[length(FImages)-1].top+FImages[length(FImages)-1].height) then
        begin showmessage('geht nicht'end
        else
        begin
          Setlength(FImages, length(FImages)+1);
          FImages[length(FImages)-1]:= TImage.Create(self);
          FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages));
          FImages[length(FImages)-1].Parent:= MainmapScrollbox;
          FImages[length(FImages)-1].height:= 20;
          FImages[length(FImages)-1].width:= 50;
          FImages[length(FImages)-1].Left:= X;
          FImages[length(FImages)-1].Top:= Y;
          FImages[length(FImages)-1].Picture.LoadfromFile(ExePath+'staemme.jpg');
          FImages[length(FImages)-1].OnClick := IMonclick;
          Mainmap.Enabled := false;
        end;
    end;


So?
Leider geht das auch nicht!
Aber die Zahlen in der Fehlermeldung haben sich verändert:

Zitat:
Zugriffsverletzung bei Adresse 0046D020 in Modul 'Strategie.exe'. Lesen von Adresse 0000005A.


Ich werde mal die andere Methode ausprobieren!
Vielen Dank für die Antworten!


Xentar - Sa 26.01.08 18:01

Ist klar, dass das immer noch nicht geht, hab ich doch schon geschrieben...


Delphi-Quelltext
1:
if FImages[length(FImages)-z]                    

Im ersten Schleifendurchlauf ist z = 0, also versuchst du wieder, auf ein ungültiges Element zuzugreifen..


icho2099 - Sa 26.01.08 18:35

versuch's mal so:


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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

Type
  (* Klasse der eigenen TImages *)
  TMyImage = Class(TImage)
             private
               R        : TRect;   (* belegter Platz als Rechteck *)
               FName    : String;  (* Name der Bilddatei          *)
               Caption  : String;  (* wenns gebraucht wird        *)

             public

               Constructor Create(AOwner : TComponent;
                                  aFNAme : String;
                                  aHint  : String;
                                  aX,aY  : Integer);
             end;
type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private-Deklarationen }
    ExePath    : String;
    FImages    : Array of TMyImage;  (* das Array um die TMyImages zu behandeln *)

    Procedure IMOnClick(Sender : TObject);

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Constructor TMyImage.Create(AOwner : TComponent;
                            aFName : String;
                            aHint  : String;
                            aX,aY  : Integer);
begin
  Inherited Create(AOwner);
  Hint     := aHint;
  ShowHint := True;
  FName    := aFName;
  Autosize := True;
  Stretch  := False;
  (* das Bild dazu laden *)
  Picture.LoadFromFile(FName);
  (* Das Rechteck bestimmen *)
  Left := aX;  Top := aY;
  R := Rect(Left,Top,Left+Width,Top+Height);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  (* Exepath weil ich die Bilder da liegen habe *)
  ExePath  := ExtractFilePath(Application.ExeName)+'\';
  Randomize;
  (* Zu Anfang keine MyImages *)
  SetLength(FImages,0);
end;

(* dies ist die Methode, die mit den OnClick Ereignissen *)
(* der dynamisch erzeugten TImages verbunden werden muss *)
Procedure TForm1.IMOnClick(Sender : TObject);
begin
  Application.MessageBox('hier ist besetzt, klick woanders','D e n k s t e',0);
end;

procedure TForm1.FormMouseDown(Sender : TObject;
                               Button : TMouseButton;
                               Shift  : TShiftState;
                               X, Y   : Integer);
Var IM      : TMyImage;
    IMFName : String;  (* Dateiname für Picture *)
    rx      : Integer;
    z       : Integer; (* Laufvariable          *)
    R1,R2   : TRect;
    IsFree  : Boolean;

begin
  (* aus drei möglichen Bildern eines zufällig auswählen *)
  rx := Random(100);
  If rx <= 33 then IMFName := '1.ico' else
  If rx <= 66 then IMFName := '2.ico' else
                   IMFName := '3.ico';
  IMFName := ExePath + IMFName;

  (* neues TMyImage, nur erstellen, nicht in Components einfügen *)
  IM := TMyImage.Create(Self,IMFName,'ich bin ein TMyImage',X,Y);
  (* das rechteck des neuen TMyImage *)
  R1 := IM.R;
  (* Checken ob es mit bereits bestehenden kollidiert *)
  IsFree := True;
  For z := 0 to (Length(FImages)-1do begin
    If InterSectRect(R2,R1,FImages[z].R) then begin
      (* Erste Überlappung mit anderem TMyImage bricht die Schleife ab *)
      IsFree := False;
      Application.MessageBox('hier auch nicht, zu eng','D e n k s t e',0);
      Break;
    end;
  end;

  If IsFree then begin
    IM.Parent  := Self;
    IM.OnClick := IMOnClick;
    (* und das Array vergrößern und das neue TMyImage einfügen *)
    SetLength(FImages,Length(FImages)+1);
    FImages[Length(FImages)-1] := IM;
  end else begin
    (* Alles für die Katz, TMyImage wird vernichtet     *)
    (* Könnte auch vor dem Break in der Schleife stehen *)
    IM.Free;
  end;

end;

end.


Edit: Quelltext


Soapy - Sa 26.01.08 19:08

Das hat mir sehr geholfen!
Jetzt noch mal reinziehen und kapieren und dann bin ich wieder um ein Stück schlauer!

Vielen Dank! Ihr seid die besten! :D