Schrijven naar klembord

Nieuwe Liberty BASIC programmeurs kunnen hier om hulp vragen.

Moderators: anthonio, Abcott

Schrijven naar klembord

Berichtdoor KeesW » vr jan 22, 2010 4:26 pm

Mijn geklooi heeft geresulteerd in een programmaatje waarmee een RANDOM-file gedefinieerd kan worden.
In de helpfiles zag ik dat in de commando's voor het creeren van een random-file geen variabelen gebruikt konden worden.
mijn oplossing is: 1) drop het gemaakte commando in een file en copieer dat in je programma, maar
2) mooier zou zijn om het gemaakte commando via het klembord in je programma te verwerken.
Ik voeg het programma waarmee de commando's voor de random-file gemaakt worden toe, niet dat het nu zo erg nuttig zal zijn,
het is voormij meer een werkstuk om wat met lb vertrouwd te raken.

Concreet de vraag: hoe kan ik het resultaat wat nu naar een bestand geschreven wordt, naar het klembord schrijven.
Code: Selecteer alles
'Form created with the help of Freeform 3 v03-27-03
'Generated on Jan 11, 2010 at 14:22:06
'Declaraties

dim flNaam$(20), flSoort$(20), flLengte$(20)
teller=1
bstNaam$=""
dat$="00/00/00"
aantal$=""
reclg=0
'for x=1 to 20
'    flNaam$(x)=""
'    flSoort$(x)=""
'    flLengte$(x)="0"
'next

[setup.main.Window]

    '-----Begin code for #main

'    nomainwin
    WindowWidth = 500
    WindowHeight = 600
    UpperLeftX=int((DisplayWidth-WindowWidth)/2)
    UpperLeftY=int((DisplayHeight-WindowHeight)/2)

    '-----Begin GUI objects code
'x,y, wijd hoog
    graphicbox #main.graphicbox20,   5, 112, 450,   2
    groupbox #main.groupbox18, "Maak record",   5, 122, 450,  90
    statictext #main.statictext1, "Bestandsnaam",   5,  42,  91,  20
    TextboxColor$ = "white"
    textbox #main.textbox2, 120,  37, 100,  25
    statictext #main.statictext5, "Datum",   5,  72,  100,  20
    statictext #main.statictext7, "Recordlengte", 285, 72, 70, 20
    textbox #main.textbox7, 375, 72,  35, 25
    textbox #main.textbox6, 120,  72,  75,  25
    statictext #main.statictext11, "Fieldnaam",  65, 142,  64,  20
    statictext #main.statictext12, "Fieldsoort", 255, 142,  60,  20
    statictext #main.statictext14, "Fieldlengte", 365, 142,  67,  20
    statictext #main.statictext15, "Aantal fieds", 285,  42,  70,  20
    textbox #main.textbox16, 375,  42,  35,  25
    statictext #main.statictext17, "Maak bestand", 155,  5, 180,  30
    radiobutton #main.radiobutton23, "Character", [radiobutton23Set], [radiobutton23Reset], 245, 162, 94,  25
    radiobutton #main.radiobutton24, "Nummeriek", [radiobutton24Set], [radiobutton24Reset], 245, 182,  94,  25
    textbox #main.textbox25, 375, 172,  50,  25
    textbox #main.textbox26,  25, 172, 200,  25
    ListboxColor$ = "white"
    listbox #main.listbox29, flNaam$(), [listbox29DoubleClick],   25, 222, 200, 300
    button #main.button32,"Toevoegen Field",[button32Click], UL, 315, 222, 140,  25
    button #main.button33,"Verwijderen Field",[button33Click], UL, 315, 262, 140,  25
    button #main.button34,"Maken bestand",[button34Click], UL, 315, 502, 140,  25

    '-----End GUI objects code

    open "untitled" for window as #main
    print #main.graphicbox20, "down; fill white; flush"
    print #main, "font ms_sans_serif 10"
    print #main.statictext17, "!font ms_sans_serif 18 bold"
    print #main.textbox7, "!font ms_sans_serif 10 bold italic"
    print #main.textbox16, "!font ms_sans_serif 10 bold italic"

    print #main, "trapclose [quit.main]"

[main.inputLoop]   'wait here for input event
    print #main.textbox7, "!disable"
    print #main.textbox16, "!disable"
    wait

[radiobutton23Set]   'Character'
    flSoort$(teller)="C"
    wait

[radiobutton23Reset]   'Geen keus'
    flSoort$(teller)=""
    wait

[button32Click]   'Toevoegen field'
   #main.textbox26,"!contents?"
   input #main.textbox26, flNaam$(teller)
   #main.textbox25,"!contents?"
   input #main.textbox25, flLengte$(teller)
   #main.listbox29 "reload"
'Tonen rcordteller en recordlengte
    aantal$ = str$(teller)
    print #main.textbox16, aantal$
    reclg=reclg+val(flLengte$(teller))
    print #main.textbox7, str$(reclg)
    teller=teller + 1
    wait

[radiobutton24Set]   'Nummeriek'
    flSoort$(teller)="N"
    wait

[radiobutton24Reset]   'Geen keus'
    flSoort$(teller)=""
    wait

[listbox29DoubleClick]   'Selecteren fieldnaam'
    print #main.listbox29, "selectionindex? index"
    print #main.textbox26, flNaam$(index)
    print #main.textbox25, flLengte$(index)
    if flSoort$(index)="C" then
        print #main.radiobutton23, "Set"
        print #main.radiobutton24, "Reset"
    else
        print #main.radiobutton24, "Set"
        print #main.radiobutton23, "Reset"
    end if
    wait

[button33Click]   'Geen keus'
    flSoort$(teller)=""
    wait

[button34Click]   'Maak bestand'
   #main.textbox2,"!contents?"
   input #main.textbox2, bstNaam$
   #main.textbox6,"!contents?"
   input #main.textbox6, dat$
   #main.textbox7,"!contents?"
   input #main.textbox7, rec$
   #main.textbox16,"!contents?"
   input #main.textbox16, aantrec$
'Open commando
    bst1Naam$=bstNaam$+".lbf"
    txtbest$="open "+ bst1Naam$ + " FOR RANDOM AS #1 LEN=" + rec$
'Field commandp's"
    if flSoort$(1)="C" then
        txtrec$="FIELD #1,"+flLengte$(1)+" as "+flNaam$(1)+"$"
    else
        txtrec$="FIELD #1,"+flLengte$(1)+" as "+flNaam$(1)
    end if
    for x=2 to val(aantrec$)
        if flSoort$(x)="C" then
            txtrec$=txtrec$ + ", "+ flLengte$(x)+" as "+flNaam$(x)+"$"
        else
            txtrec$=txtrec$ + ", "+ flLengte$(x)+" as "+flNaam$(x)
        end if
    next
'Maak een bestand en schrijf gegevens weg
     bst2Naam$=bstNaam$+".struc"
     open bst2Naam$ for output as #1
     print #1, txtbest$
     print #1, txtrec$
     close #1


'Tijdelijk tonen resultaat

print bstNaam$, dat$, aantal$
for x =1 to 20
print flNaam$(x), flSoort$(x), flLengte$(x)
next x
print txtbest$
print txtrec$

    wait

[quit.main] 'End the program
    close #main
    end


KeesW
 
Berichten: 23
Geregistreerd: do dec 10, 2009 2:32 pm

Re: Schrijven naar klembord

Berichtdoor Gordon » za jan 23, 2010 1:19 pm

Het schijnt eenvoudig te kunnen.
Helaas kan ik geen voorbeelden uit het API boek van Alyce tonen.
http://alycesrestaurant.com/apilb/index.htm
Heel goed boek.

Gelukkig heeft Alyce zelf veel publiekelijk gemaakt.
http://lbpe.wikispaces.com/newsletter.2003#toc4
Lees alles er over in Newsletter No 108.
http://babek.info/libertybasicfiles/lbnews/nl108/clipboard.htm

Dus:
open de functie OpenClipboard uit de user23.dll
set data in het klembord met de functie SetClipboardData en daarna
sluit het klembord af met CloseClipboard.

De voorbeelden spreken voor zich.

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

Re: Schrijven naar klembord

Berichtdoor KeesW » di jan 26, 2010 4:05 pm

Gordon schreef:
Het schijnt eenvoudig te kunnen. (en ) De voorbeelden spreken voor zich.
maar ik kom er niet uit.
Heb een codelisting overgehaald naar mijn programma, wat resulteert in een foutmelding bij de compilatie
"Compiler halted array GlobalAlloc() is one dimension"
De fout lijkt te zitten in de regel "hMemory = GlobalAlloc(_GMEM_MOVEABLE, lngSize)"
Ben gaan zoeken op het web op de woorden "GlobalAlloc"en "_GMEM_MOVEABLE"" o.a. in MSDN
http://msdn.microsoft.com/en-us/library/ms649016(VS.85).aspx
Maar kom er niet uit, kom mogelijk ook omdat mijn kennis van de engelsetaal zeer klein is'
Ik voeg het stukje code, wat ik bij mijn programma geplaats heb, toe.

Code: Selecteer alles
'Maak een bestand en schrijf gegevens weg
     bst2Naam$=bstNaam$+".struc"
     open bst2Naam$ for output as #1
     print #1, txtbest$
     print #1, txtrec$
'     txtclib$=txtbest$+chr$(13)+txtrec$
     close #1
     txtclib$=txtbest$

'Zet de gegevens op het clipboard
r = ClipboardSetText(0, txtclib$)


'Tijdelijk tonen resultaat

print bstNaam$, dat$, aantal$
for x =1 to 20
print flNaam$(x), flSoort$(x), flLengte$(x)
next x
print txtbest$
print txtrec$

    wait

[quit.main] 'End the program
    close #main
    end


'Send text to clipboard with api calls
'by Dennis McKinney
'Note: You can use your window handle here instead of 0
'r = ClipboardSetText(0, "Hello World")
'If r is > 0 then the text has been placed on the clipboard
'end

Function ClipboardSetText(hOwner, strText$)'
'Puts some text on the Windows clipboard
'In: The text to place on the clipboard
'Out: 0 if fail, > 0 if text placed on clipboard
strText$ = strText$ + chr$(0)
lngSize = Len(strText$)
hMemory = GlobalAlloc(_GMEM_MOVEABLE, lngSize)
'Lock the object into memory
lpMemory = GlobalLock(hMemory)

'Move the string into the memory we locked
CallDll #kernel32,"RtlMoveMemory", lpMemory as ulong, strText$ as ptr, lngSize as long, ret as void

'Don't send clipboard locked memory.
r = GlobalUnlock(hMemory)

'Open the clipboard
CallDll #user32, "OpenClipboard", hOwner as long, r as boolean

'Remove the current contents of the clipboard
CallDll #user32, "EmptyClipboard", r as boolean

'Add our string to the clipboard as text
'If hSuccess > 0 then we have set the clipboard data
CallDll #user32, "SetClipboardData", _CF_TEXT as long, hMemory as long, hSuccess as long

'Close the clipboard
CallDll #user32, "CloseClipboard", r as boolean

'If we have set the clipboard data, we no longer own
'the memory--Windows does, so don't free it unless we failed.
If hSuccess = 0 Then
r = GlobalFree(hMemory)
End If

ClipboardSetText = hSuccess
End Function



Daarbij gaat het om de aanroep: r = ClipboardSetText(0, txtclib$) en de functie

Groeten, Kees
KeesW
 
Berichten: 23
Geregistreerd: do dec 10, 2009 2:32 pm

Re: Schrijven naar klembord

Berichtdoor Gordon » di jan 26, 2010 11:44 pm

Hallo Kees,

Ik schaam me diep.
Natuurlijk heeft LB gewone "native" commando's om
teksten naar het klembord te sturen.
Ik stond al op het punt om Carl een mailtje te sturen en op te
merken dat dit een ernstig gebrek zou zijn.

Maar gelukkig is er dus allang in voorzien.

http://babek.info/libertybasicfiles/lbnews/nl108/tip.htm

Sorry voor het ongemak.

Dus plaats de inhoud van je bestand in een textbox en zeg "!copy"

Gordon.

p.s. In jouw listing vergat je de allocatie functies:
Code: Selecteer alles

'--- Supporting functions ---

Function GlobalAlloc(type, dwBytes)
CallDll #kernel32, "GlobalAlloc", type as long, dwBytes as ulong, GlobalAlloc as long
End Function

Function GlobalLock(hMem)
CallDll #kernel32, "GlobalLock", hMem as long, GlobalLock as long
End Function

Function GlobalUnlock(hMem)
CallDll #kernel32, "GlobalUnlock", hMem as long, GlobalUnlock as long
End Function

Function GlobalFree(hMem)
CallDll #kernel32, "GlobalFree", hMem as ulong, GlobalFree as long
End Function
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Re: Schrijven naar klembord

Berichtdoor KeesW » wo jan 27, 2010 3:45 pm

Gordon bedankt,

Beide mogelijkheden uit geprobeerd. Nadeel van het LB commando is dat de texteditor een menu in je window plaatst en hoewel ik opzoek ben gegaan heb ik geen commando gevonden die dat menu uitschakeld of verwijderd.
Ik ben nu bezig met het vervolg, de gegevens van het ontworpen bestand terug te kunnen zetten voor aanbrengen van wijzigingen.
Hoewel dit programma geen hogeschool programmeren is, is het mischien nuttig, ook al omdat in de richting van dbf-bestanden weinig te vinden is op het forum, om het ergens daarop te plaatsen ter lering en vermaak. Wat is je mening?

groeten Kees
KeesW
 
Berichten: 23
Geregistreerd: do dec 10, 2009 2:32 pm

Re: Schrijven naar klembord

Berichtdoor Gordon » wo jan 27, 2010 10:10 pm

Het is "eenvoudig" mogelijk om het menu van een textbox te verwijderen.

Hier volgt een voorbeeld listing uit het restaurant
van Alyce Watson

http://alycesrestaurant.com/menugone.htm

Ik beveel je haar site bijzonder aan.

http://alycesrestaurant.com/

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

Re: Schrijven naar klembord

Berichtdoor KeesW » do jan 28, 2010 2:21 pm

http://alycesrestaurant.com/menugone.htm

Het programma in de url werkt niet, niet in mijn programma ingebed en niet als singelprogramma.
het edit-menu blijft staan in het textedit box. het is een programma uit 2006, mischien werkt het niet in deze versie van LB (4)

Inderdaad in haar site is veel informatie te vinden.

Kees
KeesW
 
Berichten: 23
Geregistreerd: do dec 10, 2009 2:32 pm

Re: Schrijven naar klembord

Berichtdoor Gordon » vr jan 29, 2010 12:17 am

Tja, volgens mij gebruikt Alyce hier een verkeerde functie uit
de user32.dll. Ze gebrukt de Remove, maar Delete is beter.

Hier volgt een mogelijkheid.

Code: Selecteer alles
'Remove edit menu
'with the help of Alyce

NoMainWin

Texteditor #main.t,10,10,200,200
Open "A Window" For Window As #main
#main "trapclose [quit]"

hWnd=hWnd(#main)

    CallDLL #user32, "GetMenu" ,hWnd As ulong, hMenuBar As ulong
    CallDLL #user32, "GetSubMenu", hMenuBar As ulong, 0 As long, hSubMenu As ulong
    CallDLL #user32, "DeleteMenu", hMenuBar As ulong, hSubMenu As ulong, _MF_BYCOMMAND As ulong, R As boolean

    CallDLL #user32, "DrawMenuBar", hWnd As ulong, r As boolean

wait

[quit]
Close #main:End



Dus eerst haal je met Getmenu de handle (groot getal dat Windows levert) van
de menubalk (hMenuBar)
Dan zoek je het handlenummer (hSubMenu) van het eerste item (0 as long)
Dan Delete je beide objecten (_MF_BYCOMMAND)
Tenslotte vernieuw je de menubalk met de functie DrawMenuBar

Je kunt hier functies van maken.

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


Keer terug naar Beginner

Wie is er online

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

cron