Autor Beitrag
schitho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Mi 15.02.06 22:31 
Hi,

vorweg: Leider ist mir kein besserer Titel eingefallen :-(

Ich hab folgende Frage/Problem:

In meinem Programm hab ich einige Funktionen programmiert. Nun möchte ich die Funktionen in eine eigene Unit auslagern, damit ich die Unit auch in anderen Programmen verwenden kann.

Dies ist soweit auch noch kein Problem.

Allerdings sind die Funktionen teilw. recht umfangreich, so dass ich den Fortschritt im Hauptfenster des Hauptprogramms immer anzeigen möchte.

Wie kann ich nun auf die Progressbar des Formulars im Hauptprogramm zugreifen, wenn gerade die Funktion in einer eigenen Unit läuft?

Theoretisch müsste es ja gehen, wenn ich die Unit des Hauptprogramms unter Uses in der ausgelagerten Unit anführe. Allerdings ist dies insofern dumm, als diese Unit und deren Progressbar ja immer einen anderen Namen haben können. Somit müsste ich die Unit immer adaptieren.

Das gefällt mir aber gar nicht.

Gibt es eine andere Lösung, wie ich die Progressbar des Hauptprogramms über die ausgelagerte Unit aktualisieren lassen kann?

Ich hoffe ich hab mich halbwegs verständlich ausgedrückt und Ihr könnt mir helfen.

Danke

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
WolfB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 39

WinXP Professional
Delphi 7
BeitragVerfasst: Mi 15.02.06 22:46 
hi!
diese antwort ist nun nicht sehr durchdacht, kann also falsch sein!
wie wäre es, wenn du in der unit eine eigene progressbar erstellst die mitzählt. also wenn du die unit zum ersten mal aufrufst machste zb

ausblenden Delphi-Quelltext
1:
  progressbar:= tprogressbar.create					

dazu dann noch die nötigen eingaben für die bar.
und dann machste in der unit ne funktion die den fortschirtt DIESER progressbar wiedergibt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
function wiedergabe : integer;
begin
  result:= progressbar.position;
end;


das würde dann an das hauptprogramm den fortschritt der bar aus der unit übergeben.
sollte es zumindest ;)
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Mi 15.02.06 23:17 
Hmm. Um die Progressbar erzeugen zu können, muss man doch auch Create mitteilen, wo sie diese erzeugen soll:
ausblenden Delphi-Quelltext
1:
Progressbar1:=TProgressbar.Create(MainUnit.Form1);					


Somit muss ich in der ausgelagerten Unit auch unter Uses die Unit "MainUnit" anführen. Sobald ich die Unit aber für ein anderes Programm verwende, muss ich diese wieder anpassen.

Da kann ich ja gleich direkt auf die Progressbar des Formulares des Hauptprogramms (MainUnit) zugreifen und muss diese nicht in der ausgelagerten Unit erzeugen.

Seh also keinen Vorteil in Deiner Variante. Oder hab ich etwas falsch verstanden?

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
WolfB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 39

WinXP Professional
Delphi 7
BeitragVerfasst: Mi 15.02.06 23:27 
hm, sagte ja, hab ich nicht ausprobiert, nur überlegt.
aber du brauchst ja nur den fortschritt, welcher ein integer wert ist. den könnteste doch leicht an das hauptprogramm übergeben. mehr ist der position wert einer tprogressbar ja auch nicht.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 15.02.06 23:33 
Hallo,
übergeb doch den umfangreichen Funktionen die Progressbar des Hauptfensters, etwa so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function LiesZeilen(ProBar: TProgressbar;aMemo: TMemo): Boolean;
var z : Integer;
begin
  ProBar.Position := 0;
  ProBar.Max := aMemo.Lines.Count-1;
  for z := 0 to ProBar.Max do
    begin
    if z mod 10 = 0 then
      ProBar.Position := ProBar.Position+10;
    //mach was
    end;
  ProBar.Position := 0; 
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 16.02.06 00:01 
Ist baer schlecht, wenn man den Fortschrit mal nicht in einer Progressbar anzeigen lassen will. Entweder man arbeitet mit Nachrichten oder schöner, man schreibt sich eine Klasse und arbeitet mit Ereignissen.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 16.02.06 08:27 
Hallo,

user profile iconLuckie hat folgendes geschrieben:
Ist baer schlecht, wenn man den Fortschrit mal nicht in einer Progressbar anzeigen lassen will.
deshalb schrieb ich in "umfangreichen Funktionen ".
user profile iconLuckie hat folgendes geschrieben:
Entweder man arbeitet mit Nachrichten oder schöner, man schreibt sich eine Klasse und arbeitet mit Ereignissen.
richtig.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Do 16.02.06 22:38 
user profile iconLuckie hat folgendes geschrieben:
Ist baer schlecht, wenn man den Fortschrit mal nicht in einer Progressbar anzeigen lassen will. Entweder man arbeitet mit Nachrichten oder schöner, man schreibt sich eine Klasse und arbeitet mit Ereignissen.


Ich muss gestehen, dass ich eigentlich keine Ahnung von Klassen und dgl habe, weil ich in meiner wenigen Freizeit nur selten programmieren kann und mir daher leider auch einiges an Grundlagen fehlt :(. Hab daher in aller Kürze versucht etwas nachzulesen.

Versteh ich das so richtig:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type TFortschritt = Class
private
  FMax : integer;
  FPos : integer;
  procedure SetMax(Max:integer);
public
  property Pos: integer read FPos;
end;


Ist das soweit richtig?

Und wie erstell ich nun ein Ereignis dazu? Also z.B OnFortschritt?

Vielen Dank.

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 16.02.06 23:49 
Beispiel:
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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
{
  Author  : Michael Puff - http://www.michael-puff.de
  Date    : 2006-02-16
  License : PUBLIC DOMAIN
}


type
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure OnFooProgress(Sender: TObject; Current, Max: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TOnProgress = procedure(Sender: TObject; Current, Max: Integer) of object;

  TFoobar = class(TObject)
    private
      FOnProgress: TOnProgress;
    public
      procedure DoSomething;
      property OnProgress: TOnProgress read FOnProgress write FOnProgress;
  end;

procedure TFoobar.DoSomething;
const
  MAX = 9;
var
  i: Integer;
begin
  for i := 0 to MAX do
  begin
    if Assigned(OnProgress) then
      FOnProgress(self, i, MAX);
    sleep(500);
  end;
end;

procedure TForm1.OnFooProgress(Sender: TObject; Current, Max: Integer);
begin
  Progressbar1.Max := Max;
  Progressbar1.Step := 1;
  Progressbar1.Position := Current;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Foobar: TFoobar;
begin
  Foobar := TFoobar.Create;
  try
    Foobar.OnProgress := OnFooProgress;
    Foobar.DoSomething;
  finally
    FreeAndNil(Foobar);
  end;
end;
Snoopie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

XP Prof
D7 Ent
BeitragVerfasst: Fr 17.02.06 10:02 
Die Lösung von Lannes war schon sehr gut...

Wer bemängelt, dass er die Progressbar nicht immer anzeigen will, soll den Aufruf so gestalten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function LiesZeilen(aMemo: TMemo; ProBar: TProgressbar = nil): Boolean;
var z : Integer;
begin
  if ProBar <> nil then
  begin
    ProBar.Position := 0;
    ProBar.Step := 1; 
    ProBar.Max := aMemo.Lines.Count-1;
  end;
  for z := 0 to aMemo.Lines.Count-1 do
    begin
    //mach was
      if ProBar <> nil then ProBar.StepIt;  
    end;
  if ProBar <> nil then ProBar.Position := 0; 
end;


Damit kann die Funktion mit oder ohne Progressbar aufgerufen werden...

_________________
Snoopie
Snoopie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

XP Prof
D7 Ent
BeitragVerfasst: Fr 17.02.06 10:10 
Sorry,
es wird ja nicht bemängelt, dass die Progressbar nicht angezeigt werden soll, sondern dass man den Fortschritt anzeigen will, aber keine Progressbar benutzen will. Hab´s nicht genau gelesen...
Also Lösung nur für Benutzer der Progressbar sinnvoll. Habt ja alle Recht!!!

_________________
Snoopie
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: So 19.02.06 23:52 
Titel: Thanx!!!
Vielen Dank für Eure Lösungen. Werde es mal mir Klassen und Ereignissen probieren.

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)