Einfach oder nicht ?

Hi Joe,

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?

am Besten genau da, wo die Linie gezogen wird, würde ich denken. Soll der Text angezeigt werden?

Option Explicit

Dim Dest() As Integer
Dim Kommentar() As String '<u>Kommentarfeld dimensionieren</u>
Dim Src As Integer

Private Sub Form\_Load()
 ReDim Dest(Pic.LBound To Pic.UBound)
 ReDim Kommentar(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
 Kommentar(Dest(Index)) = ""
 Kommentar(Index) = ""
 Dest(Dest(Index)) = 0
 Dest(Index) = 0
 End If

 If Src = 0 Then
 Src = Index
 Pic(Index).BackColor = vbRed
 Else

 Dest(Index) = Src
 Dest(Src) = Index
 Kommentar(Dest(Index)) = InputBox("Kommentar eingeben", "Kommentar")
 Kommentar(Index) = Kommentar(Dest(Index))
 Line (Pic(Src).Left, Pic(Src).Top)-(Pic(Index).Left, Pic(Index).Top), vbBlack
 Pic(Src).BackColor = vbWhite
 Src = 0
 End If
End Sub

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

Im Array ‚Kommentar‘ steht der Text schon mal. Wie willst Du ihn anzeigen? Statt zu malen könnte man das ‚Line‘ Steuerelement nehmen und den Text in ‚ToolTipText‘ schreiben. Dann wird er angezeigt, wenn Du den Mauszeiger auf die Linie stellst … :smile:

Gruß, Rainer

Moin Rainer,
ich habe den text nun auf die Pics gelegt
Pic(Src).ToolTipText = Kommentar(Dest(Index))
Pic(Index).ToolTipText = Kommentar(Index)
Es Funktioniert aber nicht immer. Also der text steht „drin“ aber der MousOver funktioniert leider nicht immer.
Wie könnte ich den Tooltip auch auf die Linie schreiben ? Line.tooltip gibt es doch nicht oder ?

Danke, mfg joe

Moin Joe,

ich habe den text nun auf die Pics gelegt
Pic(Src).ToolTipText = Kommentar(Dest(Index))
Pic(Index).ToolTipText = Kommentar(Index)
Es Funktioniert aber nicht immer. Also der text steht „drin“
aber der MousOver funktioniert leider nicht immer.

ToolTipText kommt mir auch manchmal ‚hakelig‘ vor.

Wie könnte ich den Tooltip auch auf die Linie schreiben ?
Line.tooltip gibt es doch nicht oder ?

Nein, ich habe gerade nachgesehen, auch das Line-Steuerelement hat keinen.

Was vermutlich gehen würde, wäre an die Linie ein ‚Etikett‘ zu hängen, entweder direkt auf die Form printen, ein Label … wenn es im Zweifelsfall lieber die Punkte verdecken soll als umgekehrt, werden es wohl Textfelder. Die kannst Du ja immer auf Text1(index).Visible = False stellen, wenn sie nicht angezeigt werden sollen …

Was auch noch geht, wäre den Text per API direkt in den Bildspeicher zu schreiben, Der verschwindet dann, sobald die Form bewegt wird, das ist aufwändig, wird viel Code, aber dann kannst Du den text sogar entlang der Linie legen und mußt kein waagrerechtes Fähnchen anhängen.

Gruß, Rainer
PS. Mal 'ne Fragge … darf man erfahren, was Du da baust? :smile:

Moin Rainer,
ich versuche ein Tool zu bauen welches mir auf der Arbeit 2-3 Zettel bzw. Zeit erspart.
Wir haben diverse Richtfunklinks. Jeder Standort hat mehrere RichtfunkModems die kreutz und quer mit 2Mbit Kabel verschaltet sind.
Leider stimmt der Ist zustand nur zu 70% mit dem Soll zustand überein.
deswegen habe ich mir nun dieses GRafische Tool gebastelt um die verkabelung schnellstmöglich mit dem Laptop aufzuzeichnen und im Büro abzugleichen. Die Beschriftung „Kommentar“ ist einfach wofür die verbindung gebraucht wird. Und ich bin bis jetzt über die funktion begeistert. mal schauen wie es sich in der Praxis macht.
Besten Dank!!

Eine frage wäre da aber noch:
Ich würde gern beim aufheben einer verbindung, das beide seiten wieder
Me.BackColor bekommen.
mfg jonny

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
Kommentar(Dest(Index)) = ""
Kommentar(Index) = ""
Dest(Dest(Index)) = 0
Dest(Index) = 0
End If

Hi Joe,

danke für die Erklärung. Das hilft beim Verständnis. Ich dache schon an ein Auswertungstool für die kommende Fussball-EM …

Eine frage wäre da aber noch:
Ich würde gern beim aufheben einer verbindung, das beide
seiten wieder

die füllst Du doch im Moment weiß…

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

… wenn die Linie gezogen wird. Wenn die Linie gelöscht wird kannst Du die ja wieder anders füllen …

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

… wenn Dir das besser gefällt.

Wie hast Du nun die Beschriftung vor? Ich bastel schon seit einiger Zeit daran herum, direkt die Linie zu beschriften, im selben Winkel, in dem die Linie verläuft … irgendwie ist heute nicht mein Tag, etwas mache ich falsch bei der Berechnung des Winkels. :smile: Danke für die Aufgabe, das ist ein nettes Rätsel, macht Spaß! *gg* Ich poste das Modul, wenn es fertig ist.

Gruß, Rainer

OT Dim Dest() As Integer
Hallo Rainer,

vielleicht ist auch für mich heute nicht mein Verstehenstag :smile:
Dim Dest() As Integer
irritiert mich gewaltig, dummerweise habe ich hier grad kein Excel:frowning:

Aber ich bin aus dem Bauch heraus sicher, das würde in Excel Vba den Debugger anlocken.

Mag ja sein daß die einzelnen Items von Dest Integerwerte beinhalten, aber insgesamt ist Dest doch ein Array, eine Matrix o.ä.!?
Wie kann es da eine Integervariable sein?

Oder sehe ich da was falsch? *nichtunüblich*

Gruß
Reinhard

Hallo Reinhard,

vielleicht ist auch für mich heute nicht mein Verstehenstag

-)

Dim Dest() As Integer
irritiert mich gewaltig, dummerweise habe ich hier grad kein
Excel:frowning:

Aber ich bin aus dem Bauch heraus sicher, das würde in Excel
Vba den Debugger anlocken.

nein, damit hat VBA kein Problem.

Dim Dest() As Integer

deklariert ein Array aus Integer werten, nur ist noch nicht klar, wie groß das Array wird, das wird später mit

Redim Dest(Pic.Lbound to Pic.Ubound)

erst festgelegt. Das Array passt sich automatisch an die Anzahl der Pictures an. Wenn es z.B. vier Pictures gibt, wird das Array durch das Redim 8 Bytes groß.

Gruß, Rainer

Hallo Rainer,

nein, damit hat VBA kein Problem.

das habe ich dir sofort geglaubt, *schwör*

naja, weil ich so bin, natürlich erst nachdem ich

Sub tt()
Dim Dest() As Integer
ReDim Dest(1 To 5)
End Sub

getestet hatte :smile:)

Danke ^ Gruß
Reinhard

Moin Rainer,

Ich sage nicht nein zum Modul, aber macht es bei mir nur sinn wenn es eine Option gibt die linie nicht durch andere Pics laufen zu lassen.
ich habe nun schon 6 zeilen mit 16 Pics. und es lässt sich nicht vermeiden das wenn ich zeile 1 mit zeile 6 verbinde die Linie durch andere Pics läuft. ist nicht weiter wild das ich mir das ganze ja nach dem eintragen als Text ausgeben lasse.

Was ich noch klären muss wäre speichern und laden … dazu aber später, wenn ich von der arbeit komme …

besten dank !!! mfg joe

Hi Joe,

Zwischenergebnis, sieh mal. ob Du etwas davon gebrauchen kannst.

In der Form:

Option Explicit

Private Declare Function CreateFont Lib "gdi32" Alias \_
 "CreateFontA" (ByVal H As Long, ByVal w As Long, \_
 ByVal E As Long, ByVal O As Long, ByVal w As \_
 Long, ByVal i As Long, ByVal u As Long, ByVal S \_
 As Long, ByVal C As Long, ByVal OP As Long, ByVal \_
 CP As Long, ByVal Q As Long, ByVal PAF As Long, \_
 ByVal F As String) As Long
 
Private Declare Function SelectObject Lib "gdi32" (ByVal \_
 hdc As Long, ByVal hObject As Long) As Long
 
Private Declare Function DeleteObject Lib "gdi32" (ByVal \_
 hObject As Long) As Long
 
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" \_
 (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, \_
 ByVal lpString As String, ByVal nCount As Long) As Long
 
Dim x&, y&

Dim Dest() As Integer
Dim Kommentar() As String
Dim Src As Integer

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

Private Sub anzeigen()
 Dim w As Long
 Dim i As Integer
 Me.Cls
 For i = Pic.LBound To Pic.UBound
 If Dest(i) 0 Then
 w = -Winkel(Pic(i).Left, Pic(i).Top, Pic(Dest(i)).Left, Pic(Dest(i)).Top)
 TOut Pic(i).Left, Pic(i).Top, w, 12, " " + Kommentar(i)
 Line (Pic(Dest(i)).Left, Pic(Dest(i)).Top)-(Pic(i).Left, Pic(i).Top), vbBlack
 End If
 Next
End Sub

Private Sub Pic\_Click(Index As Integer)
 Dim w As Long
 If Dest(Index) 0 Then
 Kommentar(Dest(Index)) = ""
 Kommentar(Index) = ""
 Pic(Index).BackColor = Me.BackColor
 Pic(Dest(Index)).BackColor = Me.BackColor
 Dest(Dest(Index)) = 0
 Dest(Index) = 0
 End If

 If Src = 0 Then
 Src = Index
 Pic(Index).BackColor = vbRed
 Else

 Dest(Index) = Src
 Dest(Src) = Index
 Kommentar(Dest(Index)) = InputBox("Kommentar eingeben", "Kommentar")
 Kommentar(Index) = Kommentar(Dest(Index))
 anzeigen
 Pic(Src).BackColor = vbWhite
 Pic(Dest(Src)).BackColor = vbWhite
 Src = 0
 End If
End Sub

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

Private Sub TOut(x&, y&, Winkel&, Size%, Text$)
 Dim hFont&, FontMem&, Bold&, Result&
 
 If Me.FontBold Then
 Bold = 700
 Else
 Bold = 400
 End If
 
 hFont = CreateFont(-Size, 0, Winkel \* 10, 0, Bold, \_
 Me.FontItalic, Me.FontUnderline, 0, 1, 4, &H10, \_
 2, 4, "Arial")
 
 FontMem = SelectObject(Me.hdc, hFont)
 Result = TextOut(Me.hdc, x, y, Text, Len(Text))
 Result = SelectObject(Me.hdc, FontMem)
 Result = DeleteObject(hFont)
End Sub

Dann musst Du noch ein Modul hinzufügen, die Winkelberechnung wollte ich nicht auch noch in der Form haben.

Im Modul:

Option Explicit

Public Const Pi = 3.14159265358979

Public Function Winkel(ByVal xt As Integer, ByVal yt As Integer, \_
 ByVal xb As Integer, ByVal yb As Integer) As Long

 Dim alpha As Double
 Dim atan As Double
 Dim dx As Integer
 Dim dy As Integer
 Dim hyp As Integer
 Dim SinAlpha As Single
 Dim CosAlpha As Single
 Dim w As Single
 Dim sel As Integer

 dx = xb - xt
 dy = yb - yt
 hyp = Sqr(dx ^ 2 + dy ^ 2)
 SinAlpha = dy / hyp
 CosAlpha = dx / hyp

 If Sqr(-SinAlpha \* SinAlpha + 1) \> 0 Then
 Winkel = Atn(SinAlpha / Sqr(-SinAlpha \* SinAlpha + 1)) / Pi \* 180
 Else
 Winkel = 90
 End If

 sel = Sgn(SinAlpha) + (2 \* Sgn(CosAlpha))

 Select Case sel
 Case -3
 Winkel = 180 + Abs(Winkel)
 Case -1
 Winkel = 180 - Winkel
 Case 1
 Winkel = 360 - Abs(Winkel)
 Case Else

 End Select
 If Winkel = 90 Or Winkel = 270 Then
 Winkel = Winkel + 180
 End If
 If Winkel = 0 And xt \> xb Then
 Winkel = 180
 End If

End Function

Inzwischen ist der Code doch etwas umfangreicher. Verstehst Du noch alles?

Gruß, Rainer

Hi Joe,

*gg* Zeitgleich … Sieh Dir mal den neuen Code an. :smile:

Speichern und laden wird leicht.

Gruß, Rainer

Moin Rainer,

Ich habe ein Frame hinter eine Pic reihe gelegt und in den Hintergrund gedrückt. Die Pics sind nun auf dem Frame so wie ich es wollte, nur die Linie zwischen den Pics wird leider von dem Frame verdeckt. Warum ?

In eine Datei schreiben sollte so klappen oder ?
Aber wie schreibe ich die Kommentare vom tooltip mit dazu `?

ff = FreeFile
 Open "line.cfg" For Output As #ff
 For i = Pic.LBound To Pic.UBound
 Print #ff, CStr(i) & "---" & Cstr(Dest(i)) 
 Next
Close #ff

mfg jonny

Moin Joe,

Ich habe ein Frame hinter eine Pic reihe gelegt und in den
Hintergrund gedrückt. Die Pics sind nun auf dem Frame so wie
ich es wollte,

so weit schön.

nur die Linie zwischen den Pics wird leider von
dem Frame verdeckt. Warum ?

Weil Du nach wie vor mit Me.Line()-() die Linien auf die Form malst und die vom Frame verdeckt werden. Der Line-Befehl ist jetzt mit dem Frame nicht mehr zu gebrauchen, denn auf den Frame kannst Du nicht malen.

da ist umbau angesagt, Du brauchst ein Array mit Line-Steuerelementen.
Wo die hin sollen berechnest Du ja schon, Du musst nur die vier Werte aus dem Line-Befehl in die Eigenschften x1,x1,x2,y2 des Line Steuerelements schreiben. Statt der Farben schreibst Du noch .Visible = True oder False und es geht wieder.

In eine Datei schreiben sollte so klappen oder ?
Aber wie schreibe ich die Kommentare vom tooltip mit dazu
`?

ff = FreeFile
 Open "line.cfg" For Output As #ff
 For i = Pic.LBound To Pic.UBound
 Print #ff ,Dest(i)
 Print #ff ,Kommentar(i)
 Next
 Close #ff

Wozu die Umwandlung in einen String? Der Counter ist überflüssig.

Du darfst ruhig mehrere verschiedene Werte schreiben, Du musst nur genau so lesen.

Gruß, Rainer

Moin,
Argh, ich verwende erstmal ein Shape für den Rahmen. :confused:
Und bau die speicherfunkton ein.

Melde mich später, Thx mfg joe

Abend Schoin,
Ich möchte nun noch ein textfeld der Linie und dem Kommentar anfügen.
Warum ist hier Script out of Range ?
Für micht steht da: Textfeld(1) = Link1(1).text

Private Sub Link1\_Change(Index As Integer)
Dim Textfeld() As String
Textfeld(Index) = Link1(Index).Text
End Sub

mfg joe

Es fehlt das: For i = textfeld.LBound To textfeld.UBound oder ?

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

Es wird Zeit das ich mir nochmal die BAsics reinpfeife.

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

Private Sub Link1\_Change(Index As Integer)
Textfeld(Pic(Index)) = Link1(Index).Text
End Sub


'Laden
Open Ppfad For Input As #ff
 For i = Pic.LBound To Pic.UBound
 Input #ff, Dest(i)
 Input #ff, Kommentar(i)
 Input #ff, Textfeld(i)
 Link1(Pic(i)).Text = Textfeld(i) 
 Next
Close #ff

'Speichern
Private Sub Speichern\_Click()
ff = FreeFile
 pfd = App.Path
 If Right(pfd, 1) "\" Then pfd = pfd & "\"
 Ppfad = pfd & "Link.cfg"

Open Ppfad For Output As #ff
 For i = Pic.LBound To Pic.UBound
 Print #ff, Dest(i)
 Print #ff, Kommentar(i)
 Print #ff, Textfeld(i)
 Next
Close #ff
End Sub

Hi Joe,

*gg* da hebe ich doch gerade falsch gelesen, noch einmal … :smile:

Ich möchte nun noch ein textfeld der Linie und dem Kommentar
anfügen.
Warum ist hier Script out of Range ?

Es ist nicht dimensioniert.

Für micht steht da: Textfeld(1) = Link1(1).text

Private Sub Link1\_Change(Index As Integer)
 Dim Textfeld() As String
 Textfeld(Index) = Link1(Index).Text
End Sub

Dim textfeld() As String ist der erste Schritt, da fehlt noch ein ReDim Textfeld(von to bis)

Gruß, Rainer

Beim Laden bekomme ich den fehler:
Control Array 16 doesnt exist. hmpf
Link1(i).Text = Textvomtextfeld(i)

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

Private Sub Laden\_Click()
ff = FreeFile
pfd = App.Path
If Right(pfd, 1) "\" Then pfd = pfd & "\"
 Ppfad = pfd & "Link.cfg"
 Picopen = pfd & "open.bmp"
 Picclose = pfd & "close.bmp"

Open Ppfad For Input As #ff
 For i = Pic.LBound To Pic.UBound
 Input #ff, Dest(i)
 Input #ff, Kommentar(i)
 Input #ff, Textvomtextfeld(i)
 Link1(i).Text = Textvomtextfeld(i)
 Next
Close #ff

End Sub

Hi Joe,

Was ist ‚Link1(Index).Text‘?

Hmmm, kommentier mal die Laderoutine aus und sorge so dafür, daß erst mal etwas gesichert wird. Sonst fällt mir an dem Code im Moment nichts auf. Was geht nicht?

Gruß, Rainer