Autor |
Beitrag |
Juless
Hält's aus hier
Beiträge: 3
|
Verfasst: 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.
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 public 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 /2) THEN 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;
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 / 9) THEN 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 * 2) THEN 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 * 3) THEN 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 * 4) THEN 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 * 5) THEN 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 * 6) THEN 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 * 7) THEN 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 * 8) THEN 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 Christian S.: Code- durch Delphi-Tags ersetzt
|
|
freedy
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: 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
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
|
Verfasst: 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
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:
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
Hält's aus hier
Beiträge: 3
|
Verfasst: 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
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 27.11.08 19:43
Hallo? Hilft mir nochmal jemand weiter?
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if ... then begin end else if ... then 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
|
Verfasst: Fr 28.11.08 08:10
Das Problem in deiner Procedure liegt bei...
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 / 9) THEN 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!
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 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'); 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
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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:
Delphi-Quelltext 1:
| ExtractFilePath(ParamStr(0)) + 'Mond1.bmp' |
Genauer mit Demo hab ich das hier beschrieben:
www.delphi-library.d...ewtopic.php?p=499701
|
|
|