Avatar billede christian_h Nybegynder
18. september 2002 - 17:52 Der er 14 kommentarer og
2 løsninger

Disable Maxbutton i runtime

Hej Eksperter.

I design time kan man bestemme om MaxButton skal til eller fra på ens form, men kan man ikke gøre dette i runtime ???, jeg har prøvet flg. i en commandButton

Me.MaxButton = 1
eller
Me.MaxButton = True
eller
Form1.Maxbutton = 1 
eller
Form1.Maxbutton = true

men så får jeg en fejl som siger
"Funktion or interface marked as restricted, or the function uses an automation type not supported by Visual Basic"

Håber i kan hjælpe.

Mvh.

Christian H
Avatar billede joern Nybegynder
18. september 2002 - 19:35 #1
Hej Christian.

I VB5 er maxbuttom en read-only property, så dér kan man vist ikke.  Men er det virkelig nødvendigt at kunne ændre i runtime?
Du vil kunne lade brugeren markere f.eks. i en checkbox at næste gang programmet startes, skal maxbuttom være tilgængelig eller ikke.  Altså ved at skrive værdien til Registry eller til en ini-fil, som du så læser fra ved start af programmet.

M.v.h.  Jørn
Avatar billede christian_h Nybegynder
18. september 2002 - 22:39 #2
Hej Jørn.

Nej det er måske forkert beskrevet, det skal IKKE ændres under runtime, men skal sættes til True eller False, når programmet startes, alt efter hvilken opløsning brugerens skærm kører i, den funktion har jeg lavet, så det jeg mangler er at hvis "SVARET" er 800 * 600 skal MaxButton være true og hvis "SVARET" er 1024 * 768 skal MaxButton være false.

Så hvis der er nogen der kender en måde hvorpå man under Form_load eller Form_initialize eller sådan noget kan sætte disse vil jeg blive glad.

Mvh.

Christian H
Avatar billede joern Nybegynder
19. september 2002 - 09:39 #3
Hej Christian.

Du kan til det formål lave din egen 'maxbuttom' et sted på formen.
Screen.width (og height) indeholder skærmens opløsning i twips, og når du kender den kan du lade en knap-kontrol være enabled eller ikke (eller visible = true / false).
Knappen skal så sætte formens bredde/højde til de antal twips der ønskes.

Knappen kan 'gendanne' hveranden gang ved at sætte en betingelse:

If form1.width > 10000 then
    form1.width = 8900
    form1.height = 7000
  else
    form1.width = 11000
    form1.height = 9000
end if

Tallene er (næsten) grebet ud af luften, find de rigtige.

M.v.h.  Jørn
Avatar billede martin_moth Mester
19. september 2002 - 10:15 #4
Du kan få skærmopløsningen med et API kald:

Option Explicit
    ' Declares til API-funktion
    Private Declare Function GetSystemMetrics Lib "user32" _
                            (ByVal nIndex As Long) As Long

Private Sub Form_Load()
    Dim x As Integer
    Dim y As Integer
    x = GetSystemMetrics(0)
    y = GetSystemMetrics(1)
    MsgBox "Skærmopløsningen er  " & x & " x " & y
End Sub

Du kan IKKE ændre om der skal være kontrol-box på i runtime (Max-Min-Close-knapperne) - altså du kan sagtens få læst skærmopløsningen ved programstart, jf. ovenstående, men du kan ikke ændre om der skal controlbox på eller ej. Det kan kun gøres i design-time :o(

Men du kan bestemme om formen skal være maximeret, minimeret eller normal.

Fx. ved at skrive Form1_Load() om til:

Private Sub Form_Load()
    Dim x As Integer
    x = GetSystemMetrics(0)
    If x <= 800 Then
      Form1.WindowState = vbMaximized 'maximerer form på ved lav opløsning
    Else
      Form1.WindowState = vbNormal 'normalisere form på ved normal opløsning
    End If
End Sub
Avatar billede martin_moth Mester
19. september 2002 - 14:06 #5
NB: Der er et lille problem med Joern's løsning, nemlig at formens placering forbliver den samme når man maximere, - men det kunne jo klares med at skrive:

form1.left=0 og form1.top = 0 = øverste venstre hjørne af skærmen...

Det er dog meget nemmere at bruge Form1.WindowState = vbNormal hhv. Form1.WindowState = vbMaximized, synes jeg ;o))

PS: Hvis du vil have, at formen skal have en bestemt låst størrelse når den ikke er maximeret, kan du skrive følgende:

Form1_resize()
  if Form1.WindowState = vbNormal then
    form1.width = 5000
    form1.height = 4000
  end if
end if

Således er formen enten maximeret, minimeret eller har størrelsen 5000x4000 /Marmo2
End Sub
Avatar billede martin_moth Mester
19. september 2002 - 14:08 #6
Sorry - sidste linie er End Sub og ikke End if, naturligvis
Avatar billede christian_h Nybegynder
20. september 2002 - 12:27 #7
Det er nogle udemærkede forslag i kommer med begge to, men det der er hele ide´en med dette er at når man kører i 1024 x 768 må formen ikke kunne maximeres !!!!!.

Mvh.

Christian H

PS. Jeg vender lige tilbage når jeg finder en løsning.
Avatar billede martin_moth Mester
20. september 2002 - 13:09 #8
Jamen det har du jo fået løst med ovenstående.

Få skærmopløsningen - er den 1024x768, sørger du for at der ikke må maximeres...

Fx som følger:

Option Explicit
Private Declare Function GetSystemMetrics Lib "user32" _
                          (ByVal nIndex As Long) As Long
Dim X As Integer

Private Sub Form_Load()
  X = GetSystemMetrics(0)
End Sub

Private Sub Form_Resize()
  If Form1.WindowState = vbMaximized Then
    If X = 1024 Then
      Form1.WindowState = vbNormal
    End If
  End If
End Sub

Således kan formen ikke maximeres hvis skærmopløsningen er 1024x768 - prøv selv, opret en form og smit koden på formen ;o)

/Marmo2
Avatar billede christian_h Nybegynder
20. september 2002 - 13:27 #9
Ja det er rigtigt nok, men jeg syntes bare at det ser "dumt" ud at formen rent faktisk maximeres for derefter at gå tilbage til vbnormal, det virker uprofessionelt at formern laver sådan "op/ned" spring !!!!.

Mvh

Christian H
Avatar billede martin_moth Mester
20. september 2002 - 13:48 #10
Så har du stadig løsningen fra joern, fjern kontrolboxen (Max-Min-Close-knapperne), og indsæt din egne maximeringsknapper. Afhængig af skærmopløsningen kan du så gøre dem synlige eller usynlige.
Det kan komme til at se lige på prof ud som de rigtige knapper i kontrolboxen - du kan jo indsætte et image med et billede at en maximeringsknap, i stedet for en trykknap - så kan ingen se forskel... Det kan sagtens komme til at se super-prof ud...

Alternativt - lav din form usynlig. Aflæs skærmopløsningen under form_load - afhængig af hvad den er loader du en form med eller uden kontrolbox... En ret fusket løsning, men det kan sagtens lade sig gøre - du skal bare have 3 forme i stedet for en

Men jeg gentager: Du kan IKKE ændre om der skal være kontrol-box på i runtime. Dit problem kan dog sagtens løses alligevel, jf. ovenstående... /Marmo2
Avatar billede christian_h Nybegynder
20. september 2002 - 13:55 #11
Hmmmm. jeg kigger lidt mere på sagen, jeg vil gerne give jer 15 point hver for besværet, men er det OK, hvis jeg venter med at uddele dem til jeg har den "endelige" løsning så i kan se den ??.

Mvh.

Christian H
Avatar billede martin_moth Mester
20. september 2002 - 14:02 #12
Ja ja - vent du bare :o)
Avatar billede christian_h Nybegynder
20. september 2002 - 14:18 #13
Hejsa.

Det kan altså godt lade sig gøre at disable "maximer" knappen, prøv at start et nyt projekt, og indsæt flg. kode, hvis du så starter formen i 1024 * 768 er "Max" knappen disablet, men hvis du starter programmet i 800 * 600 er "Max" knappen enablet.

Option Explicit
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"  (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZE = &H1000000
Dim X As Integer

Private Sub Form_Load()
  X = GetSystemMetrics(0)
  Dim lngStyle As Long
 
  If X = 1024 Then
     
    lngStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
    lngStyle = lngStyle And Not (WS_MAXIMIZEBOX) Xor WS_MAXIMIZE
    lngStyle = SetWindowLong(Me.hwnd, GWL_STYLE, lngStyle)
  End If

End Sub

Er vi ikke eninge om at det virker ???, det var et eksempel jeg fandt på www.vbforums.com SUPER sted

Mvh.

Christian H
Avatar billede joern Nybegynder
20. september 2002 - 20:14 #14
Christian>>

Stædighed belønnes, men så mu du jo have pointene selv.

M.v.h.  Jørn
Avatar billede christian_h Nybegynder
21. september 2002 - 15:06 #15
Jeg tildeler jer begge 15 point som tak for snakken, det kan jo være at jeg kan bruge noget af det andet vi har snakket om en anden god gang.

Mvh.

Christian H
Avatar billede martin_moth Mester
23. september 2002 - 08:12 #16
Så lærte jeg også noget - beklager, at jeg så hårsnakket påstod at det ikke kunne lade sig gøre - men tak for points ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester