Progress Bar
Hi,
mal wieder eine Frage
Wenn ich den Progressbar aus der IDE benutzen will. Wie bekomme ich das Teil dazu sich in einer schleife langsam zu füllen?
Das Sample funktioniert schon mal nicht. es scheint in einer Schleife kein Refresh vom Bar zu geben.
ProgressBar1.refresh hat es auch nicht gebracht.
Ok, ich rausgefunden das in dem FrameworkTest Program, der ProgressBar über einen timer getriggert wird. Habs versucht mit Copy past zu Implementieren. leider ohne Erfolg es hängt immer wieder an etwas anderem.
mal wieder eine Frage
Wenn ich den Progressbar aus der IDE benutzen will. Wie bekomme ich das Teil dazu sich in einer schleife langsam zu füllen?
|
|
Source code |
1 2 3 4 5 6 7 8 |
Public Sub Command1_Click() For I = 1 To 100 ProgressBar1.Value = I ' und zum Warten For t = 1 To 1000000 Next t Next i End Sub |
Das Sample funktioniert schon mal nicht. es scheint in einer Schleife kein Refresh vom Bar zu geben.
ProgressBar1.refresh hat es auch nicht gebracht.
Ok, ich rausgefunden das in dem FrameworkTest Program, der ProgressBar über einen timer getriggert wird. Habs versucht mit Copy past zu Implementieren. leider ohne Erfolg es hängt immer wieder an etwas anderem.
This post has been edited 1 times, last edit by "schnitzelbrain" (Sep 9th 2011, 11:53am)
Ok, noch ein Schritt weiter.
Timer aus der IDE eingebaut
Trotzdem Passiert nix, sobald die For/next gestartet sind.
Im Endeffekt sieht man den ProgressBar am ende vom Sub von 0 auf 100% gehen und das wars. Zwischendrin tut sich nix.
Timer aus der IDE eingebaut
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Public Sub Command1_Click() Timer1.enabled = true For I = 1 To 100 ' Hier läuft mein Program code weiter mit einigen Berechnungen und For/next Schleifen Next i Timer1.enabled = false End Sub Public Sub Timer1_Timer() ProgressBar1.Value = ProgressBar1.Value + 1 end sub |
Trotzdem Passiert nix, sobald die For/next gestartet sind.
Im Endeffekt sieht man den ProgressBar am ende vom Sub von 0 auf 100% gehen und das wars. Zwischendrin tut sich nix.
|
|
Jabaco Source |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Public Sub Timer1_Timer() ProgressBar1.Value = ProgressBar1.Value +1 End Sub Public Sub Command1_Click() Timer1.Enabled=True Timer1.Interval=1 ProgressBar1.PaintString=True End Sub Public Sub Command2_Click() Timer1.Enabled=False End Sub Public Sub Command3_Click() ProgressBar1.Value=0 End Sub |
Hilft das?
Stell Dir Timer wie einen Button vor, der vom Computer in bestimmten Zeitabständen gedrückt wird.
Grüße
theuserbl
Danke erst mal für die Antwort.
Das mit dem Timer hatte ich schon so verstanden, das Problem ist das es aber so nicht funktioniert
Wenn ich dein Beispiel um eine For/next schleife ergänze, passiert mit dem ProgressBar so lange nichts bis die Schleife abgelaufen ist.
Das heißt der Timer Event kann die Schleife nicht unterbrechen. Ich denke mal mein Programmierstiel ist nicht der beste und ich müßte mein Program in mehrere threads aufteilen die ein refresh vom Prograssbar zulassen.
Mit der For/next wird es so wohl nicht funktionieren.
Es werden auch keine Text Felder abgeändert (z.B. mit zwischenergebnissen bei Rechnungen) bis die Schleifen abgelaufen sind.
Korrekt? Oder fehlt mir Irgendwo ein "Include" oder so.
Das mit dem Timer hatte ich schon so verstanden, das Problem ist das es aber so nicht funktioniert
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Public Sub Timer1_Timer() ProgressBar1.Value = ProgressBar1.Value +1 End Sub Public Sub Command1_Click() Timer1.Enabled=True Timer1.Interval=1 ProgressBar1.PaintString=True For I = 1 to 10000000 'Tue irgendwas next i End Sub Public Sub Command2_Click() Timer1.Enabled=False End Sub Public Sub Command3_Click() ProgressBar1.Value=0 End Sub |
Wenn ich dein Beispiel um eine For/next schleife ergänze, passiert mit dem ProgressBar so lange nichts bis die Schleife abgelaufen ist.
Das heißt der Timer Event kann die Schleife nicht unterbrechen. Ich denke mal mein Programmierstiel ist nicht der beste und ich müßte mein Program in mehrere threads aufteilen die ein refresh vom Prograssbar zulassen.
Mit der For/next wird es so wohl nicht funktionieren.
Es werden auch keine Text Felder abgeändert (z.B. mit zwischenergebnissen bei Rechnungen) bis die Schleifen abgelaufen sind.
Korrekt? Oder fehlt mir Irgendwo ein "Include" oder so.
Quoted
Wenn ich dein Beispiel um eine For/next schleife ergänze, passiert mit dem ProgressBar so lange nichts bis die Schleife abgelaufen ist.
Ist ja auch klar, wenn Du die Schleife in Command1_Click() setzt. Solange die Schleife läuft, kannst Du auch keinen anderen Button drücken. Und der Computer eben nicht den Timer.
Quoted
Das heißt der Timer Event kann die Schleife nicht unterbrechen.
Wenn Du einen Timer verwendest, dann ist der Timer Deine Schleife.
Ohne es jetzt getestet zu haben (bin wieder mit Linux unterwegs), hier mal ein abgeändertes Programm:
|
|
Jabaco Source |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Dim I as integer=1 Public Sub Timer1_Timer() ProgressBar1.Value = ProgressBar1.Value +1 'Tue irgendwas I=I+1 If I >= 10000000 then Timer1.Enabled=False end if End Sub Public Sub Command1_Click() Timer1.Enabled=True Timer1.Interval=1 ProgressBar1.PaintString=True End Sub Public Sub Command2_Click() Timer1.Enabled=False End Sub Public Sub Command3_Click() ProgressBar1.Value=0 End Sub |
Ok, super.
Danke für die Info.
Habs kapiert.
Leider kann ich dann den Vorgang für mein Projekt nicht gebrauchen. Da der refresh von den Feldern (und vom Bar) erst kommt wenn der Button_click oder der Timer_click abgearbeitet ist.
Mein "Tue Irgendwas" sind ein paar geschachtelte schleifen die zwischendrin eigentlich Werte(Fortschritt) anzeigen sollten. Das haut leider aus bekannten Gründen nicht hin.
Gibt es wenigstens eine Möglichkeit eine "Busy" Anzeige einzubauen, also:
Geht sowas mit einer eigenen Event Überwachung (ich drück mich mal so aus wie ich es verstehe.) Die bei einem Ereignis das Irgendwo im Program stattfindet was tut. Wie z.B. ein mouse over event, der geht ja auch egal ob in Schleife oder nicht.
Danke für die Info.
Habs kapiert.
Leider kann ich dann den Vorgang für mein Projekt nicht gebrauchen. Da der refresh von den Feldern (und vom Bar) erst kommt wenn der Button_click oder der Timer_click abgearbeitet ist.
Mein "Tue Irgendwas" sind ein paar geschachtelte schleifen die zwischendrin eigentlich Werte(Fortschritt) anzeigen sollten. Das haut leider aus bekannten Gründen nicht hin.
Gibt es wenigstens eine Möglichkeit eine "Busy" Anzeige einzubauen, also:
|
|
Source code |
1 2 3 4 5 6 7 |
1 Vorgang gestartet 2 Busy an 3 Schleifen........ 4 Vorgang beendet 5 Busy aus |
Geht sowas mit einer eigenen Event Überwachung (ich drück mich mal so aus wie ich es verstehe.) Die bei einem Ereignis das Irgendwo im Program stattfindet was tut. Wie z.B. ein mouse over event, der geht ja auch egal ob in Schleife oder nicht.
Möglicherweise könnte man es erreichen, indem Timer wiederum einen anderen Timer aufruft, etc.Leider kann ich dann den Vorgang für mein Projekt nicht gebrauchen. Da der refresh von den Feldern (und vom Bar) erst kommt wenn der Button_click oder der Timer_click abgearbeitet ist.
Mein "Tue Irgendwas" sind ein paar geschachtelte schleifen die zwischendrin eigentlich Werte(Fortschritt) anzeigen sollten. Das haut leider aus bekannten Gründen nicht hin.
Wobei der Quellcode dadurch sicherlich komplizierter und unübersichtlicher werden könnte.
Ja, das geht. Du könntest den Mouse-Cursor auf Sanduhr stellen und hinterher wieder zurück.
Quoted
Gibt es wenigstens eine Möglichkeit eine "Busy" Anzeige einzubauen, also:
![]()
Source code
1 2 3 4 5 6 7 1 Vorgang gestartet 2 Busy an 3 Schleifen........ 4 Vorgang beendet 5 Busy aus
Oder ein Label einbauen, das wärend alles abläuft einen Text anzeigt wie "Bitte warten ...".
Also in dem Bereich gibt es zig Möglichkeiten.
Du könntest auch sämtliche Buttons aus Eanabled=False stellen. Etc.
Grüße
theuserbl
Das hatte ich Versucht, der Text wird nicht angezeigt
Quoted
Oder ein Label einbauen, das wärend alles abläuft einen Text anzeigt wie "Bitte warten ...".
Erst wenn mein Button5_click rum ist erscheint das "Done" im Textfeld
Gleiches mit einem Label mit Label1.Enabled = True wird es bei Click auf den Button nicht Sichtbar.
Gibt es Irgendwas bekanntes (ich weis es kann bestimmt viel geben) das ein regelmäßigen Refresh von den Textfeldern/Labels usw verhindert?
Ich meine ein java include oder eine jabaco Einstellung?
Liegt es vielleicht an meiner Jabaco Version ich benutze die vom 14.1.2011, den link hattest du mir mal gegeben.
Update:
Hab die Version 84 genommen. Hat nix verändert aber
Noch was, macht Applet oder EXE einen Unterschied ?
This post has been edited 2 times, last edit by "schnitzelbrain" (Sep 11th 2011, 4:59pm)
Habs auch ausprobiert. Du hast recht.Das hatte ich Versucht, der Text wird nicht angezeigt
Quoted
Oder ein Label einbauen, das wärend alles abläuft einen Text anzeigt wie "Bitte warten ...".![]()
Erst wenn mein Button5_click rum ist erscheint das "Done" im Textfeld![]()
![]()
Gleiches mit einem Label mit Label1.Enabled = True wird es bei Click auf den Button nicht Sichtbar.
Wenn in Button_click etwas steht wie
|
|
Jabaco Source |
1 2 3 4 5 |
Label1.Caption = "Bitte warten..." For I = 1 to 100000 System.out.println(i) Next I Label1.Caption = "Ok" |
Soviel ich sehe, scheint es ein Problem von Java zu sein, nicht von Jabaco.
Bei dem Problem stehe ich selber wie ein Ochs vorm Berg und versteh wieder einmal die Java-Welt nicht. Obwohl ich kurz vorher immer mal wieder der Meinung bin, Java nun endlich verstanden zu haben.
Nicht daß ich wüßte. Man kann ein Reflesh selbst auslösen. Aber verhindern ... ?
Quoted
Gibt es Irgendwas bekanntes (ich weis es kann bestimmt viel geben) das ein regelmäßigen Refresh von den Textfeldern/Labels usw verhindert?
Ich meine ein java include oder eine jabaco Einstellung?
Ne, mit der Jabaco-Version hat das nichts zu tun. Das Problem liegt viel tiefer. Bei den Zusammenhängen, wie Java funktioniert und so.
Quoted
Liegt es vielleicht an meiner Jabaco Version ich benutze die vom 14.1.2011, den link hattest du mir mal gegeben.
Grüße
theuserbl
This post has been edited 1 times, last edit by "theuserbl" (Sep 14th 2011, 1:47am)
Habe es gerade noch mal überprüft, Sieht so aus, daß nur in der Jabaco-IDE das Programm sich selbst überholt und ein "Ok" ausgibt, bevor die For-Schleife zu Ende abgearbeitet wurde.
Wenn in Button_click etwas steht wie
Dann erscheint als Label-Text nur "Ok". Gleichzeitig läuft die innere Schleife noch immer weiter.
![]()
Jabaco Source
1 2 3 4 5 Label1.Caption = "Bitte warten..." For I = 1 to 100000 System.out.println(i) Next I Label1.Caption = "Ok"
Aber auch als kompilierte Version bekommt man ein "Bitte warten..." nie zu Gesicht.
Habe mir nun auch noch mal das Programm von einem Dekompiler in Java anzeigen lassen und dort steht ganz klar ebenfalls das "Label1.$Caption("Bitte warten...");" vor der Schleife.
Grüße
theuserbl
Zwei Punkte:
1. daß in der IDE das "Ok" als Text erscheint, bevor die Schleife abgearbeitet wird, liegt mit hoher wahrscheinlichkeit an der Pipe von Java zur IDE. Das heißt, Java jat schon den Text der kompletten Schleife alles abgearbeitet und ausgegeben und auch an die IDE weitergereicht, nur die IDE ist nicht schnell genug den Text bei sich wiederzugeben.
2. das seltsame Verhalten, daß der Text "Bitte warten" nicht erscheint, obwohl er vor der Schleife vorkommt, irritiert mich noch immer. Daher habe ich nun unter
[ http://www.java-forum.org/awt-swing-swt/…enfolge-ab.html ]
die Frage in ein Java-Forum gestellt (meiner Meinung nach, das beste deutschsprache Java-Forum, daß es gibt).
Grüße
theuserbl
1. daß in der IDE das "Ok" als Text erscheint, bevor die Schleife abgearbeitet wird, liegt mit hoher wahrscheinlichkeit an der Pipe von Java zur IDE. Das heißt, Java jat schon den Text der kompletten Schleife alles abgearbeitet und ausgegeben und auch an die IDE weitergereicht, nur die IDE ist nicht schnell genug den Text bei sich wiederzugeben.
2. das seltsame Verhalten, daß der Text "Bitte warten" nicht erscheint, obwohl er vor der Schleife vorkommt, irritiert mich noch immer. Daher habe ich nun unter
[ http://www.java-forum.org/awt-swing-swt/…enfolge-ab.html ]
die Frage in ein Java-Forum gestellt (meiner Meinung nach, das beste deutschsprache Java-Forum, daß es gibt).
Grüße
theuserbl
Was das Problem betrifft, sieht die Lösung so aus, daß der Compiler etwas abgeändert werden muß.
Ich habe mal folgendes kleines Jabaco-Programm geschrieben
der Quellcode läßt sich hier downloaden:
[ WaitingLabelSrc.zip ]
Wenn man es kompiliert, erscheint das von Dir beschriebene Problem. Hier als kompilierte Jar-Datei:
[ WaitingLabel.jar ]
U.a. wird beim Kompilieren Eine Datei namens Form1$CommandButton.class erstellt.
In Java entspricht sie dieser Datei:
Das Einzige was als Änderung nötig ist, ist in jede Event-Methode (in diesem Fall "_Click") einen eigenen Thread zu erstellen, indem eine voin Thread abgeleitete Klasse erstellt wird:
Und hier die kompilierte Version mit der neuen Datei:
[ WaitingLabelFix.jar ]
Dort existiert nun nicht mehr das Problem.
Das heißt, es ist eine wirklich kleine Änderung des Compilers nötig.
Bis dahin ist es wirklich nicht gerade einfach in Jabaco soetwas zu Programmieren. Du mußt dann ein neues Klassenmodul erstellen mit java/lang/Thread als "SuperClass".
In diesem Klassenmodul mußt Du ein Sub erstellen, das die öffentliche Funktion "run" besitzt, in der Du Deinen Programmcode schreibst, den Du eigentlich in Command1_Click() von Deinem Form haben wolltest:
Angenommen Du hast das obere Klassenmodul "Class1" genannt, dann mußt Du anschließend noch in Command1_Click() von Form1 folgendes schreiben:
Und wenn Du einen weiteren Button mit soetwas erstellen willst, mußt Du noch ein Klassenmodul auf diese Weise erstellen und mit dem anderen Command2_Click() verknüpfen.
Edit: Auf die Schnelle weiß ich gerade doch keine Lösung es mit dem derzeitigen Jabaco--Compiler zu nutzen.
Ist halt momentan "etwas" komplizierter.
Grüße
theuserbl
Ich habe mal folgendes kleines Jabaco-Programm geschrieben
|
|
Jabaco Source |
1 2 3 4 5 6 7 |
Public Sub Command1_Click() Label1.Caption = "Please wait..." For i = 1 To 100000 System.out.println(i) Next i Label1.Caption = "Ok." End Sub |
der Quellcode läßt sich hier downloaden:
[ WaitingLabelSrc.zip ]
Wenn man es kompiliert, erscheint das von Dir beschriebene Problem. Hier als kompilierte Jar-Datei:
[ WaitingLabel.jar ]
U.a. wird beim Kompilieren Eine Datei namens Form1$CommandButton.class erstellt.
In Java entspricht sie dieser Datei:
|
|
Jabaco Source |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import VB.CommandButton; public class Form1$CommandButton extends CommandButton { int ID; Form1 Owner; int Index; public void setOwner(Form1 var1, int var2) { Owner = var1; ID = var2; Index = -1; } public void _Click() { if(1 == ID) { Owner.Command1_Click(); } } } |
Das Einzige was als Änderung nötig ist, ist in jede Event-Methode (in diesem Fall "_Click") einen eigenen Thread zu erstellen, indem eine voin Thread abgeleitete Klasse erstellt wird:
|
|
Jabaco Source |
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 |
import VB.CommandButton; public class Form1$CommandButton extends CommandButton { int ID; Form1 Owner; int Index; public void setOwner(Form1 var1, int var2) { Owner = var1; ID = var2; Index = -1; } public void _Click() { Thread thread = new Thread() { public void run() { if(1 == ID) { Owner.Command1_Click(); } } }; thread.start(); } } |
Und hier die kompilierte Version mit der neuen Datei:
[ WaitingLabelFix.jar ]
Dort existiert nun nicht mehr das Problem.
Das heißt, es ist eine wirklich kleine Änderung des Compilers nötig.
Bis dahin ist es wirklich nicht gerade einfach in Jabaco soetwas zu Programmieren. Du mußt dann ein neues Klassenmodul erstellen mit java/lang/Thread als "SuperClass".
In diesem Klassenmodul mußt Du ein Sub erstellen, das die öffentliche Funktion "run" besitzt, in der Du Deinen Programmcode schreibst, den Du eigentlich in Command1_Click() von Deinem Form haben wolltest:
|
|
Jabaco Source |
1 2 3 4 5 6 7 8 9 10 |
Public Sub run() ' Hier den eigenen Code hinschreiben ' Zum Beispiel: ' Label1.Caption = "Bitte warten..." ' For I = 1 to 100000 ' System.out.println(i) ' Next I ' Label1.Caption = "Ok" End Sub |
Angenommen Du hast das obere Klassenmodul "Class1" genannt, dann mußt Du anschließend noch in Command1_Click() von Form1 folgendes schreiben:
|
|
Jabaco Source |
1 2 3 4 |
Public Sub Command1_Click() Dim myClass As new Class1 myClass.start() End Sub |
Und wenn Du einen weiteren Button mit soetwas erstellen willst, mußt Du noch ein Klassenmodul auf diese Weise erstellen und mit dem anderen Command2_Click() verknüpfen.
Edit: Auf die Schnelle weiß ich gerade doch keine Lösung es mit dem derzeitigen Jabaco--Compiler zu nutzen.
Ist halt momentan "etwas" komplizierter.
Grüße
theuserbl
This post has been edited 2 times, last edit by "theuserbl" (Sep 17th 2011, 2:07am)
Wollte nur noch mal die Compiler-freundliche Modifizierung hier auch noch mal reinsetzen:
Das erzeugt die beiden Klassen
- Form1$CommandButton.class
- Form1$CommandButton$Click.class
Grüße
theuserbl
|
|
Jabaco Source |
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 |
import VB.CommandButton; public class Form1$CommandButton extends CommandButton { int ID; Form1 Owner; int Index; public void setOwner(Form1 var1, int var2) { Owner = var1; ID = var2; Index = -1; } public void _Click() { Click click = new Click(); click.start(); } public class Click extends Thread { public void run() { if(1 == ID) { Owner.Command1_Click(); } } } } |
Das erzeugt die beiden Klassen
- Form1$CommandButton.class
- Form1$CommandButton$Click.class
Grüße
theuserbl
Hallo,
danke für deine mühe.
Hab ich das richtig verstanden, wenn ich die Klasse anlege wie von dir als kompilerfreundlich gepostet. Dann sollte es funktionieren?
Immo hab ich mein Projekt erst mal auf Real Basic umgestellt. Dort hab ich zwar erst mal keine Möglichkeit direkt alle Plattformen zu unterstützen(Personal Edition) aber dafür einige Probleme weniger(JBGrid ist in Jabaco auch noch sehr rudimär).
Ich behalte Jabaco aber weiter im Auge.
danke für deine mühe.
Hab ich das richtig verstanden, wenn ich die Klasse anlege wie von dir als kompilerfreundlich gepostet. Dann sollte es funktionieren?
Immo hab ich mein Projekt erst mal auf Real Basic umgestellt. Dort hab ich zwar erst mal keine Möglichkeit direkt alle Plattformen zu unterstützen(Personal Edition) aber dafür einige Probleme weniger(JBGrid ist in Jabaco auch noch sehr rudimär).
Ich behalte Jabaco aber weiter im Auge.
Es funktiniert dann bei dem von mir gezeigten Programm, das einen Button hat, der "Command1" heißt und nur auf "Click" reagiert wird.
Quoted
Hab ich das richtig verstanden, wenn ich die Klasse anlege wie von dir als kompilerfreundlich gepostet. Dann sollte es funktionieren?
Wenn Du mehrere Buttons verwendest, die evtl. anders heißen und möglicherweise teilweise beim Drüberfahren mit der Maus schon ähnliche Aktionen durchführen sollen, dann solltest Du die Datei Form1$CommandButton.class erst mit FernFlower/ decompilieren, dann in Java die von mir erwähnten Modifikationen vornehmen und mit Java neu kompilieren. DANN klappt es.
Was ich damit zeigte ist lediglich, daß es funktioniert, wenn man den Compiler abändern würde.
Der Compiler übernimmt ja - gerade was Events angeht - schon einige Aufgaben. Und ich habe gezeigt, daß wenn der Compiler noch zusätzliche Threads erstellt, Jabaco sich genau so verhält, wie wir es erwarten würden und es sein sollte.
Grüße
theuserbl
Similar threads
-
Tips, Tricks, Samples & Tutorials »-
JBPlayer - Simple mp3 player
(Aug 9th 2010, 6:40pm)
-
Visual Basic 6 Compatibility »-
Is VB and VBA implementation documented?
(Jan 13th 2011, 6:36pm)
-
Tips, Tricks, Samples & Tutorials »-
Alerter v1.Good progress thanks to OlimilO
(Oct 12th 2009, 6:16pm)
-
History & News »-
RELEASE: Jabaco 1.5.0 BETA - 2009-08-08
(Aug 8th 2009, 1:25pm)
