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.
… 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 
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. 
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. 
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.
-
Wenn ich Picture1 index 0-15 brauche, also 16 Bilder pro reihe, muss ich auf Long umsteigen, oder?
-
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 = „“ ?
-
Wie war das mit einer Listbox die nach jedem klick sagt:
Picture1 index1 wurde mit Picture2 index4 verbunden 
danke mfg joe
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hi Joe,
Array…Array …da war doch was.
*gg*
- 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.
- 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.
- Wie war das mit einer Listbox die nach jedem klick sagt:
Picture1 index1 wurde mit Picture2 index4 verbunden
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. 
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. 
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. 
Gruß, Rainer
Hallo Rainer,
Joe bleibt dir bis 2046 erhalten *sicherbin*
na hoffentlich! Das ist doch schön so. 
Ja, einer muß ja das Licht ausmachen 
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. 
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. 
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 … 
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 
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