Seite 1 von 1

Includepath-Befehl und Variablen

Verfasst: 26.09.2008 16:10
von Palandt
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......

Verfasst: 26.09.2008 16:16
von ZeHa
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.

Re: Includepath-Befehl und Variablen

Verfasst: 26.09.2008 16:17
von cxAlex
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. ...
Includepath ist keine Befehl, sondern sagt nur dem Compiler wo du deine Includedateien drin hast, damit du relative Pfadangaben verwenden kannst.
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())

Verfasst: 26.09.2008 16:26
von Palandt
Ich glaub, ich bin zu hohl....iudex non calculat...:)...ich poste mal den Code-Ausschnitt:

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

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....:)

Verfasst: 26.09.2008 16:29
von Palandt
Sauber cxAlex, das hab ich gesucht. Besten Dank!

Verfasst: 26.09.2008 16:59
von cxAlex

Code: Alles auswählen

#sIncludePfad = sPfad + "Includes" 
In dieser Zeile steckt der Fehler:

Konstanten dürfen keine Variablen Werte enthalten.
Mach lieber eine Globale Variable:

Code: Alles auswählen

Global sIncludePath.s = sPfad + "Includes\"
PS: Ich würde Pfade prinzipiel immer mit "\" am Ende speichern.
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)

Verfasst: 26.09.2008 17:45
von Palandt
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:

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

Verfasst: 26.09.2008 18:25
von cxAlex
Freud mich das ich dir helfen konnte.