Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 243006 (4442)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Messagehandling
Philipp Sternberg
| Datum:29.04.02 17:01 (ps@burghardt-ib.de) |
Hallo, ich arbeite gerade an einem Programm das ein ListViewControl verwendet. Wenn ich auf den Header des ListViews klicke, sollten die Daten nach bestimmten kreterien sortiert werden. (In etwa so als wenn man im Explorer auf "Typ" klickt, damit die Dateien nach Dateityp sortiert werden) Daimt ich das überhaupt mitbekomme habe ich mich mit Messagehandling beschäftigt und bin auf gewaltige Probleme gestoßen. Kurzum ich hab es mit den Profan-Befehlen (GetMessage usw)nicht geschafft, dem Problem Herr zu werden, da besonders %NotifyCode mir irgendwie immer nur unvollständiges zurückliefert (ich hab den Eindruck, dass über Profan Messages des Queues verlorengehen.) Deshalb bin ich auf die Apifunktionen GetMessage, TranslateMessage und DispatchMessage ausgewichen und auf ein weiters Problem gestoßen: GetMessage soll laut api-doc immer einen wert <> 0 zurückgeben, es sei denn es ist eine wm_Quit, also Programmende aufgetreten, bei mir ist es aber permanent 0. DA kann doch nicht ständig wm_quit auftreten ????? Kleines Beispiel:
    def @GetExtMessage(4) !"user32.dll","GetMessageA"
    def @DispatchMessage(1) !"user32.dll","DispatchMessageA"
    def @TranslateMessage(1) !"user32.dll","TranslateMessage"

    declare back_msg%
    declare MSG#,msg&                                        'Messagestruktur anlegen
    struct MSG = hwnd&,message&,w_param&,l_param&,time&,pt&

    dim MSG#,MSG
    let msg& = msg#
    windowstyle 528                                          'Schließen manuell übernehmen
    window 100,100-200,200
    Seterrorlevel -2                                         'Handling durch Profan abschalten
    whilenot @equ(%key,2)
    let back_msg% = @GetExtMessage(msg&,%hwnd,0,0)           'Messages abholen
    Print "Message: ",MSG#.message&,"back: ",back_msg%
    DispatchMessage (msg&)'Message zurück zu Windows
    wend
    end
verwendetes Os:Win 2000, Profan-Runtime 7.0e Bitte helft mir... Philipp Sternberg
Frank Abbing
| Datum:29.04.02 18:28 |
Hallo. Zuerst mal: Ich kein absolut kein Message-Profi ! Aber meines Erachtens nach kannst du die Message API's nicht mit Profan benutzen. Das gesamte Message-Handling deines Programms muß in einer Prozedur stehen, deren Zeiger du dann an Windows übergibst. Das geht aber mit Profan nicht, da keine Programmadressen ermittelt werden können... Sorry. Gruß, Frank
Philipp Sternberg
| Datum:29.04.02 18:48 (ps@burghardt-ib.de) |
Hmm, du meinst also ich sollte die Profan fubktionen getmessage nehmen ?? Komisch irgendwie scmeißen die andere werte raus als GetMessage alles sehr merkwürdig .... Philipp Sternberg
Philipp Sternberg
| Datum:29.04.02 19:13 (ps@burghardt-ib.de) |
So, hier noch mal ein weiteres beispiel: normalerweise sollte der Button einen wm_command (273) auslösen (genauso wie das Systemmenü), aber es tut sich einfach nichts ! Weiterhin ist mir aufgefallen, dass sich manchmal %LastMessage ändert obwohl %Message gleichgeblieben ist, darf doch eigentlich gar nicht sein oder ???
    windowstyle 536                                         'Schließen manuell übernehmen
    window 100,100-400,200
    declare back_msg%,ende%,bu_calc%
    let bu_calc% = @control ("BUTTON","&Berechnen",$50010000,206,120,112,22,%hwnd,222,%hinstance,$20000)

    Seterrorlevel -2                                         'Handling durch Profan abschalten
    whilenot ende%
    GetMessage           'Messages abholen
    color 0,15
    Print "Message: ",%message,%LastMessage,"Notify;",%NOTIFYCODE
    if @equ(%message,273) 'wm_command
     color 15,0
     case @equ(@div&(&WParam,256)) : let ende% = 1
     Print  "identify: ",@div&(&WParam,256)," loword: ",@and(&WParam,256)," handle:",@word(MSG#,12)
    elseif @equ(%message,274) 'wm_syscommand
     case @equ(&WParam,61536) : let ende% = 1 'sc_close
    endif
    case @gt(%csrlin,8) : locate 1,1
    wend
    end
vielleicht kann mir da auch nur Roland weiterhelfen .. wie gesagt, runtime 7.0e-NT unter win2k bis dann
Jörg Sellmeyer
| Datum:29.04.02 19:33 (joerse@gmx.de) |
Hallo, Vielleicht hilft's, wenn Du die Messages, die Du benötigst als usermessages definierst. Gruß Jörg
Philipp Sternberg
| Datum:29.04.02 19:47 (ps@burghardt-ib.de) |
Wie bitte soll ich diese Usermessage denn an mein Hauptfenster absetzen oder besser gesagt von wo??? Ich möchte doch herausfinden ob eines meiner Child-fenster irgendeine Message an mein Hauptfenster gesendet hat oder nicht, ich kann dem childfenster ja schlecht sagen dass es ne usermessage absetzen soll bzw, dass kann ich nur wenn ich vorher dessen wirkliche message kenn, die ich aber nicht erhalte (im übrigen wäre es reichlich unproduktiv usermessages an sich selbst zu schreiben um diese dann auszuwerten) nein, dass ist mit sicherheit keine Lösung Philipp
Uwe ''Pascal'' Niemeier
| Datum:30.04.02 11:00 (Pascalxd@owl-online.de) |
Hallo Philipp! Die Auswertung von WM_NOTIFY lässt in der Tat zu wünschen übrig... Jedenfalls: Ob irgendein HeaderButton angeklickt wurde, lässt sich ja über %Notifycode erkennen: -302, wenn das LV den Focus vorher schon hatte, -7, wenn nicht. Die Abfrage, welcher HeaderButton betroffen ist, wird wohl nur über die Maus- position möglich sein. Entweder durch einen direkten Vergleich oder indem du per LVM_GETHEADER (ab Comctl32.dll 4.7) das Handle des Headers ermittelst und darauf HDM_HITTEST anwendest (alles ohne Gewähr, weil noch nicht getestet). @ Roland: Wie wäre es mit einem Befehl, mit dem man Profan mitteilt, welche Notify- Message man auswerten möchte (wenn sie eintrifft) und für den man eine entsprechene Bereichsvariable zur Verfügung stellt? HTH Pascal
Philipp Sternberg
| Datum:30.04.02 12:54 (ps@burghardt-ib.de) |
Dank an Uwe. Vielen Adn, ja, so wird es wahrscheinlich gehen, mein problem ist nur dass ich ständig auf der suche nach konstanten bin. So besitze ich leider auch kein commctrl32.h v4.7 woher bekommst du die denn immer (apropos, ab welchem OS ist die common control 4.7 denn dabei ??) Philipp
Eric Eggert
| Datum:30.04.02 16:26 (webmaster@yatil.de) |
Bei Windows ME ist die Version 5.81 dabei... MfG, Eric
Frank Abbing
| Datum:01.05.02 10:57 |
Hi, Alle Konstanten sind in der Datei "Windows.inc" vorhanden. Das ist eine Datei, die Assembler benutzen, aber die Werte nützen dir natürlich auch in Profan. Such' mal per Google.de Gruß, Frank
Uwe ''Pascal'' Niemeier
| Datum: 01.05.02 23:23 (Pascalxd@owl-online.de) |
Hallo Leute! Ich habe vor einiger Zeit am Kiosk das "PC-Magazin"-Sonderheft "C++ und Java" gefunden. Da waren massenhaft halbwegs aktuelle C-Header und API-Infos (im chm-Format) drauf. Dazu musste man VC++ nicht mal installieren, was ich aber erst hinterher gemerkt habe ;-} Ansonsten: Einfach mal im WWW nach einer markanten Konstantenbezeichnung suchen. BTW: Unter http://support.microsoft.com/servicedesks/fileversion/default.asp kann man für jede MS-dll die möglichen Versionen erfragen und mit welchem OS, Update oder Programm diese "ausgeliefert wurde", sprich: auf den Rechner gekommen ist. So einen Service hätte ich Microsoft garnicht zugetraut... P.S. Die Comctl32.dll ist schon in Win95 + IE 3.x enthalten! SeeYou Pascal

| Zurück zur Übersicht