Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Progess Bar soll laden während sich ein tImage aufbaut (https://www.delphipraxis.net/45952-progess-bar-soll-laden-waehrend-sich-ein-timage-aufbaut.html)

Daniel07A 15. Mai 2005 13:50


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:
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;
Hier jetzt der gesamte Code des Progs:

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

marabu 15. Mai 2005 14:02

Re: Progess Bar soll laden während sich ein tImage aufbaut
 
Hallo Daniel,

Zitat:

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.
Solange du die folgende Schleife abarbeitest, ist das auch kein Wunder.

Delphi-Quellcode:
for I:=0 to 50000-1 do
  PRB_Laden.Position:=I;
Du musst die Position in der eigentlichen Arbeitsschleife verändern, dann hast du den gewünschten Effekt.

Grüße vom marabu

Daniel07A 15. Mai 2005 14:05

Re: Progess Bar soll laden während sich ein tImage aufbaut
 
ich habe den code wie folgt eingefügt:

Delphi-Quellcode:
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;
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.

100nF 15. Mai 2005 14:09

Re: Progess Bar soll laden während sich ein tImage aufbaut
 
hi,

Delphi-Quellcode:
for I:=0 to 50000-1 do
  PRB_Laden.Position:=I;
50000-1 = 49999 :mrgreen: :mrgreen:

Daniel07A 15. Mai 2005 14:13

Re: Progess Bar soll laden während sich ein tImage aufbaut
 
Zitat:

50000-1 = 49999
??? Verstehe ich nicht.

Ich habe meinen beitrag von eben nochmal editiert. Musst du mal schauen was ich falsch mache.

Luckie 15. Mai 2005 14:19

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.

Daniel07A 15. Mai 2005 14:27

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.

Luckie 15. Mai 2005 14:32

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: http://www.luckie-online.de/Delphi/S...Nachricht.html

Daniel07A 15. Mai 2005 14:44

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:
PRB_Laden.Position:=I;
in die rechnung einbauen muss?

marabu 15. Mai 2005 15:15

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:
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;
marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.
Seite 1 von 2  1 2      

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