Entwickler-Ecke
Multimedia / Grafik - canvasgrafik erst nach komplettem programmdurchlauf gezeichn
nepleurepas - Mo 16.04.07 00:23
Titel: canvasgrafik erst nach komplettem programmdurchlauf gezeichn
Hallo,
mache ein Programm dass Sternkarten aus gegeben Daten berechnet und graphisch darstellt. Habe dazu ein paar Proceduren gemacht, die exelfiles auslesen und dann mit TCanvas zeichnet. Soweit so gut, alles funktioniert. Nun wollte ich das Ganze animiert machen, d.h. dass das Program nacheinander versch Excelfiles (die die Sternstände zu versch. zeiten beinhalten) "durchmacht" . dadurch soll man dann sehen wie sich die sterne auf der Karte bewegen. Das Programm läuft, nur ließt er der reihe nach alle files aus und zeigt mir nur die letzte Karte an. Hab dann noch n paar experimente gemacht, und bin zu dem schluss gekommen, dass Delphi erst alle anderen Vorgänge ausführt, und dann ganz zu schluss den letzten Canvaszustand zeichnet. Kann mir da vllt jemand helfen, wie ich die Grafiken immer dann zeichnen lassen kann, wenn ich es im quelltext so vorsehe?
Viele dank für Antworten.
gruß Stefan
Karlson - Mo 16.04.07 00:29
Ich muss gleich weinen, auch wenn ich das deinem Namen nach nicht tun soll, denn du hättest das auch etwas verständlicher erklären können ;)
So, ich verstehe deine Ausführungen nicht so wirklich. Ich denke ohne Quellcode wird man dir da nicht helfen können.
Allgemein gilt in so einem Fall: Du hast doch irgendeine Procedure die dann deine Daten zeichnet. Und wenn du willst das gezeichnet werden soll rufst du die ganz einfach auf :?:
Wie gesagt...Quellcode oder verständlich schreiben.
JayEff - Mo 16.04.07 00:45
Legt beschwörend seine Hände auf die Code-Kristallkugel
Ich sehe .. ich sehe ...!
Application.ProcessMessages; ! :flehan:
Also. Das ist mal das erste, was mir so einfällt. Wenn du eine lange Prozedur hast (vielleicht noch mit sleep drin), und in ihr eine Animation darstellen willst, so dass mehrere Bilder nacheinander angezeigt/gezeichnet werden, dann wird die Prozedur erst durchlaufen, bis weitere Nachrichten verarbeitet werden bzw. bis etwas gezeichnet wird. Ich denke, was helfen würde, ist folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Procedure ZeichneAlles; begin Image1.Canvas.Lineto(10, 10); Application.ProcessMessages; sleep(1000);
Image1.Canvas.Lineto(20, 20); Application.ProcessMessages; sleep(1000);
Image1.Canvas.Lineto(30, 30); Application.ProcessMessages; end; |
nepleurepas - Mo 16.04.07 00:45
Karlson hat folgendes geschrieben: |
Ich muss gleich weinen, auch wenn ich das deinem Namen nach nicht tun soll, denn du hättest das auch etwas verständlicher erklären können ;)
So, ich verstehe deine Ausführungen nicht so wirklich. Ich denke ohne Quellcode wird man dir da nicht helfen können.
Allgemein gilt in so einem Fall: Du hast doch irgendeine Procedure die dann deine Daten zeichnet. Und wenn du willst das gezeichnet werden soll rufst du die ganz einfach auf :?:
Wie gesagt...Quellcode oder verständlich schreiben. |
Also die Procedure "lesetabelle" ließt die exceltablle aus übergibt jeweils ein x und y Koordinate an die Procedure "zeichnestern".
Die Procedure "lesetabelle" wird von der Procedure "Animation " aufgerufen, die nacheinander versch. excelfiles öffnet.
Hoffe nun ist es einigermaßen verständlich. Das programm läuft, das Problem is nur, dass bis das letzte excelfile ausgelesen wird garnichts gezeichnet wird. erst danach und dann alles auf einmal.
Gruß Stefan
ok, hier der quellcode:
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:
| procedure animation(filename: string); var episode, episodenanzahl, laengepfad: integer; var lfdnr, pfad: string; begin pfad:= filename; episodenanzahl:= 8 ; episode:= 1; laengepfad:= length(pfad); lfdnr:= '1';
while (episode<(episodenanzahl+1)) do begin pfad[laengepfad-4]:= lfdnr[1]; print1u.Xls_To_StringGrid(form1.stringgrid1, pfad); print1u.lesetabelle(form1.stringgrid1); episode:= episode+1; lfdnr:= inttostr(episode); sleep(1000); end; form1.Edit2.Text:= pfad;
procedure zeichnestern(x,y: real); var px, py, dicke: integer; var farbe: Tcolor;
begin
dicke:= strtoint(form1.edit3.text); farbe:= form1.colorbox1.selected; form2.Image1.canvas.brush.Color:= farbe; form2.Image1.canvas.Pen.Color:= farbe; px:= umrechnen(x); py:= umrechnen(y);
form2.Image1.Canvas.roundrect(px-dicke,py-dicke,px+dicke,py+dicke,100,100); form2.edit1.text:= inttostr(px); form2.edit2.text:= inttostr(py); |
JayEff - Mo 16.04.07 00:47
Das Delphiforum hat eine geniale Funktion, die deinen Quellcode wunderschön formatiert ausgibt, mit Syntaxhighlighting, fettgedruckten Schlüsselwörtern und sämtlichen Absätzen, die in deinem Code sind. Diese Funktion lässt sich einfach nutzen, in dem du deinen Code mit Delphi-Tags umschließt, etwa so:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG272063684bf8fb22ed995633a1647a14}</span></span>! :mahn:
Auf diese Weise ersparst du unseren lieben Mods viel Arbeit und ausserdem werden dir die anderen Delphianer gerner helfen, zumal dein Code wesentlich leserlicher ist!
Bitte ändere das doch einfach, in dem du die

-Taste (bzw. für den Inline-Editor, falls im Profil AJAX aktiviert ist, die

-Taste) rechts neben deinem Beitrag benutzt.
Alles weitere steht ja in meinem letzten Post ;)
nepleurepas - Mo 16.04.07 00:56
JayEff hat folgendes geschrieben: |
Das Delphiforum hat eine geniale Funktion, die deinen Quellcode wunderschön formatiert ausgibt, mit Syntaxhighlighting, fettgedruckten Schlüsselwörtern und sämtlichen Absätzen, die in deinem Code sind. Diese Funktion lässt sich einfach nutzen, in dem du deinen Code mit Delphi-Tags umschließt, etwa so: <span class="inlineSyntax"><span class="codecomment">{PROTECTTAGf99c72bdb1c799d69801de0caeb3598d}</span></span>! :mahn:
Auf diese Weise ersparst du unseren lieben Mods viel Arbeit und ausserdem werden dir die anderen Delphianer gerner helfen, zumal dein Code wesentlich leserlicher ist!
Bitte ändere das doch einfach, in dem du die -Taste (bzw. für den Inline-Editor, falls im Profil AJAX aktiviert ist, die -Taste) rechts neben deinem Beitrag benutzt.
Alles weitere steht ja in meinem letzten Post ;) |
danke für den Tip mit "Application.ProcessMessages" Denke so funktiuniert es.
gruß Stefan
JayEff - Mo 16.04.07 00:59
nepleurepas hat folgendes geschrieben: |
| Denke so funktiuniert es. |
Wenn's denn so funktioniert, markierst du dann das Thema entsrechend? Unter dem letzten Beitrag ist ein Link, ein großes
HIER... ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!