Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Suche Tutorial zum Erstellen eigener Librarys

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Felix



Anmeldungsdatum: 22.01.2008
Beiträge: 41
Wohnort: Breisach

BeitragVerfasst am: 18.02.2008, 19:35    Titel: Suche Tutorial zum Erstellen eigener Librarys Antworten mit Zitat

Hallo,

wie die Überschrift schon sagt...
Ich hab sozusagen ne kleine GUI zusammengebastelt als Übung. Also dass man Buttons und so weiter halt hinzufügen kann. Der Einfachheit halber hab ich dazu Grafiken gezeichnet (60x40 Pixel) und diese werden dann beim Programmstart gestartet. Damit ich aber nicht immer so einen riesigen Code schreiben muss, um einen einzigen Button zu erstellen und abzufragen, ob die Maus gerade auf dem Button ist und Linke Taste gedrückt wurde, will ich das i-wie vereinfachen.
Hier erstmal der alte Code:
Code:

BLoad "res\buttons\start.bmp"
get (0,0)-(60,40),start

cls

put (20,10),start

do

loop if x>20 and x<80 then
 if y>10 and y<50 and button = 1 then
   goto startpressed
 end if
end if

loop




so werden dann auch Menus, Fenster und so weiter geladen. Ich weiß, manche werden sich jetzt die Haare raufen und sagen "Wie kann man nur ne GUI mit .bmp-grafiken machen, ...", aber ich hatte einfach keine andere idee was ich programmieren könnte, und dann hab ich mit dem, was ich in den letzten 2 Wochen gelernt habe, angefangen das Programm zu schreiben.
Also ich möchte dann sozusagen eine Library erstellen, in denen neue Befehle deklariert werden, beispielsweiße mkbutton (xposition, yposition)
(ich will dann die Grafiken entweder in der Library direkt laden oder halt über dem mkbutton definieren, wobei dann noch eine Variable reinmüsste, welche Grafik denn geladen werden müsse. mkbutton(xposition, yposition, pfad). In der Library wird dann gecheckt, on an xposition + 60 bzw y position + 40 der linke mausbutton gedrückt wurde.

Kennt jemand ein gutes Tutorial oder kann mit jemand schnell zeigen wie man das macht? Vielen Dank schonmal im Vorraus.

Gruß Felix

PS: Tut mir echt leid dass ich solche Romane schreibe, aber ich kann mich einfach nicht kürzer fassen lächeln , ich hoffe ihr könnt mir verzeihn.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 18.02.2008, 20:24    Titel: Antworten mit Zitat

Für Shared Libaries(DLL, SO): Schau mal in der Englischen FreeBASIC CHM unter "Programming Reference > Making Binaries > Shared Libaries".
Für Static Libaries(LIB, A): "Programming Reference > Making Binaries > Static Libaries"

Wird alles gut beschrieben.

EDIT:
ICH HABE DA DOCH NICHT WIRKLICH EIN GOTO GESEHEN? mit dem Kopf durch die Mauer wollen durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Felix



Anmeldungsdatum: 22.01.2008
Beiträge: 41
Wohnort: Breisach

BeitragVerfasst am: 18.02.2008, 20:47    Titel: Antworten mit Zitat

Doch du hast da ein Goto gesehen durchgeknallt
Wieso was is daran schlimm??
_________________
Mein Anti-High-End-PC: Pentium 4 1,7Ghz, 512Mbyte DDR, Radeon 9250 128Mbyte DDR-2,
50 Gbyte Seagate HDD, ... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Felix



Anmeldungsdatum: 22.01.2008
Beiträge: 41
Wohnort: Breisach

BeitragVerfasst am: 18.02.2008, 21:30    Titel: Antworten mit Zitat

hmm entweder hab ich was falsch verstanden oder Freebasic ist buggy, wobei ich eher auf 1 plädiere lächeln

Ich hab das jetzt so gemacht:

Code:

'meine library als .bas file

Public Function mkbutton(ByVal pfad As String, ByVal nob As string) As string
   
   Dim nob(0 To 60, 0 To 40) As integer
   
   BLoad pfad
   Get (0,0)-(60,40), nob
End Function


Code:

'meine library als .bi file

#Inclib "lib"

Declare Function mkbutton(ByVal pfad As String, ByVal nameofbutton As string) as integer



Code:

'und der eintrag in meinem Programm:

#Include "lib.bi"

mkbutton ("res\buttons\start.bmp", start)



Dann spuckt der mir diese Fehler aus:

error 68: Array access, index expected, before ')' in 'mkbutton ("res\buttons\start.bmp", Start)'

error 55: Type mismatch, at parameter 2 of MKBUTTON() in 'mkbutton ("res\buttons\start.bmp", Start)'

Kann mir jemand sagen was ich falsch gemacht habe?
Sorry dass ich euch mit so noobfragen nerve... verlegen

Gruß Felix
_________________
Mein Anti-High-End-PC: Pentium 4 1,7Ghz, 512Mbyte DDR, Radeon 9250 128Mbyte DDR-2,
50 Gbyte Seagate HDD, ... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 18.02.2008, 21:31    Titel: Antworten mit Zitat

http://de.wikipedia.org/wiki/Programmiererjargon hat Folgendes geschrieben:
Der bildhafte Ausdruck Spaghetti-Code bezeichnet ein Programm, in dem, durch unbedingte Sprünge (z.B. zahlreiche verschachtelte Sprunganweisungen), der Programmablauf schwer nachzuvollziehen ist, wie bei einem Berg Spagetti, bei dem es sehr schwer ist heraus zu finden, welche Nudelenden zusammen gehören.

Hervorgerufen durch GOTO& GOSUB. Ja!

zurück zum Thema, Static Libarys wären für deinen Fall wahrscheinlich besser geeignet.

Edit: Hab gerade erst deine Antwort gesehen, ignoriere den letzten Satz.
Scheint eher ein Problem beim Arrayzugriff zu sein als mit der Libary.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Felix



Anmeldungsdatum: 22.01.2008
Beiträge: 41
Wohnort: Breisach

BeitragVerfasst am: 18.02.2008, 21:51    Titel: Antworten mit Zitat

muss man dann irgendwie das array aus dem lib-Programm in das main-Programm exportieren oder wird das schon erledigt, indem man die library in das main Programm importiert?
_________________
Mein Anti-High-End-PC: Pentium 4 1,7Ghz, 512Mbyte DDR, Radeon 9250 128Mbyte DDR-2,
50 Gbyte Seagate HDD, ... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 18.02.2008, 22:26    Titel: Antworten mit Zitat

raph ael hat Folgendes geschrieben:
EDIT:
ICH HABE DA DOCH NICHT WIRKLICH EIN GOTO GESEHEN? mit dem Kopf durch die Mauer wollen durchgeknallt


Krig dich mal wieder ein! ... Wenn du dich SO über ein GOTO aufregst, dann solltest du an deinen Programmierkünsten wohl noch etwas arbeiten, denn scheinbar verstehst du den Sinn , bzw. die Vor und Nachteile eines Goto's nicht.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 18.02.2008, 22:38    Titel: Antworten mit Zitat

Ich muß ihm aber teilweise Recht geben: So, wie Felix das Goto da einsetzt, macht es bestimmt keinen Sinn.
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 19.02.2008, 02:28    Titel: Antworten mit Zitat

Da geb ich dir natürlich vollkommen recht, jedoch muss man das ja nicht gleich so kund tun. Es wäre doch sicher hilfreicher, wenn man demjenigen aufzeigt, wo die schwachstelle bei der verwendung des Gotos liegen. Vorallem, Warum man es "DORT" nicht einsetzen >KANN< / >SOLLTE< ... denn .. dafür gibt es keinen Grund.

Aber, um mal ein Beispiel zu posten, wo es sinvoll sein Kann ein Goto zu nutzen.
Code:
For X = 1 to 10
    For Y = 1 to 10
        For Z = 1 to 10
            'Hier ALLE Schleifen verlassen
        Next
    Next
Next


In VB gibt es eine Alternative, die so aussähe. (hab ich allerdings noch nie gebraucht)
Code:
For X = 1 to 10
    For Y = 1 to 10
        For Z = 1 to 10
            Exit For
Next X, Y, Z


In FB und VB könnte man es so machen:
Code:
Dim XExit as UByte
For X = 1 to 10
    For Y = 1 to 10
        For Z = 1 to 10
            XExit = 1
            Exit For
        Next
        If XExit = 1 Then Exit For
    Next
    If XExit = 1 Then Exit For
Next
NextExit:


Jetzt würde mich mal interessieren, wie du @raph ael hier eine einfache Methode Findest, um alle drei schleifen zu verlassen, udn den darunterliegenden Code weiter abarbeitest.
Elegant und einfach ist hier (unbestreitbar) das Goto. Es verläst augenblicklich alle schleifen, ohen das zusätzliche Variablen nötig sind, oder unnötig Instruktionen abgearbeitet werden müssen.

Elegant ist es mit:
Code:
For X = 1 to 10
    For Y = 1 to 10
        For Z = 1 to 10
            Goto NextExit
        Next
    Next
Next
NextExit:


Und nach Spagetticode sieht das sicher nicht aus. SpagettiCode erzeugen nur die Programmierer, die keine Ahnung im richtigen Umgang mit den Befehlen haben, oder erst beim lernen dieser sind.

Es ist wohl sinvoller, wenn die Programmierer den richtigen Umgang mit befehlen lernen anstat ihnen zu verbieten irgend welche befehle zu nutzen, deren Funktion anderen nicht gefällt, weil sie schlechte erfahrungen damit gemacht oder den Befehl noch nie sinvoll genutz haben.

PS: In ASM nutzt man JMP ... Zunge rausstrecken ... Wenn du das auch so verpöhnst dann viel spass mit deinem ersten ASM Code.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Felix



Anmeldungsdatum: 22.01.2008
Beiträge: 41
Wohnort: Breisach

BeitragVerfasst am: 19.02.2008, 10:08    Titel: Antworten mit Zitat

Hab den Fehler gefunden... Weiß aber nciht wie ich ihn beheben kann weinen

Code:

PUBLIC FUNCTION mkbutton(BYVAL pfad AS STRING, BYVAL nob AS STRING) AS STRING
   
   DIM nob(0 TO 60, 0 TO 40) AS INTEGER
   
   BLOAD pfad
   GET (0,0)-(60,40), nob


ich dimensioniere ja oben in der Funktionsdeklaration die variable nob als Stringvariable. Das heiß, in meinem Programm schriebe ich dann beispielsweise

Code:

mkbutton("res\buttons\start.bmp", start)

also wird ja der String start in der variable nob gespeichert.
Nun will ich aber eine Variable mit dem Inhalt von nob (also start) als array deklarieren, um die Bilder zu GETten und später wieder zu PUTten.

ich habe es oben ja versucht zu lösen, indem ich einfach
Code:

dim nob(0 to 60, 0 to 40) as integer

gemacht habe, aber geht natürlcih nicht, so wird ja einfach nob nochmal neu deklariert was zu einem Fehler führt...
Kann mir jemand helfen?

Gruß Felix
_________________
Mein Anti-High-End-PC: Pentium 4 1,7Ghz, 512Mbyte DDR, Radeon 9250 128Mbyte DDR-2,
50 Gbyte Seagate HDD, ... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 19.02.2008, 14:48    Titel: Antworten mit Zitat

Also .. ich weis nicht genau, was du vor hast, ich kanns nicht richtig herauslesen, aber erstmal zu deinen Probelmen.

Code:
mkbutton ("res\buttons\start.bmp", start)


Du hast vergessen "Start" zu definieren. Wenn "Start" eien Variable ist, dann must du diese zuerst Deklarieren, befor du sie verwenden kannst:

Code:
Dim Start as String = "Bla"
mkbutton ("res\buttons\start.bmp", start)


Oder

Code:
mkbutton ("res\buttons\start.bmp", "Bla")




raph ael hat Folgendes geschrieben:
Scheint eher ein Problem beim Arrayzugriff zu sein als mit der Libary.
Der Fehler entsteht als folge einer nicht definierten Funktion. Der Compiler kennt die Funktion mkbutton nicht, und geht anschliessend davon aus, das mkbutton durch () ein Array zu sein scheint. Daraufhin sucht er nach mkbutton als Array. Findet er natürlich nicht, da die Definition fehlt, und spukt daraufhin einen Fehler aus.


@ Felix
Zitat:
error 68: Array access, index expected, before ')' in 'mkbutton ("res\buttons\start.bmp", Start)'

error 55: Type mismatch, at parameter 2 of MKBUTTON() in 'mkbutton ("res\buttons\start.bmp", Start)'

Ich bitte dich das nächste mal den vollständigen Fehler zu posten. Leider ist nämlich nicht genau zu erkennen, wo der Fehler entsteht. Man kann es zwar erraten aber so sicher ist es dann auch nicht.

Fehler ausgaben habenmeist die folgende Struktur.
<Datei in welcher der Fehler auftrit>(<Zeilennumer des Fehlers>) <Error/Warning> <Fehlernummer> <Beschreibung des Fehlers> <Die Fehlerzeile>

Was dann so aussehen würde:
<???>(<???>) <error> <55> <Array access, index expected, before ')' in> <'mkbutton ("res\buttons\start.bmp", Start)'>


Zu deinem Vorhaben.
Es wäre sicher einfacher (auch wenn es mehr Code wäre), wenn du anhand von Positions und grösseninformationen herausfindest, welcher Knopf gedrückt wurde.

Du Definierst ein Array, das deien Elemente (Button, Label, Textfeld, usw.) speichert.
Code:
Type Element
    Element_Type as UByte
    Element_Bild as Byte PTR
    Element_Position_X as Integer
    Element_Position_Y as Integer
    Element_Breite as UInteger
    Element_Hoehe as UInteger
End Type
Dim ElementeD() as Element
Dim ElementeC as UInteger


Dieses Array (ElementD) nutzt den Datentyp (Element) der mit "Type Element" erstellt wurde. Es speichert die wichtigsten Informationen die zur darstellung und zum Prüfen diehnen.


Anschliessend Schreibst du eine Funktion, die ein neues Element in das Array hinzufügt.
Code:
Sub Element_Add(V_Type as UByte, V_Position_X as Integer, V_Position_Y as Integer, V_Breite as UInteger, V_Hoehe as UInteger, V_Bild_Path as String)
ElementC += 1
Redim Preserve ElementeD(ElementeC) as Element
With ElementeD(ElementeC)
    .Element_Type = V_Type
    .Element_Position_X = V_Position_X
    .Element_Position_> = V_Position_Y
    .Element_Breite = V_Breite
    .Element_Hoehe = V_Hoehe
    .Element_Bild = ImageCreate(V_Breite, V_Hoehe)
    BLoad .Element_Bild, V_Bild_Path
End With
End Sub


Anschliessend kannst du mit einer weiteren Funktion die Elemente auf dem Bildschirm ausgeben.

Um dann zu Überprüfen, ob du dich über einem Element Befindest, brauchst du dann nur noch alle Elemente durchlaufen, udn überprüfen, ob sich die Mauspotion in einem der "Rechtecke", die durch Position und Dimension definiert werden, befindet.

Code:
Funktion Maus_In_Element(V_Maus_Position_X as UInteger, V_Maus_Position_X as UInteger) as UByte
For X as ULong = ElementeC to 1 Step -1
    With ElementeD(ElementeC)
        If (.Element_Position_X <= V_MausPosition_X) and (.Element_Position_X + .Element_Breite => V_MausPosition_X) Then
            If (.Element_Position_Y <= V_MausPosition_Y) and (.Element_Position_Y + .Element_Hoehe => V_MausPosition_Y) Then
                Return X
            End If
        End If
    End With
Next


Diese Funktion liefert dir dir die Nummer (Indexnummer) des Elementes zurück, in welchem sich die Maus befindet.

Ich weis nicht genau, ob das mit dem Bilder-laden so funktioniert, aber die Anderen Funktionen sollten problemlos lauffehig sein.

Als Ansatz für deine GUI ist es sicher hilfreich.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Felix



Anmeldungsdatum: 22.01.2008
Beiträge: 41
Wohnort: Breisach

BeitragVerfasst am: 20.02.2008, 20:37    Titel: Antworten mit Zitat

Hallo,
erstmal vielen Dank für die Antwort, hab mir deinen Text mal ausgedruckt und lese ihm mir nacher mal in ruhe durch, dann kann ich das besser verarbeiten, wenn ich mir wichrige sachen anstreiche und so. Ich kann am Monitor eh schlecht lesen. Ich melde mich wieder wenn es neuigkeiten gibt lächeln

Gruß Felix
_________________
Mein Anti-High-End-PC: Pentium 4 1,7Ghz, 512Mbyte DDR, Radeon 9250 128Mbyte DDR-2,
50 Gbyte Seagate HDD, ... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz