Autor Beitrag
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Sa 26.01.08 18:01 
Ist klar, dass das immer noch nicht geht, hab ich doch schon geschrieben...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: Sa 26.01.08 18:35 
versuch's mal so:

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 88

Windows 2000
Delphi 2005 Personal
BeitragVerfasst: 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

_________________
Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!