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

Visit my repository

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....


Visit my repository

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

Visit my repository

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