 |
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 |
FB_RML
Anmeldungsdatum: 06.04.2008 Beiträge: 4
|
Verfasst am: 06.04.2008, 18:54 Titel: Probleme mit neuem Modul |
|
|
Hallo Forum,
ich bin "brandneues" Mitglied und deshalb ganz kurz zu meiner Person:
Ich gehe stramm auf die 50 zu, komme ursprünglich aus dem wilden Süden von Deutschland und mache jetzt das Rheinland (Köln/Bonner-Raum) unsicher.
Beruflich darf ich kleine bis mittlere Datenbanken in Access (und dem dort integrierten VBA) realisieren, bin also gründlich MS-verwöhnt/geschädigt.
Deshalb finde ich FreeBasic klasse und freue mich, dass es so was tolles gibt.
So nun, zu meinem Problem:
Ich habe in dem schönen Beispiel "OpenFile", die Funktion zum Öffnen des Win-Datei-Dialoges überarbeitet (daraus eine Sub - "FileOpen()" - gemacht) - das funktioniert auch, solange die Sub im Modul "OpenFile.Bas" ist.
Damit mir das Modul nicht zu lang wird, habe ich in FBEdit über "Datei - Neue Code Datei" ein neues Modul "DlgOpen" angelegt und die Sub "FileOpen()" aus dem Modul "OpenFile.Bas" dorthin verschoben.
Und jetzt gings los: Wenn ich in FBEdit auf die Schaltfläche "Start" klickte, dann erscheint im Ausgabefenster die Nachricht "OpenFile.Bas(94) error 41: Variable not declared, FileOpen in 'FileOpen()'".
Beim Durchlesen der Dokumentation entdeckte ich dann den Hinweis, dass jede Sub deklariert werden müsste. Also habe ich in "OpenFile.Bas", direkt unter die #Include-Anweisungen die Deklaration "Declare SUB FileOpen()" eingetragen.
Jetzt erscheint im Ausgabefenster: "OpenFile.o:fake:(.text+0x52e): undefined reference to `FILEOPEN@0'", ich sitze vor dem Rechenknecht, habe große Fragezeichen im Gesicht und bin mit meinem Latein am Ende.
Was muss ich tun, damit ich die Sub "FileOpen()", auch wenn sie in dem neuen Modul ist, zum Laufen bringe?? Für einen Tip bin ich echt dankbar.
Im Voraus schon mal vielen Dank
FB_RML |
|
Nach oben |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 06.04.2008, 19:09 Titel: |
|
|
Hi und Willkommen in der Community !
Anstatt das Modul über das Dateimenü hinzuzufügen solltest du im Projekt- Explorer Rechtsklicken und dann "Neu hinzufügen > Modul" bzw. "Add new > Module" verwenden.
Ansonsten wird das Modul nicht mitcompiliert. _________________
Zitat: | 1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein. |
|
|
Nach oben |
|
 |
FB_RML
Anmeldungsdatum: 06.04.2008 Beiträge: 4
|
Verfasst am: 06.04.2008, 20:16 Titel: Leider kein Erfolg |
|
|
Wow, ich bin ja echt überrascht über die schnelle Antwort!!! Habe nur mein Abendessen verdrückt und als ich zum Rechenknecht kam, war die Hilfe schon da. Vielen Dank raph ael.
Nur leider bekomme ich jetzt eine andere Fehlermeldung.
Folgendes habe ich gemacht: Das alte Modul gelöscht, danach das Projekt gespeichert, geschlossen und neu aufgerufen. Danach das neue Modul so hinzugefügt, wie von raph ael beschrieben und die Sub "FileOpen()" eingefügt. Das neue Modul war mit gelb hinterlegtem "b" hervorgehoben.
Zunächst bekam ich als Fehlermeldung im Ausgabefenster: "C:\Programme\FreeBASIC\Compiler\bin\win32\ld.exe: DlgOpen.o: No such file: No such file or directory" Welche Datei DlgOpen.o sucht der denn?
Ich habe dann im folgendes gemacht: Markiertes neues Modul mit Rechtsklick im Projekt-Explorer angeklickt - "Auswahl zwischen Modul/Datei umschalten" (ich dachte das könnte helfen).
Jetzt erhalte ich wieder die 'altbekannte' Fehlermeldung "OpenFile.o:fake:(.text+0x52e): undefined reference to `FILEOPEN@0'"
Ich weiß, dass der Fehler meist vor der Kiste sitzt und ich wahrscheinlich grad auf der Leitung - aber kann mir mit bitte jemand davon 'runter helfen?
Nochmals danke
FB_RML |
|
Nach oben |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 06.04.2008, 20:51 Titel: |
|
|
Hi,
das Modul muss auch wirklich ein Modul sein, und die gelbe Hinterlegung ist schon richtig (deshalb heißt es ja modulare Programmierung ). Das die DlgOpen.o nicht gefunden wird ist komisch... Vielleicht liegt ja der Fehler im Quellcode (kann ich mir grad nicht vorstellen) aber poste ihn mal im NoPaste. Oder es ist ein Fehler im Projekt... Öffne die "irgendwas.fbp"- Datei mit einem normalen Editor und poste den Inhalt auch. _________________
Zitat: | 1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein. |
|
|
Nach oben |
|
 |
FB_RML
Anmeldungsdatum: 06.04.2008 Beiträge: 4
|
Verfasst am: 06.04.2008, 22:30 Titel: Problem mit Modul - Quellcode |
|
|
Um das Ganze transparenter zu machen - hier nun der gesamte Quellcode des Projekts, an dem ich rumkaue:
Als Grundlage habe ich das Beispiel "OpenFile", das im Verzeichnis ...\Projects\Samples enthalten ist, verwendet.
Das Modul OpenFile.Bas sieht jetzt so aus:
Code: |
'Pfad = ...\FreeBasic\inc
#Include Once "windows.bi"
#Include Once "win/commdlg.bi"
#Include "OpenFile.bi"
Declare Sub FileOpen()
Declare Function DlgProc(ByVal hWnd As HWND, ByVal uMsg As UINT, ByVal wParam As WPARAM, ByVal lParam As LPARAM) As Integer
'Dialogform anzeigen
hInstance=GetModuleHandle(NULL)
DialogBoxParam(hInstance,Cast(ZString Ptr,IDD_DLG1), NULL, @DlgProc, NULL)
ExitProcess(0)
End
____________________________________________________________
Sub FileOpen()
Dim hWin As HWND
'250000 Zeichen als Leerstring vorgeben (Damit auch ganz viele Dateien ausgewählt werden können
'(überflüssige Leerzeichen werden später wieder entfernt)
Dim As String *250000 strFile = Space(249999)+ Chr(0)
Dim OFN As OpenFileName, RetStr As String, Liste() As String
Dim X As Integer, Y As Integer, Z As Integer
Const szNULL=!"\0"
Const szFilter = "MP3-Dateien (*.mp3)" & szNULL & "*.mp3" & szNULL
With OFN
.lStructSize = SizeOf(OpenFileName)
.hwndOwner = hWin
.hInstance = hInstance
'"Arbeitsplatz" als Ausgangsordner vorgeben - ansprechen über Class ID
.lpstrInitialDir = StrPtr("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")
.lpstrFile = StrPtr(strFile)
.nMaxFile = SizeOf(strFile)
.lpstrFilter = StrPtr(szFilter)
.lpstrTitle = StrPtr(" MP3-Datei auswählen (Mehrfachauswahl möglich)")
'Flags: &H200 = Mehrfachauswahl möglich
' &H4& = Kontrollkästchen "Schreibgeschützt" wird versteckt
' &H80000 = Dialoge des Win-Explorer werden genutzt
.flags = &H200 Or &H4& Or &H80000
End With
If GetOpenFileName(@OFN) Then
Y = 0
ReDim Liste(Y)
RetStr = Trim(strFile)
'Prüfen, ob Chr(0) im Rückgabestring enthalten (wenn ja -> mehrere Dateien markiert)
If InStr(RetStr, Chr(0)) Then
'Mehrere Dateien ausgwählt -> Rückgabestring zerlegen und in Liste aufnehmen (jeder Listen-
'eintrag = eine Datei); WICHTIG: Chr(0) anhängen - letzter Teil wird sonst "vergessen"
RetStr = RetStr & Chr(0)
Do While InStr(RetStr, Chr(0))
X = InStr(RetStr, Chr(0))
Liste(Y) = Left(RetStr, X - 1)
'Rückgabestring um ausgelesenen Teil verkürzen
RetStr = Right(RetStr, Len(RetStr) - X)
Y = Y + 1
ReDim Preserve Liste(Y)
Loop
For X = 1 To Ubound(Liste)
'Liste(0) = Verzeichnis; jeweiliger Dateiname wird mit "\" & Liste(X) angehängt
'MessageBox nur temporär zur Anzeige; Später werden Dateien an die Audiogenie.Dll
'von Stefan Töngi übergeben
MessageBox(hWin, Liste(0) & "\" & Liste(X), "Ausgewählte Datei", 64)
Next
Else
'Nur eine Datei ausgewählt - RetStr enthält kompletten Pfad
MessageBox(hWin, RetStr, "Ausgewählte Datei", 64)
End If
Else
'Nix ausgewählt
MessageBox(hWin, "Keine Dateien ausgewählt", "Keine Auswahl", 48)
End If
End Sub
____________________________________________________________
Function DlgProc(ByVal hWin As HWND, ByVal uMsg As UINT, ByVal wParam As WPARAM, _
ByVal lParam As LPARAM) As Integer
Dim As Long id, Event, x, y
Dim hBtn As HWND
Dim rect As RECT
Dim buff As ZString * 250
Select Case uMsg
Case WM_INITDIALOG
'
Case WM_CLOSE
EndDialog(hWin, 0)
'
Case WM_COMMAND
id=LoWord(wParam)
Event=HiWord(wParam)
Select Case id
Case SF_FileOpen
FileOpen()
'
'
End Select
Case WM_SIZE
'
Case Else
Return FALSE
'
End Select
Return TRUE
End Function
|
____________________________________________________________
Das Modul OpenFile.Bi ist recht kurz:
Code: |
#Define IDD_DLG1 1000
#Define SF_FileOpen 1001
Dim Shared hInstance As HINSTANCE
|
Im Modul OpenFile.Rc ist lediglich die Dialogform "IDD_DLG" mit einer Schalftfläche (Name= SF_FileOpen) enthalten.
Die OpenFile.fbp sieht so aus:
[Project]
Version=2
Description=Open file dialog
Api=fb (FreeBASIC),win (Windows)
Grouping=1
AddMainFiles=1
ResExport=
[Make]
Recompile=0
Module=Module Build,fbc -c
Current=1
1=Windows GUI,fbc -s gui
2=Windows GUI (Debug),fbc -s gui -g
Output=
Run=
[File]
1=OpenFile.Bas
2=OpenFile.Bi
3=OpenFile.Rc
1001=
4=
[FileInfo]
1=0,74,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2=0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
3=0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1001=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
4=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
[ReallyRad]
IDD_DLG1=,,
Wie gesagt: Wenn ich jetzt - auch so, wie es raph ael beschrieben hat ein neues Modul ("DlgOpen.Bas") einfüge und die Sub "FileOpen" von "OpenFile.Bas" nach "DlgOpen.Bas" verschiebe, dann kommt es zu den in meinem ersten und zweiten Beitrag beschriebenen Problemen.
Den Compiler und die IDE habe ich mir vorgestern von freebasic.portal.de heruntergeladen. Den Code habe ich auch in NoPaste eingestellt.
Viele Grüße
FB_RML
PS: Ein kleiner Comment zu raph ael: Dass modulare Progeammierung deshalb modulare Programmierung heißt, weil sie aus Modulen besteht, habe ich mir fast schon gedacht  |
|
Nach oben |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 07.04.2008, 17:30 Titel: |
|
|
Ich bin im Moment mit meinem Latein am Ende .
Ich würde das vielleicht über Includedateien lösen:
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=555
Nicht vergessen: Aus den beiden Moduldateien wieder normale Dateien machen und die "main.bas" als Hauptdatei definieren.
Das sollte den gleichen Zweck erfüllen .
Und weil ichs mir nicht verkneifen kann:
404 - USER NOT FOUND
Der Nutzer "raph ael" wurde nicht gefunden!
Sie sehen diese Fehlernachricht weil:- Sie einen Nutzer aufrufen wollten existiert nicht
- Der Nutzer macht gerade Mittagspause
- Der Nutzer ist anderwertig verhindert
- Der Nutzer weilt nicht mehr unter den Lebenden
Sollten sie dies für eine Fehlfunktion des Servers halten, konaktieren sie den Webmaster unter: webmaster@irgendwo.net _________________
Zitat: | 1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein. |
|
|
Nach oben |
|
 |
FB_RML
Anmeldungsdatum: 06.04.2008 Beiträge: 4
|
Verfasst am: 07.04.2008, 20:29 Titel: Problem mit neuen Modul - beseitigt! |
|
|
Hallo raph ael,
ich habe es so gemacht, wie Du es in Deiner Antwort und unter dem Link auf das FreeBasic-Portal angeregt hast - und es funzt !!!
Nochmals vielen heißen Dank!!
Nur eine Frage drängt sich mir jetzt auf (wie gesagt, ich bin in FreeBasic noch relativ grün hinter den Ohren): Was ist in FreeBasic der Unterschied zwischen der "normalen" Datei und dem Modul (ausser dass ich die "normale" Datei per Include-Anweisung einbinden muss und in FBEdit im Symbol bei der "normalen" Datei das b fehlt), wenn in der Funktionsweise - zumindest für mich - kein Unterschied auszumachen ist?
Viele Grüße
FB_RML |
|
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.
|
|