1. 程式人生 > >Delphi 修改文字框中內容

Delphi 修改文字框中內容

Delphi 修改Excel 中文字框內容

 

首先看一下Excel中錄製的巨集程式碼吧

 

Sub Macro1()

'

' Macro1 Macro

' 巨集由 HFBiao 錄製,時間: 2010-5-15

'

    ActiveSheet.Shapes("Text Box 1").Select    

    Selection.Characters.Text = "55555555555555555555555555"   

    With Selection.Characters(Start:=1, Length:=26).Font

        .Name = "宋體"

        .FontStyle = "常規"

        .Size = 12

        .Strikethrough = False

        .Superscript = False

        .Subscript = False

        .OutlineFont = False

        .Shadow = False

        .Underline = xlUnderlineStyleNone

        .ColorIndex = xlAutomatic

    End With

    Range("H17").Select

End Sub

 

只能先這麼說了, Delphi 不等於 VB , 不要太相信錄製的巨集程式碼,因為它們不是為Delphi準備的。而我之前卻是沒有這般認識的。

 

先看巨集程式碼

    ActiveSheet.Shapes("Text Box 1").Select

    Selection.Characters.Text = "55555555555555555555555555"

這是選擇了一個文字框後變更內容的程式碼,將它翻譯成Delphi 中應該下面這樣的

asheet:=FExcelapplication.Sheets.Item[1];

asheet. Shapes['Text Box 1'].Characters.Text = "55555555555555555555555555";

執行它,提示找不到成員,換用序號表示

asheet:=FExcelapplication.Sheets.Item[1];

asheet.Shapes[1].Characters.Text = "55555555555555555555555555";

執行,還是提示找不到成員,這下就有點暈了。

 

尋找 Excel VB 的幫助,發現如下:

 

 

Shapes 集合用法

可用 Shapes 屬性返回 Shapes 集合。下例選定 myDocument 上的所有圖形。

Set myDocument = Worksheets(1)
myDocument.Shapes.SelectAll
                    

註釋  如果要同時對工作表上的所有圖形進行某項操作(例如刪除或設定屬性),請選定所有圖形,然後對選定區域應用 ShapeRange 屬性以建立一個包含工作表上所有圖形的 ShapeRange 物件,然後對 ShapeRange 物件應用適當的屬性或方法。

可用 Shapes(index) (其中 index 是圖形的名稱或索引號)返回單個的 Shape 物件。下例設定 myDocument 上第一個圖形的預設陰影的填充。

Set myDocument = Worksheets(1)
myDocument.Shapes(1).Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientBrass
 
 
-------------------------幫助引用完成--------------------------

 

用Delphi 去操作Excel ,那幫助也是不可全信的,還是那句話,因為它們不是為Delphi準備的。

 

可用 Shapes(index)(其中 index 是圖形的名稱或索引號)返回單個的 Shape 物件。

在幫助中用 Shapes(index) 返回單個物件,卻在Delphi 中是不行的。

繼續查幫助,發現 Shapes 中有 Item 方法。 在這時,我想我是應該找到了。

 

更改 Delphi 程式碼

asheet:=FExcelapplication.Sheets.Item[1];

MyShape:= asheet.Shapes.Item[1];

//asheet.Shapes[1].Characters.Text = "55555555555555555555555555";

程式碼成功執行,嘗試提取對像 ID號

asheet:=FExcelapplication.Sheets.Item[1];

MyShape:= asheet.Shapes.Item[1];

ShowMessage(IntToStr(MyShape.ID));

程式碼成功執行,ID號顯示,這說明單個的Shape物件是己經取到了,剩下來的就應該簡單了。

可事實並不像想像中的那麼簡單!

 

更改 Delphi 程式碼

asheet:=FExcelapplication.Sheets.Item[1];

MyShape:= asheet.Shapes.Item[1];

MyShape.Characters.Text = "55555555555555555555555555";

執行 ,

報錯   Method 'Characters' not supported by automation object  , Characters 竟不支援。這是再次證明了錄製出來的巨集是不能信的。只得乖乖的去找幫助了。

查詢 Shape 對像的屬性 ,發現有 TextFrame 屬性,TextFrame 屬性 返回 TextFrame 物件

 

以下為 TextFrame 物件的定義

代表 Shape 物件中的文字框。包含文字框中的文字,也包含用於控制文字框的對齊方式及位置的屬性和方法。

 

看到這個,我是有點激動了,我知道好運己降臨到我身上。

 

更改 Delphi 程式碼

asheet:=FExcelapplication.Sheets.Item[1];

MyShape:= asheet.Shapes.Item[1];

MyShape.TextFrame.Characters.Text = "55555555555555555555555555";

 

執行成功。

 

總結下吧。

  1. 在Excel 中錄製的巨集不可全信
  2. 幫助也不可全信
  3. 以上兩點只針對用 Delphi 去操作Excel時成立,因為那些都不是為Delphi而準備的
  4. 每天至少要睡6小時,不要熬夜。因為這些都是我在睡一覺之後的第二天才弄出來的,在第一天是怎麼都出不來。
  5. 不會時多問,上網找,可千萬不要像我這樣弄了四個多小時整出來,人生沒多少四小時的。不過我是沒人可問,在網上搜了N多遍也找不到答案的情況下,才自己動手的了。不過自己做出來會很高興的。
  6. 信念很重要,永不放棄!(在第一天時,我對這個問題基本是處於絕望的境地了)