; ; *** BEFORE USING - MAKE A FILE CALLED 'TEXT.TXT' ON THE C DRIVE AND WRITE A FEW RANDOM LINES OF TEXT WITH NOTEPAD *** ; TYPES OF VARIALBES ; Global means it can be used anywhere - omiting this means it's local ; the main variable types you will need are .a .s .i ('i' is automatic if not specified) ; **YOU ALWAYS DEFINE YOUR GLOBAL VARIABLES AT THE TOP TO AVOID CONFUSION** ; EXAMPLES ; NOTE: We won't use all of these variables in our code below - some are just examples. #THE_FILENAME = "C:\text.txt" ; this is a constant text string - constants are described later Global TheNumber = 1000 ; this is automatically an integer (for big numbers) by default because there's no '.i' period after it Global PushedButton.a = #False ; '.a' after means this uses 1 byte (either for true/false or for numbers 0 - 255). it's the smallest unit available Global TheText.s = "This is some text" ; you use '.s' to denote a text string variable ; AN ARRAY Global Dim TheTextLines.s(10, 10) ; this defines a 2D matrix (a.k.a. array) 10 by 10 of text strings ; how to use it TheTextLines(1, 1) = "thing" ; now position 1 by 1 equals 'thing'. you can also use 0 by 0 if you want. most things start at zero. Global Dim RealLines.s(0) ; this one is also an array, but with one dimension. it's zero because the size will be defined later - we don't know how much space we need yet ; LOCALS ; if you write a var without using global in front, it'll automatically be local TheTest.a = #True HappyFrank.s = "happy to be" ; EXAMPLES OF PROCEDURES ; these get called in your code below to use them - like 'LoadSomeText()'. it's used as if it's a built in command in the language. Procedure LoadSomeText() This_Is_A_Variable.a = 50 ; a local variable with a size of 1 byte - can store 0 to 255. it can't be used outside this procedure. ; you may use underscore or capitalization in your variable names, just NO SPACES. TheText = "this is some new text" ; this one we can access/change in here cause it's Global. we couldn't use HappyFrank in here though (we 'could', but it would be a new var that's cleared.) ; put whatever code you want in here EndProcedure ; these procs don't return anything. if it were to return something, you'd write 'Procedure.i' or 'Procedure.a' for example. SEE BELOW at the next procedure. Procedure AnotherProc() ; more stuff would go in here EndProcedure ; this proc will count the number of lines in a text file ; we need to use this below, you'll see ; FileNumber is a default '.i' that we pass into the procedure like a command parameter. Procedure.i CountFileLines(FileNumber) ; on a procedure '.i' should be defined if the proc is to return a value. it means this proc will return an integer number, but it could be any of the types. Lines = 0 ; automagically an integer cause no '.' after it Repeat Lines + 1 ; in PB (unlike other langs), we don't say 'Lines = Lines + 1' or 'Lines++' - it's more clear IMO. ReadString(FileNumber) Until Eof(FileNumber) = #True ; Eof means 'End Of File', so this loop repeats until the end of file has been reached. Lines - 1 ; we get one extra blank line at the bottom of the file, so -1 to ignore it FileSeek(FileNumber, 0) ; this sets our reading pointer back to the top of the file, so we can later start reading from the begining again. ProcedureReturn Lines EndProcedure ; MACROS ; macros are simply procs that are basically pasted in place of your code (where ever you write its name) ; whereas procs actually get referenced and the code jumps into it ; so if you use a long macro too often, it will bloat your code because it's pasting copies of it everywhere - in that case, use a procedure ; they are generally used to just make your code look better and more understandable below Macro BeginingOfFile() FileSeek(0, 0) EndMacro ; ANYTHING OUTSIDE OF/BELOW YOUR PROCS AND VARIABLE DECLARATIONS, IS THE MAIN ENTRY POINT OF YOUR PROGRAM ; so this is where the program starts executing. ; For example: This_Is_A_Variable - will not work here because it is local to the procedure called LoadSomeText() If ReadFile(0, #THE_FILENAME) ; opens this text file as file number zero. if you were to open more files, you'd put one, etc. if you are done and CloseFile(0), then you can re-use zero again. ; we count the number of lines in the file so that we know how big to make the array (1D matrix) Lines = CountFileLines(0) ; Lines = the integer returned by using our procedure above Dim RealLines.s(Lines) ; this is the array we defined above as 'Global' with a size of zero. we are now re-dimensioning it to the size in the variable 'Lines' For CurrentLine = 0 To Lines RealLines(CurrentLine) = ReadString(0) ; we read each line from the file and assign it to its proper position in the array Next BeginingOfFile() ; go back to the begining so we can do it again with a different example. the macro code is pasted here behind the scenes. #GOODLY_FILE = 0 ; this is an example of a constant. it's denoted with a hashtag. it's a pre-defined variable that can never change at run-time. ; you could use this constant instead of writing '0' for your file number everywhere. it's just to make your code more readable. ; Example: OpenFile(#GOODLY_FILE, "B:\text.txt") .... Lines = CountFileLines(#GOODLY_FILE) #ANOTHER_FILE = 1 ; if you know your numbers will always be in order... (in some instances you want constants with numbers out of order) ; you can use an Enumeration and that will automatically number them in order Enumeration ; enumerations are convenient because sometimes, you might want to remove an item from the list and not have to change all the following numbers to be in order. #FIRST_FILE ; they don't need to be capitalized, but this is the main convention #SECOND_FILE #THIRD_FILE EndEnumeration ; enumerations are very important when dealing with windows and their containing objects (gadgets in PB)... ; so you don't have to remember the object numbers AND can also insert more objects without changing all the subsequent ones. ; here is another way to read the lines that's much simpler and doesn't use a procedure like CountFileLines, but it's far slower Lines = 0 Repeat RealLines(Lines) = ReadString(#GOODLY_FILE) Lines + 1 ReDim RealLines.s(Lines) ; we are using ReDim here, instead of Dim. ReDim resizes the array and preserves its contents. ; so instead of counting the file lines first, we just resize the array once on each loop - slower and junky. to resize and preserve, the system... ; has to reallocate a new slightly larger chunk of ram and then copy the contents from the old array into the new larger memory space. ; use it sparingly and only when there is absolutely no way to determine the size of something beforehand like we did above. Until Eof(#GOODLY_FILE) = #True Lines - 1 CloseFile(#GOODLY_FILE) ; display the lines For DisplayLine = 0 To Lines MessageRequester(TheText, RealLines(DisplayLine)) ; this shows each line of the array we read in a MessageBox (the term used in mainstream languages). Next Else MessageRequester(HappyFrank, "The file '" + #THE_FILENAME + "' could not be opened!", #PB_MessageRequester_Error) ; this is the same as MessageBox in VB. EndIf