AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Progess Bar soll laden während sich ein tImage aufbaut
Thema durchsuchen
Ansicht
Themen-Optionen

Progess Bar soll laden während sich ein tImage aufbaut

Ein Thema von Daniel07A · begonnen am 15. Mai 2005 · letzter Beitrag vom 15. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Daniel07A

Registriert seit: 15. Mai 2005
12 Beiträge
 
Delphi 7 Enterprise
 
#1

Progess Bar soll laden während sich ein tImage aufbaut

  Alt 15. Mai 2005, 14:50
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

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

  Alt 15. Mai 2005, 15:02
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
  Mit Zitat antworten Zitat
Daniel07A

Registriert seit: 15. Mai 2005
12 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 15. Mai 2005, 15:05
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.
  Mit Zitat antworten Zitat
100nF

Registriert seit: 7. Nov 2004
639 Beiträge
 
#4

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

  Alt 15. Mai 2005, 15:09
hi,

Delphi-Quellcode:
for I:=0 to 50000-1 do
  PRB_Laden.Position:=I;
50000-1 = 49999
  Mit Zitat antworten Zitat
Daniel07A

Registriert seit: 15. Mai 2005
12 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 15. Mai 2005, 15:13
Zitat:
50000-1 = 49999
??? Verstehe ich nicht.

Ich habe meinen beitrag von eben nochmal editiert. Musst du mal schauen was ich falsch mache.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

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

  Alt 15. Mai 2005, 15:19
Wenn du die 50.000 schon hardcodest und eins von abziehst, dann kannst du auch gleich 49.999 schreiben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Daniel07A

Registriert seit: 15. Mai 2005
12 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 15. Mai 2005, 15:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 15. Mai 2005, 15:32
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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Daniel07A

Registriert seit: 15. Mai 2005
12 Beiträge
 
Delphi 7 Enterprise
 
#9

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

  Alt 15. Mai 2005, 15:44
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 PRB_Laden.Position:=I; in die rechnung einbauen muss?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

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

  Alt 15. Mai 2005, 16:15
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz