Foro | | | | - Página 1 - |
| Nico Madysa | Einen Saludo allen daraußen.
Dies es el offizielle Nachfolger hiervon: [...] . Diesmal taucht una muy seltsamer Fehler en quasi demselben Code en. A Erinnerung sei él una vez más (en unwesentlich gekürzter Form) gezeigt: KompilierenMarcaSeparación $H Messages.ph
var id% = 1
Struct CREATESTRUCT = lpCreateParams&, hInstance&, hMenu&, hwndParent&, cy%, cx%, y%, x%, style&, lpszName&, lpszClass&, dwExStyle&
Struct LVCOLUMN = Mask&, FMT&, CX&, Text&, cchTextMaxLen&, Subitem&
Struct LVITEM = IMASK&, ITEM&, ISUBITEM&, State&, StateMask&, ITEXT&, ITEXTMAX&, IIMAGE&, ILPARAM&
proc CreateW
if %pCount > 10
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&,exstyle&
else
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&
var exstyle& = 0
endif
var cs# = New(CREATESTRUCT)
With cs#
.lpCreateParams& = SizeOf(cs#)
.hInstance& = hInst&
.hMenu& = if(u_IsMenu(id%),id%,0)
.hwndParent& = pWnd&
.cy% = dy%
.cx% = dx%
.y% = y%
.x% = x%
.style& = style&
.lpszName& = Addr(Name$)
.lpszClass& = Addr(Class$)
.dwExStyle& = exstyle&
EndWith
var handle& = u_CreateWindowExW(exstyle&,Addr(Class$),Addr(Name$),style&,x%,y%,dx%,dy%,pWnd&,id%,hInst&,cs#)
inc id%
ifnot handle&
Class$ = WinError$(%WinError)
MessageBox("Es trat folgender Fehler auf:
" + Class$,"F E H L E R !!!",4096)
endif
Dispose cs#
return handle&
endproc
subproc Create.GridBoxW
parameters pWnd&,def$,stl%,x%,y%,dx%,dy%
declare s$
var hList& = CreateW("SzyzszLzizsztzVzizezwz3z2zzz","",$50000009 + stl%,x%,y%,dx%,dy%,pWnd&,0,%hInstance,$200)
u_SendMessageW(hList&,$1036,0,$00000023)
var LVC# = New(LVCOLUMN)
With LVC#
.Subitem& = 0
.MASK& = $7
whileloop 0,(len(def$,";") 3) - 1
s$ = SubStr$(def$,3*&loop + 1,";")
.TEXT& = Addr(s$)
.FMT& = val(SubStr$(def$,3*&loop + 2,";"))
.CX& = val(SubStr$(def$,3*&loop + 3,";"))
.cchTextMaxLen& = len(s$)
u_SendMessageW(hList&,$1061,&loop,LVC#)
EndWhile
EndWith
Dispose LVC#
return hList&
endproc
proc InsertStringW
parameters pList&,s$,index%
declare ss$
var LVI# = New(LVITEM)
var d$ = Get("ListDel") + "z"
With LVI#
.IMASK&=$1
.ITEM& = index%
whileloop len(s$,d$)
ss$ = SubStr$(s$,&loop,d$)
.iText& = Addr(ss$)
.ITEXTMAX& = len(ss$)
.ISUBITEM& = &loop - 1
ifnot &loop - 1
u_SendMessageW(pList&,$104D,index%,LVI#)
else
u_SendMessageW(pList&,$104C,index%,LVI#)
endif
EndWhile
EndWith
Dispose LVI#
endproc
proc LoadText
parameters d$
declare a$
case d$ = "" : return
Die CSV-Datei wird eingelesen
declare b#,t$,tt$
Dim b#,FileSize(d$)
BlockRead(d$,b#,0,SizeOf(b#))
d$ = Char$(b#,2,SizeOf(b#)-2)
Dispose b#
Die Zeilen werden im Sortier-Listview alphabetisch geordnet
whileloop 0,len(d$,"x0Dzx0Az")-1
a$ = "Mzeziznz;zVzezrzszuzczhz!z"
a$ = SubStr$(d$,&loop+1,"x0Dzx0Az")
WindowTitle Translate$(a$,"z","|")
InsertStringW(hSortDP&,a$,&loop)
InsertStringW(hSortDP&,SubStr$(d$,&loop+1,"x0Dzx0Az"),&loop)
EndWhile
Die Substrings jeder Zeile sind mit einem Semikolon getrennt
Set("ListDel",";")
Das Sortier-Listview wird ins Anzeigelistview übertragen
Aus einer Spalte werden zwei
var LVI# = New(LVITEM)
LVI#.IMASK&= $1
LVI#.ITEXT&= LVI#+36
LVI#.ITEXTMAX& = 200
LVI#.ISUBITEM& = 0
whileloop 0, Getcount(hSortDP&) -1
LVI#.ITEM& = &loop
u_SendMessageW(hSortDP&,$1073,&loop,LVI#)Text auslesen
Dim b#,200
b# = LVI#.iText&
d$ = Char$(b#,0,SizeOf(b#))In Stringvariable schreiben
InsertStringW(hList&,d$,&loop)übertragen
Dispose b#
EndWhile
Dispose LVI#
endproc
declare hUser&,hGDI&,hKrnl&
declare hSortDP&,hList&
cls
var font& = Create("Font","Times New Roman",16,0,0,0,0)
hUser& = ImportDLL("USER32","u_")
hSortDP& = Create("GridBoxW",%hWnd,";0;100",$10,0,0,0,0)
ShowWindow(hSortDP&,0)
hList& = Create("GridBoxW",%hWnd,";0;300;;0;300",$00,0,0,width(%hWnd),height(%hWnd))
SetFont hList&,font&
WindowTitle "Bitte warten, Wortliste wird geladen ..."
Format
LoadText LoadFile$("Testdatei laden","Test.txt")
WindowTitle "Je 100 deutsche und polnische Wörter"
whilenot IsKey(27)
waitinput
wend
FreeDLL hUser&
FreeDLL hGDI&
FreeDLL hKrnl&
DeleteObject font&
end
Viel Texto en wenig Extraño, entscheiden son nämlich el folgenden Zeilen: KompilierenMarcaSeparación
whileloop 0,len(d$,"x0Dzx0Az")-1
a$ = "Mzeziznz;zVzezrzszuzczhz!z"
a$ = Substr$(d$,&bucle+1,"x0Dzx0Az")
Título de la ventana Translate$(a$,"z","|")
InsertStringW(hSortDP&,a$,&bucle)
InsertStringW(hSortDP&,Substr$(d$,&bucle+1,"x0Dzx0Az"),&bucle)
EndWhile
Hier stürzt el Code en el späteren Línea KompilierenMarcaSeparación sang- y klanglos de. Nun el eigentlich verwunderlichen Beobachtungen: 1. Das Kompilat arbeitet fehlerfrei. 2. Nehme Yo no el Umweg encima a$, pero füge el Substring inmediatamente una (Línea 2 y 4 weg, dafür Línea 5), así hay no Fehler. 3. Nehme Yo no unterschiedlichen Textos, pero una festen Probetext (Línea 2 weg, dafür Línea 1), así hay ebenfalls no Fehler. 4. Item se ejecuta alles fehlerfrei, si yo el el obige Línea con Título de la ventana entkommentiere. An el Prozessorauslastun kann lo sin embargo no mentira, porque füge Yo anstatt de Título de la ventana Sleep una, así stürzt el Kode ebenfalls de.
Das waren ahora vier Wege, esta Fehler a umgehen. Doch ha irgendjemand una Idea, por qué él überhaupt auftritt? Jede dieser vier Lösungen (außer tal vez Nummer 3) debería eigentlich gar no Auswirkung haben y doch verhindern ellos el Programmabsturz. Dietmar y yo son con unserem Latein al Ende, doch tal vez sehen 46 Augen más que 4.
Lo verbleibt ratlos
Nico Madysa |
| | | | |
| | | | - Página 2 - |
| | | Ein XProfan11-String besteht de 2 Longs y el Bytes. Erstes Largo es una Zählerwert (de Delphi verwaltet) y Zweites el Stringlänge. El Función addr son pero no el Stringadresse zurück, pero zeigt en el ersten Bytes en el String, zeigt also en el Adresse+8. KompilierenMarcaSeparación Für Api-Params después de lpz reicht el direkte Adresse en Bytes+z.
Das Ejemplo zeigt auch una con el dynamischen Stringspeicherverwaltung zusammenhängenden Problemfall. |
| | | | |
| | Frank Abbing |
Darf uno el GlobalAllocs eigentlich genauso mover como Profano-Bereiche, also después de el Schema Zona# = Long&, oder benötigen jene dafür una entsprechenden Stil?
En el Flags, el du gewählt hast, erhälst du fixen Speicher. Für verschiebbaren musst du $42 gewenden. Zum Verschieben kannst du entonces GlobalReAlloc uso. Yo selber arbeite sólo fixen Guardar. El trabajo algo más rápido, y uno erlebt no ungewollten Überraschungen. |
| | | | |
| | Nico Madysa | IF, Beitrag=53192, Zeitpunkt=12.07.2009
El Función addr son pero no el Stringadresse zurück, pero zeigt en el ersten Bytes en el String, zeigt also en el Adresse+8.
Natürlich tut ellos el. El APIs -- y diesem speziellen Falle el Listview-Messages -- interés se nämlich nada para esta Verwaltungslongints, pero para el Puffer. Worin besteht ahora konkret el Diferencia, si Yo esta con Addr(texto$) y len(texto$) oder con bereich# y SizeOf(bereich#) bereitstelle?
EDIT: @Franco: Davon Yo ya gelesen, pero yo war No sicher, como weit M$ dieses "moveable" fasst. Denen puede ser also auch neue Adressen zuweisen? El Win32.hlp schweigt se darüber de y meint sólo, con GlobalReAlloc puede Características y Größe verändert voluntad. |
| | | | |
| | Frank Abbing |
Denen puede ser also auch neue Adressen zuweisen? El Win32.hlp schweigt se darüber de y meint sólo, con GlobalReAlloc puede Características y Größe verändert voluntad.
El Adresse se se ändern necesario, si la neue Grösse no mehr en el ursprünglichen Puffer passt. Ob el auch así durchgezogen se oder una Fehlermeldung ausgegeben se, musst du selber testen, porque Yo - como dijo - GlobalAlloc sólo festem Speicher benutze. |
| | | | |
| | Dieter Zornow | Also Yo lo veces probiert, el Ejemplo en el Aaahen kam Yo abgeändert y lo va en me einwandfrei. Hoffe el hängt no con el Betriebsystem zusammen. KompilierenMarcaSeparación |
| | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 13.07.2009 ▲ |
| |
| | Dieter Zornow | Funktioniert no yo en el sólo GlobalAlloc pero auch con el undokumentierten DIM Función, el Roland ahora preisgegeben ha. Als Exe y como PRF |
| | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 13.07.2009 ▲ |
| |
| | RGH | IF, Beitrag=53192, Zeitpunkt=12.07.2009
Das Ejemplo zeigt auch una con el dynamischen Stringspeicherverwaltung zusammenhängenden Problemfall.
Das liegt pero no a el Speicherverwaltung XProfans, pero daran, como Delphi con Cuerdas umgeht: Ein Leerstring belegt no Speicher y kein Speicher ha auch no Aderesse. Das kann para Stolperstein voluntad, si uno una Leerstring con Addr(s$) a una API-Función son, sin ihn vorher en una Nullbyte ("z") a erweitern.
Saludo Roland |
| | | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 13.07.2009 ▲ |
| |
| | RGH | Nico Madysa, Beitrag=53176, Zeitpunkt=10.07.2009
Das waren ahora vier Wege, esta Fehler a umgehen. Doch ha irgendjemand una Idea, por qué él überhaupt auftritt? Jede dieser vier Lösungen (außer tal vez Nummer 3) debería eigentlich gar no Auswirkung haben y doch verhindern ellos el Programmabsturz.
¡Hola Nico,
una derartige Beobachtung, que un Programmabsturz aufgrund eigentlich bastante unsinniger Los cambios veces es y veces no, oder lo en el Interpreter va y compiliert no oder umgekehrt, deutet oftmals darauf hin, dass lo irgendwo en el Code una kleinere Verletzung de Speichergrenzen son, el eben manchmal para Crash führt y manchmal zufällig no, je después de qué a el Speicherort, a el fälchlicherweise geschrieben se, disponible es. Dass lo manchmal funktioniert, deutet darauf hin, dass lo una más kleinere Grenzüberschreitung es y manchen Fällen sólo eben lediglich Speicher überschrieben se, el no gebraucht se oder no geschützt es.
Saludo Roland |
| | | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 13.07.2009 ▲ |
| |
| | RGH | Und Yo Su Fehler gefunden, Nico: KompilierenMarcaSeparaciónLVI#.IMASK&= $1
LVI#.ITEXT&= LVI#+36
LVI#.ITEXTMAX& = 200
LVI#.ISUBITEM& = 0pre> Hier gibst Usted el Adresse para el a lesenden Texto con LVI# + 36 a. El Struktur LVITEM es aber sólo 36 Bytes groß, el heißt also, el Adresse weist el erste Byte después de el Struktur. El Programmzeile, el el Texto ausliest, schreibt ihn natürlich exakt como hin. Dumm sólo, dass dies una no geDIMter Speicherbereich es.
Usted könntest ahora natürlich el Struktur LVITEM en esta 200 Bytes größer hacer (una texto#(200) anhängen), oder aber todavía einfacher: Usted DIMensionierst B# antes el Erzeugen el Strukturvariable LVI# y gibst B# direkt como Adresse para el Texto a. Dann sieht el Ende el Procedimiento LoadText así de: KompilierenMarcaSeparación<...>
Die Substrings jeder Zeile sind mit einem Semikolon getrennt
Set("ListDel",";")
Das Sortier-Listview wird ins Anzeigelistview übertragen
Aus einer Spalte werden zwei
Dim b#,200
var LVI# = New(LVITEM)
LVI#.IMASK&= $1
LVI#.ITEXT&= B#
LVI#.ITEXTMAX& = 200
LVI#.ISUBITEM& = 0
whileloop 0, Getcount(hSortDP&) -1
LVI#.ITEM& = &loop
u_SendMessageW(hSortDP&,$1073,&loop,LVI#)Text auslesen
d$ = Char$(b#,0,sizeof(b#))In Stringvariable schreiben
InsertStringW(hList&,d$,&loop)übertragen
EndWhile
Dispose LVI#
Disponer B#
... y alles se ejecuta rund!
Saludo Roland |
| | | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 13.07.2009 ▲ |
| |
| | Dieter Zornow | Oh sí correcto, Yo hatte el Nico dijo y esta vergessen, dass mi Structur en pauschal 512 para Texto erweitert es, deshalb escribir y lese Yo siempre direkt hinter el eigentliche Structur |
| | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 13.07.2009 ▲ |
| |
| | Nico Madysa | Siempre es otra vez erstaunlich, qué para simple Lösungen el seltsamsten Ereignisse haben. KompilierenMarcaSeparación $H Messages.ph
var id% = 1
Struct CREATESTRUCT = lpCreateParams&, hInstance&, hMenu&, hwndParent&, cy%, cx%, y%, x%, style&, lpszName&, lpszClass&, dwExStyle&
Struct LVCOLUMN = Mask&, FMT&, CX&, Text&, cchTextMaxLen&, Subitem&
Struct LVITEM = IMASK&, ITEM&, ISUBITEM&, State&, StateMask&, ITEXT&, ITEXTMAX&, IIMAGE&, ILPARAM&
Def GlobalAlloc(2) !"KERNEL32","GlobalAlloc"
Def GlobalFree(1) !"KERNEL32","GlobalFree"
proc UTF
parameters text$
declare b#
Dim b#,2*len(text$)+2
StringW b#,0 = text$
text$ = Char$(b#,0,SizeOf(b#)-2)
return text$
endproc
proc CreateW
if %pCount > 10
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&,exstyle&
else
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&
var exstyle& = 0
endif
Class$ = UTF(Class$)
Name$ = UTF(Name$)
var cs# = New(CREATESTRUCT)
With cs#
.lpCreateParams& = SizeOf(cs#)
.hInstance& = hInst&
.hMenu& = if(u_IsMenu(id%),id%,0)
.hwndParent& = pWnd&
.cy% = dy%
.cx% = dx%
.y% = y%
.x% = x%
.style& = style&
.lpszName& = Addr(Name$)
.lpszClass& = Addr(Class$)
.dwExStyle& = exstyle&
EndWith
var handle& = u_CreateWindowExW(exstyle&,Addr(Class$),Addr(Name$),style&,x%,y%,dx%,dy%,pWnd&,id%,hInst&,cs#)
inc id%
ifnot handle&
Class$ = WinError$(%WinError)
MessageBox("Es trat folgender Fehler auf:
" + Class$,"F E H L E R !!!",4096)
endif
Dispose cs#
return handle&
endproc
subproc Create.GridBoxW
parameters pWnd&,def$,stl%,x%,y%,dx%,dy%
declare s$
var hList& = CreateW("SysListView32","",$50000009 + stl%,x%,y%,dx%,dy%,pWnd&,0,%hInstance,$200)
u_SendMessageW(hList&,$1036,0,$00000023)
var LVC# = New(LVCOLUMN)
With LVC#
.Subitem& = 0
.MASK& = $7
whileloop 0,(len(def$,";") 3) - 1
s$ = SubStr$(def$,3*&loop + 1,";")
.TEXT& = Addr(s$)
.FMT& = val(SubStr$(def$,3*&loop + 2,";"))
.CX& = val(SubStr$(def$,3*&loop + 3,";"))
.cchTextMaxLen& = len(s$)
u_SendMessageW(hList&,$1061,&loop,LVC#)
EndWhile
EndWith
Dispose LVC#
return hList&
endproc
proc InsertStringW
parameters pList&,s$,index%
declare ss$,palloc&
var LVI# = New(LVITEM)
var d$ = UTF(Get("ListDel"))
With LVI#
.IMASK&=$1
.ITEM& = index%
whileloop len(s$,d$)
ss$ = SubStr$(s$,&loop,d$) + "zz"
palloc& = GlobalAlloc($40,len(ss$))
Char palloc&,0 = ss$
.iText& = palloc&
.ITEXTMAX& = len(ss$)
.ISUBITEM& = &loop - 1
ifnot &loop - 1
u_SendMessageW(pList&,$104D,index%,LVI#)
else
u_SendMessageW(pList&,$104C,index%,LVI#)
endif
GlobalFree(palloc&)
EndWhile
EndWith
endproc
proc LoadText
parameters d$
case d$ = "" : return
declare b#,t$,tt$ , a$
Die CSV-Datei wird eingelesen
Dim b#,FileSize(d$)
BlockRead(d$,b#,0,SizeOf(b#))
d$ = Char$(b#,2,SizeOf(b#)-2)
Dispose b#
Die Zeilen werden im Sortier-Listview alphabetisch geordnet
whileloop 0,len(d$,"x0Dzx0Az")-1
a$ = SubStr$(d$,&loop+1,"x0Dzx0Az") DIES IST DIE BETROFFENE ZEILE
InsertStringW(hSort&,SubStr$(d$,&loop+1,"x0Dzx0Az"),&loop)
EndWhile
Die Substrings jeder Zeile sind mit einem Semikolon getrennt
Set("ListDel",";")
Das Sortier-Listview wird ins Anzeigelistview übertragen
Aus einer Spalte werden zwei
Dim b#,100
var LVI# = New(LVITEM)
LVI#.IMASK&= $1
LVI#.ITEXT&= b#
LVI#.ITEXTMAX& = 200
LVI#.ISUBITEM& = 0
Bereich freimachen
whileloop 0, Getcount(hSort&) -1
LVI#.ITEM& = &loop
clear b#
u_SendMessageW(hSort&,$1073,&loop,LVI#) Text auslesen
d$ = Char$(b#,0,SizeOf(b#))In Stringvariable schreiben
InsertStringW(hList&,d$,&loop)übertragen
EndWhile
Dispose LVI#,b#
endproc
declare hUser&,hGDI&,hKrnl&
declare hSort&,hList&
cls
var font& = Create("Font","Times New Roman",16,0,0,0,0)
hUser& = ImportDLL("USER32","u_")
hSort& = Create("GridBoxW",%hWnd,UTF("Sortieren")+";0;100",$10,0,0,0,0)
ShowWindow(hSort&,0)
hList& = Create("GridBoxW",%hWnd,UTF("Deutsch")+";0;300;"+UTF("Polnisch")+";2;300",$00,0,0,width(%hWnd),height(%hWnd))
SetFont hList&,font&
WindowTitle "Bitte warten, Wortliste wird geladen ..."
Format
"Wort1;Wort2
Wort3;Wort4;..."
LoadText LoadFile$("Quelldatei laden ...","deupol.txt")
WindowTitle "Je 100 deutsche und polnische Wörter (ESC um zu sichern)"
whilenot IsKey(27)
waitinput
wend
FreeDLL hUser&
FreeDLL hGDI&
FreeDLL hKrnl&
DeleteObject font&
end
Gracias euch allen para eure Geduld y Ayuda. |
| | | | |
| | Dietmar Horn | Gracias a todos Helfer para el Hilfestellung(en)!
Der para Durchbruch führende Referencia kam de Roland.
Der Rest es nun vermutlich lediglich todavía stupide y zeitaufwändige Fleißarbeit.
Saludo Dietmar |
| | | Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V. [...] Windows 95 bis Windows 7 Profan² 6.6 bis XProfan X2 mit XPSE Das große XProfan-Lehrbuch: [...] | 15.07.2009 ▲ |
| |
|
RespuestaThemeninformationenDieses Thema ha 7 subscriber: |