You are not logged in.

  • "schnitzelbrain" is male
  • "schnitzelbrain" started this thread

Posts: 19

Date of registration: Jan 23rd 2011

Location: Germany

  • Send private message

1

Thursday, September 8th 2011, 9:40pm

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?

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)


  • "schnitzelbrain" is male
  • "schnitzelbrain" started this thread

Posts: 19

Date of registration: Jan 23rd 2011

Location: Germany

  • Send private message

2

Friday, September 9th 2011, 12:38pm

Ok, noch ein Schritt weiter.
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.

theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

3

Saturday, September 10th 2011, 12:24am

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

  • "schnitzelbrain" is male
  • "schnitzelbrain" started this thread

Posts: 19

Date of registration: Jan 23rd 2011

Location: Germany

  • Send private message

4

Saturday, September 10th 2011, 9:04am

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

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.

theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

5

Saturday, September 10th 2011, 12:11pm

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

theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

6

Saturday, September 10th 2011, 12:18pm

Kleine Ergänzung. Damit der Progessbar auch richtig läuft:
Es wird angenommen, daß ProgressBar1.Min 0 ist.

Jabaco Source

1
2
3
4
5
6
7
8
Public Sub Timer1_Timer() 
   ProgressBar1.Value = I/10000000*ProgressBar1.Max
   'Tue irgendwas
    I=I+1
    If  I >= 10000000 then
      Timer1.Enabled=False
    end if
 End Sub

  • "schnitzelbrain" is male
  • "schnitzelbrain" started this thread

Posts: 19

Date of registration: Jan 23rd 2011

Location: Germany

  • Send private message

7

Sunday, September 11th 2011, 12:19pm

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:

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.

theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

8

Sunday, September 11th 2011, 4:06pm

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.
Möglicherweise könnte man es erreichen, indem Timer wiederum einen anderen Timer aufruft, etc.
Wobei der Quellcode dadurch sicherlich komplizierter und unübersichtlicher werden könnte.

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

Ja, das geht. Du könntest den Mouse-Cursor auf Sanduhr stellen und hinterher wieder zurück.
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

  • "schnitzelbrain" is male
  • "schnitzelbrain" started this thread

Posts: 19

Date of registration: Jan 23rd 2011

Location: Germany

  • Send private message

9

Sunday, September 11th 2011, 4:31pm

Quoted

Oder ein Label einbauen, das wärend alles abläuft einen Text anzeigt wie "Bitte warten ...".
Das hatte ich Versucht, der Text wird nicht angezeigt ?(
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 :thumbsup: der Cursor in den Textfeldern ist da. DANKE...

Noch was, macht Applet oder EXE einen Unterschied ?

This post has been edited 2 times, last edit by "schnitzelbrain" (Sep 11th 2011, 4:59pm)


theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

10

Wednesday, September 14th 2011, 1:34am

Quoted

Oder ein Label einbauen, das wärend alles abläuft einen Text anzeigt wie "Bitte warten ...".
Das hatte ich Versucht, der Text wird nicht angezeigt ?(
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.
Habs auch ausprobiert. Du hast recht.
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"
Dann erscheint als Label-Text nur "Ok". Gleichzeitig läuft die innere Schleife noch immer weiter. Geradezu so, als sei es ein zusätzluicher Thread. Ja, das Fenster mit dem Button der gedrückt wurde, kann sogar inzwischen geschlossen sein und es wird noch immer weitergezählt.

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.

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?
Nicht daß ich wüßte. Man kann ein Reflesh selbst auslösen. Aber verhindern ... ?

Quoted

Liegt es vielleicht an meiner Jabaco Version ich benutze die vom 14.1.2011, den link hattest du mir mal gegeben.
Ne, mit der Jabaco-Version hat das nichts zu tun. Das Problem liegt viel tiefer. Bei den Zusammenhängen, wie Java funktioniert und so.


Grüße
theuserbl

This post has been edited 1 times, last edit by "theuserbl" (Sep 14th 2011, 1:47am)


theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

11

Wednesday, September 14th 2011, 2:00am


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"
Dann erscheint als Label-Text nur "Ok". Gleichzeitig läuft die innere Schleife noch immer weiter.
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.

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

theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

12

Friday, September 16th 2011, 11:10am

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

theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

13

Saturday, September 17th 2011, 1:39am

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

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)


theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

14

Saturday, September 17th 2011, 2:41am

Wollte nur noch mal die Compiler-freundliche Modifizierung hier auch noch mal reinsetzen:

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

  • "schnitzelbrain" is male
  • "schnitzelbrain" started this thread

Posts: 19

Date of registration: Jan 23rd 2011

Location: Germany

  • Send private message

15

Saturday, September 17th 2011, 8:49am

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.

theuserbl

Intermediate

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

16

Saturday, September 17th 2011, 12:22pm

Quoted

Hab ich das richtig verstanden, wenn ich die Klasse anlege wie von dir als kompilerfreundlich gepostet. Dann sollte es funktionieren?
Es funktiniert dann bei dem von mir gezeigten Programm, das einen Button hat, der "Command1" heißt und nur auf "Click" reagiert wird.

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

Rate this thread
WoltLab Burning Board