Forum | | | | - page 1 - |
| Nico Madysa | Einen Salut allen daraußen.
ca ist qui offizielle successeur hiervon: [...] . Diesmal taucht un très seltsamer faute dans quasi demselben Code sur. Zur Erinnerung sei il encore la fois (dans unwesentlich gekürzter forme) gezeigt: KompilierenMarqueSéparation $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 Text um wenig Seltsames, entscheiden sommes nämlich qui folgenden Zeilen: KompilierenMarqueSéparation
whileloop 0,len(d$,"x0Dzx0Az")-1
a$ = "Mzeziznz;zVzezrzszuzczhz!z"
a$ = $ Substr(d$,&loop+1,"x0Dzx0Az")
Titre de la fenêtre Translate$(a$,"z","|")
InsertStringW(hSortDP&,a$,&loop)
InsertStringW(hSortDP&,$ Substr(d$,&loop+1,"x0Dzx0Az"),&loop)
Endwhile
ici stürzt qui Code dans qui späteren la ligne KompilierenMarqueSéparation sang- et klanglos ab. eh bien qui eigentlich verwunderlichen Beobachtungen: 1. cela Kompilat arbeitet correct. 2. Nehme je pas den le détour sur a$, mais füge den Substring tout de suite un (la ligne 2 et 4 weg, pour la ligne 5), so gibt es keinen faute. 3. Nehme je aucun unterschiedlichen Textes, mais une festen Probetext (la ligne 2 weg, pour la ligne 1), so gibt es également keinen faute. 4. Item fonctionne alles correct, si je qui qui obige la ligne avec Titre de la fenêtre entkommentiere. à qui Prozessorauslastun peux es cependant pas liegen, car füge je anstatt de Titre de la fenêtre Sleep un, so stürzt qui Kode également ab.
cela étions maintenant quatre Wege, cette faute trop tourner autour de. Doch hat irgendjemand une Ahnung, pourquoi il überhaupt auftritt? chacun cette quatre Lösungen (sauf peut-être numéro 3) sollte eigentlich gar aucun Auswirkung avons et doch verhindern vous den Programmabsturz. Dietmar et je sommes avec unserem latin am Ende, doch peut-être voyons 46 Augen plus que 4.
Es verbleibt perplexe
Nico Madysa |
| | | | |
| | | | - page 2 - |
| | | un XProfan11-String besteht aus 2 Longs et qui Bytes. Erstes Long est un Zählerwert (de Delphi verwaltet) et Zweites qui Stringlänge. qui Funktion addr gibt mais pas qui Stringadresse zurück, mais zeigt sur qui ersten Bytes im String, zeigt alors sur qui Adresse+8. KompilierenMarqueSéparation Pour Api-Params pour lpz reicht qui directe Adresse sur Bytes+z.
cela Beispiel zeigt aussi une avec qui dynamischen Stringspeicherverwaltung zusammenhängenden Problemfall. |
| | | | |
| | Frank Abbing |
Darf on qui GlobalAllocs eigentlich genauso Déplacer comment Profan-Bereiche, alors pour dem Schema Bereich# = Long&, ou bien besoin celui-là pour une entsprechenden Stil?
chez den Flags, qui du gewählt la hâte, erhälst du fixen grenier. Pour verschiebbaren musst du $42 gewenden. Zum Déplacer peux du ensuite GlobalReAlloc verwenden. je selber arbeite seulement avec fixen Sauver. qui travailler quelque chose plus rapide, et on erlebt keinen ungewollten Überraschungen. |
| | | | |
| | Nico Madysa | iF, Beitrag=53192, Zeitpunkt=12.07.2009
qui Funktion addr gibt mais pas qui Stringadresse zurück, mais zeigt sur qui ersten Bytes im String, zeigt alors sur qui Adresse+8.
Bien sûr tut vous cela. qui APIs -- et dans diesem speziellen piège qui Listview-Messages -- intéresser sich nämlich gar pas pour cet Verwaltungslongints, mais pour den Puffer. Worin besteht maintenant konkret qui Unterschied, si je cette avec Addr(text$) et len(text$) ou bien avec bereich# et SizeOf(bereich#) bereitstelle?
EDIT: @Frank: en habe je déjà gelesen, mais j'étais Je ne sûrement, comment large M$ cet "moveable" fasst. Denen peux on alors aussi neue Adressen zuweisen? qui Win32.hlp schweigt sich par-dessus aus et meint seulement, avec GlobalReAlloc peut Eigenschaften et Taille modifié volonté. |
| | | | |
| | Frank Abbing |
Denen peux on alors aussi neue Adressen zuweisen? qui Win32.hlp schweigt sich par-dessus aus et meint seulement, avec GlobalReAlloc peut Eigenschaften et Taille modifié volonté.
qui Adresse wird sich changement doit, si le neue Grösse pas plus dans den original Puffer passt. si cela aussi so durchgezogen wird ou bien une Fehlermeldung ausgegeben wird, musst du selber testen, weil je - comment dit - GlobalAlloc seulement avec festem grenier benutze. |
| | | | |
| | Dieter Zornow | alors j'ai es la fois probiert, cela Beispiel dans dem Aaahen kam habe je abgeändert et und dir chez mir einwandfrei. Hoffe cela hängt pas avec dem Betriebsystem zusammen. KompilierenMarqueSéparation |
| | | 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 chez Je ne seulement avec GlobalAlloc mais aussi avec qui undokumentierten DIM Funktion, qui Roland maintenant preisgegeben hat. comme Exe et comme 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
cela Beispiel zeigt aussi une avec qui dynamischen Stringspeicherverwaltung zusammenhängenden Problemfall.
cela liegt mais pas à qui Gestion de la mémoire XProfans, mais daran, comment Delphi avec Cordes umgeht: un Leerstring belegt keinen grenier et ne...aucune grenier hat aussi aucun Aderesse. cela peux zum Stolperstein volonté, si on une Leerstring avec Addr(s$) à une API-Funktion gibt, sans ihn auparavant um un Nullbyte ("z") trop erweitern.
Salut 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
cela étions maintenant quatre Wege, cette faute trop tourner autour de. Doch hat irgendjemand une Ahnung, pourquoi il überhaupt auftritt? chacun cette quatre Lösungen (sauf peut-être numéro 3) sollte eigentlich gar aucun Auswirkung avons et doch verhindern vous den Programmabsturz.
allô Nico,
une derartige Beobachtung, dass un Programmabsturz aufgrund eigentlich droite unsinniger Changements la fois erfolgt et la fois pas, ou bien es im Interpreter allez et compilé pas ou bien renversé, deutet oftmals puis hin, dass es irgendwo im Code une kleinere Verletzung de Speichergrenzen gibt, qui plan quelquefois zum Crash führt et quelquefois zufällig pas, je après que quoi à dem Speicherort, à den fälchlicherweise geschrieben wird, vorhanden ist. Dass es quelquefois funktioniert, deutet puis hin, dass es une plutôt kleinere Grenzüberschreitung ist et dans manchen Fällen arrêt plan lediglich grenier überschrieben wird, qui pas gebraucht wird ou bien pas geschützt ist.
Salut 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 | et j'ai Deinen faute trouvé, Nico: KompilierenMarqueSéparationLVI#.IMASK&= $1
LVI#.ITEXT&= LVI#+36
LVI#.ITEXTMAX& = 200
LVI#.ISUBITEM& = 0pre> ici gibst Du qui Adresse pour den trop lesenden Text avec LVI# + 36 à. qui Struktur LVITEM ist mais seulement 36 Bytes grand, cela est alors, qui Adresse weist sur cela erste Byte pour qui Struktur. qui Programmzeile, qui den Text ausliest, écrit ihn naturellement exakt là hin. Dumm seulement, dass ca un pas geDIMter Speicherbereich ist.
Du könntest maintenant naturellement qui Struktur LVITEM um cet 200 Bytes größer faire (un text#(200) anhängen), ou bien mais encore einfacher: Du DIMensionierst B# avant dem Erzeugen qui Strukturvariable LVI# et gibst B# direct comme Adresse pour den Text à. ensuite sieht cela Ende qui Procédure LoadText so aus: KompilierenMarqueSéparation<...>
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#
Dispose B#
... et alles fonctionne rund!
Salut 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 | eh oui richtig, je hatte cela Nico dit et dabei oublier qc, dass mon Structur um forfaitaire 512 pour Text erweitert ist, c'est pourquoi schreibe et lese je toujours direct derrière qui 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 | c'est toujours wieder erstaunlich, quoi pour simple Lösungen qui seltsamsten Ereignisse avons. KompilierenMarqueSéparation $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
merci euch allen pour eure patience et Aider. |
| | | | |
| | Dietmar Horn | merci à alle Helfer pour qui Hilfestellung(en)!
qui zum Durchbruch führende Hinweis kam de Roland.
qui reste ist eh bien probablement lediglich encore stupide et zeitaufwändige Fleißarbeit.
Salut 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 ▲ |
| |
|
répondreOptions du sujet | 9.894 Views |
Themeninformationencet Thema hat 7 participant: |