schnelle Hilfe zu Canvas + verschwinden lassen!

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Slider5000
Beiträge: 6
Registriert: Fr 23. Dez 2011, 15:17

schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von Slider5000 »

Hey,
bin neu hier und hoffe mal, dass ich den richtigen Forenbereich getroffen habe..
zuerst ist mal das problem, dass ich das programm heute abend um 23:59 meinem lehrer geschickt haben muss^^..
wir sollen also mit canvas einen weihnachtsbaum erstellen, und der soll ein paar special-features haben..
ich habe jetzt eine checkbox eingebaut, wodurch kugeln an den baum gehangen werden..
klappt auch, aber wenn der haken weg ist, bleiben die kugeln.. wie kann ich die dann wieder entfernen? übermalen geht nicht, weil man einen zufällig generierten hintergrund wählen kann..

problem 2:
ich lasse unten vom image geschenke positionieren, über ein spinedit kann man die anzahl festlegen.
aber wenn ich erst 8 geschenke festlege und danach z.b. 4, zeigt er 12.. logisch, er fügt sie einfach hinzu.. die ersten "8" soll er aber wieder verschwinden lassen..
hier der quelltext von problem 1 und 2
1:

Code: Alles auswählen

procedure TForm1.CKugelChange(Sender: TObject);
begin
  k := 105;
  u := 90;
  k1 := 125;
  u1 := 110;
  if CKugel.Checked then
    for Kugelnlinks := 1 to 3 do
      with ITannenbaumBild.canvas do  // linke Kugelseite
      begin
 
        pen.color := random(color);
        brush.color := pen.color;
        ellipse(k, u, k1, u1);
        k := k - 30;
        u := u + 80;
        k1 := k1 - 30;
        u1 := u1 + 80;
      end;
 
 
  k := 225;
  u := 90;
  k1 := 245;
  u1 := 110;
  if CKugel.Checked then
    for Kugelnlinks := 1 to 3 do
      with ITannenbaumBild.canvas do  // rechte Kugelseite
      begin
 
        pen.color := random(color);
        brush.color := pen.color;
        ellipse(k, u, k1, u1);
        k := k + 30;
        u := u + 80;
        k1 := k1 + 30;
        u1 := u1 + 80;
      end;
 
end;
und hier von problem 2:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  Geschenke := StrToInt(SGeschenke.Text);
  with ITannenbaumBild.canvas do
 
    if Geschenke > 8 then
    begin
      ShowMessage('Du bist zu gierig!');
      Close;
    end
    else
    begin
 
      for Lauf := 1 to Geschenke do
      begin
        x2 := random(300) + 10;
        y2 := random(50) + 340;
        Brush.Color := clred;
        pen.color := clred;
        rectangle(x2 - 20, y2, x2 + 20, y2 + 10);   //Geschenk
        Brush.Color := clyellow;
        Pen.Color := clyellow;
        rectangle(x2 - 1, y2 + 10, x2 + 1, y2 + 0);
        //Schleife Geschenk von oben nach unten
        rectangle(x2 - 20, y2 + 4, x2 + 20, y2 + 6);
        //Schleife Geschenk von links nach rechts
 
      end;
    end;
 
end;
hoffe ihr könnt mir.. schnell.. helfen :-D
Zuletzt geändert von Lori am Fr 23. Dez 2011, 19:34, insgesamt 1-mal geändert.
Grund: richtigen Highlighter

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von theo »

Du solltest im OnPaint Ereignis einer Komponente zeichnen.
Da malst du jedesmal alle Elemente auf den Canvas, das Hintergrundbild zuerst.
Ein "Invalidate" verursacht ein Neuzeichnen.

Slider5000
Beiträge: 6
Registriert: Fr 23. Dez 2011, 15:17

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von Slider5000 »

okey.. aber mein größeres problem ist weiterhin das mit den geschenken..
kann mir da jemand helfen, dass immer nur die angezeigt werden, die ich im spinedit angegeben habe?

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von MAC »

Als aller erstes: Makier mal in deinem Posting dein Quellcode und wähle bei Highlighter aus "Freepascall/Lazarus" danke, jetzt kann man den Code auch mal "lesen"

DU machst es folgendermaßen:

Du malst den Hintergrund
Du malst ein Baum
Du malst 8 geschenke
Du malst noch weitere 4 geschenke
Du malst 10 Kugeln.

Fertig: Baum mit 12 geschenken und 10 Kugeln.

Problem bei deiner Art ist aber das du die Position , an dem du dein Geschenk malst wieder vergisst.
Du nimmst also eine zufallsposition. Speicherst die nicht.
Vorteil dieser Varainte ist: Sie ist schnell. Nachteil ist sie ist schwieriger rückgängig zu machen (also Genschenke wegnehmen ist nicht !!!!)
Da es dir aber nicht so auf die geschwindigkeit an kommt (Die andere Variante brauch vlt 1 ms mehr :D (in diesem fall)), rate ich es folgendermaßen zu machen:

Als allererstest musst du dir ein Record zusammenbauen.
Ein Record ist eigentlich nix besonderes, in ihm werden mehrere Variablen zusammengefasst.
// Für alle Mitleser : ich habe mich hier entschieden einen Record zu nehmen weil ich nicht weis ob Slider5000 gut im Objekt Orientierten Programmieren ist, und da dort leicher fehler auftauchen bleib ich mal bei einem record.

TKugel = record
x,y:integer; // jede kugel hat eine x und y position
farbe:integer; // und eine Farbe
// size:integer; //z.B könntest du die Kugel noch um eine Größe erweitern.
end;

// soetwas ähnliches erstellst du für deine geschenke mit allem was so ein Geschenk besitzt.

Dann Speicherst erstmal ein Haufen Variablen:
1: Wieviele Kugeln du benutzt.
2: Wieviele Geschenke du benutzt.
3: Ein (dynamischen) Array mit der Position von allen Kugeln // hier: Kugeln: array of TKugel
4: Ein Array mit der Position von allen Geschenken. // Siehe Records

Diese Variablen werden gesetzt wenn ander SpinEdit rumgeschraubt wird.
Beim Rumschrauben an der SpnEdit, wird erstmal nicht gezeichnet !
Ein Beispiel Durchgang bei deiner Kugel-SpinEdit wär also:

Code: Alles auswählen

var
i:integer;
begin
anzahlmeinerkugeln := SpinEdit1.Value;
setlength(Kugeln,anzahlmeinerkugeln); // der dynamische Array bekommt die länge damit du genausoviele informationen speichern kannst wie du Kugeln hast.
for i := 0 to anzahlmeinerkugeln-1 do
  begin
  kugeln[i].x := random(300);
  kugeln[i].y := random(300);
  kugeln[i].farbe := random(16777215); 
  end;
end;
Du schreibst alles Zeichnen in eine 2te Procedure, die jedes mal aufgerufen wird wenn du etwas an den Kugeln oder Geschenken änderst...
Das bedeutet, selbst wenn du nur eine weitere Kugel haben willst, wird nochmal der Komplette hintergrund, der Komplette baum, alle anderen Kugeln und alle Geschenke gezeichnet !

Code: Alles auswählen

// als erstes solltest du ein großes weißes (oder welche Hintergrudnfarbe dir lieb ist) Recheck zeichen um alles was bisher gezeichnet wurde zu überspielen. 
// Dann den Hintergrund + Baum zeichenen
// Dann die Kugeln
for i := 0 to anzahlmeinerkugeln-1 do
  begin
  canvas.Pen.color := Kugeln[i].Farbe;
  k := kugeln[i].x;
  u := kugeln[i].y;
  canvas.ellipse(k,u,k1,u2);
  end;
So entschuldigung für den langen text :)
Ich habe mal versucht dir nicht allzuviel zu helfen wesshalb ich nur ein bisschen Code zu den Kugeln gegeben habe und das Zeichen (Rendern) nur in PreudoCode geschrieben habe...
Ich hoffe es hilft dir etwas.

Code: Alles auswählen

Signatur := nil;

Slider5000
Beiträge: 6
Registriert: Fr 23. Dez 2011, 15:17

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von Slider5000 »

ok..
bleibt das problem mit den geschenken..
n kumpel hats auch so, und bei dme klappts..

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von pluto »

Du musst, wenn sich die Anzahl der Geschenke ändert, auch deine Liste auf 0 zurücksetzten. Ich weiß jetzt nicht, ob es eine TobjectList ist, wenn dann könntest du das mit der Clear Methode machen, aber ich glaube, es ist ein einfacher array, also SetLength(ArrrayName, 0). und dann den Canvas überzeichnen.
MFG
Michael Springwald

Slider5000
Beiträge: 6
Registriert: Fr 23. Dez 2011, 15:17

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von Slider5000 »

ja. das mit dme clear hab ich mir auch überlegt, aber da sagt er mir immer, dass es den ausdruck nicht gibt.. ich wollte eig. die variable immer zurücksetzen.. aber das geht nicht..
kannst du mir erklärn, was eine tobjekt-list ist?
hab im inet schon davon gelesen, dass man es dann irgendwie löschen kann..
und das mit dem übermalen klappt nicht, weil der hintergrund random ist..

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von theo »

Slider5000 hat geschrieben: kannst du mir erklärn, was eine tobjekt-list ist?
Google ist dein Freund: http://www.delphi-treff.de/tutorials/vc ... rundlagen/" onclick="window.open(this.href);return false;
Slider5000 hat geschrieben: hab im inet schon davon gelesen, dass man es dann irgendwie löschen kann..
Nee, das hast du nicht gelesen.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von pluto »

Nee, das hast du nicht gelesen.
Naja lider5000 ist anders. Du verwendest wie ich schon geschrieben hast ein Array, also musst du die Länge des Array's auf 0 setzten mit der Anweisung die ich geschrieben habe:
SetLength(Array, 0), kann sein, dass ich mich verschrieben habe, also gibt mal SetLe ein und drücke Strg+Leertaste. Ich würde mir dafür eine kleine Methode schreiben die zwei Aufgaben erledigt:
Array zurück setzten und den Canvas überzeichnen mit einem FillRect.
MFG
Michael Springwald

Slider5000
Beiträge: 6
Registriert: Fr 23. Dez 2011, 15:17

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von Slider5000 »

sorry aber ich verstehs einfach nicht, was ihr mit dem arrey wollt,
könnt ihr mir nochmal sagen, was damit überhaupt passieren soll`?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von pluto »

OK. Mein Fehler: Ich dachte du verwendest ein array. Also brauchst du nur das Canvas mit FillRect neu zeichnen. schon sollte es gehen.
MFG
Michael Springwald

Slider5000
Beiträge: 6
Registriert: Fr 23. Dez 2011, 15:17

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von Slider5000 »

hab jetzt das info-ass aus meinem kurs gefragt und ihm beide programme gegeben und selbst er verstehts nicht, warum es bei ihm geht und bie mir nicht..
habe es jetzt abgeschickt..
trotzdem danke für die problemlösung nr. 1 :)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: schnelle Hilfe zu Canvas + verschwinden lassen!

Beitrag von pluto »

Sonst sende es mir mal: michael.springwald@gmx.de dann schaue ich es mir an...
MFG
Michael Springwald

Antworten