Wrapper's
voor GraphApp
Inhoud
Inleiding
GraphApp is een bibliotheek voor window toepassingen . Gemaakt door
:
L. Patrick
Basser Department of Computer Science
School of Information Technologies
University of Sydney 2006
Australia
http://enchantia.com/software/graphapp/
Het heet eenvoudig te gebruiken en na enig gepuzzel valt het
inderdaad wel mee .
Het voordeel van deze bibliotheek is dat het redelijk klein is
(ongeveer 800k) .
En zowel werkt onder X11(Linux/Unix) als een .so bestand als
onder MSWindows (98/XP) als een .dll bestand .
Het bevat naast een mogelijk Menu's temaken over de nodige
LijstSelectie alsmeede RadioKnoppen , PopUp menus's e.d.
Ook zijn een aantal Dialogen aanwezig zoals FileOpen FileSave en een
Messagebox met verschillend antwoord mogelijkheden .
Ook is het mogelijk drie soorten plaatjes te gebruiken te weten .gif ,
.png , .jpg . (Soms wel een beetje erg veel om te onthouden)
Graph Appl vertalen
Vertaald met de mingw (mswindows) en linux .
Mingwin .
Om de mingw DLL telaten maken moet de volgende opdracht aan de make
file worden toegevoegd .
MAKE_DYNAMIC_LIB = gcc -shared -o
DLL
= graphapp.dll
dynamic: apptypes.h $(DLL)
$(DLL): $(OBJECTS) $(HEADERS)
$(exist $(DLL), del $(DLL))
$(MAKE_DYNAMIC_LIB) $(DLL) win32/*.o
utility/*.o gui/*.o imgfmt/*.o libgif/*.o \
libjpeg/*.o libpng/*.o libz/*.o -mwindows -Wl,--out-implib,libgraphapp.a
Zover ik het begrepen heb -mwindows
zorgt ervoor dat er geen Console
box (DOS box) worden opgestart .
-Wl,--out-implib,libgraphapp.a
haalt
uit de lib de
symbolreferentie voor de DLL .
(wil je referentie's uit andere DLL gebruiken geeft dan -Bdynamic plus
de gewenste lib's mee.)
Linux (GCC)
De linux versie kun je met de meegegeven Makefile gebruiken . Zorg wel
dat je een aantal header files uit de X11 hebt .
Wrapper voor Peu / Euphoria
De wrapper voor Peu en Euphoria is geschreven door Matt Arriola .
De wrap file graphapp.eu
is oorsprongkelijk
voor Linux gemaakt maar werk ook in MSWindows als je maar even de DLL
toevoegd .
Deze bevat een include bestand file.e
welke
call's naar een pipe bevat
, verwijder deze als je in MSWindows werkt . (voorbeeld ex05 werkt niet
meer)
Verwijder de dubbele declaratie get_image_area
. Wijzig get_window_area
, parameters zijn onjuist .
Verander app_fil_rec
t in app_window_fill_app
(en verwijder
euapp_fill_rext
)
Voorbeeld EX04 is uitgebreid met de benodigde edit-actie zoals
copy/paste .
Voorbeeld TRY2 is aan aanzet voor een equivalend voor Xdailog (wat
zover ik weet alleen voor Linux/Unix beschikbaar is)
Peu en Euphoria werken hoofdzakelijk met een CallBack functie . Het is
echter ook mogelijk deze omtezetten in een scanner functie .
Inplaats van main_loop()
welke uitgaat van
CallBack's gebruik dan next_event()
welke een
pointer terug geeft van de structuur welke is aangeroepen . (zie EX02A)
. Hiertoe zijn alle hook in de bibliotheek gewijzigd door
centrale hook omzetter ( get_hook(hook)
) met
-1 niets , 0 event_scanner anders callbackfunc() .
Wrapper voor Fortran (G77)
De wrapper is nog
lang
niet af ! Maar is bedoeld omtezien of het wel
mogelijk is .
Bijvoorbaad twee wetenswaardigheden :
- Parameter worden gegeven als call by reference , oftewel
als
pointers . Indien CHAR parameter worden gebruikt wordt de lengte van
deze als laatste parameter als call by value meegegeven .
- (
call
proc(charstring,integer)
geeft in C void
proc_(char *txt, int *i, int length_txt)
-
result=char
function(parameter)
geeft in C void proc_(
char *result , int len_result , int *parameter)
)
- Characterstring van Fortran naar C moeten voorzien worden
van een
laatste teken '\0' en eventueel moeten de leading spaces gestripd
worden .
- Characterstring van C naar Fortran moet gekopierd worden
totaan '\0' en opgevult worden met spatie's tot de door Fortran gegeven
textlengte .
Event Scanning
(voorbeeld)
Er is gekozen voor een scanning techiek t.b.v de event afhandeling (zie
ook JAPI) . Dit betekend dat de aanroep van next_event()
een
pointer
terug geeft welke indentiek is aan een der gemaakte
var=GraphApp_functie() of 1
als er geen callback is of het is 0 wat aangeeft dat alle windows
gesloten zijn . Dit geeft de mogelijkheid is geheel anders te doen
tussen twee event's .
Je kunt het voorbeeld zowel in Linux als in MSWindows vertalen .
Linux : g77 -o test grapappg77.f graphappg77.c
./libapp.so
Mingw : g77 -o test grapappg77.f
graphappg77.c graphapp.dll -mwindows
Hoe je foutlose typcasting krijgt ontgaat mij nog steeds , maar het
blijven waarschuwingen en het werkt er wel om , alleen niet netjes .
CallBack (voorbeeld)
Bij deze methode roept een event een functie aan welke direct
wordt uitgevoerd . In de huidige wrapper worden nu alle event
afgehandeld door main_loop()
. Als alle windows gesloten zijn is de procedure beeindigd . Dit
betekend in Fortran dat de CallBack's moeten worden gedeclareerd
alszijnde een external
function .
De parameters van
de CallBack functie zijn pointers d.w.z. om de pointer waarde te
krijgen moet je de parameter door de functie %loc
halen .
V.b. parameter is I (dat geeft de waarde van het eerste element van de
Graph Structuur weer ) , het adres van de structuur wordt
verkregen door adresStruct = %loc(I) .
De
CallBack van
MenuItem geeft als waarde zijn ouder maar door nu %loc te gebruiken
krijg je het adres van MenuItem (zie struct MenuItem in app.h
)
.
Je kunt het voorbeeld zowel in Linux als in MSWindows vertalen .
Linux : g77 -o test grapappcb.f graphappg77.c
./libapp.so
Mingw : g77 -o test grapappcb.f
graphappg77.c graphapp.dll -mwindows
Dialogs (voorbeeld)
In dit voorbeeld wordt het gebruik van alle Dialogs getoond . De
declaratie logical
mag ook vervangen worden
door integer
alleen eist
Fortran dan dat je de conditie in het if
statement ook als een vergelijking
op geeft . Daar een aantal Dialog alleen een vorm van oke/cancel geven
heb ik deze gedeclareerd als logical
.
Voor File dialog geldt dat de waarde welke de functie terug geeft ok of
cancel is . De file naam (+pad) staat in de laatste parameter .
Je kunt het voorbeeld zowel in Linux als in MSWindows vertalen .
Linux : g77 -o test dialog.f graphappg77.c ./libapp.so
Start dit vanuit een console anders kun je de antwoorden niet lezen .
Mingw : g77 -o test dialog.f
graphappg77.c graphapp.dll
Vertaal deze zonder -mwindows anders kun je de antwoorden niet lezen .
Broncode downloading
Uitleiding
Naast GraphApp zijn er mij nog twee systemen bekend die zowel in
Linux/unix als in MSWondows werken .
- JAPI
- JAPI staat voor Java Application Programming Interface .
Het heeft Wrapper voor een heleboel talen en O.S.
- JAPI wordt zover ik weet niet meer ontwikkeld maar is
teverkrijgen op http://www.japi.de
.
- Japi werkt met een server/client techniek . De server is
de Java omgeving en de client is je programma .
- wxWindows
- wxWindows is geschreven in C++ en daarom wat moeilijker
te Wrappen zeker voor iets als Fortran
- wxWindows en wxWidgets zijn te berijken via http://www.wxwindows.org
.
Heb je hierwat aan gehad mail
mij dan maar eens .