<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        color:black;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
tt
        {mso-style-priority:99;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:black;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        color:black;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
span.EmailStyle23
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle24
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body bgcolor=white lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span style='color:windowtext'>Thank you very much for explaining all this!!   I really don’t know what I would do without the helpful people here!<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'>I didn’t know there was something like </span><span style='color:windowtext'>IncludeTrailingPathDelimiter, wow that sure is useful!   I have a LOT of places I need to make sure I stick in the trailing \ and this function will really help clean up a lot of that mess!</span><span style='color:windowtext'><o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'>I did not realize </span>Open_File.lpstrFile was working like a pointer to Ret…  knowing that makes things make more sense!  I thought setting Open_File.lpstrFile:=Ret was just a way to initialize it, not that it was actually a pointer to Ret.<o:p></o:p></p><p class=MsoNormal>Should I just never use Open_File.lpstrFile except to set it to Ret (which I will probably rename to make it more clear that THAT is the real location of all my file name data)<o:p></o:p></p><p class=MsoNormal>So in other words do <o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Repeat<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            String_List.add(StrPas(Ret[Position_of_Filename]));<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            inc(Position_of_Filename,length(String_List[String_List.Count-1])+1);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Until Ret[Position_of_Filename]=#0;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'>The reason I made those variables global is because I set the initial ones in the main program loop… no real reason for doing that other than I thought it might help my crash issues if I wasn’t constantly creating and destroying those variables.  It does seem like a good idea to initialize every time so I’ll move all that into the function.<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'>I’ve incorporated the recommended changes and still have a few problems.<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Here is my updated sample program.  I renamed Ret to Open_File_Buffer and I am only using that variable after Open_File.lpstrFile:=Open_File_Buffer;  my problems still show up only if I try to set a default file with </span><span style='color:windowtext'>Open_File_Buffer:=Pchar(Target_File+#0+#0); </span><span style='color:windowtext'>  I’m not sure if I am doing this right.  It seems to put it in there but then if I select more than one file, it returns a False, and I also get crashes occasionally as well.  </span><span style='color:windowtext'>Open_File.lpstrInitialDir seems to work better but it only works if I do not try to set a default file name.  sometimes want a default file name, sometimes I do not, but I always want to set the initial directory, so I would like to learn the proper way to achieve both of these.<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Thank you again for the help and the great suggestions!   It’s very much appreciated.</span><span style='color:windowtext'><o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><div><p class=MsoNormal><span style='color:windowtext'>James<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:windowtext'>{$mode objfpc}{$H+}<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>//   https://docs.microsoft.com/en-us/windows/desktop/api/commdlg/nf-commdlg-getopenfilenamea<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>//   https://docs.microsoft.com/en-us/windows/desktop/api/commdlg/ns-commdlg-tagofna<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Uses<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>  sysutils,Windows,Commdlg,Classes,CRT;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Var<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>File_Num           : Word;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Target_File        : AnsiString;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>File_Stringlist    : tstringList;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>{=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=}<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Procedure Display_File_StringList(Var Display_String_List:tStringList);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Var<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>  SL_Loop : Word;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   If Display_String_List.Count=0 then<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Textcolor(12);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Writeln('0 Files Selected')<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      End<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Else<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   If Display_String_List.Count=1 then<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         TextColor(10);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Writeln(Display_String_List[0]);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Textcolor(14);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Writeln('1 Files Selected');<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      End<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Else<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         TextColor(13);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Writeln('Path for all files: ',Display_String_List[0]);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         TextColor(10);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         For SL_Loop:= 1 to Display_String_List.Count-1 Do<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            Writeln('File #',SL_Loop,': ',Display_String_List[SL_Loop]);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Textcolor(14);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Writeln(Display_String_List.Count-1,' Files Selected');<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      End;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>End;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>{=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=}<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Function Get_Files_Into_Stringlist(Var String_List:tStringList):Boolean;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Var<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File_Result      : Boolean;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Position_of_Filename  : Word;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File             : TOpenFileNameA;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File_Buffer      : array[0..100000] of char;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   String_List.Clear;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   fillchar(Open_File, sizeof(Open_File), 0);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   fillchar(Open_File_Buffer, sizeof(Open_File_Buffer), 0);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File.lStructSize:=sizeof(Open_File);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File.lpstrFile:=Open_File_Buffer;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File.nMaxFile:=SizeOf(Open_File_Buffer);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File.hwndOwner:=0;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File.Flags := OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_ALLOWMULTISELECT;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File.lpstrDefExt:='.txt';<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File.lpstrTitle:='My Program - Open File';<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File.lpstrFilter:='All Files (*.*)'+#0+'*.*'+#0;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   If Target_File<>'' then<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>       Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          // The line below makes GetOpenFileNameA return with False if I select more than one file.<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          // It also causes the following occasionally:<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          // An unhandled exception occurred at $00401B5A:<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          // EAccessViolation: Access violation<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          // $00401B5A  GET_FILES_INTO_STRINGLIST,  line 66 of i:/programming/gcode/test/getfilenamea to stringlist.pas<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          // $00401E60  main,  line 99 of i:/programming/gcode/test/getfilenamea to stringlist.pas<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          Open_File_Buffer:=Pchar(Target_File+#0+#0);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          //If the line below is un commmented, it selects multiple files from the correct directory, but only if the line above is commented out<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>          //Open_File.lpstrInitialDir:=Pchar(ExtractFilePath(Paramstr(1))+#0+#0);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>       End;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Open_File_Result:=GetOpenFileNameA(@Open_File);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   If Open_File_Result then<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Position_of_Filename:=0;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Repeat<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            String_List.add(StrPas(@Open_File_Buffer[Position_of_Filename]));<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            inc(Position_of_Filename,length(String_List[String_List.Count-1])+1);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Until Open_File_Buffer[Position_of_Filename]=#0;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      End;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Writeln(Open_File_Result);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Get_Files_Into_Stringlist:=Open_File_Result;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>End;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>{=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=}<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Procedure Process_File(Some_File: AnsiString);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   TextColor(11);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Writeln('Processing File: ',Some_File);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>End;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>{=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=}<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>Begin {Main Program}<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   File_Stringlist:=TStringlist.Create;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   If paramstr(1)<>'' then<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Target_File:=paramstr(1);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Process_File(Target_File);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      End<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   else<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Target_File:='';<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Repeat<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Get_Files_Into_Stringlist(File_Stringlist);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Display_File_StringList(File_Stringlist);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      If (File_Stringlist.Count=1) and FileExists(File_Stringlist[0]) Then<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            Target_File:=File_Stringlist[0];<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            Process_File(Target_File);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         End<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      Else<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>      If (File_Stringlist.Count>1) Then<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         Begin<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            Target_File:=IncludeTrailingPathDelimiter(File_Stringlist[0]);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>            for file_num:=1 to File_Stringlist.count-1 do<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>               Process_File(Target_File+File_Stringlist[File_Num]);<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>         End;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   Until File_Stringlist.count=0;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>   File_Stringlist.Free;<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>end.<o:p></o:p></span></p><p class=MsoNormal><span style='color:windowtext'>{=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=}<o:p></o:p></span></p></div></div></body></html>