| Autor |
Beitrag |
Katzenstreu
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Fr 14.04.06 12:26
Hallo,
ich habe mich mal wieder in diesem Forum eingefunden, da ich ein Problem habe  .
Es geht um ein Programm, dass ich vom Lehrer habe und nicht komplett verstehe.
Ich habe es bereits abgeschriben und nachgebaut, Elemente und werte verändert und das Resultat beobachtet.
Nun weiß ich aber in dem Teil der zu der Bewegung des Kreises von links nach rechts führt nicht weiter.
Im Anhang findet ihr den Code, die *.exe und alle sonsteigen mir unbekannten Dateien, die Delphi erstellt  .
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Erscheinen: TButton; Bewegen: TButton; Verschwinden: TButton; procedure FormCreate(Sender: TObject); procedure ErscheinenClick(Sender: TObject); procedure BewegenClick(Sender: TObject); procedure VerschwindenClick(Sender: TObject); private public end;
var Form1: TForm1; x,y,Durchmesser:Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin x:=10; y:=10; Durchmesser:=200; end;
procedure TForm1.ErscheinenClick(Sender: TObject); begin Refresh; canvas.Ellipse(x,y,x+Durchmesser,y+Durchmesser); end;
procedure TForm1.BewegenClick(Sender: TObject); var i:integer; Quelle, Ziel: TRect;
begin for i:=x-5 to ClientWidth-Durchmesser-x-5 do
begin Quelle:=Rect(i,y,i+Durchmesser+5,y+Durchmesser+5); Ziel:=Rect(i+1,y,i+Durchmesser+6,y+Durchmesser+5); canvas.CopyRect(Ziel,Canvas,Quelle); sleep(1); end; end;
procedure TForm1.VerschwindenClick(Sender: TObject); begin Refresh; end;
end. |
Edit 1:
Speziell geht es mir um die Erkläung aus deisem Bereich:
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:
| procedure TForm1.FormCreate(Sender: TObject); begin x:=10; y:=10; Durchmesser:=200; end;
procedure TForm1.ErscheinenClick(Sender: TObject); begin Refresh; canvas.Ellipse(x,y,x+Durchmesser,y+Durchmesser); end;
procedure TForm1.BewegenClick(Sender: TObject); var i:integer; Quelle, Ziel: TRect;
begin for i:=x-5 to ClientWidth-Durchmesser-x-5 do
begin Quelle:=Rect(i,y,i+Durchmesser+5,y+Durchmesser+5); Ziel:=Rect(i+1,y,i+Durchmesser+6,y+Durchmesser+5); canvas.CopyRect(Ziel,Canvas,Quelle); sleep(1); end; end; |
MfG
Tim 
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Katzenstreu am Sa 15.04.06 13:43, insgesamt 1-mal bearbeitet
|
|
starsurfer
      
Beiträge: 334
Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
|
Verfasst: Fr 14.04.06 13:19
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.FormCreate(Sender: TObject); begin x:=10; y:=10; Durchmesser:=200; end; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.ErscheinenClick(Sender: TObject); begin Refresh; canvas.Ellipse(x,y,x+Durchmesser,y+Durchmesser); end; |
"Canvas" ist in dem fall der Zeichenfläche von der Form1, also kann man es auch "form1.canvas" nennen...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.BewegenClick(Sender: TObject); var i:integer; Quelle, Ziel: TRect; begin for i:=x-5 to ClientWidth-Durchmesser-x-5 do begin Quelle:=Rect(i,y,i+Durchmesser+5,y+Durchmesser+5); Ziel:=Rect(i+1,y,i+Durchmesser+6,y+Durchmesser+5);canvas.CopyRect(Ziel,Canvas,Quelle); sleep(1); end; end; |
"Clientwidth" bezieht sich auf die Fenstergröße der Form OHNE Rand. ( auch Form1.clientwidth)
welche Frage du genau haste weis ich nich...hast ja keine direkte Frage gestellt
na vll hilft das hier schon weiter
star
_________________ GEIZ IST GEIL! - Ihr Sozialamt
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Fr 14.04.06 13:27
Hallo starsurfer,
danke für deine Hilfe  .
Warum wird de Elipse (in diesem Fall ein Kreis) durch vier Variablen bestimmt (canvas.Ellipse(x,y,x+Durchmesser,y+Durchmesser)  ?
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.ErscheinenClick(Sender: TObject); begin Refresh; canvas.Ellipse(x,y,x+Durchmesser,y+Durchmesser); end; |
Edit 2:
"Ich habe eben rausgefunden, dass die ersten zwei Werte wohl der Bereich sind, wo das Rechteck (Quadrat) anfängt. Die letzten beiden Werte sind für die Breite und die Höhe des Rechtecks verantwortlich."
Dann arbeite ich mal Frage für Frage ab  .
Danke dir!
MfG
Tim
Edit 1:
Wofür steht i? Was macht dieser Faktor oder Wert?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.BewegenClick(Sender: TObject); var i:integer; Quelle, Ziel: TRect; begin for i:=x-5 to ClientWidth-Durchmesser-x-5 do begin Quelle:=Rect(i,y,i+Durchmesser+5,y+Durchmesser+5); Ziel:=Rect(i+1,y,i+Durchmesser+6,y+Durchmesser+5);canvas.CopyRect(Ziel,Canvas,Quelle); sleep(1); end; end; |
Zuletzt bearbeitet von Katzenstreu am Fr 14.04.06 13:34, insgesamt 1-mal bearbeitet
|
|
starsurfer
      
Beiträge: 334
Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
|
Verfasst: Fr 14.04.06 13:32
Also durch die Punkte wird ein Rechteck(deswegen 4 Punkte) bestimmt in das der Kreis gezeichnet wird.
Die ersten 2 Wert: x-y Wert des oben links liegendem Punkt im Rechteck
Die zweiten 2 Werte: x-y Wert des unten rechts liegendem Punkt im Rechteck
Quelltext 1: 2: 3: 4: 5:
| Punkt 1 *---+ | | +---* Punkt2 |
-----
i ist die Varibale für die for..to..do Schleife
irgendwo muss man ja den aktuellen Schleifendurchlauf/Stand speichern 
_________________ GEIZ IST GEIL! - Ihr Sozialamt
Zuletzt bearbeitet von starsurfer am Fr 14.04.06 13:38, insgesamt 1-mal bearbeitet
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Fr 14.04.06 13:35
Muss das i sein?
Könnte man nicht sagen, dass der Kreis von links nach rechts bis zum Rand -x Pixel kopiert werden soll?
|
|
starsurfer
      
Beiträge: 334
Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
|
Verfasst: Fr 14.04.06 13:41
das i MUSS sein!
du willst ja das es sich nich einfach vom linke rand zum rechten springt (ohne zwischenschritte)
es soll sich ja langsam von links nach rechts bewegen...
kleines Beispiel(hatt nix mit deinem Programm zu tun):
Delphi-Quelltext 1: 2: 3: 4:
| for i:=1 to 3 do begin xpos:=i*10; end; |
i=1
x-pos (vom Kreis): 10
i=2
x-pos (vom Kreis): 20
i=3
x-pos (vom Kreis): 30
und da i durch die for-schleife ständig erhöht wird bewegt der Kreis sich langsam nach rechts!
_________________ GEIZ IST GEIL! - Ihr Sozialamt
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Fr 14.04.06 14:22
Das leuchtet mir nun ein  .
Jetzt muss ich nurnach deinen (eigentlich einfachen) Ablauf selbständig ohne sonstige Hilfsmittel (wie in der Klausur) alleine erstellen können.
Wie kann ich das üben?
Und wenn ich das dann kann, muss ich mir noch andere Methoden, die das gleiche Ergebnis haben, erlernen  .
MfG
Tim 
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Fr 14.04.06 15:17
Die Zeile for i:=..., Quelle:=... und Ziel:=... sind mir nun klar.
Aber Warum steht in dieser Zeile (Form1.Canvas.CopyRect(Ziel, Canvas, Quelle)  erst das Ziel, dann Canvas und dann die Quelle?
Was hat das Wort Canvas in den Koordinaten zu suchen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.BewegenClick(Sender: TObject); var i: integer; Quelle, Ziel: TRect; begin for i:=x-5 to Form1.ClientWidth-Durchmesser do begin Quelle:=Rect(i,y-5,i+Durchmesser+5,y+Durchmesser+5); Ziel:=Rect(i+1,y-5,i+Durchmesser+6,y+Durchmesser+5); Form1.Canvas.CopyRect(Ziel, Canvas, Quelle); Sleep(1); end; end; |
MfG
Tim 
|
|
starsurfer
      
Beiträge: 334
Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
|
Verfasst: Fr 14.04.06 15:43
Delphi-Quelltext 1:
| Form1.Canvas.CopyRect(Ziel, Canvas, Quelle); |
Form1.canvas.copyrect = die zeichenfläche in die kopiert wird
Ziel = Zielbereich auf der zeichenfläche in die kopiert wird (Koordinaten)
Canvas = Form1.canvas = die Zeichenfläche aus der kopiert wird
Quelle = Quellbereich aus der Zeichenfläche aus der kopiert wird (Koordinaten)
_________________ GEIZ IST GEIL! - Ihr Sozialamt
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Fr 14.04.06 17:53
Dann ist doch die Quelle das gleiche wie Canvas?! :hmm:
|
|
Coder
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 14.04.06 19:09
Das Programm ist aus dem Buch "Delphi für Kids".
Das hab ich auch und kann ich nur empfehlen.
Ist aber für jüngere geschrieben. 
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Fr 14.04.06 19:12
Das Buch habe ich bei meinem Lehrer (, der auch Schulleiter ist  ) schon gesehen.
Mal sehen, obs das irgendwo billig gibt.
Edit 1:
@Coder: Würdest du mir dein Buch eventuell verkaufen?
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Sa 15.04.06 13:20
Hallo,
nun habe ich die angekündigte zweite Variante getestet.
In dieser wird der Kreis gezeichnet. Er wird ebenfalls mit der "for - do"-Schleife verschoben. Der ehemalige Kreis wird mit der Hintergrundfarbe überschrieben.
Im Anhang das Projekt inkluive der ausführbaren Datei.
Hier der 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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Erscheinen: TButton; Bewegen: TButton; Verschwinden: TButton; procedure FormCreate(Sender: TObject); procedure ErscheinenClick(Sender: TObject); procedure BewegenClick(Sender: TObject); procedure VerschwindenClick(Sender: TObject); private public end;
var Form1: TForm1; x,y,Durchmesser:Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin x:=10; y:=10; Durchmesser:=200; end;
procedure TForm1.ErscheinenClick(Sender: TObject); begin Refresh; Form1.Canvas.Ellipse(x,y,x+Durchmesser,y+Durchmesser); end;
procedure TForm1.BewegenClick(Sender: TObject); var i:Integer; begin for i:=1 to Form1.ClientWidth-Durchmesser-2*x do begin Form1.Canvas.Pen.Color:=Form1.Color; Form1.Canvas.Ellipse(x+i-1,y,x+i-1+Durchmesser,y+Durchmesser); Form1.Canvas.Pen.Color:=ClBlack; Form1.Canvas.Ellipse(x+i,y,x+i+Durchmesser,y+Durchmesser); Sleep(1); end; end;
procedure TForm1.VerschwindenClick(Sender: TObject); begin Refresh; end;
end. |
Jedoch verstehe ich nicht, warum der Kreis in der y-Ebene anscheinend verschoben wird.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| ... Form1.Canvas.Pen.Color:=Form1.Color; Form1.Canvas.Ellipse(x+i-1,y,x+i-1+Durchmesser,y+Durchmesser); Form1.Canvas.Pen.Color:=ClBlack; Form1.Canvas.Ellipse(x+i,y,x+i+Durchmesser,y+Durchmesser); ... |
Könnte mir das jemand erklären?
MfG
Tim
Edit 1:
Nach dem Aufzeichen und nach dem Betrachten dder folgenden Zeichnung habe ich es nun endlich verstanden.
Delphi-Quelltext 1: 2: 3: 4: 5:
| Punkt 1 *---+ | | +---* Punkt 2 |
Einloggen, um Attachments anzusehen!
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: So 16.04.06 14:54
Hallo,
bitte erklärt mir hier noch einmal den markierten Bereich:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TKreis = class x,y,Durchmesser:Integer;
constructor Create (xx,yy,dd:Integer); procedure Erscheine; procedure Bewege; Procedure Verschwinde; end;
TForm1 = class(TForm) Erscheinen: TButton; Bewegen: TButton; Verschwinden: TButton; procedure FormCreate(Sender: TObject); procedure ErscheinenClick(Sender: TObject); procedure BewegenClick(Sender: TObject); procedure VerschwindenClick(Sender: TObject); end;
var Form1: TForm1; Kreis: TKreis; i: integer; Quelle, Ziel: TRect;
implementation
{$R *.dfm}
constructor TKreis.Create(xx,yy,dd:Integer); begin x:=xx; y:=yy; Durchmesser:=dd; end;
procedure TKreis.Erscheine; begin Form1.Refresh; Form1.Canvas.Ellipse(x,y,x+Durchmesser,y+Durchmesser); end;
procedure TKreis.Bewege; begin for i:=x-5 to Form1.ClientWidth-Durchmesser-x-5 do begin Quelle:=Rect(i,y-5,i+Durchmesser+5,y+Durchmesser+5); Ziel:=Rect(i+1,y-5,i+Durchmesser+6,y+Durchmesser+5); Form1.Canvas.CopyRect(Ziel,Form1.Canvas,Quelle); sleep(7); end; end;
procedure TKreis.Verschwinde; begin Form1.Refresh; end;
procedure TForm1.FormCreate(Sender: TObject); begin Kreis:=TKreis.Create(10,10,200); end;
procedure TForm1.ErscheinenClick(Sender: TObject); begin Kreis.Erscheine; end;
procedure TForm1.BewegenClick(Sender: TObject); begin Kreis.Bewege; end;
procedure TForm1.VerschwindenClick(Sender: TObject); begin Kreis.Verschwinde; end;
end. |
Moderiert von Gausi: Screenshot entfernt.
Einloggen, um Attachments anzusehen!
|
|
Born-to-Frag
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: So 16.04.06 15:28
Warum machst du bitte nen Screenshot von dem Source und schreibst ihn dann zusätzlich noch rein? 
_________________ Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: So 16.04.06 15:34
Born-to-Frag hat folgendes geschrieben: | Warum machst du bitte nen Screenshot von dem Source und schreibst ihn dann zusätzlich noch rein?  |
Warum so böse?!
Weil ich der Meing bin, dass viele Leute keine Lust haben den Quellcode abzuschreiben.
Du kannst auch gerne alle Bilder von www.feddern.org blockeren, sofern dein Browser das zu lässt  .
Aber nun BTT: Weißt du Rat?
MfG
Tim
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: So 16.04.06 16:17
Moderiert von Katzenstreu: Großes Lob. Perfekt! Gratulation!
Wie kann man den Bereich im Delphiquekllcode färben?
Und warum steht in derr for-to-do-Schleife 2 mal "-5"?
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 16.04.06 16:21
Katzenstreu hat folgendes geschrieben: | | Wie kann man den Bereich im Delphiquekllcode färben? |
Mit [Highl ight]...[/Highlight]
_________________ We are, we were and will not be.
|
|
Katzenstreu 
      
Beiträge: 39
Windows XP Professional
|
Verfasst: Mo 17.04.06 12:18
Titel: Problem mit "Constructor Create"!
Hallo,
ich weiß nicht, warum mir folgender Fehler angezeigt wird:
Quelltext 1: 2: 3: 4: 5:
| [Fehler] Unit1.pas(12): Ungenügende Forward- oder External-Deklaration: 'TKreis1.Create' [Fehler] Unit1.pas(13): Ungenügende Forward- oder External-Deklaration: 'TKreis1.Erscheine' [Fehler] Unit1.pas(14): Ungenügende Forward- oder External-Deklaration: 'TKreis1.Bewege' [Fehler] Unit1.pas(15): Ungenügende Forward- oder External-Deklaration: 'TKreis1.Verschwinde' [Fataler Fehler] Project2.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden |
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TKreis1 = class x,y,Durchmesser:Integer; constructor Create (xx,yy,dd:Integer); procedure Erscheine; procedure Bewege; procedure Verschwinde; end;
TForm1 = class(TForm) Erscheinen: TButton; Bewegen: TButton; Verschwinden: TButton; private public end;
var Form1: TForm1; Kreis: TKreis1;
implementation
{$R *.dfm}
end. |
Edit 1:
Ich habe einfach den Constructor weiter unten gestartet. Damit ist dieses Problem behoben.
Nun habe ich eine For-To-Do-Schleife eingebaut. Dabei erhalte ich folgenden Fehler:
[highlight][Warnung] Unit1.pas(56): FOR-Schleifenvariable muss eine einfache lokale Variable sein[/highlight]
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Katzenstreu am Mo 17.04.06 12:54, insgesamt 1-mal bearbeitet
|
|
Born-to-Frag
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: Mo 17.04.06 12:51
das project ist n icht immer nötig  .. naja also die fehlermeldungen kommen weil du prozeduren deklariert hast aber die nirgens in der implementation drinne hast..
greetz
_________________ Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
|
|
|