請教VB高手preserve的用法

時間 2022-07-26 04:52:08

1樓:匿名使用者

redim 語句用來定義或重定義原來已經用帶空圓括號(沒有維數下標)的 private、public 或 dim 語句宣告過的動態陣列的大小。

可以使用 redim 語句反覆地改變陣列的元素以及維數的數目,但是不能在將乙個陣列定義為某種資料型別之後,再使用 redim 將該陣列改為其它資料型別,除非是 variant 所包含的陣列。如果該陣列確實是包含在某個 variant 中,且沒有使用 preserve 關鍵字,則可以使用 as type 子句來改變其元素的型別,但在使用了此關鍵字的情況下,是不允許改變任何資料型別的。

如果使用了 preserve 關鍵字,就只能重定義陣列最末維的大小,且根本不能改變維數的數目。例如,如果陣列就是一維的,則可以重定義該維的大小,因為它是最末維,也是僅有的一維。不過,如果陣列是二維或更多維時,則只有改變其最末維才能同時仍保留陣列中的內容。

下面的示例介紹了如何在為已有的動態陣列增加其最末維大小的同時而不清除其中所含的任何資料。

redim x(10, 10, 10)

. . .

redim preserve x(10, 10, 15)

同樣地,在使用 preserve 時,只能通過改變上界來改變陣列的大小;改變下界則會導致錯誤。

如果將陣列改小,則被刪除的元素中的資料就會丟失。如果按位址將陣列傳遞給某個過程,那麼不要在該過程內重定義該陣列的各維的大小。

在初始化變數時,數值變數被初始化為 0,變長的字串被初始化為乙個零長度的字串 (""),而定長的字串則用 0 填充。variant 變數被初始化為 empty。使用者自定義型別的變數的每個元素作為各自獨立的變數進行初始化。

在使用引用物件的變數之前,必須使用 set 語句將乙個已有的物件賦給該變數。在被賦值之前,所宣告的物件變數有乙個特定值 nothing,這個值表示該變數沒有指向任何物件的例項。

小心 如果 redim 語句所使用的變數在模組級別或過程級別不存在,則該語句就相當於乙個宣告語句。如果此後在乙個更廣的範圍內又建立了同名的變數,即使使用了 option explicit,redim 也將使用後宣告的這個變數,且不會導致編譯錯誤。為了避免這種衝突,就不應把 redim 作為宣告語句使用,而只應作為重定義陣列大小的語句。

注意 要改變 variant 所包含的陣列的大小,必須在試圖改變其陣列大小之前顯式宣告該 variant 變數。

保留動態陣列的內容

每次執行 redim 語句時,當前儲存在陣列中的值都會全部丟失。visual basi 重新將陣列元素的值置為 empty(對 variant 陣列)、置為 0(對 numeric 陣列)、置為 零長度字串(對 string 陣列)或者置為 nothing(對於物件的陣列)。

在為新資料準備陣列,或者要縮減陣列大小以節省記憶體時,這樣做是非常有用的。有時希望改變陣列大小又不丟失陣列中的資料。使用具有 preserve 關鍵字的 redim 語句就可做到這點。

例如,使用 ubound 函式引用上界,使陣列擴大、增加乙個元素,而現有元素的值並未丟失:

redim preserve dynarray (ubound (dynarray) + 1)

在用 preserve 關鍵字時,只能改變多維陣列中最後一維的上界;如果改變了其它維或最後一維的下界,那麼執行時就會出錯。所以可這樣程式設計:

redim preserve matrix (10, ubound (matrix, 2) + 1)

而不可這樣程式設計:

redim preserve matrix (ubound (matrix, 1) + 1, 10)

2樓:呼嚕

摘自微軟的msdn:

visual basic

visual basic 語言參考

redim 語句 (visual basic)

更新:2007 年 11 月

為陣列變數重新分配儲存空間。

redim [ preserve ] name(boundlist) [ , name(boundlist) [, ... ] ]

各部分說明

preserve

可選項。修飾符,當僅更改最後乙個維度的大小時,用來保留現有陣列中的資料。

name

必選。陣列變數的名稱。請參見已宣告元素的名稱。

boundlist

必選。列出重新定義的陣列各個維度的界限。

備註可以使用redim語句來更改某個已宣告陣列的乙個或多個維度的大小。如果有乙個較大的陣列,並且您不再需要它的某些元素,redim可通過減小陣列大小來釋放記憶體。另一方面,如果**確定某個陣列需要更多元素,redim也可以新增它們。

redim語句僅適用於陣列。它在標量(只包含單一值的變數)、集合或結構上是無效的。請注意,如果將變數宣告為採用array型別,redim語句將沒有足夠的型別資訊來建立新陣列。

僅可以在過程級使用redim。這意味著,變數的「宣告上下文」必須是過程,而不能是原始檔、命名空間、介面、類、結構、模組或塊。有關更多資訊,請參見宣告上下文和預設訪問級別。

規則· 修飾符。只能指定preserve修飾符,並且,如果這樣做,就不能省略redim關鍵字。

· 多個變數。可以在同一宣告語句中調整多個陣列變數的大小,同時為每個變數指定name和boundlist部分。以逗號分隔多個變數。

· 陣列界限。boundlist中的各個條目可指定該維度的下限和上限。不管是否指定,下限總是為零。

上限是該上標的最大可能值,而不是維度的長度(即上限加 1)。每個上標都可能在零到其上限值之間變動。

boundlist中維度的數量必須與陣列的原始秩匹配。

· 空陣列。可以使用 -1 來宣告陣列維度的上限。這表示陣列為空,但不是nothing (visual basic)。

有關更多資訊,請參見如何:建立不含任何元素的陣列。然而,visual basic **不能成功訪問此類陣列。

如果試圖這樣做,則在執行期間會發生 indexoutofrangeexception 錯誤。

· 資料型別。redim語句無法更改陣列變數或其元素的資料型別。

· 初始化。redim語句無法為陣列元素提供新的初始化值。

· 秩。redim語句無法更改陣列的秩(維數)。

· 使用 preserve 調整大小。如果使用preserve,則只能調整陣列最後乙個維度的大小,對於其他每個維度,您必須指定它在現有陣列中已經具有的相同界限。

例如,如果陣列只有一維,而可以調整該維度的大小並依然保留陣列的所有內容,因為您更改的是最後乙個並且唯一的維度。然而,如果陣列具有兩個或多個維度,則如果使用preserve將僅可以更改最後維度的大小。

· 屬性。可以在容納值陣列的屬性上使用redim。

行為· 陣列替換。redim釋放現有陣列並且建立具有相同秩的新陣列。新陣列將替換陣列變數中已釋放的陣列。

· 不使用 preserve 初始化。如果未指定preserve,redim會將新陣列的元素初始化為它們資料型別的預設值。

· 使用 preserve 初始化。如果指定preserve修飾符,visual basic 會將這些元素從現有陣列複製到新陣列。

示例下面的示例將增加某個動態陣列最後乙個維度的大小(不會丟失陣列中的任何現有資料),然後減小該大小(會有部分資料丟失)。最後,它會將大小重新減小到其原始值,並重新初始化所有陣列元素。

visual basic

dim intarray(10, 10, 10) asinteger

redim preserve intarray(10, 10, 20)

redim preserve intarray(10, 10, 15)

redim intarray(10, 10, 10)

第乙個redim將建立乙個新陣列,該陣列將替換變數intarray中的現有陣列。redim會將所有元素從現有陣列複製到新陣列。它還會在每一層中每個行的結尾另外新增 10 列,並將這些新列中的元素初始化為 0(陣列元素型別integer的預設值)。

第二個redim建立另乙個新陣列,複製所有適合的元素。然而,每一層的每一行的結尾丟失了 5 列。如果不再使用這些欄,丟失將不成問題。減小大型陣列的大小能夠釋放不再需要的記憶體。

第三個redim仍然建立另乙個新陣列,同時從每一層中每個行的結尾移除另外 5 列。這一次它不會複製任何現有元素。這樣即會將陣列恢復為其原始大小,並將它的所有元素還原為它們的原始預設值。

請參見任務

如何:建立不含任何元素的陣列

概念redim 語句(針對 visual basic 6.0 使用者)

陣列大小宣告(針對 visual basic 6.0 使用者)

參考const 語句 (visual basic)

dim 語句 (visual basic)

erase 語句 (visual basic)

nothing (visual basic)

indexoutofrangeexception

vb高手請進,請教vb問題

因為你定義的 adodc1和2 路徑不是form2,和form3的路徑,我認為你應該定義乙個公共模組來存放路徑,未找到方法或資料成員 很可能是路徑根本沒連上。定義公共模組如下 public sub main provider path 生詞庫。mdb persist security info fa...

vb問題,請教高手幫忙

得將form1的keypreview屬性改為true,或者寫在form load裡 option explicit private sub form load me.keypreview true 這個別忘了 form1.scale 100,100 100,100 text1.fontname 黑體...

vb問題,請教高手!解釋下面程式結果的原因

輸出結果 falsetrue 前面幾個都是輸出這個字元的ascii值,最後兩個是判斷這兩個字元的ascii大小,如果符合條件就顯示true,不符合就顯示false,順便說說,你的最後乙個print裡的語句是錯的,少了 明白你問的什麼問題。把sendkeys true 按 alt f4 關閉計算器。這...

請教幾個vb的問題,請教VB乙個陣列複製的問題

第乙個和第二個你可以自己用程式實驗,第三個是呼叫windows的通用對話方塊的列子。呼叫通用對話方塊來開啟檔案,寫入資料,最後再刪除檔案。請教vb乙個陣列複製的問題 如果你用的是的話,那有乙個相當簡單的方法來完成陣列複製操作。即使用中提供的動態陣列增強功能。它的使用也很簡單,首先是宣告陣列,然後是直...

請教一道vb題,請教一道vb的程式設計題!!

太睏了,直接用if語句給你 if ch1.check true thentext1.text 學習程式設計 end if if ch2.check true then end if if ch1.check true and ch2.check true then end if if ch1.che...