webForumDet fria alternativet

Bestämma positionen på en scroll?

17 svar · 278 visningar · startad av ampy

ampyMedlem sedan feb. 20011 498 inlägg
#1

Jag har en Textbox som innehåller så många rader så att man måste scrolla för att kunna se all text. Varje sekund så uppdaterar en timer texten i Textboxen.

Problemet är att när man scrollat sig längst ner i Textboxen och sen så körs timern så hamnar man högst upp igen. Det är ju inte så snyggt.

Så kan man på nåt sätt spara informationen på vart scrollen befinner sig och sen sätta den där den var innan när timern har körts?

nikoMedlem sedan juni 20022 599 inlägg
#2

Överst i formuläret:

Private Declare Function SetScrollPos Lib "user32" (ByVal hwnd As Long, _
ByVal nBar As Long, ByVal nPos As Long, ByVal bRedraw As Long) As Long
Private Const SB_VERT = 1

Anropa sedan:

SetScrollPos Text1.hwnd, SB_VERT, 100, True

På så sätt hamnar du längst ner (100=100%).

Vill du istället "minnas" en tidigare position så måste du först hämta den med: GetScrollPos.

ampyMedlem sedan feb. 20011 498 inlägg
#3

Hmm, nu hamnar bara scrollen längst ner men den text som syns "tillhör" texten i början.

nikoMedlem sedan juni 20022 599 inlägg
#4

Jo, det ligger nog lite i det .. Får fundera lite. Finns säkert nåt lätt sätt.

nikoMedlem sedan juni 20022 599 inlägg
#5

Nu då?

Överst:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
        lParam As Any) As Long
Private Const WM_VSCROLL = &H115
Private Const SB_LINEUP = 0
Private Const SB_LINEDOWN = 1
Private Const SB_PAGEUP = 2
Private Const SB_PAGEDOWN = 3
Private Const SB_ENDSCROLL = 8
Private Const SB_BOTTOM = 7

Anrop:

SendMessage Text1.hwnd, WM_VSCROLL, SB_BOTTOM, 0
ampyMedlem sedan feb. 20011 498 inlägg
#6

Nu fungerar det som det ska MEN jag vill ju hellst att den ska hamna där den var innan timern kördes. Vart anger man positionen för scrollen?

nikoMedlem sedan juni 20022 599 inlägg
#7

OK.

För att forcera scrollen till en viss position kan du skriva så här:

Private Const SB_THUMBPOSITION = 4
LngIndex = 100 ' Position=100 tex.
SendMessage Text1.hwnd, WM_VSCROLL, (CInt(LngIndex) * &H10000) _
    Or (SB_THUMBPOSITION And &HFFFF&), 0

För att sedan få fram den senaste manuella förflyttningen med musen (alltså inte kodmässiga) så måste man nog subklassa textboxen (annars får man rundgång). Men jag känner att jag inte riktigt orkar det just nu, tyvärr. :l

nikoMedlem sedan juni 20022 599 inlägg
#8

OK. Här är ett förslag som funkar "sådär" om det finns många rader i textboxen och man befinner sig långt ner. Att det fortfarande blir en förskjutning beror på att själva "scroll-boxen" hela tiden krymper och jag inte riktigt vet hur jag ska justera för det.

http://member.webforum.nu/3773/scrollbars.zip

Du kan ju försöka få rätt på det sista om du har lust, men det är mycket mer jobb än man tror.

ampyMedlem sedan feb. 20011 498 inlägg
#9

Tack, ska kolla på filen. :)

ampyMedlem sedan feb. 20011 498 inlägg
#10

När jag nu startar mitt program så stängs det av på en gång, varför?

nikoMedlem sedan juni 20022 599 inlägg
#11

Läste du "varningstexten"? Om du kör inne i studion så måste du avsluta med "krysset" så att Form_Unload körs. Annars kraschar studion och blir konstig tills du bootar om.

Om du kör det utanför studion så ska det inte avslutas direkt.

ampyMedlem sedan feb. 20011 498 inlägg
#12

Jo, jag läste varningstexten. Men jag hinner ju inte ens köra programmet. Direkt när jag trycker på Start så stängs programmet av.

nikoMedlem sedan juni 20022 599 inlägg
#13

OK? Det låter konstigt. Det funkar hos mig (2000 sp3). Som sagt, det du beskriver händer om man råkar stänga via stop-knappen i studion. Då går det inte att köra i studion förrän man bootat om. Men du kan väl köra själva exe-filen utan att den stängs?

ampyMedlem sedan feb. 20011 498 inlägg
#14

Jag kan köra andra forms i samma projekt utan problem.

nikoMedlem sedan juni 20022 599 inlägg
#15

Som sagt, den här koden är lite "farlig". Min tanke var nog att du först skulle kolla på en separat och sen eventuellt försiktigt flytta över den till ditt projekt. Om du börjar blanda in den i annan kod och har ett endaste litet syntax-fel eller fel namn på en textruta så blir detta resultatet. Tyvärr. Gör alltid en fullständig kompilering innan du försöker köra. Och boota om ifall det behövs.

ampyMedlem sedan feb. 20011 498 inlägg
#16

När jag tar bort denna kod så stängs inte programmet på en gång.

Private Sub Form_Load()
    glPrevWndProc = fSubClass(txtLog)
End Sub
nikoMedlem sedan juni 20022 599 inlägg
#17

Ja, fast då försvinner poängen. Svårt att säga varför det inte funkar. Har du bytt ut Text1 mot txtLog på ALLA ställen (även bas-filen). Har du bytt ut "frmMain" mot namnet på ditt formulär? Har du kört en full compile utan errors? Har du bootat om? Kör du XP? (Jag har inte testat på XP, men det borde funka.)

ampyMedlem sedan feb. 20011 498 inlägg
#18

niko skrev:

Har du bytt ut "frmMain" mot namnet på ditt formulär?

Det hade jag inte gjort. :r

Men nu fungerar det!

Tack för all hjälp! :bire

134 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)