Autor Beitrag
die_nadja
Hält's aus hier
Beiträge: 15

Win 98, Win XP

BeitragVerfasst: Mi 09.03.05 18:12 
Huhu @ all :)

Es geht um eine *sich bewegende* Form,mehrere Shapes die sich bei bestimmten Aktionen (z.b. button) in eine vorbestimmte Richtung bewegen. Ich brauche soetwas für ein Programm an dem ich zurzeit arbeite. Vor einiger Zeit habe ich etwas passendes gefunden (siehe Dateianhang), leider geht dieses Programm über meine Kenntnisse (Ttimer,ComponentCount,shape.tag..usw. haufen Befehle innerhalb der Prozeduren) hinaus und ich habe keinen blassen Schimmer wie das eigentlich alles funktioniert...
Es wäre echt super nett wenn ihr mir helfen könntet, bzw. das Programm mit ein paar //"comments" versehen würdet.
1. möchte ich selber verstehen was ich in meinem Prog nutze und ausserdem möchte auch mein Lehrer eine Erklärung. Habe auch schon viel gesucht, bin aber leider zu keinem Ergebnis gekommen :/..Falls ihr auch nix findet bzw. helfen könnt dann steh ich da weil ichs ja nicht benutzen kann,...wäre echt super nett. Danke schonmal im Vorraus : )
die_nadja :roll:
Einloggen, um Attachments anzusehen!
_________________
I think, therefore I am ...
1211chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30

WIN XP Pro, Win 7-64bit Home
D4 Prof
BeitragVerfasst: Mi 09.03.05 18:30 
Hmmmm, irgendwie verworren Dein Wunsch. Vielleicht solltest Du um Hilfe zu kriegen die Aufgaben einzeln abarbeiten (mein Vorschlag).

Also Du möchtest ein Formular über Timer bewegen ?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var a: integer;
begin
a:=5;
form1.left:=form1.left+a;
end;


der Code gehört in den Timer, diesen z.b. auf 10 sec. einstellen dann geht form1 alle 10 sec um 5 pixel nach links.

der code im button bewegt das form1 bei click nach links

oder hab ich Dich falsch verstanden ?

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.

_________________
Theorie: Alles läuft ... Praxis: Nix funzt ... Ich bin eben ein Mann der Praxis
die_nadja Threadstarter
Hält's aus hier
Beiträge: 15

Win 98, Win XP

BeitragVerfasst: Mi 09.03.05 19:07 
Ja ist eine gute Idee (einzeln bearbeiten :p)..
Das mit dem Timer werd ich dann gleichmal versuchen. Am Besten ich schreibe das ganze Teil neu, mit meinem Wissen..bei Fragen nerv ich einfach wieder ; )
Danke für die Hilfe

_________________
I think, therefore I am ...
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.03.05 19:41 
So etwa?

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:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
unit Unit1;

interface

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

type
  Tform1 = class(Tform)
    Shape1: TShape;
    Shape3: TShape;
    Shape2: TShape;
    Button1: TButton;
    Shape6: TShape;
    Shape5: TShape;
    Shape4: TShape;
    Button2: TButton;
    Shape8: TShape;
    Shape9: TShape;
    Edit1: TEdit;
    Edit2: TEdit;
    Shape7: TShape;
    Shape10: TShape;
    Timer1: TTimer; // Im Designer: Enabled := False setzen!
    procedure formCreate(Sender: tobject);
    procedure Button1Click(Sender: tobject);
    procedure Button2Click(Sender: tobject);
    procedure Timer1Timer(Sender: tobject);
  private
    Unten_Ausgefahren: Boolean; // Status des unteren Teils

    procedure formRegion;       // Geometrie zusammensetzen

    procedure MoveformRegion    // Verschiebung des Teils mit
      (Tag                      // Teilnummer (siehe Shape.TAG
      ,x,y: Integer;            // Weg um den verschoben wird
       Show: Boolean = False);  // Sichtbar: Ja wenn nich angegeben

    procedure Pause(t: Integer);

  public
    { Public-Deklarationen }
  end;

var
  form1: Tform1;

implementation

{$R *.DFM}

//==========================================================================
// 1.Hier beginnt das Programm den Code abzuarbeiten
procedure Tform1.formCreate(Sender: tobject);
var i:Integer;
begin
//  Unten_Ausgefahren := False; Zu beginn immer False, Instanzvariable s. o.
  formRegion;             // form vorbereiten
  Timer1.Enabled := True; // Timer erst starten, wenn alles vorbereitet ist!
end;

//==========================================================================
// 2. Zusammensetzen der Geometrie
procedure Tform1.formRegion;
var
  HR1,HR2: HRgn; // Handles für die Regionen
  Shape: TShape; // Ein Objekt vom Typ Shape
  i: Integer;    // Zähler für Schleifen
begin
  HR2 := 0;                               // Als leer markieren
  HR1 := CreateRectRgn(0,0,0,0);          // erzeuge eine rechteckige Region
  for I := 0 to ComponentCount - 1 do     // Alle Komponenten des formulars
  begin                                   //   abklappern
    if Components[I] is TShape then       // Falls es vom Typ Shape ist
    begin
      Shape := (Components[i] as TShape); // Typisierten Zeiger setzen
      if (Shape.Shape = stRectangle)      // Wenn es ein Rechteck ist
        or (Shape.Shape = stSquare) then  // oder eine Quadrat dann
        HR2 := CreateRectRgn              // Eine RechteckRegion erzeugen mit
          (Shape.Left                     //   linkem Rand bei
          ,Shape.top                      //   oberem Rand bei
          ,Shape.Left+Shape.Width         //   rechtem Rand bei
          ,Shape.top+Shape.Height)        //   unterem Rand bei
      else // Hier else, denn das eine schließt das andere aus
      if (Shape.Shape = stCircle) then    // Wenn es dagegen ein Kreis ist
        HR2 := CreateRoundRectRgn         // Eine Runde Region erzeugen mit
          (Shape.Left                     //   linkem Rand bei
          ,Shape.top                      //   oberem Rand bei
          , Shape.Left+Shape.Width        //   rechtem Rand bei
          ,Shape.top+Shape.Height         //   unterem Rand bei
          ,Shape.Left+Shape.Width div 2   //   Mittelpunkt horizontal
          ,Shape.top+Shape.Height div 2); //   Mittelpunkt vertikal

      // Hier kann ein Fehler auftreten, wenn keiner der beiden Fälle zutraf
      // Dann wäre HR2 undefiniert
      if HR2 <> 0 then                    // Wenn HR2 eine gültige Region ist
        CombineRgn                        // Eine Region aus zwei Regionen
          (HR1                            // Dahin die neue Region speichern
          ,HR1                            // Erste Reg.
          ,HR2                            // Zweite Reg.
          ,RGN_OR);                       // mit ODER zusammensetzen

    end; // If is TShape
  end; // Schleife für alle Komponenten

  SetWindowRgn(Handle, HR1, True);        // Ergebnisregion bei Windows anmelden
end;;

//==========================================================================
// 3. Wenn der Timer abgelaufen ist, gehts hier weiter
procedure Tform1.Timer1Timer(Sender: tobject);
var
  i: Integer;
begin
  Timer1.Enabled := False; // Timer wieder sperren

  for i := 1 to 5 do             // Fünf Schritte
  begin
    MoveformRegion(3,0,-i,True); // form verändern
    Pause(10);
  end;

  for i := 1 to 3 do             // Drei Schritte
  begin
    MoveformRegion(3,0,-5,True);
    Pause(10);
  end;

  for i := 1 to 5 do             // Fünf Schritte
  begin
    MoveformRegion(3,0,-(6-i),True);
    Pause(10);
  end;
end;

//==========================================================================
// 4. Wartezeit sinnvoll verbringen
procedure Tform1.Pause;
var
  i: Integer;
begin
  i := GetTickCount;             // System Zähler (Zeitbasis)
  while GetTickCount - i < t do  // T Zeitschritte lang
    Application.ProcessMessages; //   nur Nachrichtenschleife bedienen
end;

//==========================================================================
// 5. Geometrie ändern nicht form verschieben!
procedure Tform1.MoveformRegion;
var
  Shape: TControl;
  i: Integer;
begin
  for I := 0 to ComponentCount - 1 do // Alle Komponenten des formulars
  begin
    if not (Components[I] is  TTimer) then // Wenn kein Timer ist
    begin
      Shape := (Components[i] as TControl); // Komponente als Control
      if Shape.Tag = Tag then // Wenn der im Designer gesetzte Tag-Wert mit
      begin                   // dem Parameter Tag übereinstimmt
        Shape.top := Shape.top + y;   // Diesen Teil der Geometrie um Y hoch
        Shape.Left := Shape.Left + x; // bzw. um X seitlich verschieben
       end;
    end;
  end;

  if Show then   // Wenn das formular sichtbar ist (Siehe Defaultparameter)
    formRegion;  //   zusammengesetzte Geometrie neu erzeugen
end;

//==========================================================================
// Button 1 wurde gedrückt: Zustand unten ändern
procedure Tform1.Button1Click(Sender: tobject);
var
  i: Integer;
  n: Integer;
begin
  if Unten_Ausgefahren then // Wenn unten ausgefahren war
    n := -1                 //   Vorzeichen ändern
  else                      // ansonsten
    n := 1;                 //   Vorzeichen setzen

  // Nur, wenn unten ausgefahren war
  if Unten_Ausgefahren then
  begin

    // Analog zu oben ...
    for i:=1 to 5 do
    begin
      MoveformRegion(2,i*n,0,True);
      Pause(10);
    end;

    for i:=1 to 15 do
    begin
      MoveformRegion(2,5*n,0,True);
      Pause(10);
    end;

    for i:=1 to 5 do
    begin
      MoveformRegion(2,(6-i)*n,0,True);
      Pause(10);
    end;
  end;

  // Immer ...
  for i:=1 to 5 do
  begin
    MoveformRegion(2,0,i*n);
    MoveformRegion(1,0,i*n,True);
    Pause(10);
  end;

  for i:=1 to 5 do
  begin
    MoveformRegion(2,0,5*n);
    MoveformRegion(1,0,5*n,True);
    Pause(10);
  end;

  for i:=1 to 5 do
  begin
    MoveformRegion(2,0,(6-i)*n);
    MoveformRegion(1,0,(6-i)*n,True);
    Pause(10);
  end;

  // Nur, wenn unten nicht ausgefahren war
  if not Unten_Ausgefahren then
  begin
    for i:=1 to 5 do
    begin
      MoveformRegion(2,i*n,0,True);
      Pause(10);
    end;

    for i:=1 to 15 do
    begin
      MoveformRegion(2,5*n,0,True);
      Pause(10);
    end;

    for i:=1 to 5 do
    begin
      MoveformRegion(2,(6-i)*n,0,True);
      Pause(10);
    end;
  end;

  Unten_Ausgefahren := not Unten_Ausgefahren; // Zustand wurde geändert
end;

//==========================================================================
// Button 2 wurde gedrückt: Zurückfahren falls notwendig und dann beenden
procedure Tform1.Button2Click(Sender: tobject);
var
  i: Integer;
begin
  Timer1.Enabled := False; // Timer sperren, falls er gerade aktiviert ist

  // Nur, wenn unten ausgefahren ist
  if Unten_Ausgefahren then
  begin
    for i:=1 to 5 do
    begin
      MoveformRegion(2,i*-1,0,True);
      Pause(10);
    end;

    for i:=1 to 15 do
    begin
      MoveformRegion(2,5*-1,0,True);
      Pause(10);
    end;

    for i:=1 to 5 do
    begin
      MoveformRegion(2,(6-i)*-1,0,True);
      Pause(10);
    end;

    for i:=1 to 5 do
    begin
      MoveformRegion(2,0,i*-1);
      MoveformRegion(1,0,i*-1,True);
      Pause(10);
    end;

    for i:=1 to 5 do
    begin
      MoveformRegion(2,0,5*-1);
      MoveformRegion(1,0,5*-1,True);
      Pause(10);
    end;

    for i:=1 to 5 do
    begin
      MoveformRegion(2,0,(6-i)*-1);
      MoveformRegion(1,0,(6-i)*-1,True);
      Pause(10);
    end;
  end;

  // Der Rest immer
  for i:=1 to 5 do
  begin
    MoveformRegion(3,0,i,True);
    Pause(10);
  end;

  for i:=1 to 3 do
  begin
    MoveformRegion(3,0,5,True);
    Pause(10);
  end;

  for i:=1 to 5 do
  begin
    MoveformRegion(3,0,(6-i),True);
    Pause(10);
  end;

  Close; // Beenden
end;

end.
die_nadja Threadstarter
Hält's aus hier
Beiträge: 15

Win 98, Win XP

BeitragVerfasst: Mi 09.03.05 20:02 
Titel: !!super!!
Wow, genau so etwas! :)
Habs dank dir auch verstanden; werd es wohl trotzdem "vereinfachen" ..
Also nochmal ein riesen Dank für die Arbeit(das du dich da so rein gekniet hast): )
*kiss
das Forum ist echt super-->sehr brauchbare Antworten in kürzester Zeit..werd wohl Stammgast!

_________________
I think, therefore I am ...