|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 06.03.2006, 23:36 Titel: wie setzt man Allegro/C-Befehl nach FreeBasic um ?????? |
|
|
Hi Leute,
heut hab ich mal wieder ne Frage an euch. Mein Allegro-Fimmel hat sich bestimmt schon rumgesprochen. Eigentlich komm ich ja damit klar. Hm. Dachte ich
Aber nun ist in der Allegro-Beschreibung doch ein Befehl aufgeführt, den ich nicht nach FreeBasic "übersetzt" kriege. Weil doch Allegro's Beschreibung davon ausgeht, man würde Allegro in C einbinden und nicht in Basic.
das DrumRum
Ich versuche die ganzen Tastaturtreiberbefehle zu testen und ein Stück weit zu dokumentieren. Das klappt ja auch gut.
Nur ist das mit Allegro (FreeBasic auch?) so, daß wenn der Endnutzer eines Programmes per Windows-Taste oder halt per Strg+Esc-Tasten auf den Desktop umschaltet, der Bildschirminhalt gelöscht wird. Klickt er sich nun in der Task-Leiste zum Freebasic+Allegro-Programm zurück ist alles schwarz.
Was da passiert weiß ich ja, und daß ich auch den Inhalt sichern und wieder Restaurieren kann ist auch klar.
Nur krieg ich im Programm einfach nicht mit, ob der User auf dem Desktop war. Somit müßte ich ständig über einen "doppelten" Screen arbeiten, das belastet dann die CPU/Grafikkarte.
das Problem selbst
nun hab ich Hoffnung, daß ich über einen noch nicht ausprobierten Befehl von Allegro "abhören" kann, ob der User die Tasten STRG+ESC gedrückt hat.
Dieser Befehl ist in Wirklichkeit eine Funktion, die auch in allegro.bi eingebunden/deffiniert ist. Somit steht sie in FreeBasic auch zur Verfügung.
Der Allegro-Hilfe-Text dazu:
extern int (*keyboard_callback)(int key);
If set, this function is called by the keyboard handler in response to every keypress. It is passed a copy of the value that is about to be added into the input buffer, and can either return this value unchanged, return zero to cause the key to be ignored, or return a modified value to change what readkey() will later return. This routine executes in an interrupt context, so it must be in locked memory.
Falls gesetzt, wird diese Function vom Tastaturtreiber bei jedem Tastenanschlag aufgerufen. Es wird eine Kopie des Wertes übergeben, der in den Tastaturpuffer zu schreiben ist. In der Funktion kann man diesen Wert entweder wie er ist oder aber verändert zurückgeben. ....
Ein Beispiel, jedoch in C:
Code: | int enigma_scrambler(int key)
{
/* Add one to both the scancode and ascii values. */
return (((key >> 8) + 1) << 8) | ((key & 0xff) + 1);
}
END_OF_FUNCTION(enigma_scrambler)
...
install_timer();
LOCK_FUNCTION(enigma_scrambler);
install_keyboard();
keyboard_callback = enigma_scrambler; |
Kann mir nun jemand erklären, wie ich das nach FreeBasic umgesetzt kriege?
Bei Folgendem Versuch meckert FreeBasic beim kompilieren nicht, aber die Function wird aber auch nicht aufgerufen
Code: | FUNCTION mein_keyboard( Taste% ) AS INTEGER
STATIC AlteTaste%, zaehler%
zaehler%=zaehler%+1
TastenNummer%=key%
CALL TEXT_Zentriert(STR$(zaehler%)+" "+STR$(Taste%)+" "+STR$(TastenNummer%),4)
END FUNCTION
END_OF_FUNCTION(mein_keyboard%)
DIM SHARED TastenNummer%, Taste%(KEY_MAX)
LOCK_FUNCTION(mein_keyboard)
keyboard_callback = CPTR( ANY PTR, mein_keyboard( Taste% )
DO WHILE TastenNummer%<>27 AND TastenNummer%<>59
IF Alte_TastenNummer% <> TastenNummer% THEN
TEXT_Zentriert(STR$(TastenNummer%), 4)
Alte_TastenNummer% = TastenNummer%
END IF
LOOP |
in der Allegro.bi wird das ganze so beschrieben:
'Extern Import keyboard_callback Alias "keyboard_callback" As Function cdecl(ByVal key As Integer) As Integer
Wenn ich anstelle von "taste%" mit "key" oder "key%" oder key(0) arbeite, wie das im Beispiel gemacht wird, dann hagelt es Fehler.
Hoffe, von euch weiß jemand Rat
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 07.03.2006, 02:09 Titel: |
|
|
key ist ein reserviertes schlüsselwort von FB, das ist vermutlich alles..
vllt hilf dir http://freebasic.de/Referenz.php?zeig=tuts&col1=a0d5d0&ref=yes&show=NOKEYWORD _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 07.03.2006, 17:52 Titel: |
|
|
Hallo Mister D, hallo Alle
Auch wenn schon allegro mit einem Array das key heißt daherkommt,
Code: | Extern Import key(0 to KEY_MAX-1) Alias "key" As Byte |
hab ich versucht, mit: Code: | option nokeyword key | in der allegro.bi das keyword von FreeBasic freizugeben.
Aber FreeBasic meckert dabei, scheint key gar nicht zu kennen:
Code: |
allegro.bi(22) : error 14: Expected identifier, found: 'key'
option nokeyword key
^
|
Daran scheints nicht zu liegen.
Zumal beim bennenen von key als Paramieter im Aufruf von keyboard_callback beanstandet wird, daß key ein Array sei (dublicate deffinition) (expected '(' found ')' ).
Allegro hat ja ein Key(Array) deffiniert, mit dem man Tasten abfragen kann (nur dabei kommt Strg+Esc nicht an)
weiter grübelnd
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 08.03.2006, 01:18 Titel: |
|
|
ich werd aus deinem text irgendwie nich schlau, bin vermutlich einfach bisschen müde aber wenns n array key gibt kannst du key nich als einfache variable auch noch benutzen außer in ner sub oder sowas wenn das array nicht global ist, aber ich denk ma das is dir auch klar. Wieso musst du das teil denn unbedingt key nennen? nimm doch halt einfach nen anderen namen oder geht das nich? _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 08.03.2006, 16:53 Titel: |
|
|
Hallo Mister D
richtig, Key ist ein Array, das hat Allegro so inszeniert. Soweit, so gut. Aus anderen Tests weiß ich, daß ich im Main als auch in SUBs und FUNCTIONs an Key() rankomme, also ist dieses Array auch global.
Daß ich rumprobiere, "key" für den Aufruf zu verwenden, liegt schlichtweg daran, daß ich das so im Allegro-Beispiel für C gesehen habe (siehe weiter oben) und nun denke, ich sollte dies in FreeBasic so machen.
Mittlerweile bin ich soweit, daß ich in der Function, welche ich an keyboard_callback übergeben soll, als Parameter "key" verwenden kann, ohne daß FreeBasic muckt.
Lt C-Beispiel soll ich dann im Main keyboard_callback=mein_keyboard schreiben, was so nicht läuft. Hatte danach dann probiert, den Pointer auf mein_keyboard zu übergeben, was nur akzeptiert wird, wenn ich das als C-Pointer übergebe (klingt ja auch plausibel):
keyboard_callback = CPTR( ANY PTR, mein_keyboard( Taste% )
Jedoch beendet sich das Programm dann nach jeglichem Tastendruck, anstatt die Befehle in MeineKeySub auszuführen und in die Warteschleife im Main zurückzukehren.
Danach hab ich dann auch im Aufruf versucht, nicht mit "=" zu agieren, sondern wie bei meinen anderen FUNCTIONs mit Klammern zu programmieren:
dummy%=keyboard_callback(mein_keyboard)
dabei weißt mich FreeBasic beim Compilieren darauf hin, daß ich parameter zu mein_keyboard anzugeben habe.
Mach ich nun:
dummy%=keyboard_callback( mein_keyboard(Taste%) )
beendet sich das Programm wieder bei jeglichem Tastendruck
und dann verzweifelnderweise mit
dummy%=keyboard_callback( mein_keyboard(key) )
meint FreeBasic, daß key ein Array sei, und als Parameter so hier nicht herpassen würde.
Genau gesagt, hab ich also überhaupt keinen Plan mehr, was ich noch probieren soll, damit Allegro bei jedem Tastendruck eine von mir erstellte SUB/FUNCTION aufruft.
haarerausreißend
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 09.03.2006, 01:23 Titel: |
|
|
ja benutz doch einfach nich key sondern kih oder irgendwas? _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 09.03.2006, 16:52 Titel: |
|
|
key nicht zu benutzen ist ja das, was ich mit Taste% als übergabevariable gemacht habe. Das funzt nicht, die Sub wird bei Tastendruck dann nicht angesprungen. Der Ansatz von mir scheint komplett falsch zu sein , aber keine Ahnung, wie ichs machen soll.Vielleicht stolpert irgend jemand aus der "C-Fraktion" hier mal rein, der mir sagen kann, wie ich das Beispiel aus C nach FreeBasic umsetzen kann.
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 12.03.2006, 20:20 Titel: |
|
|
So, mein Problem hab ich über www.allegro.cc gelöst
da es auch eine halbe Antwort auf den Post hier ist, schreibe ich die Lösung der Vollständigkeit halber hier rein:
1) mittels dieser Function, die bei Tastenanschlag aufgerufen werden sollte, ist es höchstwahrscheinlich NICHT möglich, die STRG+ESC-Kombination abzufragen, da diese Funktion auf der gleichen Basis läuft, wie die Key()-Array-Funktion für Tastaturabfragen. Und dort kommt ja STRG+ESC auch nicht als Tasteneingabe an. Windows hält sich selbst für den angesprochenen, gibt also keinem anderen Programm sowas weiter. Warum ich jedoch dabei die Windows-Taste selbst abfrage kann, bleibt dann ein Rätsel.
2) Allegro hat aber einen anderen Befehl, der eine selbstgeschriebene FB-Function jedesmal aufrufen läßt, wenn zwischen dem FreeBasic-Programm und dem Desktop hin- und hergesprungen wird:
set_display_switch_callback(wann, FuncPtr)
wann ist einer der beiden Ausdrücke: SWITCH_IN oder SWITCH_OUT
FuncPtr ist ein C-Pointer auf eine Function
mit nachfolgendem Beispiel wird unten im Bilschirm "aus Windows zurueck" hingeschrieben, wenn ich bei laufendem FB-Programm mit STRG+ESC auf den Desktop springe und dann zurück komme:
Code: | 'Allegro.Bas Grundgeruest um Allegro in Freebasic einzubinden
'---------------------------------------------------------------
'Initialisierungsbereich
'=======================
DECLARE FUNCTION ausWinZuruck%()
'$include: '..\..\inc\allegro.bi'
'
'Hauptteil
'=========
'Allegro init
IF (allegro_init() <> 0) THEN
allegro_message("FEHLER: Allegro konnte nicht initialisiert werden!")
GOTO Programmende
END IF
'GRAFIKMODUS SETZEN
set_color_depth(8)
IF (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) <> 0) THEN
allegro_message("FEHLER: Grafik konnte nicht initialisiert werden!")
GOTO AllegroEnde
END IF
'TastaturTreiber Starten
IF install_keyboard <> 0 THEN
allegro_message("Tastaturtreiber-install fehlgeschlagen")
GOTO Programmende
END IF
'Timer Starten
IF install_timer() < 0 THEN
allegro_message("FEHLER: Timer konnte nicht initialisiert werden!")
GOTO AllegroEnde
END IF
'Maus Starten
IF install_mouse() < 0 THEN
allegro_message("FEHLER: Maus konnte nicht initialisiert werden!")
GOTO AllegroEnde
END IF
'=========================================================
'MAIN
text_mode(1) 'Texthintergrund in Farbe 1 (-1 wäre transparent)
'=============================================================================
FUNCTION ausWinZuruck%()
textout(screen, font, "aus Windows zurück", 10, 460, 4)
END FUNCTION
END_OF_FUNCTION(ausWinZuruck%%)
LOCK_FUNCTION(ausWinZuruck%%)
set_display_switch_callback( SWITCH_IN, CPTR( ANY PTR, PROCPTR(ausWinZuruck%) ) )
readkey()'because in this Test, the Keypress for coming Back from
readkey()'Win-Desktop is given to readkey, I ask here 5 times, so that
readkey()'the program allready stays waiting and shows what's happening
readkey()'Weil der Tastendruck für den Rücksprung vom Win-Desktop an readkey
readkey()'übergeben wird, hier mehrfache abfrage, daß Anzeige zu sehen ist!
'-----------------------------------------------------------------------------
AllegroEnde:
allegro_exit()
Programmende:
'=========================================================
'Unterprogramme
'============== |
es sollte nun ein Leichtes sein, eine Kopie des Screeninhaltes parat zu haben, und das Zurückkopieren der Kopie auf den screen in obiger Funktion "ausWinZurueck%()" einzutragen. Dann sieht der User wieder, was das Programm vor Wegsprung zum Desktop angezeigt war.
Warum das bei meinen Versuchen mit der Function bei Tastenanschlag ausführen nicht geklappt hat, kann ich mir nur damit erklären, daß ich dort kein DECLARE FUNCTION drin hatte. Hier isses drin, hier gehts, ich such nicht weiter.
vielleicht hilfts jemandem
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|