Deutsch
Forum

Fehlermeldung: Falscher Parametertyp %...

 

funkheld
Hallo, guten Tag.
Ich habe dieses Programm für XPSE etwas verändert.
Und es kommt immer noch eine Fehlermeldung.
Ich finden den Typ von Fehler nicht:



Wo steckt der ?
Zeile 88 ist im XProfEd leer.
KompilierenMarkierenSeparieren
 {$cleq}
Def CopyMemory(3) !"KERNEL32","RtlMoveMemory"
Declare Ende%, SendeBtn&, EndeBtn&, Edit&
Declare Groesse&, Text$, ProgHndl&, AltProc&
Declare CopyData#, EigeneDaten#
Struct SCopyData = ~COPYDATASTRUCT
Dim CopyData#, SCopyData
Window 20,20-400,400
WindowTitle "Programm2"
EndeBtn& = Create(Button,%hWnd,Beenden,105,50,70,20)
SendeBtn& = Create(Button,%hWnd,Senden,15,50,70,20)
Edit& = Create(Edit, %hWnd, , 10, 15, 170, 24)

Proc Senden

    Parameters Nachricht$

    With CopyData#

        .dwData& = 0
        .cbData& = SizeOf(Nachricht$)
        .lpData& = Addr(Nachricht$)

    EndWith

    Sendmessage(ProgHndl&,~WM_COPYDATA,%hWnd,Addr(CopyData#))

EndProc

Proc WndProc

    parameters wnd&, msg&, wparam&, lparam&

    If msg&=~WM_COPYDATA

        CopyMemory(CopyData#,lparam&,12)
        Groesse& = CopyData#.cbData&
        Dim EigeneDaten#, Groesse&
        CopyMemory(EigeneDaten#,CopyData#.lpData&,Groesse&)
        Text$ = String$(EigeneDaten#,0)
        Dispose EigeneDaten#

    EndIf

    return call(AltProc&,wnd&,msg&,wparam&,lparam&)

Endproc

AltProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,ProcAddr(WndProc,4))

While 1

    ProgHndl&=FindWindow("Programm2")
    Case ProgHndl&: Break
    Sleep 100

EndWhile

Usermessages ~WM_COPYDATA

WhileNot Ende%

    WaitInput

    If %Key = 2

        Ende% = 1

    ElseIf GetFocus(EndeBtn&)

        Ende% = 1

    ElseIf GetFocus(SendeBtn&)

        Senden GetText$(Edit&)

    ElseIf %umessage=~WM_COPYDATA

        SetText Edit&, Text$

    Endif

EndWhile

Dispose CopyData#
End

Danke.

Gruss
peter

31 kB
Hochgeladen:23.02.2013
Ladeanzahl42
Herunterladen
 
23.02.2013  
 



Typ % also ein Int -

vermutlich erwartet XProfan an der Stelle kein Int -

vermutlich bei Anweisungen wie diesen:
KompilierenMarkierenSeparieren
Create(Button,%hWnd,Beenden,105,50,70,20)

Dürfte so funktionieren:
KompilierenMarkierenSeparieren
Create("Button",%hWnd,"Beenden",105,50,70,20)

Nochwas:
KompilierenMarkierenSeparieren
Du zeigst für eine wProc auf eine interpretierte Proc -

gehe dabei von Programmabstürzen aus, mal hier mal da. Für sowas mit ProcAddr

unbedingt auf eine nProc zeigen da diese nativen Funktionen APC- & threadsicher

sind.
 
23.02.2013  
 



Hauptfenster Subclassing z.B. so:
KompilierenMarkierenSeparieren
oder ohne globale Variable:
KompilierenMarkierenSeparieren
Garantiert absturzsicher.

Siehe auch Beispiele am Ende dieses Dokumentes: [...] 

Hinweis:

XProfan-Fehlermeldungen-Fehlerzeile-Angabe beim Einsatz mit XPSE
müsste der Zeile in der dateiname.ENH-Datei entsprechen.
 
23.02.2013  
 




funkheld
Jup, danke. Habe ich jetzt geändert.
Es startet, aber friert dann ein.
Irgendwie ist das Programm nicht auf den neuesten Stand.

Woran liegt das denn nun?
Oder hast du irgendwo ein Programm , wo man Daten von einem Fenster zum anderen Fenster senden kann ?

Danke.

Gruss
peter
 
23.02.2013  
 



Dafür ist die Funktion sendMessage ja da, um Daten an Controls/ Fenster zu senden.

Damit kann man ganz praktisch 3 ganzzahlige Werte übermitteln:
KompilierenMarkierenSeparieren
 
23.02.2013  
 



Nachtrag:

Ich sehe das Du wm_copyData verwenden möchtest -

macht eig. nur Sinn wenn man mehr als 3 Werte übermitteln möchte wie z.B.

einen Stringinhalt. wm_copyData als UserMessage kann aber nicht zuverlässig

funktionieren da zum Zeitpunkt des Auslesens von WP und LP die Daten nicht

mehr zur Verfügung stehen (müssen) da die Daten normal nur so lange bestehen

bis die Nachricht die wProc erreicht hat. Du kannst jedoch wm_copyData-

übermittelte Daten in der wProc erhalten und von dort aus weiterverwenden.
 
23.02.2013  
 




funkheld
Ich habe hier etwas gefunden. Funktioniert nach meinen Vorstellungen..

Hiermit sende ich jetzt :
KompilierenMarkierenSeparieren
 {$cleq}
Declare Ende&, senden&, Dlg&,wert&
declare IsActive&, InMemory&, SizeOfMem&, hmap&, hMapView&
Dlg&     = Create("Dialog", %hwnd, "Senden", 220, 190, 410, 280)
senden& = Create("Button", Dlg&, "Senden", 110, 220, 80, 30)
Ende&    = Create("Button", Dlg&, "Ende", 210, 220, 80, 30)
IsActive& = 0
InMemory& = 4000
'1024 Bytes Speicher
SizeOfMem& = 1024
'Speicherbereich anlegen
hmap&     = ~CreateFileMapping(-1,0,~PAGE_READWRITE,0,SizeOfMem&,"MeinSpeicher")
'Zeiger auf Speicherbereich ermitteln
hMapView& = ~MapViewOfFile(hMap&,$000F001F, 0, 0, 0)
'die ersten 4 Bytes erhalten das Fensterhandle
Long   hMapView&,0 = %hwnd
'die nächsten 4 Bytes bleiben frei für das Fensterhandle von Programm 2
wert&=0

WhileNot @Clicked(Ende&)

    WaitInput

    If @Clicked(senden&)

        If Long(hMapView&,4) <> 0

            IsActive& = 1

        Endif

        dat_send

    EndIf

EndWhile

End

proc dat_send

    wert&=wert&+1
    long hMapView&,8 = wert&

    If IsActive&

        sendMessage(Long(hMapView&,4),InMemory&,0,0)

    endif

endproc


Hiermit wird empfangen:
KompilierenMarkierenSeparieren
 {$cleq}
Declare IsActive&, InMemory& , Ende&, SizeOfMem&, hmap&, hMapView&
IsActive& = 0
InMemory& = 4000
Ende& = 0
'1024 Bytes Speicher
SizeOfMem& = 1024
'Speicherbereich anlegen
hmap& = ~CreateFileMapping(-1,0,~PAGE_READWRITE,0,SizeOfMem&,"MeinSpeicher")
'Zeiger auf Speicherbereich ermitteln
hMapView& = ~MapViewOfFile(hMap&,$000F001F, 0, 0, 0)
Cls
'die zweiten 4 Bytes erhalten das Fensterhandle
Long hMapView&,4 = %hwnd
UserMessages InMemory&

whilenot Ende&

    Waitinput

    If %UMessage = InMemory&

        Print long(hMapview&,8)

    Endif

EndWhile

~UnmapViewOfFile(hMapView&)
~CloseHandle(hMapView&)
End

Wird diese : %UMessage jedesmal nach dem durchlauf auf "0" gesetzt und neu beschrieben bei einer neuen Übertragung oder bleibt bei der ersten Verbindung %UMessage auf den Wert InMemory& ?

Danke.

Gruss
peter
 
24.02.2013  
 



Schau mal hiernach wirds auf 0 gesetzt:
KompilierenMarkierenSeparieren
 {$cleq}
cls
usermessages 12345
sendMessage(hWnd,12345,0,1)
sendMessage(hWnd,12345,0,2)
sendMessage(hWnd,12345,0,3)

do{

    waitinput 1000
    case %uMessage : print ulParam

}


denn die Ausgabe lautet:

321
 
24.02.2013  
 




funkheld
Jup, danke.
Jetzt kann ich die Sendmessage erkennen bzw einordnen.

Gruss
peter
 
24.02.2013  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.496 Betrachtungen

Unbenanntvor 0 min.
Andreas Koch10.09.2014
Ernst12.05.2014
Nico Madysa20.02.2014
mein02.06.2013
Mehr...

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

iF (5x)
funkheld (4x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie