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:

Probleme mit neuem Modul

 
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
FB_RML



Anmeldungsdatum: 06.04.2008
Beiträge: 4

BeitragVerfasst am: 06.04.2008, 18:54    Titel: Probleme mit neuem Modul Antworten mit Zitat

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. lächeln
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. weinen
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
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 06.04.2008, 19:09    Titel: Antworten mit Zitat

Hi und Willkommen in der Community lächeln !
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
FB_RML



Anmeldungsdatum: 06.04.2008
Beiträge: 4

BeitragVerfasst am: 06.04.2008, 20:16    Titel: Leider kein Erfolg Antworten mit Zitat

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. mit dem Kopf durch die Mauer wollen
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
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 06.04.2008, 20:51    Titel: Antworten mit Zitat

Hi,
das Modul muss auch wirklich ein Modul sein, und die gelbe Hinterlegung ist schon richtig (deshalb heißt es ja modulare Programmierung zwinkern ). 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
FB_RML



Anmeldungsdatum: 06.04.2008
Beiträge: 4

BeitragVerfasst am: 06.04.2008, 22:30    Titel: Problem mit Modul - Quellcode Antworten mit Zitat

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 grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 07.04.2008, 17:30    Titel: Antworten mit Zitat

Ich bin im Moment mit meinem Latein am Ende verwundert .
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 lächeln .

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
FB_RML



Anmeldungsdatum: 06.04.2008
Beiträge: 4

BeitragVerfasst am: 07.04.2008, 20:29    Titel: Problem mit neuen Modul - beseitigt! Antworten mit Zitat

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 !!! happy

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
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