| Autor |
Beitrag |
schitho
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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
      
Beiträge: 39
WinXP Professional
Delphi 7
|
Verfasst: 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
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.
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 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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:
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
      
Beiträge: 39
WinXP Professional
Delphi 7
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mi 15.02.06 23:33
Hallo,
übergeb doch den umfangreichen Funktionen die Progressbar des Hauptfensters, etwa so:
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; end; ProBar.Position := 0; end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Do 16.02.06 08:27
Hallo,
Luckie hat folgendes geschrieben: | | Ist baer schlecht, wenn man den Fortschrit mal nicht in einer Progressbar anzeigen lassen will. |
deshalb schrieb ich in "umfangreichen Funktionen ".
Luckie 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 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: Do 16.02.06 22:38
Luckie 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:
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
|
Verfasst: Do 16.02.06 23:49
Beispiel:
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:
|
type TForm1 = class(TForm) Button1: TButton; ProgressBar1: TProgressBar; procedure Button1Click(Sender: TObject); private public 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
      
Beiträge: 33
XP Prof
D7 Ent
|
Verfasst: 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:
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 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
      
Beiträge: 33
XP Prof
D7 Ent
|
Verfasst: 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 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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)
|
|