 |
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 |
Felix
Anmeldungsdatum: 22.01.2008 Beiträge: 41 Wohnort: Breisach
|
Verfasst am: 18.02.2008, 19:35 Titel: Suche Tutorial zum Erstellen eigener Librarys |
|
|
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 , ich hoffe ihr könnt mir verzeihn. |
|
Nach oben |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 18.02.2008, 20:24 Titel: |
|
|
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?  |
|
Nach oben |
|
 |
Felix
Anmeldungsdatum: 22.01.2008 Beiträge: 41 Wohnort: Breisach
|
Verfasst am: 18.02.2008, 20:47 Titel: |
|
|
Doch du hast da ein Goto gesehen
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, ...  |
|
Nach oben |
|
 |
Felix
Anmeldungsdatum: 22.01.2008 Beiträge: 41 Wohnort: Breisach
|
Verfasst am: 18.02.2008, 21:30 Titel: |
|
|
hmm entweder hab ich was falsch verstanden oder Freebasic ist buggy, wobei ich eher auf 1 plädiere
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...
Gruß Felix _________________ Mein Anti-High-End-PC: Pentium 4 1,7Ghz, 512Mbyte DDR, Radeon 9250 128Mbyte DDR-2,
50 Gbyte Seagate HDD, ...  |
|
Nach oben |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 18.02.2008, 21:31 Titel: |
|
|
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.
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 |
|
 |
Felix
Anmeldungsdatum: 22.01.2008 Beiträge: 41 Wohnort: Breisach
|
Verfasst am: 18.02.2008, 21:51 Titel: |
|
|
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, ...  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 18.02.2008, 22:26 Titel: |
|
|
raph ael hat Folgendes geschrieben: | EDIT:
ICH HABE DA DOCH NICHT WIRKLICH EIN GOTO GESEHEN?  |
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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 18.02.2008, 22:38 Titel: |
|
|
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2008, 02:28 Titel: |
|
|
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 ... ... Wenn du das auch so verpöhnst dann viel spass mit deinem ersten ASM Code.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Felix
Anmeldungsdatum: 22.01.2008 Beiträge: 41 Wohnort: Breisach
|
Verfasst am: 19.02.2008, 10:08 Titel: |
|
|
Hab den Fehler gefunden... Weiß aber nciht wie ich ihn beheben kann
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, ...  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2008, 14:48 Titel: |
|
|
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 |
|
 |
Felix
Anmeldungsdatum: 22.01.2008 Beiträge: 41 Wohnort: Breisach
|
Verfasst am: 20.02.2008, 20:37 Titel: |
|
|
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
Gruß Felix _________________ Mein Anti-High-End-PC: Pentium 4 1,7Ghz, 512Mbyte DDR, Radeon 9250 128Mbyte DDR-2,
50 Gbyte Seagate HDD, ...  |
|
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.
|
|