Forum: PC-Programmierung VB Elemente zur Laufzeit


von CATCO (Gast)


Lesenswert?

Hallo,

ich habe eine Maske, wo ich eine XML einlade, in dieser XML steht alles 
drin. Wie viele Button, wo positioniert usw. Die Elemente kann ich dann 
wenn man die Datei lädt erstellen, positionieren klappt alles.

Jetzt habe ich aber ein Problem. Wenn ich auf einen Button drücke, 
springe ich in eine Funktion, sowas hier

Form Load:
AddHandler ButtonHelp(indexID).Click, AddressOf myHelpButtonClick
...


Private Sub myHelpButtonClick(sender As Object, e As EventArgs)
        MsgBox("ok")
    End Sub


Das klappt. Ich habe ca. 50 Help-Buttons, klicke ich drauf, kommt "OK". 
Jetzt das Problem. Jeder Help Button soll einen anderen Text darstellen 
(steht auch in der XML). Wie mache ich das? Ich kann ja jetzt schlecht 
50x Funktionen erstellen, oder? Das Problem ist, in Summe kann ich bis 
zu 500 Button haben. Gibt es hier einen Trick, wie man das per Array 
lösen kann?

von Alexander K. (Gast)


Lesenswert?

JA.

Public my_Button As New Dictionary(Of Integer, BUTTON)

Sub my_button_ini
  my_button.Add(1, my_button_1) ' my_button_1 ist der echte Name des 
Button
  my_button.Add(2, my_button_3)
  my_button.Add(2, my_button_3)
end sub

sub füllen
  for i = 1 to 3
     my_button(i).text = "button-" + str(i)
  next i
end sub


Ich hoffe das ist logisch und hilft

Ist die moderne Form. Unter vb 6 konnte mal das direkt zuweisen.

Du kannst dann mit my_button(index).**** alles zuweisen. Wie in meinen 
Beispiel den namen. Musst halt nur wissen welcher Index welcher button 
ist. Ist besonders gut, wenn man den Visible Befehl nutzt, oder Enable, 
Sonst tippt man sich doof.

Nebeninfo : der NAME des Buttons kann frei wählbar sein. Es muss nur ein 
Button sein. Du kannst dann den Button über Sein REAL-Namen ansprechen 
oder sein "Familien-Namen" ;)

Gruß

  Pucki

von Alexander K. (Gast)


Lesenswert?

Kleiner Nachtrag

 Private Sub bb_1_Click(sender As System.Object, e As System.EventArgs) 
Handles bb_1.Click, bb_2.Click, bb_3.Click

    name_des_button = sender.name

    if name_des_button = "bb_1" then msgbox("alles gut, hab bb_1 
getroffen")

  End Sub

Gruß

  Pucki

von CATCO (Gast)


Lesenswert?

Alexander K. schrieb:
> Kleiner Nachtrag
>
>  Private Sub bb_1_Click(sender As System.Object, e As System.EventArgs)
> Handles bb_1.Click, bb_2.Click, bb_3.Click
>
>     name_des_button = sender.name
>
>     if name_des_button = "bb_1" then msgbox("alles gut, hab bb_1
> getroffen")
>
>   End Sub
>
> Gruß
>
>   Pucki

Perfekt das hat mir sogar schon gereicht. Das wurde mir nicht angezeigt, 
wenn ich sender. gemacht habe kam nur hash und tostring usw aber nichts 
anders. Da wusste ich das nicht.

Ich habe jedem Button usw im TAG eine Nummer (nämlich seine index_nr) 
gegeben. So kann ich jetzt sender.tag machen und habe die indexnr und 
kann darüber direkt alles weitere aus dem Array mit den Texten 
entziehen. Genial

von Alexander K. (Gast)


Lesenswert?

Die .xx Listen sind nicht immer vollständig oder zeigen Befehle zu spät 
an.

button_1.PerformClick  z.b.  da kommt PerformClick erst wenn du perf 
eingeben hast.

Ist übriges der Befehl per Programm auf einen Button zu klicken. Benutze 
ich sehr oft wenn ich nach eine Operation den "neu laden" o.s. Button 
auslösen will, um ein Datagrid zu aktualisieren. Oder was auch immer.

My.Application.DoEvents   <- das selbe (erst nach den 3 Buchstaben). 
Löst ein neu zeichnen aus. Sehr wichtig wenn man ein Event-Zähler laufen 
hat.

for i = 1 to 10
  label.text = "Bearbeite "+ str(i) + " 10"
Next i

Da passiert nix während das Prg. läuft in der Anzeige und plötzlich 
steht eine 10 da.
for i = 1 to 10
  label.text = "Bearbeite "+ str(i) + " 10"
  My.Application.DoEvents
Next i

Und der Zeigt brav alle 10 Zahlen an.

Nur so ein bisschen Infos die du vielleicht mal brauchen kannst. ;)

edit Noch schlimmer wird es bei zu geladenen System-Objekten wie z.B. 
Excel ;)

Gruß

   Pucki

von CATCO (Gast)


Lesenswert?

Alexander K. schrieb:
> My.Application.DoEvents   <- das selbe (erst nach den 3 Buchstaben).
> Löst ein neu zeichnen aus. Sehr wichtig wenn man ein Event-Zähler laufen
> hat.
>
> for i = 1 to 10
>   label.text = "Bearbeite "+ str(i) + " 10"
> Next i
>
> Da passiert nix während das Prg. läuft in der Anzeige und plötzlich
> steht eine 10 da.
> for i = 1 to 10
>   label.text = "Bearbeite "+ str(i) + " 10"
>   My.Application.DoEvents
> Next i
>
> Und der Zeigt brav alle 10 Zahlen an.
>
> Nur so ein bisschen Infos die du vielleicht mal brauchen kannst. ;)
>
> edit Noch schlimmer wird es bei zu geladenen System-Objekten wie z.B.
> Excel ;)
>
> Gruß
>
>    Pucki

Ja, DoEvents() ist sehr wichtig, nutze ich oft. Ich komme eigentlich aus 
der Mikrocontroller Programmierung, Interrupts sind da Standard, das 
gibt es irgendwie nicht, Timer löst nicht aus wenn man in einer Schleife 
ist. Früher bevor ich den Befehl kannte, habe ich immer mit mehreren 
Timern experimentiert die sich gegenseitig triggern usw um nicht 
"hängen" zu bleiben in Schleifen usw. DoEvents() macht das ganze Ding 
aber weitaus einfacher.

Ich habe noch ein Problem, dazu mache ich gleich aber einen neuen Thread 
auf

von Alexander K. (Gast)


Lesenswert?

CATCO schrieb:
> Ich habe noch ein Problem, dazu mache ich gleich aber einen neuen Thread
> auf

Mal schauen.

Ich bin in Mikrocontroller-Programmierung noch nicht zu ganz fit.

Aber da ich mit Visual-Basic-sehr ähnlichen Code (Auch Basic mit 
.befehlen) programmiere, muss ich mich nur noch etwas mit 
BIT-Verschiebungen herum ärgern. ;)

Gruß

  Pucki

von CATCO (Gast)


Lesenswert?

Alexander K. schrieb:
> CATCO schrieb:
>> Ich habe noch ein Problem, dazu mache ich gleich aber einen neuen Thread
>> auf
>
> Mal schauen.
>
> Ich bin in Mikrocontroller-Programmierung noch nicht zu ganz fit.
>
> Aber da ich mit Visual-Basic-sehr ähnlichen Code (Auch Basic mit
> .befehlen) programmiere, muss ich mich nur noch etwas mit
> BIT-Verschiebungen herum ärgern. ;)
>
> Gruß
>
>   Pucki

Bitschiebung usw geht mit VB ja auch ganz gut. Der Vorteil in C ist nur 
die Programmierung mit Interrupts und Pointern, das hat mir anfangs 
stark gefehlt in VB aber habe mich dran gewöhnt man muss nur wissen, 
welcher Trick noch geht wie DoEvents als Beispiel.

von Alexander K. (Gast)


Lesenswert?

Ich habe mich falsch ausgedrückt.

Ich programmiere die Arduino-Chips via Visual-Basic ähnlichen Code. Der 
wird dann vom Compiler in ein Arduino-IDE kompatiblen Code umgewandelt 
und an den Programmer/ Arduino gesenden.

Hier mal eine gekürzer Code der NICHT Lauffähig ist, sondern nur die Art 
des progammieren zeigen soll.

****************************************
Sub Process_Globals
  'These global variables will be declared once when the application 
starts.
  'Public variables can be accessed from all modules.
  Public Serial1 As Serial
  Public lcd As LiquidCrystal_I2C
  Public ic As WireMaster

  Private led_status As Boolean

'  Private st_pin1 As Pin
'  Private st_pin2 As Pin

End Sub

Private Sub AppStart
  Serial1.Initialize(115200)


  lcd.Initialize(0x27, 16, 2) 'based on the example from the project.
  lcd.Backlight = True
  'lcd.Write("LED ï:ö ")

  lcd.SetCursor(1,0)

  ic.Initialize

  'c temp
  TempSensorPin.Initialize(TempSensorPinNumber, 
TempSensorPin.MODE_OUTPUT)
  'Init the timer
  MeasureTimer.Initialize("MeasureTimer_Tick", MeasureTimerInterval * 
1000)
  led_timer.Initialize("ledTimer_Tick", ledTimerInterval * 1000)
  'Start the timer
  MeasureTimer.Enabled = True
  led_status = True
  led_timer.Enabled = True

  lcd.SetCursor(0,1)
  lcd.Write("Temperatur:")

End Sub

von Alexander K. (Gast)


Lesenswert?

Kleiner Nachtrag.

Im selben Programmierstil (IDE von der selben Firma), programmiere ich 
auch meine Android-Teile. ;)

Ist doch eh immer alles das selbe. Warum dann 1000 Umgebungen lernen, 
wenn es reicht die Eigenheiten der Geräte zu kennen. ;)

Rasperry, Java und Appel-Teile geht auch, aber ich muss es ja nicht 
übertreiben. ;)

Gruß

  Pucki

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.