Includepath-Befehl und Variablen
Includepath-Befehl und Variablen
Für alle, die mich kennen, ich bin jetzt mit der Erstellung meines User Interfaces ziemlich weit gekommen, nicht zuletzt dank der Tipps von TS-Soft und Edel gestern abend. Obgleich ich es eigentlich vermeiden wollte, wegen jedem Katzenkirmes die Forumsfeuerwehr zu rufen, stehe ich doch jetzt vor einem Hindernis, das ich trotz intensiven Nachforschens (google: includepath mit variablen site:http://www.purebasic.fr/german u.ä. Varianten) nicht überwinden kann.
In meinem Original Visual Basic Projekt habe ich es so gehandhabt, dass ich beim ersten Start des Programms den Nutzer des Progs gefragt habe, unter welchem Pfad denn das Prog gespeichert sei. Dies habe ich in einer Txt-Datei unter C: konserviert. Danach griff das Programm immer auf diese Datei zurück und speicherte den Stammpfad in der Variable sPpfad. Damit wollte ich das vermaledeite Hartcodieren und das damit verbundene Umschreiben von dutzenden Zeilen Code vermeiden, das erforderlich wäre, wenn die Pfadangaben im "Originalformat" im Code enthalten sind und es zu einem Wechsel des Speicherortes des Progs kommt. Nun habe ich das wie gewohnt auch bei PB einprogrammiert und was müssen meine überraschten Augen sehen: Der Includepath-Befehl lässt anscheinend keine (String-)Variablen zu. Und ich lager grundsätzlich fast alles mit includefile aus, das ist bei der Größe meines Projekts auch nicht anders machbar, sonst hab ich völlig unlesbaren Spaghetticode (bei VB geschah das mit Modulen oder Classmodulen). Jetzt hab ich mittelschwere Panik, dass ich tatsächlich alle Pfadangaben hartcodieren muss, dann fang ich an zu saufen......
In meinem Original Visual Basic Projekt habe ich es so gehandhabt, dass ich beim ersten Start des Programms den Nutzer des Progs gefragt habe, unter welchem Pfad denn das Prog gespeichert sei. Dies habe ich in einer Txt-Datei unter C: konserviert. Danach griff das Programm immer auf diese Datei zurück und speicherte den Stammpfad in der Variable sPpfad. Damit wollte ich das vermaledeite Hartcodieren und das damit verbundene Umschreiben von dutzenden Zeilen Code vermeiden, das erforderlich wäre, wenn die Pfadangaben im "Originalformat" im Code enthalten sind und es zu einem Wechsel des Speicherortes des Progs kommt. Nun habe ich das wie gewohnt auch bei PB einprogrammiert und was müssen meine überraschten Augen sehen: Der Includepath-Befehl lässt anscheinend keine (String-)Variablen zu. Und ich lager grundsätzlich fast alles mit includefile aus, das ist bei der Größe meines Projekts auch nicht anders machbar, sonst hab ich völlig unlesbaren Spaghetticode (bei VB geschah das mit Modulen oder Classmodulen). Jetzt hab ich mittelschwere Panik, dass ich tatsächlich alle Pfadangaben hartcodieren muss, dann fang ich an zu saufen......
Wenn die dicke Frau klatscht, ist die Oper zu Ende
Du darfst Variablen aus dem Grund nicht benutzen, weil der IncludePath-Befehl zur Compilezeit ausgewertet wird (denn zu diesem Zeitpunkt benötigt er ja die Includes), Variablen jedoch zur Laufzeit (also während das eigentliche Programm läuft, sprich, längst kompiliert ist).
Du mußt also Konstanten benutzen. Einfach ein # vor den "Variablennamen", und schon ist es eine Konstante. Diese wird bereits zur Compilezeit verwendet, da sie sich ja sowieso nicht mehr ändern werden.
Du mußt also Konstanten benutzen. Einfach ein # vor den "Variablennamen", und schon ist es eine Konstante. Diese wird bereits zur Compilezeit verwendet, da sie sich ja sowieso nicht mehr ändern werden.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Re: Includepath-Befehl und Variablen
Includepath ist keine Befehl, sondern sagt nur dem Compiler wo du deine Includedateien drin hast, damit du relative Pfadangaben verwenden kannst.Palandt hat geschrieben:... beim ersten Start des Programms den Nutzer des Progs gefragt habe, unter welchem Pfad denn das Prog gespeichert sei. ...
... Der Includepath-Befehl lässt anscheinend keine (String-)Variablen zu. ...
Das gibst im Fertigen Programm gar nicht mehr. Wenn du den Speicherort deines Programms ermitteln wills würde ich Folgendes nehmen:
Code: Alles auswählen
AppPath.s = GetPathPart(ProgramFilename())
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Ich glaub, ich bin zu hohl....iudex non calculat...
...ich poste mal den Code-Ausschnitt:
Und schon kommt eine Welle von Fehlermeldungen dergestalt, dass dieser Konstantentyp nicht mit einer Variablen gemischt werden dürfe. Wie soll ich das denn anstellen?
Achso, vielen Dank erstmal für die schnelle Antwort, ich sehs hier beinahe schon als Selbstverständlichkeit an...auch nicht gut....

Code: Alles auswählen
;Pfadangabe auslesen
If ReadFile(0,"C:\Pfadangabe_QM.txt")
Global sPfad.s = ReadString(0)
CloseFile(0)
Else
MessageRequester ("Hinweis","Du musst erst das Programm ErsterStart_Pfadeingabe starten!",0)
EndIf
; [A.] Includes
#sIncludePfad = sPfad + "Includes"
IncludePath sIncludePfad
Achso, vielen Dank erstmal für die schnelle Antwort, ich sehs hier beinahe schon als Selbstverständlichkeit an...auch nicht gut....

Wenn die dicke Frau klatscht, ist die Oper zu Ende
Code: Alles auswählen
#sIncludePfad = sPfad + "Includes"
Konstanten dürfen keine Variablen Werte enthalten.
Mach lieber eine Globale Variable:
Code: Alles auswählen
Global sIncludePath.s = sPfad + "Includes\"
Sonst kann man das mit einer Datei ohne Endung verwechseln.
// Edit:
Ich nehme jetzt mal an das du ein Programm erstellst und und deinem Programm andere Daten beilegs im Ordner "Include". Damit du relative Pfadangaben verwenden kannst musst du SetCurrentDirectory() verwenden.
Code: Alles auswählen
SetCurrentDirectory(sIncludePath)
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Du hast recht, erstgenannter Befehl (GetPath) erspart mir ja lediglich die umständliche Abfrage des Speicherortes, aber mit der SetCurrentDirectory-Anweisung bin ich jetzt da, wo ich ich hinwollte. Vielen Dank! Und ja, ich lagere über include das gesamte User-Interface aus (windows, gadgets, menus, images etc.), die Datenbankarchitektur und eigens kreeierte Prozeduren, zur Erledigung immer wieder anfallender Sachen (die meisten kann ich mit geringem Aufwand von VB nach PB "konvertieren"); ein kleines Beispiel, das zwar programmiertechnisch in der Vorschule angesiedelt, trotzdem dem Prog einen eigenen Flair gibt:
Das Image ist ein relativ aufwendig gestaltes Bild: da siehst du dann einen schmächtig drein blickenden Typen, der sich vor Scham nur auf die Füße blickt; mach auch n bisserl Graphikdesign; kommt dann ganz witzig rüber, wenn du dann als Errormessage eingibst: "Sie sollten sich was schämen, ein falsches Laufwerk anzugeben, pfui deibel!"
Weiss nur noch nicht, wie ich die Textlabels hier transparent kriege - ging bei VB ganz einfach, aber das kommt auch noch.
Bin halt ziemlich faul, was ich einmal geschrieben hab, und von dem ich glaube, es häufiger benutzen zu können, das wird prozedual ausgelagert; damit ich dann nicht völlig kirre werde, wenn ich mal ne zeitlang nichts an dem Prog gemacht hab, versuche ich das Ganze so übersichtlich und nachvollziehbar wie möglich zu gestalten.
Code: Alles auswählen
Procedure Error (Errormessage.s)
If OpenWindow(#Window_Error, 306, 104, 500, 375, "FEHLER", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_Error))
TextGadget(#Text_Error, 210, 165, 270, 180, "Es ist folgender Fehler aufgetreten: "+Errormessage)
ImageGadget(#Image_Error, 0, 0, 500, 375, ImageError)
EndIf
EndIf
EndProcedure

Bin halt ziemlich faul, was ich einmal geschrieben hab, und von dem ich glaube, es häufiger benutzen zu können, das wird prozedual ausgelagert; damit ich dann nicht völlig kirre werde, wenn ich mal ne zeitlang nichts an dem Prog gemacht hab, versuche ich das Ganze so übersichtlich und nachvollziehbar wie möglich zu gestalten.
Wenn die dicke Frau klatscht, ist die Oper zu Ende
Freud mich das ich dir helfen konnte.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86