Page 1 of 2

How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 4:04 pm
by dcr3
Hi. How do I, correctly open a file, on a specific column. In my case column 2.

This doesn't work.

Code: Select all

flg= #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_ScreenCentered
   OpenWindow(0,0,0,240,600,"Open File 2nd Col",flg)
   ButtonGadget(1, 10, 10, 100, 20, "OpenFile1")
   ButtonGadget(2, 130, 10, 100, 20,"OpenFile2")
   ListIconGadget(3, 10, 40, 220, 550,"Col1",110)
   AddGadgetColumn(3, 1, "Col2",140)
   
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      AppQuit = 1
     
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
      Case 1  ;Open File 1 
          
      file1.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
        
      OpenFile(1, file1)
       
      While Eof(1)=0 
      AddGadgetItem(3,-1,ReadString(1))
      Wend     
      CloseFile(1)
      
    Case 2   ;Open File 2
      
      file2.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1) 
        
      OpenFile(2,file2)
     
      While Eof(2)=0   
      AddGadgetItem(3,-1,Chr(10)+ReadString(2)) 
      Wend 
      CloseFile(2)
        
      EndSelect

  EndSelect
Until AppQuit
A quick way to creat a file.
Just make sure, you don't have, the same named files in your Documents.

File1:

Code: Select all

      For x=1 To 30
      Debug "File1 Item "+x
      Next
      ;SaveDebugOutput("C:\Users\dcr3\Documents\File1.txt") 
      SaveDebugOutput("C:\Users\?YourName?\Documents\File1.txt")

File2:

Code: Select all

      For y=1 To 30
      Debug "File2 Item "+y
      Next
      SaveDebugOutput("C:\Users\?UserName?\Documents\File2.txt")


If I do this, it works. But, only if I open a file, in the first column.

Code: Select all

Case 2
file2.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1) 
        
      OpenFile(2,file2)
      i=0
      While Eof(2)=0   
      SetGadgetItemText(3,i,ReadString(2),1)
      i=i+1
      Wend 
      CloseFile(2)
Any :idea: ?

I want to do this, irrespective of which file , I open first.

Re: How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 4:19 pm
by NicTheQuick
Files do not have columns.
If I do this, it works. But, only if I open a file, in the first column.
Please can you try to write a little more understandable English? I totally do not know what you are talking about. Thank you. :-)

Re: How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 4:37 pm
by Papala

Code: Select all

flg= #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_ScreenCentered
   OpenWindow(0,0,0,240,600,"Open File 2nd Col",flg)
   ButtonGadget(1, 10, 10, 100, 20, "OpenFile1")
   ButtonGadget(2, 130, 10, 100, 20,"OpenFile2")
   ListIconGadget(3, 10, 40, 220, 550,"Col1",110)
   AddGadgetColumn(3, 1, "Col2",140)
   
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      AppQuit = 1
     
    Case #PB_Event_Gadget
     
      Select EventGadget()
         
      Case 1  ;Open File 1
         
      file1.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
       
      OpenFile(1, file1)
       
      While Eof(1)=0
      AddGadgetItem(3,-1,ReadString(1))
      Wend     
      CloseFile(1)
     
    Case 2   ;Open File 2
     
      file2.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
       
      OpenFile(2,file2)
      
      While Eof(2)=0   
        If x < CountGadgetItems(3)
          SetGadgetItemText(3,x,GetGadgetItemText(3,x)+Chr(10)+ReadString(2))
        Else          
          AddGadgetItem(3,x,Chr(10)+ReadString(2))
        EndIf
        x+1
      Wend
      CloseFile(2)
       
      EndSelect

  EndSelect
Until AppQuit
Just made it work for open file 1 then file 2... but this is a very ugli code :-/

Re: How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 5:25 pm
by dcr3
Papala. Nice try, but that doesn't work either.

Re: How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 6:01 pm
by Papala
Yeah... it work... Once...
Here is a working routine... if I have well understand what you try to do.

Code: Select all

EnableExplicit

Structure Column
  Col1.s
  Col2.s
EndStructure
Global NewList Datas.Column(), Col1, Col2

Macro FillList(Column)
  If Column
    ChangeCurrentElement(Datas(),Column)
  Else
    If FirstElement(Datas())
      Datas()\Column = ReadString(0)
    EndIf
  EndIf
  Repeat
    If NextElement(Datas()) = 0
      AddElement(Datas())
    EndIf
    Datas()\Column = ReadString(0)
  Until Eof(0)
  Column = @Datas()
EndMacro

Declare ButtonEven()

OpenWindow(0,0,0,240,600,"Open File 2nd Col",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(1,10,10,100,20,"OpenFile1")
ButtonGadget(2,130,10,100,20,"OpenFile2")
ListIconGadget(3,10,40,220,550,"Col1",110)
AddGadgetColumn(3,1,"Col2",140)
BindGadgetEvent(1,@ButtonEven())
BindGadgetEvent(2,@ButtonEven())

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Procedure ButtonEven()
  Protected File$
  File$ = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
  If File$ = ""
    ProcedureReturn #False
  EndIf
  ReadFile(0,File$)
  Select EventGadget()
    Case 1
      FillList(Col1)
    Case 2
      FillList(Col2)
  EndSelect
  CloseFile(0)
  ClearGadgetItems(3)
  ForEach Datas()
    AddGadgetItem(3,-1,Datas()\Col1 + Chr(10) + Datas()\Col2)
  Next
EndProcedure

Re: How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 6:37 pm
by skywalk
As NicTheQuick implied, to interpret columns from a text file, you need to specify the delimiter or compose a custom read procedure. Txt files are random, but CSV files use comma's. xml,json files are more structured.
What are you trying to do?

Re: How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 6:51 pm
by RASHAD
I hope that I understood you correctly

Code: Select all

flg= #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_ScreenCentered
   OpenWindow(0,0,0,240,600,"Open File 2nd Col",flg)
   ButtonGadget(1, 60, 10, 80, 20, "OpenFile1")
   ButtonGadget(2, 150, 10, 80, 20,"OpenFile2")
   ButtonGadget(4, 10, 10, 40, 20,"Reset")
   ListIconGadget(3, 10, 40, 220, 550,"Col1",110,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
   AddGadgetColumn(3, 1, "Col2",140)
   For i = 0 To 100   
      AddGadgetItem(3,-1,"")
   Next
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      AppQuit = 1
     
    Case #PB_Event_Gadget
     
      Select EventGadget()
         
      Case 1  ;Open File 1
         
      file1.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
       item1 = 0
      OpenFile(1, file1)
       
      While Eof(1)=0
        SetGadgetItemText(3,item1,ReadString(1),0)
        item1 + 1
      Wend     
      CloseFile(1)
     
    Case 2   ;Open File 2
     
      file2.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
       item2 = 0
      OpenFile(2,file2)
     
      While Eof(2)=0           
        SetGadgetItemText(3,item2,ReadString(2),1)
        item2 + 1
      Wend
      CloseFile(2)
      
    Case 4
      ClearGadgetItems(3)
      For i = 0 To 100   
        AddGadgetItem(3,-1,"")
      Next
       
      EndSelect

  EndSelect
Until AppQuit

Re: How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 7:47 pm
by dcr3
Both codes do what I want.

Thanks, Rashad. As always. :)


Thansks, Papala. Very nice code. :) :)

Re: How to, correctly open a file, on a specific column.?

Posted: Tue Dec 18, 2018 11:42 pm
by TI-994A
And yet another approach...

Code: Select all

Dim listColumnData.s(30, 1)
#listIconGadgetColumn1 = 0
#listIconGadgetColumn2 = 1
#listIconGadget = 6

Procedure fileRead(forColumn)
  Shared listColumnData()
  file.s = OpenFileRequester("Open File", "", "Text (*.txt)|*.txt", 1)
  If file <> ""
    item = 0 
    ClearGadgetItems(#listIconGadget)
    fileNum = OpenFile(#PB_Any, file)  
    While Not Eof(fileNum)
      listColumnData(item, forColumn) = ReadString(fileNum)    
      AddGadgetItem(#listIconGadget, -1, 
                    listColumnData(item, #listIconGadgetColumn1) + 
                    #LF$ + listColumnData(item, #listIconGadgetColumn2))   
      item + 1
    Wend     
    CloseFile(fileNum)  
  EndIf   
EndProcedure

OpenWindow(0, 0, 0, 300, 660, "Open File 2nd Col",
           #PB_Window_SystemMenu | 
           #PB_Window_MinimizeGadget | 
           #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 135, 20, "Open File1")
ButtonGadget(2, 155, 10, 135, 20, "Open File2")
ButtonGadget(3, 10, 70, 280, 20, "Clear List")
ButtonGadget(4, 10, 40, 135, 20, "Clear Column1")
ButtonGadget(5, 155, 40, 135, 20, "Clear Column2")
ListIconGadget(#listIconGadget, 10, 100, 280, 550, "Column1", 140,
               #PB_ListIcon_GridLines | 
               #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#listIconGadget, 1, "Column2", 140)

Repeat
  Select WaitWindowEvent()      
    Case #PB_Event_CloseWindow
      appQuit = 1      
    Case #PB_Event_Gadget      
      Select EventGadget()                    
        Case 1
          fileRead(#listIconGadgetColumn1)          
        Case 2
          fileRead(#listIconGadgetColumn2)          
        Case 3
          ClearGadgetItems(#listIconGadget)
          FreeArray(listColumnData())
          Dim listColumnData.s(30, 1)
        Case 4, 5
          ClearGadgetItems(#listIconGadget)          
          column = EventGadget() - 4
          For i = 0 To 30
            listColumnData(i, column) = ""
            AddGadgetItem(#listIconGadget, -1, 
                          listColumnData(i, #listIconGadgetColumn1) + 
                          #LF$ + listColumnData(i, #listIconGadgetColumn2))   
          Next i            
      EndSelect      
  EndSelect
Until appQuit

Re: How to, correctly open a file, on a specific column.?

Posted: Wed Dec 19, 2018 5:28 am
by mestnyi
TI-994A wrote:And yet another approach...

Code: Select all

Dim listColumnData.s(30, 1)
#listIconGadgetColumn1 = 0
#listIconGadgetColumn2 = 1
#listIconGadget = 6

Procedure fileRead(forColumn)
  Shared listColumnData()
  file.s = OpenFileRequester("Open File", "", "Text (*.txt)|*.txt", 1)
  If file <> ""
    item = 0 
    ClearGadgetItems(#listIconGadget)
    fileNum = OpenFile(#PB_Any, file)  
    While Not Eof(fileNum)
      listColumnData(item, forColumn) = ReadString(fileNum)    
      AddGadgetItem(#listIconGadget, -1, 
                    listColumnData(item, #listIconGadgetColumn1) + 
                    #LF$ + listColumnData(item, #listIconGadgetColumn2))   
      item + 1
    Wend     
    CloseFile(fileNum)  
  EndIf   
EndProcedure

OpenWindow(0, 0, 0, 300, 660, "Open File 2nd Col",
           #PB_Window_SystemMenu | 
           #PB_Window_MinimizeGadget | 
           #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 135, 20, "Open File1")
ButtonGadget(2, 155, 10, 135, 20, "Open File2")
ButtonGadget(3, 10, 70, 280, 20, "Clear List")
ButtonGadget(4, 10, 40, 135, 20, "Clear Column1")
ButtonGadget(5, 155, 40, 135, 20, "Clear Column2")
ListIconGadget(#listIconGadget, 10, 100, 280, 550, "Column1", 140,
               #PB_ListIcon_GridLines | 
               #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#listIconGadget, 1, "Column2", 140)

Repeat
  Select WaitWindowEvent()      
    Case #PB_Event_CloseWindow
      appQuit = 1      
    Case #PB_Event_Gadget      
      Select EventGadget()                    
        Case 1
          fileRead(#listIconGadgetColumn1)          
        Case 2
          fileRead(#listIconGadgetColumn2)          
        Case 3
          ClearGadgetItems(#listIconGadget)
          FreeArray(listColumnData())
          Dim listColumnData.s(30, 1)
        Case 4, 5
          ClearGadgetItems(#listIconGadget)          
          column = EventGadget() - 4
          For i = 0 To 30
            listColumnData(i, column) = ""
            AddGadgetItem(#listIconGadget, -1, 
                          listColumnData(i, #listIconGadgetColumn1) + 
                          #LF$ + listColumnData(i, #listIconGadgetColumn2))   
          Next i            
      EndSelect      
  EndSelect
Until appQuit

Code: Select all

[07:26:47] Waiting for executable to start...
[07:26:47] Executable type: MacOSX - x64  (64bit, Unicode)
[07:26:47] Executable started.
[07:26:52] [ERROR] Line: 14
[07:26:52] [ERROR] Array index out of bounds.
[07:26:56] The Program was killed.

Re: How to, correctly open a file, on a specific column.?

Posted: Wed Dec 19, 2018 1:13 pm
by TI-994A
mestnyi wrote:

Code: Select all

[07:26:47] Waiting for executable to start...
[07:26:47] Executable type: MacOSX - x64  (64bit, Unicode)
[07:26:47] Executable started.
[07:26:52] [ERROR] Line: 14
[07:26:52] [ERROR] Array index out of bounds.
[07:26:56] The Program was killed.
Tested and working with:
1. PureBasic v5.62 (x64) on Windows 10
2. PureBasic v5.70 LTS b4 (x64) on Windows 10
3. PureBasic v5.46 LTS (x64) on MacOS High Sierra
4. PureBasic v5.62 (x64) on MacOS High Sierra
5. PureBasic v5.70 LTS b4 (x64) on MacOS High Sierra

Re: How to, correctly open a file, on a specific column.?

Posted: Wed Dec 19, 2018 2:30 pm
by dcr3
Thanks. TI-994A for your input. :)

Already tried this. Your code and mine not ideal.

Code: Select all

Procedure ClearColumns(Gadget,Col)

  For x = 0 To CountGadgetItems(Gadget)-1
    SetGadgetItemText(Gadget,x,#Empty$,Col)
  Next
  
EndProcedure


ClearColumns(#ListIcon_1,0)
ClearColumns(#ListIcon_1,1)
Unless someone comes up with a different solution. :!:


My wish for a PB native function:

RemoveGadgetColumnItem(#Gadget,Column,Position). :D :D

Re: How to, correctly open a file, on a specific column.?

Posted: Wed Dec 19, 2018 3:14 pm
by TI-994A
dcr3 wrote:Already tried this...
Constantly zeroing out the list items and overwriting them is not an ideal approach. But the multi-dimensional array circumvents this, by maintaining the values externally. The list is cleared and repopulated, but never zeroed out one cell at a time:

Code: Select all

ClearGadgetItems()
AddGadgetItem()
;SetGadgetItemText() function is never used
Quite a different approach. :wink:
dcr3 wrote:My wish for a PB native function:

Code: Select all

RemoveGadgetColumnItem(#Gadget, Column, Position)
That would merely be an alias function, and easily achievable through a simple macro:

Code: Select all

Macro RemoveGadgetColumnItem(gadget, column, position)
  SetGadgetItemText(gadget, position, "", column)
EndMacro
Your wish is granted! Merry Christmas. :lol:

Re: How to, correctly open a file, on a specific column.?

Posted: Wed Dec 19, 2018 10:58 pm
by dcr3
;My Aproach. :oops:

Code: Select all

Procedure ClearColumns(Gadget,Col)
  For x = 0 To CountGadgetItems(Gadget)-1
    ;SetGadgetItemText(Gadget,x,#Empty$,Col) ;My mistake Thanks for the tip. :) 
    SetGadgetItemText(Gadget,x,"",Col)
  Next
EndProcedure
TI-994A,Your wish for me. :lol:

Code: Select all

Macro RemoveGadgetColumnItem(gadget, column, position)
  SetGadgetItemText(gadget, position, "", column)
EndMacro
Below what I wished for,Based on RemoveGadgetItem(#Gadget, Position).

Code: Select all

FLG= #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered
    OpenWindow(0, 0, 0, 220, 450, "",FLG)
    ButtonGadget(1, 10, 10, 100, 20, "FillList")
    ButtonGadget(2, 110, 10, 100, 20, "RemoveItem")
    ListIconGadget(3, 10, 40, 200, 370, "Column1", 140)
    AddGadgetColumn(3, 1, "Column2", 140)
    TextGadget(4, 10, 420, 95, 20, "", #PB_Text_Border)
    TextGadget(5, 120, 420, 95, 20, "", #PB_Text_Border)
  Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      AppQuit = 1 
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case 1   ;FillList
          For x=1 To 20
          AddGadgetItem(3,-1,text$+x+Chr(10)+x)
          Next
          SetGadgetText(4,t$+"TotalItems "+t$+CountGadgetItems(3))
          SetGadgetText(5,t$+"TotalItems "+t$+CountGadgetItems(3))
		  
        Case 2   ;RemoveGadgetColumnItems
		
          For y=CountGadgetItems(3) To 0 Step-1
           RemoveGadgetItem(3,y)
		   
          ;Based on RemoveGadgetItem(#Gadget, Position)
		   
         ;My wish: RemoveGadgetColumnItem(#Gadget, Column, Position) :D  :D  :D 
           ;RemoveGadgetColumnItem(3,0,y); Column1 :D  :D 
           ;RemoveGadgetColumnItem(3,1,y); Column2 :D  :D 
         ;Therefore TI-994A, you haven't granted me anything. :cry: 

         Next
		 
         SetGadgetText(4,t$+"RemainingItems "+t$+CountGadgetItems(3))
         SetGadgetText(5,t$+"RemainingItems "+t$+CountGadgetItems(3))
      EndSelect

  EndSelect
Until AppQuit

Re: How to, correctly open a file, on a specific column.?

Posted: Thu Dec 20, 2018 12:14 am
by RASHAD
Hi
- Remove item row,col
- Add item row,col,text
And maybe more who knows :P

Code: Select all

Global NewList a$(),NewList b$()

Procedure removeitem(row,col)
  If col = 0
    item1 = 0
    ResetList(a$())
    *Result  = SelectElement(a$(), row)
    ChangeCurrentElement(a$(), *Result)
    DeleteElement(a$())
    ResetList(a$())
    While NextElement(a$())
      SetGadgetItemText(3,item1,a$(),0)
      item1 + 1
    Wend    
  Else
    item2 = 0
    ResetList(a$())
    *Result  = SelectElement(b$(), row)
    ChangeCurrentElement(a$(), *Result)
    DeleteElement(b$())
    ResetList(b$())
    While NextElement(b$())
      SetGadgetItemText(3,item2,a$(),1)
      item2 + 1
    Wend
  EndIf
EndProcedure

Procedure additem(row,col,text$)
  If col = 0
    item1 = 0
    ResetList(a$())
    *Result  = SelectElement(a$(), row)
    ChangeCurrentElement(a$(), *Result)
    InsertElement(a$())
    a$() = text$
    ResetList(a$())
    While NextElement(a$())
      SetGadgetItemText(3,item1,a$(),0)
      item1 + 1
    Wend    
  Else
    item2 = 0
    *Result  = SelectElement(b$(), row)
    ChangeCurrentElement(b$(), *Result)
    InsertElement(b$())
    b$() = text$
    ResetList(b$())
    While NextElement(b$())
      SetGadgetItemText(3,item2,b$(),1)
      item2 + 1
    Wend
  EndIf
EndProcedure

flg= #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_ScreenCentered
   OpenWindow(0,0,0,240,600,"Open File 2nd Col",flg)
   ButtonGadget(1, 10, 10, 80, 20, "OpenFile1")
   ButtonGadget(2, 150, 10, 80, 20,"OpenFile2")
   ButtonGadget(4, 10, 40, 80, 20,"Remove 5,0")
   ButtonGadget(5, 140, 40, 90, 20,"Add 3,1,RASHAD")
   ListIconGadget(3, 10, 70, 220, 520,"Col1",95,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
   AddGadgetColumn(3, 1, "Col2",95)
   For i = 0 To 100   
      AddGadgetItem(3,-1,"")
   Next
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      AppQuit = 1
     
    Case #PB_Event_Gadget
     
      Select EventGadget()
         
      Case 1  ;Open File 1
         
      file1.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
      item1 = 0
      OpenFile(1, file1)       
      While Eof(1) = 0
        AddElement(a$())
        a$() = ReadString(1)
      Wend
      CloseFile(1)
      ResetList(a$())
      While NextElement(a$())
        SetGadgetItemText(3,item1,a$(),0)
        item1 + 1
      Wend     
      
     
    Case 2   ;Open File 2     
      file2.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
      item2 = 0
      OpenFile(2,file2)     
      While Eof(2)=0           
        AddElement(b$())
        b$() = ReadString(2)
      Wend
      CloseFile(2)
      ResetList(b$())
      While NextElement(b$())
        SetGadgetItemText(3,item2,b$(),1)
        item2 + 1
      Wend    
     
    Case 4
      removeitem(5,0)
      
    Case 5
      additem(3,1,"RASHAD")
       
      EndSelect

  EndSelect
Until AppQuit