FileInfos in Statusbar anzeigen

Anfängerfragen zum Programmieren mit PureBasic.
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

FileInfos in Statusbar anzeigen

Beitrag von PureNoob »

Hi Leute,

ich habe heute mal mit der StatusBar experimentiert und wollte in der StatusBar den Auszug aus einer Datei anzeigen lassen.

Die Datei heisst Upgrade.txt und befindet sich im Verzeichnis C:\Games\
In der Datei steht dann folgender Text:

Code: Alles auswählen

Bei diesem Spiel handelt es sich um die Version 1.1.4 ..... usw. usw.
Es soll nun in der StatusBar genau der Bereich "Version 1.1.4" aus der Datei Upgrade.txt angezeigt werden.

Ich habe jetzt mal meinen Code angehängt, damit Ihr euch ein besseres Bild von dem Schnipsel machen könnt. Da wo "Version:" steht, soll dann die Zahl 1.1.4 hinter.

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 440, 50, "StatusBar", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(160)
      AddStatusBarField(130)
    EndIf

    StatusBarText(0, 0, "Copyright 2007 by PureNoob", #PB_StatusBar_BorderLess)
    StatusBarText(0, 1, "Version:", #PB_StatusBar_BorderLess)
    
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Könnt Ihr mir da helfen?

MFG

PureNoob
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: FileInfos in Statusbar anzeigen

Beitrag von Kiffi »

PureNoob hat geschrieben:Da wo "Version:" steht, soll dann die Zahl 1.1.4 hinter.
dann rufst Du StatusBarText() einfach noch mal mit dem geänderten Text auf:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 440, 50, "StatusBar", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
  
  CreateGadgetList(WindowID(0))
  
  ButtonGadget(1, 5, 5, 200, 20, "Statusbartext ändern")
  
  If CreateStatusBar(0, WindowID(0))
    AddStatusBarField(160)
    AddStatusBarField(130)
  EndIf
  
  StatusBarText(0, 0, "Copyright 2007 by PureNoob", #PB_StatusBar_BorderLess)
  StatusBarText(0, 1, "Version:", #PB_StatusBar_BorderLess)
  
  
  Repeat

    WWE=WaitWindowEvent()
    
    Select WWE
      
      Case #PB_Event_Gadget
        
        Select EventGadget()
          
          Case 1 ; Button gedrückt
            
            StatusBarText(0, 1, "Version: 1.1.4", #PB_StatusBar_BorderLess)
            
        EndSelect
      
    EndSelect
    
  Until WWE = #PB_Event_CloseWindow
  
EndIf
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Du musst die Datei öffnen, und die entsprechende Zeile auslesen in einen String. Jetzt nimmst du dir aus dem String die spezifischen Informationen. Wie du das machst hängt von den Informationen ab:

-> sind die Informationen immer gleich gegliedert? (Ab dem 25ten Buchstaben steht immer die Versionnummer, die wiederum 4 Stellig ist)
-> Gibt es signifikante Hinweise, wo welche Information steht? (Komma/Tab-Trennung, Versionnummer in Klammern etc)

Wenn du zB wüsstest, dass die Versionnummer immer in den letzten 7 Bytes dieser Zeile steht, ließt du die aktuelle Zeile ein, und dann schneidest du die relevanten 7 Bytes von rechts aus, und packst sie in eine Stringvariable:
>sCurrentVersion.s zum Beispiel.

Beim Anzeigen addierst du den String den du am Anfang haben möchtest ("Version:") mit dem Neuen String, in dem die Version steht.
>sStatusBarAnzeige.s = "Version:" + sCurrentVersion.

Anzeigen geht genau wie du es jetzt auch schon machst:
>StatusBarText(0, 1, "Version:", #PB_StatusBar_BorderLess)
wird zu
>>StatusBarText(0, 1, sStatusBarAnzeige, #PB_StatusBar_BorderLess)

Gr33tz
Tafkadasom2k5
(der hiermit die Anderen bittet, nicht sofort fertigen Code auszuspucken, uk sich dem Ziel langsam zu nähern. Nen fertige Code kann ich auch ausspucken- ist sogar schon fertig ;) )
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Dafür eignet sich doch eigentlich sehr gut die Preference Abteilung von PB

Code: Alles auswählen

Procedure VersionsAnzeige(StatusBar.l, StatusBarFeld.l, Flags.l, Filename.s)

  OpenPreferences(Filename.s)

    StatusBarText(StatusBar.l, StatusBarFeld.l, "Version:" + ReadPreferenceString("Version","DefaultVersion"),Flags.l)
  
  ClosePreferences()
  
EndProcedure 

;##### Beispielaufruf

VersionsAnzeige(0,1,#PB_StatusBar_BorderLess,"C:\Games\Upgrade.txt")

Musst natürlich mit CreatePreferences() vorher das File angelegt haben ;)


So kannst du in die Upgrade.txt noch jede Menge andere Daten schreiben
und musst nicht das komplette File einlesen und alles einzelnd "parsen".
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

String auslesen

Beitrag von PureNoob »

Hallo Leute,

ich habe mir jetzt nach meinem wissen folgenden Code zurechtgebastelt:

Code: Alles auswählen

ReadFile(1, "C:\Games\Upgrade.txt")
    While Eof(1) = 0
      Code$+ReadString(1)+Chr(10)
    Wend
  Code$ = Right(Code$, Len(Code$)-FindString(Code$, "Version", 0)+1)
  Code$ = Left(Code$, FindString(Code$, "für den Digi-Runner", 0))
  CreateFile(2, "C:\Games\version.txt")
  WriteString(2, Code$)
  CloseFile(2)
  End
Mit diesem müsste es doch möglich sein, den gewünschten String, also die "1.1.4" auszulesen und diese dann in die version.txt zu schreiben oder?

Das ganze soll ja dann sozusagen in der Statusleiste nach "Version:" ausgegeben werden. Kann ich da nicht den Code$ direkt in der Statusbar anzeigen lassen statt erst eine version.txt zu erstellen? So zum Bleistift?

Code: Alles auswählen

StatusBarText(0, 1, "Version:" + Code$ , #PB_StatusBar_BorderLess)
Und weil ich ja keine Ahnung habe wo ich das ganze einfügen muss, wäre eine genaue ortsangabe schon hilfreich. Muss das ganze jetzt in die Procedure Open Window rein? Oder wohin? Ich bin ratlos.

Gruss PureNoob
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Mit diesem müsste es doch möglich sein, den gewünschten String, also die
"1.1.4" auszulesen und diese dann in die version.txt zu schreiben oder?
Ja, allerdings solltest du noch ein " CloseFile(1) " einbauen... sonst ist das
Datei-Handle immer vergeben ;)
Naja... wenn Du die Versionsnummer immer im Programm änderst,
vor dem kompilieren, dann brauchst du nie nich irgendwie ein Version.txt ;)
Und weil ich ja keine Ahnung habe wo ich das ganze einfügen muss, wäre
eine genaue ortsangabe schon hilfreich. Muss das ganze jetzt in die
Procedure Open Window rein? Oder wohin?
Wenn Du es nur einmal brauchst (beim Programmstart z.B.) dann kann
das in die Open_Window Procedure rein...

Ansonsten muss das Fenster geöffnet sein und schon ist es egal, wo du

Code: Alles auswählen

StatusBarText(0, 1, "Version:" + Code$ , #PB_StatusBar_BorderLess)
einbaust.

Ich bin ratlos.
:lol: Nun ja nicht mehr... Bist ja von allein drauf gekommen ;) (m.o.w <) )
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

Weisses Fenster und Programmcrash

Beitrag von PureNoob »

Hallo Bisonte,

ich habe den Code jetzt geändert und in die Procedure Open Window eingebettet siehe hier:

Code: Alles auswählen

Procedure Open_Window_0()
If OpenWindow(#Window_0, 216, 0, 660, 440, "Testprogramm", #PB_Window_SystemMenu | #PB_Window_TitleBar )
      ReadFile(1, "C:\Games\Upgrade.txt")
    While Eof(1) = 0
      Code$+ReadString(1)+Chr(10)
    Wend
  Code$ = Right(Code$, Len(Code$)-FindString(Code$, "Version", 0)+1)
  Code$ = Left(Code$, FindString(Code$, "für den Digi-Runner", 0))
  CreateFile(1, "C:\version.txt")
  WriteString(1, Code$)
  CloseFile(1)
  CreateStatusBar(#StatusBar_0, WindowID(#Window_0))
  AddStatusBarField(160)
  StatusBarText(0, 1, "Version:" + Code$ , #PB_StatusBar_BorderLess) 
Nur leider bringt mir das Programm beim laufen nur ein graues Fenster und der Rest wird dann weiss und ich kann das Programm nur über den TaskManager schliessen.

Weisst du warum das passiert?

Gruss PureNoob
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

also wenn das die komplette Procedure sein soll... Chaos ;)

Ich gehe mal davon aus, das eine C:\Upgrade.txt existiert, daher macht es
wenig Sinn,sie erst einzulesen und im gleichem Atemzug wieder mit genau
demselben Wert wieder zu schreiben.

aber da steckt noch mehr Fehler drin ;)

Code: Alles auswählen

      ReadFile(1, "C:\Games\Upgrade.txt")
    While Eof(1) = 0
      Code$+ReadString(1)+Chr(10)
    Wend
  Code$ = Right(Code$, Len(Code$)-FindString(Code$, "Version", 0)+1)
  Code$ = Left(Code$, FindString(Code$, "für den Digi-Runner", 0))
  CreateFile(1, "C:\version.txt")
  WriteString(1, Code$)
  CloseFile(1) 
sollte besser :

Code: Alles auswählen

If ReadFile(1, "C:\Games\Upgrade.txt")
   
  While Eof(1) = 0
    Code$=ReadString(1)
    Code$ = Right(Code$, Len(Code$)-FindString(Code$, "Version", 0)+1)
    Code$ = Left(Code$, FindString(Code$, "für den Digi-Runner", 0))    
  Wend

  CloseFile(1) 

EndIf
Man sollte immer schön brav Fehlerquellen ausmerzen, daher IF READFILE usw.
Die Code$ auswertung muss innerhalb der While-Wend-Schleife passieren,
sonst wird nur die allerletzte Zeile deines Upgrade.txt gelesen.
Ich weiss ja nicht wie das Textfile aufgebaut ist, aber eigentlich braucht man
kein CHR(10) da das PB selbst erkennen sollte, wann die Zeile beendet ist.


Aber Warum dein Programm "wegsemmelt" kann ich dir höchstens sagen,
wenn ich das komplette Listing zu sehen kriege.

Edit:

Wenn du an der "ich habe einen Beschreibungstext und er soll mir die
Versionsnummer rausfiltern" Strategie festhalten willst :

Code: Alles auswählen

Procedure.s Version()
  If ReadFile(1,"C:\Games\Upgrade.txt")
    While Eof(1)=0
      code$=ReadString(1)
      Position=FindString(code$,"Version",1)
      If Position>0
          code$=Mid(code$, Position + Len("Version ") ,5)
          Break
      EndIf
    Wend
    CloseFile(1)
  EndIf
ProcedureReturn code$
EndProcedure
und dann in der Open_Windows Procedure

Code: Alles auswählen

StatusBarText(0, 1, "Version: " + Version(), #PB_StatusBar_BorderLess)
Damit kannst du dann ein Upgrade.txt verfassen, das wie eine Readme
aufgebaut ist und beim erstenmal wenn das Wort Version aufkreuzt, wie diese
genommen. Wobei du dann drauf achten solltest, das die Versionsnummer
immer aus der gleichen Anzahl an Zeichen besteht.
Also in deinem Bsp. "1.1.4"=5 ansonsten einfach die MIDFunktion ändern.
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

Verzeichnispfad aus vorheriger Eingabe auslesen

Beitrag von PureNoob »

Hallo Bisonte,

ich habe Deinen Code mal übernommen und es funktionierte solange ich den Quellpfad manuell eingab. Installierte ich das Spiel aber auf D: statt auf C: zeigte er mir keine Angaben mehr in der Statusleiste an. Ich habe hier mal etwas zusammengeschustert, wie ich es gerne hätte. Vielleicht kannst du mir ja sagen, wo mein Fehler liegt.

Procedure.s Version()
If ReadFile(1, Hier soll dann aus einen Textfeld das mittels Path$ seinen Wert zugewiesen bekam, z.B. #Text_3 der Pfad ausgelesen werden und mit dem "Upgrade.txt" zusammengesetzt werden, damit auch bei einer Installation auf D: oder E: immer die richtige Datei gefunden wird.)
While Eof(1)=0
code$=ReadString(1)
Position=FindString(code$," Patch",1)
If Position>0
code$=Mid(code$, Position + Len("Version") ,5)
Break
EndIf
Wend
CloseFile(1)
EndIf
ProcedureReturn code$
EndProcedure


Danke. PureNoob
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Code: Alles auswählen

 Procedure.s Version(Pfad.s)

If Readfile(1,Pfad)
Das wars schon...

nun wenn du die Procedure aufrufst... übergibst du einfach
Version(GetGadgetText(#Text_3)+"Upgrade.txt")

wobei dann in Text_3 nur noch der Pfad stehen muss z.B. "D:/"

Einfach mal F1 drücken und bei Proceduren bei Übergabeparameter
nachschauen....

Ich z.B. mache bei der Installation einen Registryschlüssel wo ich den Installpfad
des Programms ablege. und dann lese ich im Prg den Schlüssel aus und
kann nach lust und laune den pfad verwerten ;)
Antworten