Autor Beitrag
Juless
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 17.11.08 16:35 
Hallo, also ich habe folgendes Problem:
Ich möchte, dass meine Sonne in der linken ecke aufgeht und in der rechten ecke weider verschwindet. Dies klapt bis jetzt. Dann soll der mond(verschiedene Bilder) seine phasen auf der selben router wie die sonne durchlaufen. Danach sollte die sonne wieder beginnen, doch leider will es nicht so ganz funktionieren.
Der Mond fällt ab der hälfte nicht ab, sondern steigt weiterhin, und nachdem die sonne das 2. mal erscheint, blinkt es alles ziemlich etc. Ich denke mal, dass die mondbilder dann nur unsichtbar hinter der sonne mitlaufen.

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:
unit MTag_2;

interface

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

type
  TFTag = class(TForm)
    ImSonne: TImage;
    ImMond1: TImage;
    ImMond8: TImage;
    ImMond7: TImage;
    ImMond6: TImage;
    ImMond5: TImage;

    ImMond4: TImage;
    ImMond3: TImage;
    ImMond2: TImage;
    ImMond9: TImage;
    TiTag: TTimer;
    procedure TiTagTimer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FTag: TFTag;

implementation

{$R *.DFM}

procedure TFTag.TiTagTimer(Sender: TObject);
begin



           IF ImSonne.Visible THEN

           Begin

           if  (ImSonne.Left + (ImSonne.Width /2)) >= (FTag.Width /2THEN BEGIN

           ImSonne.Left:= ImSonne.Left +1;
           ImSonne.Top:= ImSonne.Top +1;
           end
           else
                         BEGIN

                         ImSonne.Left := ImSonne.Left +1;
                         ImSonne.Top := ImSonne.Top -1;

                         END;
           end;
{end;}

IF ((ImSonne.Left >= FTag.Width) and (ImSonne.Top >= FTag.Height)) THEN

    BEGIN


    ImSonne.Visible := False;
    ImSonne.Left := 0;
    ImSonne.Top := FTag.ClientHeight;
    FTag.Color := clMenuText ;

   end;


       IF (ImSonne.Visible = False)  THEN
       BEGIN
       ImMond1.Visible := True;
       ImMond1.Left := ImMond1.Left + 1;
       ImMond1.Top  := ImMond1.Top  - 1;

       end;



       IF (ImMond1.Left + ImMond1.Width) >= (FTag.Width / 9THEN
       BEGIN
       ImMond2.Visible := True;
       ImMond2.Left := ImMond1.Left;
       ImMond2.Top  := ImMond1.Top;
       ImMond2.Left := ImMond2.Left + 1;
       ImMond2.Top  := ImMond2.Top  - 1;
       ImMond1.Visible := False;



       end;

       IF (ImMond2.Left + ImMond2.Width) >= (FTag.Width / 9 * 2THEN
       BEGIN
       ImMond3.Visible := True;
       ImMond3.Left := ImMond2.Left;
       ImMond3.Top  := ImMond2.Top;
       ImMond3.Left := ImMond3.Left + 1;
       ImMond3.Top  := ImMond3.Top  - 1;
       ImMond2.Visible := False;
       end;

       IF (ImMond3.Left + ImMond3.Width) >= (FTag.Width / 9 * 3THEN
       BEGIN
       ImMond4.Visible := True;
       ImMond4.Left := ImMond3.Left;
       ImMond4.Top  := ImMond3.Top;
       ImMond4.Left := ImMond4.Left + 1;
       ImMond4.Top  := ImMond4.Top  - 1;
       ImMond3.Visible := False;
       end;

       IF (ImMond4.Left + ImMond4.Width) >= (FTag.Width / 9 * 4THEN
       BEGIN
       ImMond5.Visible := True;
       ImMond5.Left := ImMond4.Left;
       ImMond5.Top  := ImMond4.Top;
       ImMond5.Left := ImMond5.Left + 1;
       ImMond5.Top  := ImMond5.Top  - 1;
       ImMond4.Visible := False;
       end;

      IF (ImMond5.Left + ImMond5.Width) >= (FTag.Width / 9 * 5THEN
      BEGIN
      ImMond6.Visible := True;
      ImMond6.Left := ImMond5.Left;
      ImMOnd6.Top := ImMond5.Top;
      ImMond6.Left := ImMond6.Left + 1;
      ImMond6.Top := ImMond6.Top + 1;
      ImMond5.Visible := False;
      end;

      IF (ImMond6.Left + ImMond6.Width) >= (FTag.Width / 9 * 6THEN
      BEGIN
      ImMond7.Visible := True;
      ImMond7.Left := ImMond6.Left;
      ImMOnd7.Top := ImMond6.Top;
      ImMond7.Left := ImMond7.Left + 1;
      ImMond7.Top := ImMond7.Top + 1;
      ImMond6.Visible := False;
      end;

       IF (ImMond7.Left + ImMond7.Width) >= (FTag.Width / 9 * 7THEN
      BEGIN
      ImMond8.Visible := True;
      ImMond8.Left := ImMond7.Left;
      ImMOnd8.Top := ImMond7.Top;
      ImMond8.Left := ImMond8.Left + 1;
      ImMond8.Top := ImMond8.Top + 1;
      ImMond7.Visible := False;
      end;

      IF (ImMond8.Left + ImMond8.Width) >= (FTag.Width / 9 * 8THEN
      BEGIN
      ImMond9.Visible := True;
      ImMond9.Left := ImMond8.Left;
      ImMOnd9.Top := ImMond8.Top;
      ImMond9.Left := ImMond9.Left + 1;
      ImMond9.Top := ImMond9.Top + 1;
      ImMond8.Visible := False;
      end;

      IF (ImMond9.Left + ImMond9.Width) >= FTag.Width  THEN
      BEGIN
      ImSonne.Visible := True;
      ImMond9.Visible := False;
      ImMond1.Left := 0;
      ImMond1.Top := FTag.ClientHeight;
      FTag.Color := clBlue ;
      end;





    end;


end.


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
freedy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Di 18.11.08 10:51 
Hast du vielleicht mal deine Dateien, damit ich nicht irgendwelche Fantasiebilder bei mir in die Form einsetzen muss? Oder deine EXE?

Grüße
DaKirsche
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Di 18.11.08 14:00 
Moin moin,
also ich finde du solltest statt jeder Mondphase ein eigenes TImage, lieber die Mondphasen in das Image laden
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
[...]
MyMond: TImage;
MySun: TImage;
[...]
function loadMoonState(state:PChar)
begin
TMyForm.MyMoon.Picture.LoadFromFile('./Programmbilder/'+state+'.jpg');
end;
[...]


Und gegen das Flackern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
TMyForm.FormCreate(Sender: TObject)
begin
doublebuffered:true;
end;



P.S.: Sollte irgendwas am Code komisach aussehenliegt es daranm dass ich gerade aufm Java-Lehrgang sitze und Javageschädigt werde ;)
MfG

_________________
Die simpelsten Fehler sind meist die Schwersten...
Juless Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 18.11.08 17:10 
Hey,
danke schonmal, aber so richtig wollen, tuts immer noch nicht.

Hier mal die .EXE
Einloggen, um Attachments anzusehen!
Juless Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 27.11.08 19:43 
Hallo? Hilft mir nochmal jemand weiter?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 27.11.08 21:02 
Wenn nach 24 Stunden noch keine Antwort gekommen ist, kannst du auch einen Beitrag schreiben um zu erinnern. Verboten ist es nur innerhalb der ersten 24 Stunden einen Beitrag zu schreiben, der als einzigen Zweck die Erinnerung an dein Thema hat. ;-)

Was mir beim ersten Überfliegen aufgefallen ist ist, dass dein Code erstens sehr lang ist für das was er macht, weil du alles mehrfach im Code hast, und zweitens, dass du nie else benutzt.
Du musst ja nicht immer alles testen, wenn eine if-Bedingung bereits erfüllt war.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if ... then
begin
  // mach was
end
else if ... then // wenn das erste nicht erfüllt war, das nächste testen
begin

end;


Ich werde mir den Code gleich noch einmal genauer anschauen.
MH
Hält's aus hier
Beiträge: 11

Win XP
D3, D2005
BeitragVerfasst: Fr 28.11.08 08:10 
Das Problem in deiner Procedure liegt bei...
ausblenden 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:
       IF (ImSonne.Visible = False)  THEN
       BEGIN
       ImMond1.Visible := True;
       ImMond1.Left := ImMond1.Left + 1;
       ImMond1.Top  := ImMond1.Top  - 1;

       end;



       IF (ImMond1.Left + ImMond1.Width) >= (FTag.Width / 9THEN
       BEGIN
       ImMond2.Visible := True;
       ImMond2.Left := ImMond1.Left;
       ImMond2.Top  := ImMond1.Top;
       ImMond2.Left := ImMond2.Left + 1;
       ImMond2.Top  := ImMond2.Top  - 1;
       ImMond1.Visible := False;



       end;
       \\...


Problem:
Da die Visible von ImSonne wärend des ganzen Mondzyklusses auf false steht ändernst du bei jedem Interval die Position von ImMond1. Bei der nächsten If-Anweisung wird auch immer Ausgeführt sobald sie einmal erreicht würde. Da ImMond1.Left immer > sein wird. Dadurch beziehen sich alle Images auf die Laufbahn von ImMond1, Also immer von links unten nach recht oben.

Lösungsvorschlag
Du solltest mehr Struktur reinbringen z.B. durch Verwendung einens einzigen Images evtl. zwei. In dieses denn halt das Bild laden das du gerade brauchst(Image1.Picture.LoadFromFile('Pfad')) Und alles was gleich ist nur einmal schreiben, wie die Laufbahn von Sonne und Mond. Also das eine Image das du jetzt noch besitzt immer wieder die gleiche Route laufen lassen halt nur zwischendurch mal das Bild wechseln.

Meine Lösung
Ist nur für den Mond!
ausblenden 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:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
     //Hier werden die Bilder für die jeweilige Mondphase geladen
     if Image.Left + Image.Width < Form1.Width / 9 then Image.Picture.LoadFromFile('Mond1.bmp');  
     if Image.Left + Image.Width >= Form1.Width / 9 Image.Picture.LoadFromFile('Mond2.bmp');
     if Image.Left + Image.Width >= Form1.Width / 9*2 then Image.Picture.LoadFromFile('Mond3.bmp');
     if Image.Left + Image.Width >= Form1.Width / 9*3 then Image.Picture.LoadFromFile('Mond4.bmp');
     if Image.Left + Image.Width >= Form1.Width / 9*4 then Image.Picture.LoadFromFile('Mond5.bmp');
     if Image.Left + Image.Width >= Form1.Width / 9*5 then Image.Picture.LoadFromFile('Mond6.bmp');
     if Image.Left + Image.Width >= Form1.Width / 9*6 then Image.Picture.LoadFromFile('Mond7.bmp');
     if Image.Left + Image.Width >= Form1.Width / 9*7 then Image.Picture.LoadFromFile('Mond8.bmp');
     if Image.Left + Image.Width >= Form1.Width / 9*8 then Image.Picture.LoadFromFile('Mond9.bmp');
     
     //Und hier die Laufbahn sollte sich selbst erklären
     if Image.Left + Image.Width / 2 >= Form1.Width / 2 then
     begin
          if (Image.Left + Image.Width = Form1.ClientWidth) or (Image.Top + Image.Height = Form1.ClientHeight) then
          begin
               Image.Left := 0;
               Image.Top := 400;
          end else
              Image.Top := Image.Top + 1;
     end else
         Image.Top := Image.Top - 1;

     Image.Left := Image.Left+1;
end;

Das ist natürlich auch noch nicht perfekt. Ich hoffe ich konnte dir damit helfen, auch wenn es ein bisschen spät kommt :wink:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 28.11.08 12:09 
Da fehlt noch die Pfadangabe zu den Bildern, so funktioniert es nur zufällig mal. Also statt 'Mond1.bmp' mit Pfad:
ausblenden Delphi-Quelltext
1:
ExtractFilePath(ParamStr(0)) + 'Mond1.bmp'					

Genauer mit Demo hab ich das hier beschrieben:
www.delphi-library.d...ewtopic.php?p=499701