Autor Beitrag
e_t_grea
Hält's aus hier
Beiträge: 11

Win XP

BeitragVerfasst: Mi 14.05.08 16:33 
Hi,

ich schreibe zur Zeit meine Facharbeit in Informatik Klasse 12.
Als Thema habe ich Sortieralgorithmen bekommen.
Die Algorithmen an sich habe ich bereits fertig und sie funktionieren auch.

Mein Problem ist, dass ich den Ablauf der Algorithmen grafisch darstellen wollte,
indem ich auf einem Image die Werte als Säulendiagramm ausgeben lasse.
Ich lasse das Diagramm bereits einmal bevor Bubblesort startet zeichnen,
das Diagramm wird aber erst erneuert, wenn Bubblesort komplett durchgelaufen ist.

Am Beispiel von Bubblesort habe ich dass wie folgt gelöst:

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:
procedure Bubblesort(var value:Array of Integer);

 procedure DrawBubble(value:Array of Integer); //Diagramm zeichnen
 var
  x       :Integer;
 begin
  with BubbleImage.Canvas do
   begin
    Brush.Style:=bsSolid;
    Pen.Color:=clWhite;
    Rectangle(0,0,201,201);  //Hier "lösche" ich das Image
    Pen.Color:=clBlack;
    for x:=0 to 99 do    //Mein zu sortierendes Array enthält 100 Werte 
     begin
      MoveTo(x*2,200);
      LineTo(x*2,200-value[x]);
     end;
   end;
 end;

var
 i        :Integer;
 j        :Integer;
begin
 for i:=99 downto 0 do    //Bubblesort für Array 'value' mit 100 Werten ausgeführt
  for j:=0 to i-1 do
   begin
    if value[j]>value[j+1] then
     exchange(value[j],value[j+1]); //'exchange' vertauscht die beiden Werte 
    DrawBubble(value);
    sleep(5);      //Trotz 'sleep' wird das Diagramm erst am Ende erneuert
   end;
end;


Der Sortieralgorithmus an sich funktioniert einwandfrei, nur eben die Darstellung nicht.
Wenn ich anstelle von 'sleep' einfach 'showmessage' schreibe, funktioniert es.
Dann wird bei jedem Schritt das Diagramm neu gezeichnet.
Aber es kann ja nich der Sinn sein, hunderte von fenstern zu öffnen bzw. schließen,
nur um Bubblesort in Aktion zu erleben ;)

Deshalb jetzt meine Frage:

Wie kann ich das Diagramm bei jedem Schritt neu zeichnen lassen?
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Mi 14.05.08 16:38 
application.processmessages anstelle von showmessage wird dir weiterhelfen
Nico72
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50

Win XP, Vista
Delphi 7, Delphi 2006
BeitragVerfasst: Mi 14.05.08 16:41 
ausblenden Delphi-Quelltext
1:
BubbleImage.refresh;					

in der DrawBubble-Prozedur zum Schluss zwingt die Komponente zum Neuzeichnen.
e_t_grea Threadstarter
Hält's aus hier
Beiträge: 11

Win XP

BeitragVerfasst: Mi 14.05.08 16:49 
wow, danke für die schnellen antworten.

Hab es jetzt mit Image.Refresh probiert und klappt super,
tut mir leid Jann1k, hatte jetzt das Andere zuerst probiert ;)

Jetzt noch eine neue Frage:
Hab gemerkt, dass wenn ich mehrere Algorithmen gleichzeitig vergleichen will,
die hintereinander ausgeführt werden.
Gibt es da eine einfache Möglichkeit, die Prozeduren gleichzeitig ablaufen zu lassen?

Edit:
Um zu überprüfen, welche Algorithmen verglichen werden sollen, benutze ich CheckBoxen.
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Mi 14.05.08 17:16 
a) Vielleicht alle Algorithmen ohne grafische Ausgabe durchrechnen alles und später als "Movie" die Ergebnissse zeigen. Eignet sich aber nur für wenige zu sortierende Elemente.
b) Schrittweise. Vielleicht kannst Du die Refreshroutine missbrauchen und immer den nächsten Schritt eines anderen Algorithmus "antreten".
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 14.05.08 17:29 
Wenn verschiedene Algorithmen gleichzeitig simuliert werden sollen, dann bietet es sich an, das über mehrere Threads zu tun. Das ist aber (besonders in Verbindung mit Bitmaps) nicht so ganz trivial...

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 14.05.08 17:43 
Und ein Beispiel das genau das macht findet sich in den Demos zu Delphi ;-).
Bei Delphi 2006 / Turbo Delphi zum Beispiel unter "(Programme)\Borland\BDS\4.0\Demos\DelphiWin32\VCLWin32\Threads".
e_t_grea Threadstarter
Hält's aus hier
Beiträge: 11

Win XP

BeitragVerfasst: Mi 14.05.08 17:47 
@Tilo: ich hatte an etwas änliches gedacht, wollte eigentlich einen Timer nehmen,
würde wahrscheinlich auf das Gleiche hinauslaufen:
alle Algorithmen nochmal umschreiben ...

hab grade jaenicke gesehen:
oh man, bin ich blind :oops:
das ist ja auch noch mit den Sortieralgorithmen :roll:

vielen dank,

ich bin dann mal am programmieren
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 14.05.08 20:07 
Jep. Das Demo gibt's dort schon seit Delphi 4 ... Wenn nicht sogar NOCH länger ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
nagel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Mi 14.05.08 22:30 
Mindestens seit D3.