![]() |
Progess Bar soll laden während sich ein tImage aufbaut
Hi,
Ich habe ein Programm in dem ich ein Apfelmännchen in ein tImage zeichnen lasse. Wenn ich jetzt eine Progressbar einbaue, dann soll die Progressbar laden während sich das Apfelmännchen aufbaut. Je nachdem wie viele Iterationen das Apfelmännchen hat, dauert der Aufbau länger bzw. kürzer. Die Progressbar sollte dann natürlich auch länger bzw. kürzer laden und der Ladebalken sollte voll sein wenn das Apfelmännchen komplett aufgebaut ist. In meinem Programm habe ich die Progressbar schon eingebaut. Sie funtkioniert so, dass wenn ich auf den Button Zeichnen klicke, um das Apfelmännchen zu zeichnen, erst der ladeblaken auf 100% steigt und danach das zeichnen beginnt. Es sollte aber beides Parallel funtkionieren und aufeinander abgestimmt sein. Hier der Quellcode:
Delphi-Quellcode:
Hier jetzt der gesamte Code des Progs:
procedure TFRM_Main.BTN_ZeichnenClick(Sender: TObject);
var I: Integer; begin PRB_Laden.Min:=0; PRB_Laden.Max:=50000; for I:=0 to 50000-1 do PRB_Laden.Position:=I; begin xmax := strtofloat(FRM_Options.EDT_xmax.text); xmin := strtofloat(FRM_Options.EDT_xmin.text); ymax := strtofloat(FRM_Options.EDT_ymax.text); ymin := strtofloat(FRM_Options.EDT_ymin.text); kmax := strtoint(FRM_Options.EDT_kmax.text); rmax := strtoint(FRM_Options.EDT_rmax.Text); creal := strtofloat(FRM_Options.EDT_creal.text); cimag := strtofloat(FRM_Options.EDT_cimag.text); dx := (xmax-xmin)/500; dy := (ymax-ymin)/400; for x_bild := 0 to 500 do for y_bild := 0 to 400 do iteration (x_bild,y_bild); end; end;
Delphi-Quellcode:
unit UNT_AM_Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, jpeg, ComCtrls; type TFRM_Main = class(TForm) BTN_Options: TBitBtn; BTN_Zeichnen: TBitBtn; IMG_Apfelmann: TImage; SHP_Unterteilung: TShape; BTN_Close: TBitBtn; BTN_Hilfe: TBitBtn; PRB_Laden: TProgressBar; procedure BTN_OptionsClick(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure BTN_ZeichnenClick(Sender: TObject); procedure BTN_CloseClick(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure IMG_ApfelmannClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var FRM_Main: TFRM_Main; implementation uses UNT_AM_Options; {$R *.dfm} var x_bild,y_bild,kmax,k,rmax,xo,xu,yl,yr : integer; x,xalt,y,dx,dy,creal,cimag : real; xmax,xmin,ymax,ymin : real; md : boolean; procedure iteration(x_bild,y_bild: integer); begin x := xmin + x_bild*dx; y := ymax - y_bild*dy; creal := (x_bild) *dx+xmin; cimag := (400-y_bild) *dy+ymin; k := 0; repeat xalt := x; x := sqr(x) - sqr(y) + creal; y := 2*xalt*y + cimag; inc(k); until (sqr(x)+sqr(y)>rmax) or (k>kmax); if k >= kmax then k:=0; FRM_Main.IMG_Apfelmann.canvas.pixels[x_bild+1,y_bild+1] := 16000000div(k+1); end; procedure TFRM_Main.BTN_OptionsClick(Sender: TObject); begin FRM_Options.show; end; procedure TFRM_Main.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var a,b : real; begin a := xmin + (x-152)*(xmax-xmin)/500; b := ymax - (y-8)*(ymax-ymin)/400; FRM_Options.EDT_xmin.Text := floattostrf(a,fffixed,10,8); FRM_Options.EDT_ymax.Text := floattostrf(b,fffixed,10,8); xo := x; yl := y; xu := x; yr := y; md := true; end; procedure TFRM_Main.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin md := false; end; procedure TFRM_Main.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var a,b : real; begin if md then begin a := xmin + (x-152)*(xmax-xmin)/500; b := ymax - (y-8)*(ymax-ymin)/400; FRM_Options.EDT_xmax.Text := floattostrf(a,fffixed,10,8); FRM_Options.EDT_ymin.Text := floattostrf(b,fffixed,10,8); IMG_Apfelmann.canvas.Pen.Mode := pmnotxor; IMG_Apfelmann.canvas.Rectangle(xo,yl,xu,yr); IMG_Apfelmann.canvas.Rectangle(xo,yl,x,y); IMG_Apfelmann.canvas.Pen.Mode := pmcopy; xu := x; yr := y; end; end; procedure TFRM_Main.FormCreate(Sender: TObject); begin md := false; end; procedure TFRM_Main.BTN_ZeichnenClick(Sender: TObject); var I: Integer; begin PRB_Laden.Min:=0; PRB_Laden.Max:=50000; for I:=0 to 50000-1 do PRB_Laden.Position:=I; begin xmax := strtofloat(FRM_Options.EDT_xmax.text); xmin := strtofloat(FRM_Options.EDT_xmin.text); ymax := strtofloat(FRM_Options.EDT_ymax.text); ymin := strtofloat(FRM_Options.EDT_ymin.text); kmax := strtoint(FRM_Options.EDT_kmax.text); rmax := strtoint(FRM_Options.EDT_rmax.Text); creal := strtofloat(FRM_Options.EDT_creal.text); cimag := strtofloat(FRM_Options.EDT_cimag.text); dx := (xmax-xmin)/500; dy := (ymax-ymin)/400; for x_bild := 0 to 500 do for y_bild := 0 to 400 do iteration (x_bild,y_bild); end; end; procedure TFRM_Main.BTN_CloseClick(Sender: TObject); begin FRM_Main.Close; FRM_Options.Close; end; procedure TFRM_Main.BitBtn1Click(Sender: TObject); procedure TFRM_Main.IMG_ApfelmannClick(Sender: TObject); begin end; end. Hoffe ihr versteht mich :? Gruß Daniel |
Re: Progess Bar soll laden während sich ein tImage aufbaut
Hallo Daniel,
Zitat:
Delphi-Quellcode:
Du musst die Position in der eigentlichen Arbeitsschleife verändern, dann hast du den gewünschten Effekt.
for I:=0 to 50000-1 do
PRB_Laden.Position:=I; Grüße vom marabu |
Re: Progess Bar soll laden während sich ein tImage aufbaut
ich habe den code wie folgt eingefügt:
Delphi-Quellcode:
Es klappt jetzt, aber wenn ich auf zeichnen klicke, kommt erst eine verzögerung und dann erst startet die progressbar zu arbeiten. wie kriege ich die verzögerung weg.
procedure TFRM_Main.BTN_ZeichnenClick(Sender: TObject);
var I: Integer; begin PRB_Laden.Min:=0; PRB_Laden.Max:=50000; begin xmax := strtofloat(FRM_Options.EDT_xmax.text); xmin := strtofloat(FRM_Options.EDT_xmin.text); ymax := strtofloat(FRM_Options.EDT_ymax.text); ymin := strtofloat(FRM_Options.EDT_ymin.text); kmax := strtoint(FRM_Options.EDT_kmax.text); rmax := strtoint(FRM_Options.EDT_rmax.Text); creal := strtofloat(FRM_Options.EDT_creal.text); cimag := strtofloat(FRM_Options.EDT_cimag.text); dx := (xmax-xmin)/500; dy := (ymax-ymin)/400; for x_bild := 0 to 500 do for y_bild := 0 to 400 do iteration (x_bild,y_bild); for I:=0 to 50000-1 do PRB_Laden.Position:=I; end; end; |
Re: Progess Bar soll laden während sich ein tImage aufbaut
hi,
Delphi-Quellcode:
50000-1 = 49999 :mrgreen: :mrgreen:
for I:=0 to 50000-1 do
PRB_Laden.Position:=I; |
Re: Progess Bar soll laden während sich ein tImage aufbaut
Zitat:
Ich habe meinen beitrag von eben nochmal editiert. Musst du mal schauen was ich falsch mache. |
Re: Progess Bar soll laden während sich ein tImage aufbaut
Wenn du die 50.000 schon hardcodest und eins von abziehst, dann kannst du auch gleich 49.999 schreiben.
|
Re: Progess Bar soll laden während sich ein tImage aufbaut
ja ok kann man machen.
und wie kriege ich es jetzt hin das es ohne verzögerung startet ? ich glaube das sich jetzt erst das bild aufbaut,nur noch nicht angezeigt wird und dann die progressbar wieder umsonst arbeitet, nur nachher. wie kriege ich es parallel hin ? ist eigentlich die wichtigere frage. |
Re: Progess Bar soll laden während sich ein tImage aufbaut
Setz die Position der Progressbar in der Berechnung. Aber ich würde sowieso empfeheln das ganze in einen Thread auszulagern und dann etwader mit Synchronize arbeiten oder wenn du nicht die VCL Thread-Klasse nimmst mit Nachrichten an die Hauptform:
![]() |
Re: Progess Bar soll laden während sich ein tImage aufbaut
den link den du gepostet hast, damit kann ich nicht wriklich was anfangen.
sag mir einfach nur, wenn es nicht zu viel arbeit ist, wo ich was im Quellcode verändern muss, bzw. wo ich
Delphi-Quellcode:
in die rechnung einbauen muss?
PRB_Laden.Position:=I;
|
Re: Progess Bar soll laden während sich ein tImage aufbaut
Gerade beim Berechenen von Fraktalen kommt es darauf an, dass man der Maschine keine Rechenzeit stielt, also habe ich deinen Code so angepasst, dass er nur pro Spalte einen Arbeitsfortschritt zeigt. Habe deinen Code allerdings nicht getestet.
Delphi-Quellcode:
marabu
const
CMAXCOLS = 500; CMAXLINES = 400; var I: Integer; begin PRB_Laden.Min := 0; PRB_Laden.Max := CMAXCOLS; xmax := strtofloat(FRM_Options.EDT_xmax.text); xmin := strtofloat(FRM_Options.EDT_xmin.text); ymax := strtofloat(FRM_Options.EDT_ymax.text); ymin := strtofloat(FRM_Options.EDT_ymin.text); kmax := strtoint(FRM_Options.EDT_kmax.text); rmax := strtoint(FRM_Options.EDT_rmax.Text); creal := strtofloat(FRM_Options.EDT_creal.text); cimag := strtofloat(FRM_Options.EDT_cimag.text); dx := (xmax - xmin) / CMAXCOLS; dy := (ymax - ymin) / CMAXLINES; for x_bild := 0 to CMAXCOLS - 1 do for y_bild := 0 to CMAXLINES - 1 do begin iteration (x_bild, y_bild); with PRB_Laden do Position := Position + 1; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz