SubClassing

    • SubClassing

      Wenn man nur ein kleines Programm hat und keine Buttons
      usw. abfragt, kann man das Schließen-Kreuz (X) ja mit
      %Key = 2 oder ~wm_close abfragen.
      Ich habs unten im Code mal beim Subclassing gemacht :

      Quellcode

      1. $H Messages.ph
      2. SubClassProc
      3. Declare line&, befehl%
      4. If SubClassMessage(GridBox&, 516)
      5. line& = @GetCurSel(GridBox&)
      6. Case line& > -1 : MessageBox("Zeile Nr. : " + Str$(line& + 1) + "gewählt !", "Info", 0)
      7. Set("WinProc", 0)
      8. ElseIf SubClassMessage(dlg&, ~wm_close)
      9. Set("WinProc", 0)
      10. DestroyWindow(dlg&)
      11. End
      12. EndIf
      13. EndProc
      14. var dlg&=Create("Dialog",%hwnd,"",10,10,700,300)
      15. var GridBox&=Create("GridBox", dlg&, "Spalte 1;2;140;Spalte 2;2;140;Spalte 3;2;140;Spalte 4;2;140;NR;0;100", 0, 20, 20, width(dlg&)-40, height(dlg&)-70)
      16. AddString(GridBox&,"10 | 20 | 30 | 40 | 1")
      17. AddString(GridBox&,"100 | 200 | 300 | 400 | 2")
      18. AddString(GridBox&,"1000 | 2000 | 3000 | 4000 | 3")
      19. AddString(GridBox&,"10000 | 20000 | 30000 | 40000 | 4")
      20. SubClass dlg&, 1
      21. SubClass GridBox&, 1
      22. while 1
      23. waitinput
      24. wend
      25. 'SubClass dlg&, 0
      26. 'SubClass GridBox&, 0
      27. end
      Alles anzeigen


      Kann man das generell so machen ?
      Oder muß ich davon ausgehen, daß ich Windows irgendwann
      mal den Boden unter den Füßen wegziehe.
      Ich meine damit, ob mein Programm dann 'sauber' beendet wird,
      bzw. XProfan sich darum kümmert ?
    • In der SubClassproc sollte so wenig wie möglich gemacht werden, das machst Du besser in der Hauptschleife oder extra Proceduren, so kannst Du auch das SubClassing vor dem Beenden wieder abschalten.

      Quellcode

      1. $H Messages.ph
      2. Subclassproc
      3. Declare line&, befehl%
      4. If SubClassMessage(GridBox&, 516)
      5. Set("WinProc", 0)
      6. SetMenuItem 2000
      7. ElseIf SubClassMessage(dlg&, ~wm_close)
      8. Set("WinProc", 0)
      9. SetMenuItem 3000
      10. EndIf
      11. EndProc
      12. Var dlg&=Create("Dialog",%hwnd,"",10,10,700,300)
      13. Var GridBox&=Create("GridBox", dlg&, "Spalte 1;2;140;Spalte 2;2;140;Spalte 3;2;140;Spalte 4;2;140;NR;0;100", 0, 20, 20, width(dlg&)-40, height(dlg&)-70)
      14. AddString(GridBox&,"10 | 20 | 30 | 40 | 1")
      15. AddString(GridBox&,"100 | 200 | 300 | 400 | 2")
      16. AddString(GridBox&,"1000 | 2000 | 3000 | 4000 | 3")
      17. AddString(GridBox&,"10000 | 20000 | 30000 | 40000 | 4")
      18. SubClass dlg&, 1
      19. SubClass GridBox&, 1
      20. While 1
      21. WaitInput
      22. If MenuItem(2000)
      23. Case GetCurSel(GridBox&) > -1 : MessageBox("Zeile Nr. : " + Str$(GetCurSel(GridBox&) + 1) + " gewählt !", "Info", 0)
      24. ElseIf MenuItem(3000)
      25. SubClass dlg&, 0
      26. SubClass GridBox&, 0
      27. DestroyWindow(dlg&)
      28. End
      29. EndIf
      30. EndWhile
      Alles anzeigen
      Gruss
      Andreas

      ______________________
      http://www.ampsoft.eu

      Profan 3.3 - XProfanX2
      Windows 95,98,ME,2000,XP
      Vista - Windows 7 32 / 64 Bit

      ASUS X93S - Intel Core I7 - NVIDIA GForce GT540M - 8GB Arbeitsspeicher
    • Das ist mir schon klar, hat aber meine Frage nicht
      beantwortet. Wollte ja nur das ~wm_close auswerten.

      Quellcode

      1. SubClassProc
      2. If SubClassMessage(dlg&, ~wm_close)
      3. Set("WinProc", 0)
      4. End
      5. EndIf
      6. EndProc


      Da wollte ich wissen, ob XProfan beim End - Befehl das Programm
      sauber beendet.

      Zum Thema SubClassing wollte ich dann noch wissen, WARUM
      man in der SubClass-Procedur nur das allernötigste reinpacken
      sollte. In deinem Code oben muß ich dann doch noch eine Proc
      erstellen, wenn ich dann MenuItem abfrage. Sonst blähe ich
      meine Ereignis-Schleife ja unnötig auf und der Code wird unleserlich.

      Außerdem kann man das auch mit den Notify-Messages realisieren.

      Quellcode

      1. Proc MeinFensterProc
      2. If &NotifyWnd = GridBox&
      3. If %NotifyCode = -5
      4. Messagebox("Grid geklickt mit rechter Maustaste !", "", 0)
      5. EndIf
      6. EndIf
      7. EndProc
      8. var dlg&=Create("Dialog",%hwnd,"Rechte Maustaste in Gridbox",10,10,700,300)
      9. var GridBox&=Create("GridBox", dlg&, "Spalte 1;2;140;Spalte 2;2;140;Spalte 3;2;140;Spalte 4;2;140;NR;0;100", 0, 20, 20, width(dlg&)-40, height(dlg&)-70)
      10. AddString(GridBox&,"10 | 20 | 30 | 40 | 1")
      11. AddString(GridBox&,"100 | 200 | 300 | 400 | 2")
      12. AddString(GridBox&,"1000 | 2000 | 3000 | 4000 | 3")
      13. AddString(GridBox&,"10000 | 20000 | 30000 | 40000 | 4")
      14. While 1
      15. Waitinput
      16. If %wmNotify
      17. MeinFensterProc
      18. EndIf
      19. Case %Key = 2 : Break
      20. Wend
      21. End
      Alles anzeigen


      Was ist jetzt der Unterschied ?
    • H.Brill;977564 schrieb:

      Das ist mir schon klar, hat aber meine Frage nicht
      beantwortet. Wollte ja nur das ~wm_close auswerten.

      Quellcode

      1. SubClassProc
      2. If SubClassMessage(dlg&, ~wm_close)
      3. Set("WinProc", 0)
      4. End
      5. EndIf
      6. EndProc
      Da wollte ich wissen, ob XProfan beim End - Befehl das Programm
      sauber beendet.


      Ja, das sollte es!
      Außerdem trägt Windows seinen Teil dazu bei und würde nicht von XProfan freigegebene Ressourcen selber freigeben. (Naja, bis auf ein paar wenige Ausnahmen, aber da wird in der Hilfe gesondert darauf hingewiesen.)

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X3
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X3


      http://www.xprofan.de
    • Hier schließt "END" von XProfan sauber sogar Windows-8 ;-)

      Quellcode

      1. VAR font0%=CREATE("FONT","ARIAL",16,6,0,0,0)
      2. VAR mini%=CREATE("FONT","ARIAL",10,5,0,0,0)
      3. ADDHOTKEY 10,78,4
      4. ADDHOTKEY 20,66,4
      5. SetDialogFont font0%
      6. WindowStyle 8
      7. WINDOW (%MaxX/2-200),(%MaxY/2-60)-400,120
      8. USEICON "A"
      9. WindowTitle "WINDOWS verlassen"
      10. TEXTCOLOR RGB(200,0,0),-1
      11. USEFONT "ARIAL",20,0,1,0,0
      12. DRAWTEXT 20,0,"Soll die Windows-Sitzung beendet werden ?"
      13. VAR back%=CREATE("BUTTON",%hwnd," Alt+N &NEIN",10,30,120,30)
      14. SETZE_WAHL_ICON back%,"DOS",2,2,24,24
      15. VAR OK%=CREATE("BUTTON",%hwnd," Alt+B &Beenden",230,30,150,30)
      16. SETZE_WAHL_ICON OK%,"GESICHT",2,2,24,24
      17. WHILE 1
      18. WAITINPUT
      19. IF MENUITEM(254)
      20. Messagebox("copyright by Horst Horn ©2013\n\nwebmaster@horst-horn.de","Info...",64)
      21. ENDIF
      22. CASE GETFOCUS(back%) | MenuItem(10):END
      23. CASE GETFOCUS(OK%) | MenuItem(20):END
      24. ENDWHILE
      25. '#########################################
      26. PROC SETZE_WAHL_ICON
      27. DECLARE b_icon%
      28. PARAMETERS b_handle%,b_icon$,iX%,iY%,iB%,IH%
      29. b_icon% = CREATE("ICON",b_handle%,b_icon$,0,0)
      30. SetWindowPos b_icon% =0,0-0,0;0
      31. SetWindowPos b_icon% =iX%,iY%-iB%,iH%;0
      32. ENDPROC
      Alles anzeigen

      Die Icons werden nach dem Compilieren von mir ausgetauscht