Gosub [getFolder]

Geef hier je beste Liberty BASIC tips door. (Hier geen hulp vragen)

Moderators: anthonio, Abcott

Gosub [getFolder]

Berichtdoor Abcott » di mei 22, 2007 8:00 pm

Hier is een routine om met een GOSUB een
map op te halen.

Code: Selecteer alles
'Browse for Folder by Abcott

gosub [getFolder]
    if sPath$="" then sPath$="Cancelled"
    print "Folder chosen is "
    print sPath$
    if sPath$="Cancelled" then end

'call ShellExecute 0, sPath$,_SW_SHOWNA, "explore"
'end
wait


[getFolder]
BIF.RETURNONLYFSDIRS = 1
MAX.PATH = 260
crlf$=chr$(13)+chr$(10)

STRUCT BrowseInfo,_
    hWndOwner As uLong,_
    pIDLRoot As uLong,_
    pszDisplayName As uLong,_
    lpszTitle$ As ptr,_
    ulFlags As uLong,_
    lpfnCallback As uLong,_
    lParam As uLong,_
    iImage As uLong

    BrowseInfo.hWndOwner.struct = 0
    'txt1$="Deze tekst aanpassen" + crlf$
    txt1$=txt1$+"Kies hier een map"

    BrowseInfo.lpszTitle$.struct = txt1$
    BrowseInfo.ulFlags.struct = BIF.RETURNONLYFSDIRS

    calldll #shell32, "SHBrowseForFolder",_
    BrowseInfo as struct,_
    lpIDList as ulong

    If lpIDList>0 Then
       sPath$ = space$(MAX.PATH) + chr$(0)
       calldll #shell32, "SHGetPathFromIDList",_
       lpIDList as ulong,_
       sPath$ as ptr,_
       r as ulong

       open "ole32" for dll as #ole
        calldll #ole, "CoTaskMemFree",_
        lpIDList as ulong,_
        r as void
        close #ole

        iNull = InStr(sPath$, chr$(0))
        If iNull Then
            sPath$ = Left$(sPath$, iNull - 1)
        End If
    End If
return


Sub ShellExecute hWnd, file$, parameter, lpszOp$
    lpszFile$ = file$
    lpszDir$ = DefaultDir$
    lpszParams$=""
    CallDLL #shell32, "ShellExecuteA", hWnd As ulong,_
    lpszOp$ As ptr,lpszFile$ As ptr,_
    lpszParams$ As ptr,lpszDir$ As ptr,_
    parameter As ulong, result As ulong
    End Sub



Abcott
Avatar gebruiker
Abcott
 
Berichten: 115
Geregistreerd: wo mei 25, 2005 9:58 pm

Berichtdoor anthonio » di mei 22, 2007 9:20 pm

dit geeft bij mij de volgende error: "a non-continuable protection violation has coccured." dit gebreurd wanneer ik 4 levels diep ga (vb: c:\test\tester\testing"

het rare is dat dit niet altijd gebeurd.
weet iemand hoe dit te verklaren valt?

abcott, mooie tutorial, maar zou het mogelijk zijn overal een klein beetje uitleg bij te schrijven zodanig dat ik het beter kan begrijpen.
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm

Berichtdoor Gordon » di mei 22, 2007 10:44 pm

Hallo Abcott,

Ook ik krijg dezelfde fout te zien als Antonio.
Deze routine staat wordt volgens mij bij Liberty BASIC
meegeleverd?

Antonio, kijk maar naar Browse for Folder in de LB directory.
Brent Thorne heeft die routine het eerst geschreven.
Daarna heeft iemand de long parameters gewijzigd in ulong.
Toen werd het meegeleverd met LB.

Gordon.
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor anthonio » di mei 22, 2007 10:53 pm

doe it bedankt.
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm

Berichtdoor Gordon » wo mei 23, 2007 9:29 pm

Oeps...... ik kreeg het benauwd!!!!
Maar waarschijnlijk heb ik het gevonden.

Er zit een bug in de routine.

pszDisplayName As uLong,_

moet zijn

pszDisplayName$ As ptr,_

Ik zal Carl een PM sturen.

Of vergis ik mij? Ik heb de fout melding na vele testen
niet meer terug.

Gordon.
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor anthonio » wo mei 23, 2007 10:15 pm

pszDisplayName moet inderdaad ptr zijn, aangezien deze een woord teruggeeft en geen getal.

abcott zou je dit even kunnen wijzigen in je code.
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm

Berichtdoor Gordon » do mei 24, 2007 10:07 pm

Hmmm.... ik blijf fouten krijgen.

Gordon
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor anthonio » do mei 24, 2007 10:36 pm

probeer deze code eens.

Code: Selecteer alles
'Browse for Folder by Abcott
'Modified by anthonio

gosub [getFolder]
    if sPath$="" then sPath$="Cancelled"
    print "Folder chosen is "
    print sPath$
    if sPath$="Cancelled" then end

'call ShellExecute 0, sPath$,_SW_SHOWNA, "explore"
'end
wait


[getFolder]
BIF.RETURNONLYFSDIRS = 1
MAX.PATH = 260
crlf$=chr$(13)+chr$(10)

STRUCT BrowseInfo,_
    hWndOwner As Long,_
    pIDLRoot As Long,_
    pszDisplayName As ptr,_
    lpszTitle$ As ptr,_
    ulFlags As Long,_
    lpfnCallback As Long,_
    lParam As Long,_
    iImage As Long

    BrowseInfo.hWndOwner.struct = 0
    'txt1$="Deze tekst aanpassen" + crlf$
    txt1$=txt1$+"Kies hier een map"

    BrowseInfo.lpszTitle$.struct = txt1$
    BrowseInfo.ulFlags.struct = BIF.RETURNONLYFSDIRS

    calldll #shell32, "SHBrowseForFolder",_
    BrowseInfo as struct,_
    lpIDList as ulong

    If lpIDList>0 Then
       sPath$ = space$(MAX.PATH) + chr$(0)
       calldll #shell32, "SHGetPathFromIDList",_
       lpIDList as ulong,_
       sPath$ as ptr,_
       r as long

       open "ole32" for dll as #ole
        calldll #ole, "CoTaskMemFree",_
        lpIDList as long,_
        r as long
        close #ole

        iNull = InStr(sPath$, chr$(0))
        If iNull Then
            sPath$ = Left$(sPath$, iNull - 1)
        End If
    End If
return


Sub ShellExecute hWnd, file$, parameter, lpszOp$
    lpszFile$ = file$
    lpszDir$ = DefaultDir$
    lpszParams$=""
    CallDLL #shell32, "ShellExecuteA", hWnd As long,_
    lpszOp$ As ptr,lpszFile$ As ptr,_
    lpszParams$ As ptr,lpszDir$ As ptr,_
    parameter As long, result As long
    End Sub
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm

Berichtdoor Gordon » do mei 24, 2007 11:00 pm

Okay, deze doet het.
Maar waar lag het aan?

Gordon.
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor anthonio » do mei 24, 2007 11:52 pm

abcott had een paar zaken verkeerd gedeclareerd.
vb: voor sommige zaken gebruikte hij ptr terwijl er long moest staan.
vergelijk de code even en je ziet direct een 10tal verschillen.
allemaal kleine fouten maar samen doen deze het programma crashen.
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm

Berichtdoor Abcott » do mei 31, 2007 10:41 pm

Hallo Antonio,

Het schijnt iets met een ontbrekende Callback te maken te hebben.
Ik snap er niet van. Maar dat deed ik in eerste instantie al niet.

Wordt vervolgd.

Abcott
Avatar gebruiker
Abcott
 
Berichten: 115
Geregistreerd: wo mei 25, 2005 9:58 pm

Berichtdoor anthonio » za jun 02, 2007 12:29 am

ik zal het even kort verduidelijken.
voor sommige declaraties gebruikte je ptr. ptr wil zeggen dat het tekst in het geheugen kan opslaan terwijl je een long nodig had. long wil zeggen dat je cijfers in het geheugen kan opslaan.
als ik me niet vergis kan je een in een van de nieuwsbrieven hierover meer lezen. even kijken of ik hem terugvind.

double (8 bytes, a double floating point)
ulong (4 bytes, unsigned long integer)
long (4 bytes, signed long integer)
short (2 bytes, signed short integer)
ushort, word (2 bytes, unsigned short integer)
boolean (2 bytes, true/false expression)
char[n] (n bytes, available in structs only)

double, ulong, long, short, ushort en char[n] kunnen cijfers onthouden.
prt en char[n] kunnen woorden onthouden.
boolean kan ja/nee onthouden.
ik heb char[n] nog niet weten te gebruiken dus over dat ben ik niet 100% zeker. Zoals gordon me enkele dagen geleden vroeg wrm short gebruiken en niet long, hierboven is ook hierbij nog es een antwoord op gegeven.
Ik hoop dat dit al wat meer duidelijkheid brengt voor jou abcott.
mss nog een korte verduidelijking tussen het verschil van ushort, short, ulong en long.

ushort: 0-65535
short: –32,768 tot 32,767
boolean: 0 of 1 (0 is onwaar, 1 is waar)
long: –2,147,483,648 tot 2,147,483,647
ulong: 0 tot 4,294,967,295
double: 1E-307 tot 1E+308
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm


Keer terug naar Tips en informatie

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron