Sign in to follow this  
Followers 0
dewcansam

DriveGetDrive() and _ArrayDelete()

10 posts in this topic

#1 ·  Posted (edited)

I started out trying to make a function to read USB drives to array to generate a Combo or List box control. 

I followed this post '?do=embed' frameborder='0' data-embedContent>>

Did not really like the way they did things, but i realized that i did not need to make an array to generate the items in a Combo or List box control. 

The question is this: This is the function that I did come up with. But I really wanted to return the array with only the 'Fixed' and 'Removable' drive items. My code reflects the _ArrayDelete() call commented out. If you un-comment it the function returns an error saying the subscript is out-of-bounds. And that makes sense because _ArrayDelete() removes a element and so the array is really one less then it started out to be. Since the For loop started out with X elements and now it is X-1. So, what can be done to fix this ?? I thought that the answer lies somewhere in creating a new array and stores the elements that you want to keep in the new array and returns that array (if that makes sense). 

Code (working code that returns string):

#comments-start
/***********************************************************************
@name   function  getUsbDrives

vers:   0.03
date:   2014-10-28 19:25:08
created on:   2014-10-14 22:28:22
created by:   Christopher L. Smith

gets all drives then removes anything that is not of type 'fixed' or of
type 'removable' then returns a string formated for a GUICtrlCreateList
or GUICtrlCreateCombo.

@return string      formated for List / Combo controls

@access public
***********************************************************************/
#comments-end
Func getUsbDrives()
    Local $drv = DriveGetDrive("all");used $drv because $drives and $drive were getting hard to distinguish
    Local $rtn

    If @error Then
        MsgBox(4096, "DriveGetDrive", "It appears an error occurred.")
    Else
        For $i = 1 To $drv[0]
            ;;; loops through the drives and finds only 'Fixed' or 'Removable'
            If DriveGetType($drv[$i]) = "Fixed" Or DriveGetType($drv[$i]) = "Removable" Then
                ;;; and then gets rid of the local drive.
                If Not ($drv[$i] = "c:") Then
                    ;;; returns array of drives (could not get it to work)
                    ;_ArrayDelete( $drv ,$i)
                    ;;; returns string formated for List / Combo controls
                    $rtn &= $drv[$i] & '|'
                EndIf
            EndIf
        Next
    EndIf
    Return $rtn
EndFunc   ;==>getUsbDrives

comment out the "$rtn &= $drv[$i] & '|'" line (34) and un-comment the "_ArrayDelete( $drv ,$i)" line (32) to get the error that I am referring to. 

Edited by dewcansam

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Use _ArrayDel() on-the-fly or iterate a loop and delete an item of the same array... Not good for me.
I always use @error immediately after the function. I never let anything between function and @error.

Nowadays, I avoid using nested conditionals (before I used a lot).
Those are my practices.

Maybe this?

#include <Array.au3>

Local $var = getUsbDrives()
_ArrayDisplay($var)

Func getUsbDrives()
    Local $aDel[1]
    Local $aDrives = DriveGetDrive("all")
    If @error Then
        MsgBox(4096, "DriveGetDrive", "It appears an error occurred.")
    Else
        For $ii = 1 To $aDrives[0]
            Switch DriveGetType($aDrives[$ii])
                Case "Fixed", "Removable"
                    If Not ($aDrives[$ii] == @HomeDrive) Then _ArrayAdd($aDel, $ii)
            EndSwitch
        Next
        For $ii = 1 To UBound($aDel, 1) - 1
            _ArrayDelete($aDrives, $aDel[$ii])
        Next
    EndIf
    If UBound($aDel, 1) Then _ArrayDelete($aDrives, 0)
    Return $aDrives
EndFunc   ;==>getUsbDrives
Edited by Detefon

m(o.O)m

Share this post


Link to post
Share on other sites

When deleting things from an array, loop through the array in reverse.

So instead of:

For $i = 1 To $drv[0]

Use this:

For $i = $drv[0] To 1 Step -1

This way whatever you delete will always be above the next number in the loop.

1 person likes this

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

Good idea. Would not have thought of that. I will try it out it in a bit. Thanks.

Share this post


Link to post
Share on other sites

I never try with reverse iteration... Hummmmmm....


m(o.O)m

Share this post


Link to post
Share on other sites

I never try with reverse iteration... Hummmmmm....

Yeah, I was thinking more along the lines of what you displayed. Where you created a new array, populated it with what you were keeping then rewrote the original array. 

Share this post


Link to post
Share on other sites

 

I avoid using nested conditionals (before I used a lot).

Yeah, I did NOT like the nested conditions either. Could not think of a cleaner way. Thanks for the point out.

What exactly do you mean by

I always use @error immediately after the function. I never let anything between function and @error.

 

Could you clear that up a little bit.

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

Yes!  :thumbsup:

I see you use this...

Local $drv = DriveGetDrive("all");used $drv because $drives and $drive were getting hard to distinguish
Local $rtn
If @error Then

You left a "Local $rtn" between "Local $drv..." and "If @error..."

I use this

 Local $rtn
 Local $drv = DriveGetDrive("all");used $drv because $drives and $drive were getting hard to distinguish
 If @error Then

Nothing between "The function" and "The @error"... I see in the Help File, Logal, Global Or Dim not return @error (this is not the case).

But I don't like this.

If was another function can return set an @error? Possible a false @error or not!

Use @error is very good.

Regards, Detefon

obs: @dewcansam, I have this topics in my favorites and always consult:

Edited by Detefon

m(o.O)m

Share this post


Link to post
Share on other sites

#9 ·  Posted (edited)

 

I use this

 Local $rtn
 Local $drv = DriveGetDrive("all");used $drv because $drives and $drive were getting hard to distinguish
 If @error Then

Nothing between "The function" and "The @error"... I see in the Help File, Logal, Global Or Dim not return @error (this is not the case).

 

Ohhhhh. I got ya.  :graduated:

And nice point out on the coding practices. Will have to try to implement some of them. 

Edited by dewcansam

Share this post


Link to post
Share on other sites

I would also argue that it's best to declare and assign when required, i.e. lowest scope possible.

I see I need to update the wiki at some point.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0