Textbox -> Cursor abschalten

Hallo,

ich stehe gerade ein wenig auf dem Schlauch.

Ich habe eine Form. Ne gewaltige Form *grins* wo sich allerhand Steuerelemente drauf befinden. Unter anderem auch ca. 80 Textboxen.
Einige Textboxen fungieren als Link. Ein Label dazu missbrauchen geht aus diversen Gruenden nicht.

Soweit klappt auch alles wunderbar. Nur kann es auch einmal vorkommen, das kein Link vorhanden ist und die Zeile dementsprechend leer bleibt. Dann kann man mit der Maus in die Zeile klicken und man sieht dann den blöden Cursor, was nicht sein soll / darf :frowning:

Weiss jemand wie ich das beheben kann?

Hier der relevante Code

'Code in der Form

Private Sub Form\_Load()
 Call CreateHyperlink
End Sub

Private Sub CreateHyperlink()
 Call LinkCreate(Text1(19), Me): Call LinkDisplay(Text1(19))
 Call LinkCreate(Text1(45), Me): Call LinkDisplay(Text1(45))
 Call LinkCreate(Text6(28), Me): Call LinkDisplay(Text6(28))
 Call LinkCreate(Text6(29), Me): Call LinkDisplay(Text6(29))
 Call LinkCreate(Text7(0), Me): Call LinkDisplay(Text7(0))
 Call LinkCreate(Text7(1), Me): Call LinkDisplay(Text7(1))
 Call LinkCreate(Text7(2), Me): Call LinkDisplay(Text7(2))
 Call LinkCreate(Text7(3), Me): Call LinkDisplay(Text7(3))
 Call LinkCreate(Text7(4), Me): Call LinkDisplay(Text7(4))
 Call LinkCreate(Text7(5), Me): Call LinkDisplay(Text7(5))
 Call LinkCreate(Text7(6), Me): Call LinkDisplay(Text7(6))
 Call LinkCreate(Text7(7), Me): Call LinkDisplay(Text7(7))
 Call LinkCreate(Text7(9), Me): Call LinkDisplay(Text7(9))
 Call LinkCreate(Text7(42), Me): Call LinkDisplay(Text7(42))
End Sub

Private Sub Text7\_Click(Index As Integer)
 Select Case Index
 Case 0, 1, 2, 3, 4, 5, 6, 7, 9
 If Trim(Text7(Index).Text) = "" Then Exit Sub
 Text7(Index).Tag = "": Text7(Index).Tag = Text7(Index).Text
 Call LinkGo(Text7(Index))
 Case 42
 If Trim(Text7(Index).Text) = "" Then Exit Sub
 Text7(Index).Tag = "": Text7(Index).Tag = "Mailto:" & Text7(Index).Text
 Call LinkGo(Text7(Index))
 Case Else
 End Select
End Sub

Private Sub Text7\_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
 Select Case Index
 Case 0, 1, 2, 3, 4, 5, 6, 7, 9, 42
 If Trim(Text7(Index).Text) = "" Then Exit Sub
 Call LinkHover(Text7(Index), X, Y)
 Case Else
 End Select
End Sub

'Modul Hyperlink

Option Explicit

Private Const SE\_ERR\_NOASSOC = 31
Private Const SE\_ERR\_NOTFOUND = 2
Global Const Link\_Normal = &HA56B39 ' Blauton
Global Const Link\_Hover = &HFF& ' Rot
Global Const resHand = 2

Public Sub LinkCreate(Link As TextBox, Optional Container As Variant)
 With Link
 .Locked = True
 .TabStop = False
 .BorderStyle = 0
 If Not IsMissing(Container) Then
 .BackColor = Container.BackColor
 End If
 End With
End Sub

Public Sub LinkDisplay(Link As TextBox, Optional ByVal ColorNormal As Variant)
 With Link
 If IsMissing(ColorNormal) Then
 .ForeColor = Link\_Normal
 Else
 .ForeColor = ColorNormal
 End If
 .Font.Underline = False
 On Local Error Resume Next
 .MouseIcon = LoadResPicture(resHand, vbResCursor)
 .MousePointer = 99
 On Local Error GoTo 0
 End With
End Sub

Public Sub LinkHover(Link As TextBox, X As Single, Y As Single, Optional ByVal ColorNormal As Variant, Optional ByVal ColorHover As Variant)
 With Link
 If X \>= 0 And Y \>= 0 And X "http://" Then URL = "http://" & URL
 Call ShellExecute(GetDesktopWindow(), "Open", URL, "", "", 3)
 ElseIf Left$(LCase(Link.Tag), 7) = "mailto:" Then
 Call ShellExecute(GetDesktopWindow(), "Open", Link.Tag, "", "", 1)
 ElseIf Left$(LCase(Link.Tag), 4) = "App:" Then
 DocumentOpen Mid$(Link.Tag, 5)
 End If
End Sub

Private Sub DocumentOpen(sFilename As String)
 Dim sDirectory As String
 Dim lRet As Long
 Dim DeskWin As Long
 DeskWin = GetDesktopWindow()
 lRet = ShellExecute(DeskWin, "open", sFilename, vbNullString, vbNullString, vbNormalFocus)
 If lRet = SE\_ERR\_NOTFOUND Then
 'Datei nicht gefunden
 ElseIf lRet = SE\_ERR\_NOASSOC Then
 sDirectory = Space(260)
 lRet = GetSystemDirectory(sDirectory, Len(sDirectory))
 sDirectory = Left(sDirectory, lRet)
 Call ShellExecute(DeskWin, vbNullString, "RUNDLL32.EXE", "shell32.dll,OpenAs\_RunDLL " & sFilename, sDirectory, vbNormalFocus)
 End If
End Sub

Einige Declarationen habe ich hier nicht gepostet da es sonst den Rahmen sprengen würde und ich denke mal sie auch hier nicht relevant ist für mein Problem :wink:

Weiss jemand Rat, wie ich das abstellen kann das der Cursor nicht eingeblendet wird, wenn in der Textbox kein Eintrag drinnen steht ?

MfG Alex

Hi Alex,

Soweit klappt auch alles wunderbar. Nur kann es auch einmal
vorkommen, das kein Link vorhanden ist und die Zeile
dementsprechend leer bleibt. Dann kann man mit der Maus in die
Zeile klicken und man sieht dann den blöden Cursor, was nicht
sein soll / darf :frowning:

einfach abschalten?

 If Text1.Text = "" Then
 Text1.Enabled = False
 Else
 Text1.Enabled = True
 End If

Gruß, Rainer

Hi Alex,

Hallo Rainer,

einfach abschalten?

Owei das ich da nicht selber drauf gekommen bin :frowning:
Allerdings ist es nicht so einfach. Da ich zum Bsp. beim Editieren der Datensaetze den Cursor wiederrum in der Textbox brauche. Aber das kann ich mit einem Flag realisieren :wink:

If Text1.Text = „“ Then
Text1.Enabled = False
Else
Text1.Enabled = True
End If

Gruß, Rainer

Danke und Gruß Alex

Hallo Alex,

Owei das ich da nicht selber drauf gekommen bin :frowning:

*gg* nachdem ich bemerkt habe, wer da fragt, habe ich mich auch gewundert. :smile: Aber schön, daß nicht nur ich manchmal auf das nahe liegende nicht komme. Aber das macht ja nichts, wir sind ja hier unter uns. :smile:

Allerdings ist es nicht so einfach. Da ich zum Bsp. beim
Editieren der Datensaetze den Cursor wiederrum in der Textbox
brauche. Aber das kann ich mit einem Flag realisieren :wink:

Das ist mir inzwischen auch klar geworden. Du willst das Feld sicher auch noch anklicken können, was nicht geht, wenn es disabled ist.

Option Explicit

Private Sub Text1\_GotFocus(Index As Integer)
 If Text1(Index).Text = "" Then
 Text1(Index).Enabled = False
 Else
 'weiterer Code
 End If
End Sub

Private Sub Text1\_LostFocus(Index As Integer)
 Text1(Index).Enabled " true"
End Sub

Aber bau keine Endlosschleife daraus. :smile:

Gruß, Rainer

Hallo Alex,

Hallo Rainer,

*gg* nachdem ich bemerkt habe, wer da fragt, habe ich mich
auch gewundert. :smile: Aber schön, daß nicht nur ich manchmal auf
das nahe liegende nicht komme. Aber das macht ja nichts, wir
sind ja hier unter uns. :smile:

Naja irgendwie sieht man die simpelsten Dinge nicht mehr :s

Das ist mir inzwischen auch klar geworden. Du willst das Feld
sicher auch noch anklicken können, was nicht geht, wenn es
disabled ist.

Naja so geht das nun wieder auch nicht.
Laut MZ TOOLS habe ich mittlerweile knapp 38.000 Zeilen Source Code. Von daher muss man arg vorsichtig sein, sonst ist alles im **** :confused:

Nein aber du musst dir das so vorstellen.

Ich habe eine Form. Dort sind knapp 200 SE insgesammt drauf :s
Dazu gibt es eine DB die via ADO angesprochen wird. Die Daten werden dort auf dem Formular angezeigt. Unter anderen gibt es ein Tabstrip mit MPEG Informationen. Dieser Tab hat einzelne Reiter wo du nun User URL’s ID3V1 Tag , ID3V2 Tags etc. siehst.

Gehen wir nun einmal auf den Reiter UserURl’s ein.
Dort sind wiederrum 8 Textfelder vorhanden, die URL’s enthalen koennen, sofern sie in der DB eingetragen sind!
Sind keine eingetragen so muss ich das Textfeld abschalten :wink:

Wenn der Nutzer nun auf neu oder Edit klickt, so muss ich es einschalten. Ich habe mir 2 Subs geschrieben (SetZero und SetControl) SetZero setz alle Felder auf „“ und löscht die Listen. SetControl wird mit True oder False aufgerufen und schaltet mir die Steuerelement ein oder aus, in einer For Each Schleife. Anhand der Tag Eigenschaft der Steuerelemente weiss ich was welches ist und kann somit schalten und walten :smile:
Dann habe ich 2 Variablen ( Neu und Edit) welche asl Boolean decalriert sind.

Die Sub für Neu / Edit und Abbruch schauen wiefolgt aus :smile:

'neu

Private Sub Command1\_Click(Index as Integer)
Dim Maus as New Waitcurser
 Call Maus
 Select case Index
 case 0 'neu
 if neu or edit then exit sub
 neu=true:edit=false
 call setcontrol(false)
 call setzero
 case 1 'edit
 if neu or edit then exit sub
 neu=false:edit=true
 call setcontrol(false) 
 case 2 'Abbruch 
 set Maus=nothing
 if msgbox("Möchten sie die Daten wirklich verwerfen?",vbquestion+vbyesno)=vbno then exit sub
 call Maus
 neu=false:edit=false
 call setcontrol(true) 
 end select
end sub

private Sub SetControl(vRet as Boolean)
dim c as control
dim Maus as New Waitcursor
for each c in me
if typeof c is Textbox then
 select case c.tag
 case 1
 c.enabled = vret
 case 2
 c.enabled = not(vret)
 case 3 
 c.enabled=vret and cbool(rs.Musik.Recordcount\>0)
 'etc. 
 end select
elseif typeof c is Listbox then
'etc.
end if
next

rein theoretisch muesste doch nun folgende Anweisung klappen oder?
Bin grad an ein Rechner wo kein VB drauf ist :s

Private Sub Text7\_Click(Index As Integer)
 Select Case Index
 Case 'Die Felder
 If Trim(Text7(Index).Text) = "" and not(neu) and not(edit)then 
 text7(index).enabled=false
 Exit Sub
 else
 text7(index).enabled=true
 end if
 if neu or edit then exit sub
 Text7(Index).Tag = "": Text7(Index).Tag = Text7(Index).Text
 Call LinkGo(Text7(Index))
 Case 42 'Die Mailaddi glaub, genauso verfahren wie oben
 Case Else
 End Select
End Sub

Option Explicit

Private Sub Text1_GotFocus(Index As Integer)
If Text1(Index).Text = „“ Then
Text1(Index).Enabled = False
Else
'weiterer Code
End If
End Sub

Private Sub Text1_LostFocus(Index As Integer)
Text1(Index).Enabled " true"
End Sub

Aber bau keine Endlosschleife daraus. :smile:

Das Got Focus Ereignis wollte ich eigentlich nicht nehmen, da dort sonst jedesmal die Abfrage gestartet wird, welches ja nun wiederrum Rechenzeit in Anspruch nimmt und das Prog so langsam traege wird und ich den Source nur ausführen möchte wenn es wirklich von nöten ist :smile:

Gruß, Rainer

Gruß Alex

Hi Alex,

Ich habe eine Form. Dort sind knapp 200 SE insgesammt drauf :s
Dazu gibt es eine DB die via ADO angesprochen wird. Die Daten
werden dort auf dem Formular angezeigt. Unter anderen gibt es
ein Tabstrip mit MPEG Informationen. Dieser Tab hat einzelne
Reiter wo du nun User URL’s ID3V1 Tag , ID3V2 Tags etc.
siehst.

Gehen wir nun einmal auf den Reiter UserURl’s ein.
Dort sind wiederrum 8 Textfelder vorhanden, die URL’s enthalen
koennen, sofern sie in der DB eingetragen sind!
Sind keine eingetragen so muss ich das Textfeld abschalten :wink:

Wenn der Nutzer nun auf neu oder Edit klickt, so muss ich es
einschalten. Ich habe mir 2 Subs geschrieben (SetZero und
SetControl) SetZero setz alle Felder auf „“ und löscht die
Listen. SetControl wird mit True oder False aufgerufen und
schaltet mir die Steuerelement ein oder aus, in einer For Each
Schleife. Anhand der Tag Eigenschaft der Steuerelemente weiss
ich was welches ist und kann somit schalten und walten :smile:
Dann habe ich 2 Variablen ( Neu und Edit) welche als Boolean
decalriert sind.

Danke für die Erklärung.

rein theoretisch muesste doch nun folgende Anweisung klappen
oder?
Bin grad an ein Rechner wo kein VB drauf ist :s

Private Sub Text7\_Click(Index As Integer)
 Select Case Index
 Case 'Die Felder
 If Trim(Text7(Index).Text) = "" and not(neu) and not(edit)then
 text7(index).enabled=false
 Exit Sub
 else
 text7(index).enabled=true
 end if
 if neu or edit then exit sub
 Text7(Index).Tag = "": Text7(Index).Tag = Text7(Index).Text
 Call LinkGo(Text7(Index))
 Case 42 'Die Mailaddi glaub, genauso verfahren wie oben
 Case Else
 End Select
End Sub

Ja, das geht so. Du musst nur bedenken, daß der Focus zum nächsten Tabstopp springt sobald die Prozedur beendet ist, wenn beim Klick das Steuerelement disabled wird. Ob das unerwünschte Folgen haben kann, musst Du abschätzen. (Deshalb auch der Code, der u.U. zu einer Endlosschleife wird.) Wenn ja, musst du noch ein Setfocus z.B. auf einen Button einbauen.

Das Got Focus Ereignis wollte ich eigentlich nicht nehmen, da
dort sonst jedesmal die Abfrage gestartet wird, welches ja nun
wiederrum Rechenzeit in Anspruch nimmt und das Prog so langsam
traege wird und ich den Source nur ausführen möchte wenn es
wirklich von nöten ist :smile:

Ich wollte Dir Dein Programm auch nicht umbauen. :smile: Ich wollte damit nur darauf hinweisen, daß beim Disablen das nächste Textfeld den Focus erhält. Das Feld wurde aber gar nicht angeklickt. Das kann schon ‚seltsam‘ wirken.

Daß Dein Programm schon etwas umfangreicher ist, war mir schon klar.

Gruß, Rainer