[ ERLEDIGT ] txt Datei einlesen, kürzen & verteilen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

[ ERLEDIGT ] txt Datei einlesen, kürzen & verteilen

Beitrag von udg »

Ich probiere mich zzT an einem kleinen Tool, welches eine Text Datei auslesen soll und mir die untereinander stehenden Zeilen in verschiedene StringGadget verteilen.

Die StringGadgets sind in der Text Datei pro Zeile bestimmt worden und sollen entsprechend dem Tool pro Gadget mit einem klick auf den Button zugeordnet werden.

meine Text Datei (bilder_links.txt) sieht wie folgt aus:

Code: Alles auswählen

StringGadgetPicture1=C:\Users\mich\Pictures\lokal.png
StringGadgetPicture2=C:\Users\mich\Pictures\eifel.png
StringGadgetPicture3=C:\Users\mich\Pictures\caffee.png
StringGadgetPicture4=C:\Users\mich\Pictures\maler.png
StringGadgetPicture5=C:\Users\mich\Pictures\noise.png
damit ich nun den kompletten Link nach dem "=" in das entsprechende StringGadget laden kann habe ich pro Zeile eine Kennung angelegt die genau so heißt, wie das StringGatget im Tool.

Der Link hinter dem "=" von "StringGadgetPicture1" soll nun im Tool auch in das richtige StringGadget, "#Picture1 usw" geladen und angezeigt werden.
Also müsste ich pro Zeile den Cursor 21 Zeichen nach rechts rücken, damit meine "sogenannte Kennungsvariable" aus der Text Datei nicht mit angezeigt wird?

Leider habe ich nicht das richtige in der Hilfe gefunden was mir weiter hilft. Ich kann den Button klicken und es lädt den Inhalt der ersten kompletten Zeile in das erste StringGadget, "#Picture1".

Wie muss man vorgehen um die richtige Zeile der Text Datei, dem richtigen StringGadget zuzuordnen? Bin seit paar Stunden schon Ratlos. Habe leider auch durch suchen nichts gefunden, da ich nicht recht weiß, was genau ich suchen muss.

Hier eine abgespeckter Tool Code:

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

;{ Gadgets
Enumeration
  #Picture1
  #Picture2
  #Picture3
  #Picture4
  #Picture5
  #btn_load_links
  #Text_1
  #Text_2
  #Text_3
  #Text_4
  #Text_5
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu


Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 478, 221, 400, 396, "test", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    
      StringGadget(#Picture1, 35, 45, 330, 30, "")
      StringGadget(#Picture2, 35, 105, 330, 30, "")
      StringGadget(#Picture3, 35, 165, 330, 30, "")
      StringGadget(#Picture4, 35, 225, 330, 30, "")
      StringGadget(#Picture5, 35, 285, 330, 30, "")
      ButtonGadget(#btn_load_links, 35, 335, 330, 45, "add Links from TXT File")
      TextGadget(#Text_1, 35, 30, 50, 15, "Bild 1")
      TextGadget(#Text_2, 35, 90, 50, 15, "Bild 2")
      TextGadget(#Text_3, 35, 150, 50, 15, "Bild 3")
      TextGadget(#Text_4, 35, 210, 50, 15, "Bild 4")
      TextGadget(#Text_5, 35, 270, 50, 15, "Bild 5")
    
  EndIf
EndProcedure

OpenWindow_Window_0()

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      ;- Lade Links in Link-Slots aus TxT-Datei
       If EventGadget = #btn_load_links
          If ReadFile(1, "Link_Dateien\bilder_links.txt")
             LinkContent$ = ReadString(1,#PB_Relative)
             CloseFile(1)
          EndIf
             SetGadgetText(#Picture1, LinkContent$)
       EndIf      
       
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        End
      EndIf
  EndSelect           
ForEver
Bild


Danke fürs lesen.
Zuletzt geändert von udg am 02.03.2016 22:49, insgesamt 1-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: [ Frage ] txt Datei einlesen, kürzen & verteilen

Beitrag von mhs »

Das einfachste wäre, wenn du in deiner Textdatei gleich die richtigen Konstantennamen der Gadgets (#Picture1, ...) schreibst, dann kannst du 1:1 mit Runtimevariablen arbeiten. Wenn das nicht geht, muss du an der Stelle den Namen mit z.B. StringField oder Right, Mid, etc auftrennen.

So könnte das dann z.B. aussehen:

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

;{ Gadgets
Runtime Enumeration
  #Picture1
  #Picture2
  #Picture3
  #Picture4
  #Picture5
  #btn_load_links
  #Text_1
  #Text_2
  #Text_3
  #Text_4
  #Text_5
EndEnumeration
;}
Define.i Event, EventWindow, EventGadget, EventType, EventMenu    ; Integer statt Long


Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 478, 221, 400, 396, "test", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
   
      StringGadget(#Picture1, 35, 45, 330, 30, "")
      StringGadget(#Picture2, 35, 105, 330, 30, "")
      StringGadget(#Picture3, 35, 165, 330, 30, "")
      StringGadget(#Picture4, 35, 225, 330, 30, "")
      StringGadget(#Picture5, 35, 285, 330, 30, "")
      ButtonGadget(#btn_load_links, 35, 335, 330, 45, "add Links from TXT File")
      TextGadget(#Text_1, 35, 30, 50, 15, "Bild 1")
      TextGadget(#Text_2, 35, 90, 50, 15, "Bild 2")
      TextGadget(#Text_3, 35, 150, 50, 15, "Bild 3")
      TextGadget(#Text_4, 35, 210, 50, 15, "Bild 4")
      TextGadget(#Text_5, 35, 270, 50, 15, "Bild 5")
   
  EndIf
EndProcedure

OpenWindow_Window_0()

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
     
      ;- Lade Links in Link-Slots aus TxT-Datei
      If EventGadget = #btn_load_links
       
        Define.i Id
        Define.s Line, Name, Value
        
        If Not ReadFile(1, "Link_Dateien\bilder_links.txt")
          Continue
        EndIf
        
        While Not Eof(1)
        
          Line = ReadString(1)
        
          Name  = StringField(Line, 1, "=")
          Value = StringField(Line, 2, "=")
          
          If Not IsRuntime(Name) : Continue : EndIf

          Id = GetRuntimeInteger(Name)
          
          SetGadgetText(Id, Value)
        
        Wend
        
        CloseFile(1)

       EndIf     
       
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        End
      EndIf
  EndSelect           
ForEver

Code: Alles auswählen

#Picture1=C:\Users\mich\Pictures\lokal.png
#Picture2=C:\Users\mich\Pictures\eifel.png
#Picture3=C:\Users\mich\Pictures\caffee.png
#Picture4=C:\Users\mich\Pictures\maler.png
#Picture5=C:\Users\mich\Pictures\noise.png
Noch einfacher wäre es, wenn du statt der Textdatei auf z.B. eine Preferencedatei setzt (falls du die Textdatei selber erzeugst!).
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [ Frage ] txt Datei einlesen, kürzen & verteilen

Beitrag von udg »

Danke für deine ausführliche Erklärung und dem Beispiel. Meine Textdatei Lese ich mit einem Tool aus, dass ein Verzeichnis scant und den File inhalt in eine TxT Datei speichert. Diese soll dann vom, siehe Beispiel (Tool) weiter verarbeitet werden.

wo erfahre ich mehr zu "Runtime Enumeration" ? Worin genau besteht der Unterschied zwischen Runtime Enumeration und normalem Enumeration?

Dein Beispiel erklärt soweit alles das ich es nachvollziehen kann. Leider konnte ich vor meiner Anfrage keinen Ansatz finden.
Passt nun super.

Bild

Nochmals VIELEN DANK
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: [ Frage ] txt Datei einlesen, kürzen & verteilen

Beitrag von mhs »

udg hat geschrieben:wo erfahre ich mehr zu "Runtime Enumeration" ? Worin genau besteht der Unterschied zwischen Runtime Enumeration und normalem Enumeration?
Na in der Hilfe im Bereich Runtime :allright:

Also hier:
http://www.purebasic.com/documentation/ ... ntime.html
und hier:
http://www.purebasic.com/documentation/ ... index.html

Der Unterschied besteht darin, dass beim Kompilieren die Namen der Konstanten, Variablen, Funktionen, etc im Executable gespeichert werden (was normalerweise nicht der Fall ist) und du durch die Runtime Funktionen in Verbindungung mit dem Namen darauf Zugriff hast.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [ ERLEDIGT ] txt Datei einlesen, kürzen & verteilen

Beitrag von udg »

Ich habe die Hilfe letzte Nacht durchgequält aber nichts finden können. Von Runtime wusste ich nichts aber das ist natürlich für meinen Fall genau das Richtige.
Sehr nice. :allright:

Danke Dir
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: [ ERLEDIGT ] txt Datei einlesen, kürzen & verteilen

Beitrag von PureLust »

Hi udg,

kleine Frage: Ist die Anzahl der StringGadgets() immer gleich (also immer 5) oder kann/soll die auch mal variieren?

Greetz, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [ ERLEDIGT ] txt Datei einlesen, kürzen & verteilen

Beitrag von udg »

Hallo,
Nein es handelt sich hier im Forum nur um eine abgespeckte Version. Im eigentlichen Tool variieren die StringGadgets in der Anzahl. Zzt. benutzt ich 22. Ausserdem habe ich zusätzlich noch einen OpenFile Dialog eingebunden das man eine Datei auch selber wählen kann, ohne das die Txt Datei an einem bestimmten Ort sein muss, damit das Tool sie findet.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: [ ERLEDIGT ] txt Datei einlesen, kürzen & verteilen

Beitrag von PureLust »

Ich könnte mir vorstellen, dass das Fenster mit 22 StringGadgets() ziemlich lang ist.
Und wie wird das erst, wenn Du mal hunderte von Bildern auflisten möchtest?

Wäre da nicht evtl. eine Liste mit Hilfe eines ListIconGadget() sinnvoller?
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [ ERLEDIGT ] txt Datei einlesen, kürzen & verteilen

Beitrag von udg »

PureLust hat geschrieben:Ich könnte mir vorstellen, dass das Fenster mit 22 StringGadgets() ziemlich lang ist.
Und wie wird das erst, wenn Du mal hunderte von Bildern auflisten möchtest?

Wäre da nicht evtl. eine Liste mit Hilfe eines ListIconGadget() sinnvoller?
Im Moment sind 22 Gadgets ausreichend. Sollte es mehr werden schaue ich mir "ListIconGadget" an. Dann muss ich nicht jeden Slot einzeln angeben.
Danke für den Tipp
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten