Einfach oder nicht ?

Nabend,

Ich habe auf einer Form 16 Punkte, die auf 2 reihen a 8 Punkte aufgeteilt sind. Nun würde ich gern einen Punkt aus der ersten reihe mit einem beliebigen aus reihe 2 verbinden. Zusätzlich würde ich gern in einer Liste den text bekommen:" Punkt 1 wurde mit Punkt 9 verbunden.
Die beiden Punkte sollten entweder mit der gleichen Farbe gekennzeichnet oder mit einer linie verbunden werden.

Wie gross wäre der Aufwand ?

besten Dank. mfg jonny

Hi Joe,

Wie gross wäre der Aufwand ?

zwei Zeilen. :smile: … und etwas drum herum.

Option Explicit

Dim Start As Integer

Private Sub Picture1\_Click(Index As Integer)
 Start = Index
End Sub

Private Sub Picture2\_Click(Index As Integer)
 Line (Picture1(Start).Left, Picture1(Start).Top)-(Picture2(Index).Left, Picture2(Index).Top)
End Sub

… läuft, getestet.

Gruß, Rainer

Im ersten Moment schien es überschaubar :stuck_out_tongue:
ich habe eine Form mit Picture1 & Picture2 + deinen Code.

Compile error:
Procedur declaration does not match description of event or procedure have the same name.

wir reden über vb6 (wie immer, oder)

Thx , joe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

Private Sub Picture1_Click(Index As Integer)

Die Eigenschaft ‚Index‘ haben nur Steuerelementefelder, die Pics zum anklicken in der einen Zeile heißen alle Picture1 und haben den Index von 0 bis 7, die anderen acht heißen Picture1 mit dem Index 0 bis 7.

Gruß, Rainer

WoW, nun bin ich schon beeindruckt!!
war wieder ein anfängerfehler von mir.

Nun habe ich das ganze bis Reihe 4 a 8 Pictures gebaut.
Wie kann ich sagen das von einem Punkt nur eine Linie weggehen darf. bzw wie könnte ich eine line wieder entfernen ?

Option Explicit

Dim Start As Integer

Private Sub Picture1\_Click(Index As Integer)
Start = Index
End Sub

Private Sub Picture2\_Click(Index As Integer)
Line (Picture1(Start).Left, Picture1(Start).Top)-(Picture2(Index).Left, Picture2(Index).Top)
End Sub

Private Sub Picture3\_Click(Index As Integer)
Line (Picture1(Start).Left, Picture1(Start).Top)-(Picture3(Index).Left, Picture3(Index).Top)
End Sub

Hi Joe,

Nun habe ich das ganze bis Reihe 4 a 8 Pictures gebaut.

OK. Verschärfte Bedingungen. :smile:

Wie kann ich sagen das von einem Punkt nur eine Linie weggehen
darf.

Du kannst das Pic disablen. Beispiel:

Picture1(Index).enabled = False

Wenn die Linie vom picture1(Index) abgeht. In der Basisversion ist eine Reihe ja immer nur Start, die andere immer nur Ziel. Wenn das nicht so sein soll, wird der Code etwas komplizierter, aber nicht viel. Ursprünglich ging es ja um möglichst wenig Code. :smile:

bzw wie könnte ich eine line wieder entfernen ?

Indem Du für jedes Pic speicherst, daß eine Linie abgeht und wohin. Dazu nimmst Du am Besten zu jeder der Zeilen ein eigenes Array mit identischen Indizes und dimensioniert die als Objekt, dann hast Du alle Eigenschaften … Und schon sind wir mit dem einfachen Programm in der objektorientierten Programmierung angekommen. *fg* So schnell kann das gehen. Klar?

Gruß, Rainer

A hoi Rainer.
Array…Array …da war doch was.

  1. Wenn ich Picture1 index 0-15 brauche, also 16 Bilder pro reihe, muss ich auf Long umsteigen, oder?

  2. Picture1(Index).Enabled & Picture2(Index).Enabled = False
    Funktioniert bei Picture2 einbahnfrei. Aber bei Picture1 leider nicht sooo gut da beim disablen ja noch ein wert im index drinsteht. soll ich da einfach nach einem klick sagen index = „“ ?

  3. Wie war das mit einer Listbox die nach jedem klick sagt:
    Picture1 index1 wurde mit Picture2 index4 verbunden :confused:

danke mfg joe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

Array…Array …da war doch was.

*gg*

  1. Wenn ich Picture1 index 0-15 brauche, also 16 Bilder pro
    reihe, muss ich auf Long umsteigen, oder?

Byte ist 1 Byte groß, ein Byte hat 8 Bit. 2^0 = 1 + 2^1 = 2 … + 2^7 = 128 … Summe 255. 1 Byte reicht also um bis 255 zu zählen. Integer ist 2 Byte groß, also 255 * 255 = 65025. Aber damit man negative Zahlen darstellen kann von -32512 bis +32512. Long hat 4 Byte, Double 8 Byte … ab hier darfst Du selbst rechnen.

  1. Picture1(Index).Enabled & Picture2(Index).Enabled = False
    Funktioniert bei Picture2 einbahnfrei. Aber bei Picture1
    leider nicht sooo gut da beim disablen ja noch ein wert im
    index drinsteht. soll ich da einfach nach einem klick sagen
    index = „“ ?

Index ist eine Variable, die Du vom System bekommst, das ist immer der Index des angeklickten Bildes. Wenn Du selbst Variablen setzen möchtest, verwende einen anderen Namen.

  1. Wie war das mit einer Listbox die nach jedem klick sagt:
    Picture1 index1 wurde mit Picture2 index4 verbunden :confused:

Aber nur für die Anzeige! Nicht, daß Du damit arbeiten willst, das wird extrem langsam, nicht zu gebrauchen.
Nimm eine Variable, ich würde die ‚Src‘ nennen. (Source) und deklariere sie als Integer. (Index ist ebenfalls Integer)
Wenn Du Deine Pics nun von 1 bis n numerierst (Null weg lassen, ein Array mit Pics reicht ja auch …) Dann kannst Du mit …

If Src = 0 Then
 Src = Index
Else
 Line (Pic(Src).Left, Pic(Src).Top) - (Pic(Index).Left, Pic(Index).Top), VbBlack
 List1.AddItem CStr(Src) & " - " & CStr(Index)
 Dest(Index) = Src
 Dest(src) = Index
End If

Sowohl die Linie ziehen als auch die Punkte in die Liste eintragen.
Für die Arbeit würde ich dann aber doch ein Array ‚Dest(Count)‘ anlegen und dort immer den Index des anderen Feldes eintragen, zu dem die Linie führt. (Oben schon mal eingebaut) Wenn Du ein Zeil eintragen willst und da steht schon eins, dann muss die Linie gelöscht werden. Das habe ich jetzt noch nicht eingebaut, versuch’s mal selbst.

Line (Pic(Dest(Index)).Left, Pic(Dest(Index)).Top) - (Pic(Index).Left, Pic(Index).Top), Me.BackColor

Gruß, Rainer

Code …
Hi Joe,

erst lesen, wenn du nicht mehr weiter kommst:

Option Explicit

Dim Dest() As Integer
Dim Src As Integer

Private Sub Form\_Load()
 ReDim Dest(Pic.LBound To Pic.UBound)
End Sub

Private Sub Pic\_Click(Index As Integer)
 If Dest(Index) 0 Then
 Line (Pic(Index).Left, Pic(Index).Top)-(Pic(Dest(Index)).Left, Pic(Dest(Index)).Top), Me.BackColor
 Dest(Dest(Index)) = 0
 Dest(Index) = 0
 End If

 If Src = 0 Then
 Src = Index
 Pic(Index).BackColor = vbRed
 Else
 Line (Pic(Src).Left, Pic(Src).Top)-(Pic(Index).Left, Pic(Index).Top), vbBlack
 Pic(Src).BackColor = vbWhite
 Dest(Index) = Src
 Dest(Src) = Index
 Src = 0
 End If
End Sub

Es gibt nur ein Steuerelementefeld, die Pics heißen Pic(Index). Wo die liegen ist ja egal. Verwendest Du mehrere, wird nur der Code komplizierter, bringt aber keinen Nutzen.

Gruß, Rainer

Moin Rainer,
ich würde gern beide Bilder weiß einfärben nicht nur den startpunkt.
Es ist doch ein Array, also könnte ich mir zu jedem zeitpunkt alle verbindungen ausgeben lassen ? also Button press… 22->44, 2->10

? mfg jonny

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

ich würde gern beide Bilder weiß einfärben nicht nur den
startpunkt.

dann mach’s doch …

 Pic(Src).BackColor = vbWhite
 Pic(Index).BackColor = vbWhite

Es ist doch ein Array, also könnte ich mir zu jedem zeitpunkt
alle verbindungen ausgeben lassen ?

Ja, klar.

Private Sub Command1\_Click()  
 For i = LBound(Pic) To UBound(Pic)  
 List1.AddItem CStr(i) & " - " & CStr(Dest(i))  
 Next  
End Sub

aber wozu? Du siehst Die Linien doch.

Stopp! Das war falsch! Korrektur …

Private Sub Command1\_Click()
 Dim i As Integer
 List1.Clear
 For i = Pic.Lbound To Pic.Ubound
 List1.AddItem CStr(i) & " - " & CStr(Dest(i))
 Next
End Sub

So ist es besser.

Gruß, Rainer
PS. Schön, wenn man solche Fehler korrigieren kann. :smile:
Sollte mal Jemand so einen Wunsch haben, mach ich immer gern.

OT Nicht Lesenswert
Hallo Rainer,
Joe bleibt dir bis 2046 erhalten *sicherbin*
Aber dann steht sein/euer Programm
Lieben Gruß
Reinhard

Hallo reinhard,

Joe bleibt dir bis 2046 erhalten *sicherbin*

na hoffentlich! Das ist doch schön so. :smile:

Aber dann steht sein/euer Programm

Seine/unsere Programme. Das ist doch nicht nur eins. Dafür ist das Brett doch da.

Ich habe übrigens etwas neues, eine DLL um den in VB6/VBA fehlenden Befehl ‚Swap‘ zu realisieren, also den Inhalt von Variablen oder Bereichen in Arrays mit einem Befehl schnell auszutauschen.

Das hat mir/uns CMБ in Assembler (mit C++) geschrieben … wahnsinnig schnell!
http://www.winhome.de/ISwap.dll

Das musste ich einfach mal erzählen. :smile:

Gruß, Rainer

Hallo Rainer,

Joe bleibt dir bis 2046 erhalten *sicherbin*

na hoffentlich! Das ist doch schön so. :smile:

Ja, einer muß ja das Licht ausmachen :smile:

Ich habe übrigens etwas neues, eine DLL um den in VB6/VBA
fehlenden Befehl ‚Swap‘ zu realisieren, also den Inhalt von
Variablen oder Bereichen in Arrays mit einem Befehl schnell
auszutauschen.

Das hat mir/uns CMБ in Assembler (mit C++) geschrieben
… wahnsinnig schnell!
http://www.winhome.de/ISwap.dll

Das musste ich einfach mal erzählen. :smile:

Okay, ich setze in Vba einen Verweis auf diese DLL, und dann?

Ich kenne swap nicht, mutmaße aber stark es läuft so

swap(x,y)

was dem entspricht

Merker=x
x=y
y=Merker

z.B. in Sortiercodes eingesetzt.

Jetzt weiß ich nicht wie das mit „Bereichen in Arrays“ gemeint ist.

swap(x(5),y(7)) macht mir irgendwie keinen Sinn

Also erzähle gerne weiter, ich lausche gerne *gg*

Gruß
Reinhard

Hallo Reinhard,

Okay, ich setze in Vba einen Verweis auf diese DLL, und dann?

Ich kenne swap nicht, mutmaße aber stark es läuft so

swap(x,y)

das kann noch mehr, nämlich mehrere Bytes in einem Schritt. Ich habe ein Demo dazu geschrieben und im Brett C++ gepostet …
http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…

swap(x(5),y(7)) macht mir irgendwie keinen Sinn

Swap (BitmapBytes(0),ByteArray(0),300000) kann aber Sinn machen. :smile:

Sieh Dir mal das Beispiel an …

Gruß, Rainer

Moin Rainer,
wochenende!! Habe zwar noch Rufbereitschaft aber wenn alles gut geht müsste ich paar stunden dem „Programmieren“ opfern können.
Wieso geht folgende zeile nicht ?
If Combovar = 1 And Combo1.ListIndex = 0 Then start = 5 and ende = 16

ich musste es in 2 zeilen aufteilen:

If Combovar = 1 And Combo1.ListIndex = 0 Then start = 5
If Combovar = 1 And Combo1.ListIndex = 0 Then ende = 16

und kannst du mir erklären was das CStr im folgenen Code für eine Funktion hat ? Ich bekomme die meldung expectet Array Lbound beim ausführen. Ich würde einfach gern einen Ist stand in text form haben wenn ich alle „ports“ verbunden habe.

besten Dank.
mfg joe

Private Sub Command1\_Click()
For i = LBound(Pic) To UBound(Pic)
List1.AddItem CStr(i) & " - " & CStr(Dest(i))
Next
End Sub

Hi Joe,

Wieso geht folgende zeile nicht ?
If Combovar = 1 And Combo1.ListIndex = 0 Then start = 5 and
ende = 16

das sind zwei Befehle und die kannst Du nicht durch And trennen, dafür ist der Doppelpunkt da.

ich musste es in 2 zeilen aufteilen:

If Combovar = 1 And Combo1.ListIndex = 0 Then start = 5
If Combovar = 1 And Combo1.ListIndex = 0 Then ende = 16

oder

If Combovar = 1 And Combo1.ListIndex = 0 Then start = 5: ende = 16

und kannst du mir erklären was das CStr im folgenen Code für
eine Funktion hat?

Cstr(i) wandelt die Zahl in der Variablen i in einen String um.
Mit Str$(i) bekommst Du für i=-1 ‚-1‘ zurück, für +1 ’ 1’
Private Sub Command1_Click()
For i = LBound(Pic) To UBound(Pic)
List1.AddItem CStr(i) & " - " & CStr(Dest(i))
Next
End Sub

Syntaxfehler.
Wenn Du wissen willst, welcher Index bei Dest() der Kleinste ist, schreibst Du LBound(Dest) .
Beim Steuerelement ist das aber eine Eigenschaft, dann sieht das so aus:

Pic.LBbound

Private Sub Command1\_Click()
 For i = Pic.LBound To Pic.UBound
 List1.AddItem CStr(i) & " - " & CStr(Dest(i))
 Next
End Sub

Sorry, da hatte ich Unfug geschrieben, wenn man nicht jede Zeile testet … :smile:

Gruß, Rainer

Hi Joe,

Wieso geht folgende zeile nicht ?
If Combovar = 1 And Combo1.ListIndex = 0 Then start = 5 and
ende = 16
ich musste es in 2 zeilen aufteilen:
If Combovar = 1 And Combo1.ListIndex = 0 Then start = 5
If Combovar = 1 And Combo1.ListIndex = 0 Then ende = 16

Du hast „and“ mißverstanden. So geht das nicht. Nach Then folgt ein Befehl nicht zwei.

If Combovar = 1 And Combo1.ListIndex = 0 Then 
 start = 5 
 ende = 16
End If

Die restliche Kleinigkeit klärt Rainer *k.A. hab*

CStr wandelt einen beliebigen Wert in einen String um. Mit der Fehlermeldung kann ich nix anfangen, sorry :frowning:

Gruß
Reinhard

Erstmal läuft alles. DANKE !!
ich melde mich wieder.

mfg Jonny.

Nabend Rainer,
ich würde gern zu jeder Linie die ich zwischen 2 Pics ziehe eine Input box bekommen wo ich zu der linie einen kurzen kommentar eintragen könnte. Wo setzte ich da an?

mfg jonny

Option Explicit

Dim Dest() As Integer
Dim Src As Integer

Private Sub Form_Load()
ReDim Dest(Pic.LBound To Pic.UBound)
End Sub

Private Sub Pic_Click(Index As Integer)
If Dest(Index) 0 Then
Line (Pic(Index).Left,
Pic(Index).Top)-(Pic(Dest(Index)).Left, Pic(Dest(Index)).Top),
Me.BackColor
Dest(Dest(Index)) = 0
Dest(Index) = 0
End If

If Src = 0 Then
Src = Index
Pic(Index).BackColor = vbRed
Else
Line (Pic(Src).Left, Pic(Src).Top)-(Pic(Index).Left,
Pic(Index).Top), vbBlack
Pic(Src).BackColor = vbWhite
Dest(Index) = Src
Dest(Src) = Index
Src = 0
End If
End Sub

Es gibt nur ein Steuerelementefeld, die Pics heißen
Pic(Index). Wo die liegen ist ja egal. Verwendest Du mehrere,
wird nur der Code komplizierter, bringt aber keinen Nutzen.

Gruß, Rainer