全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2765
推到 Plurk!
推到 Facebook!

如何在 Word 中取得目前游標的位置(列號,行號)

答題得分者是:sryang
mike1000
一般會員


發表:2
回覆:5
積分:1
註冊:2011-06-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-06-14 11:35:27 IP:124.219.xxx.xxx 訂閱
各位先進好:
小弟遇到一個問題,就是目前在 BCB 以 OlePropertyGet("Selection").OlePropertyGet("Find") 的搜尋動作,
找到該指定字串後, 此時如何取回停留在該處游標指定之列號或行號 (Row , Col) , 麻煩請先輩們協助
幫忙, 謝謝!!
mike1000
一般會員


發表:2
回覆:5
積分:1
註冊:2011-06-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-06-17 16:08:22 IP:124.219.xxx.xxx 訂閱
或許我說的不太明確, 簡單的說就是我想要用 BCB 透過 OLE 操作 WORD 後(如搜尋), 取得停留的游標位置(文字模式), 也就是目前在第幾列、第幾行 ( Row , Col) ,  能否請各位先進多加幫忙, 不勝感激!!
sryang
尊榮會員


發表:38
回覆:740
積分:875
註冊:2002-06-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-06-17 22:57:07 IP:114.35.xxx.xxx 訂閱
Word 有 Row, Col 這一類的屬性可以取得嗎?
字型大小不同、邊界寬度不同、紙張大小方向不同,每一行能放的字數就不同,取得 Row, Col 有什麼意義?
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
mike1000
一般會員


發表:2
回覆:5
積分:1
註冊:2011-06-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-06-18 22:09:09 IP:125.227.xxx.xxx 訂閱
感謝 sryang 大大的意見:

小弟主要是想得到游標所在位置的行號即可,因為主要是想藉由 Find 兩次特定字串的間距得到相差的總列數, 然後一次用 OlePropertyGet(Selection) 的動作取得其間的資料,複製到剪貼簿,最後再貼到 BCB 的 OleContainer 物件中, 比起一列一列 parsing 取得內文資料作比對後,再計算所要的總列數來的快多了(尤其 Word 資料量大的時候),希望大大能理解小弟使用此法的用意,並提供解決的 Solution, 因為找了許多網路的資料, 還是無法找到取得列數的方法, 冀望能得到各位先進們的協助與幫忙,再次感謝!!

sryang
尊榮會員


發表:38
回覆:740
積分:875
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-06-19 00:07:56 IP:114.35.xxx.xxx 訂閱
Find 動作如果找到了要尋找的文字,ActiveWindow.Selection 的 Start 跟 End 屬性會記載著找到文字的開頭位置跟結尾位置
所以,Find 兩次您要尋找的特定字串,分別紀錄 Start 與 End (比如叫做 start1, end1, start2, end2)
然後設定
ActiveWindow.Selection.Start = end1 1;
ActiveWindow.Selection.End = start2 - 1;
就可以從
ActiveWindow.Selection.Text 取得這兩個特定字串中的所有文字了

完全不須取得 "列數",因為 Word 中除了表格之外,並沒有 "列" 這個概念
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
mike1000
一般會員


發表:2
回覆:5
積分:1
註冊:2011-06-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-06-19 23:12:41 IP:125.227.xxx.xxx 訂閱
首先感謝 sryang 大大的如此快速的回覆, 

目前我的做法如下:

假設已取得兩次位置 (Find 巨集), 分別是:
start1 = 212, end1 = 218; //(找到第一個句子起點,終點)
start2 = 522, end2 = 532; //(找到第二個句子起點,終點)
//**最後只要 第一個句子起點 , 及 第二個句子終點 (即所需取得的資料)

AnsiString AllSelectStr;

//代入程式
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OlePropertyGet("Start") = start1 1;
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OlePropertyGet("End") = end2 - 1;
AllSelectStr = vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OlePropertyGet("Text");


我有照您的方式取得兩次 Find 的 (start1,end1,start2,end2),
再設定
ActiveWindow.Selection.Start = end1 1;
ActiveWindow.Selection.End = start2 - 1;
最後再從 ActiveWindow.Selection.Text 取得這兩個特定字串中間的所有文字,可是回傳的資料卻都只有
一個 "\r" 的值,而不是正確所要擷取的資料,不知何處出現問題,能否請您簡單的寫一小段 code , 示範如何
正確能從第一個至第二個區間所找到的資料傳回給BCB的字串 AllSelectStr, 因為我一直無法正確測試出來,
真是麻煩您了, 感恩!!



sryang
尊榮會員


發表:38
回覆:740
積分:875
註冊:2002-06-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-06-20 07:29:24 IP:114.35.xxx.xxx 訂閱
你有一個小小的筆誤

//代入程式
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OlePropertySet("Start", end1 1);
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OlePropertySet("End", start2 - 1);
AllSelectStr = vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OlePropertyGet("Text");
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2011-06-19 17:34:58, 註解 無‧
mike1000
一般會員


發表:2
回覆:5
積分:1
註冊:2011-06-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-06-20 09:48:13 IP:124.219.xxx.xxx 訂閱
再次感謝 sryang 大大不辭辛勞的給予賜教,小弟終於解決這個問題,可以取得所需的文字及圖片資料,但是還有一個小問題,
如下所示:

//之前的程式(現在不只侷限取得文字而已)
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OlePropertySet("Start", end1 1);
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OlePropertySet("End", start2 - 1);


現在下達 "複製動作" 至 Clipboard
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection").OleFunction("Copy");

然後再 "貼上" View_OleContainer 物件
View_OleContainer->Paste(); //(屬性: SizeMode = smAutoSize, 且已加入 ScrollBox 可上下軸捲看到其他未顯示的資料部分)

理論上應該會把之前 Find 兩次後所選擇的區間資料拷貝進 View_OleContainer 中, 但我發現當選取的資料量較小時貼上是 OK, 而
資料量大時會有後段的某些資料未被貼入 View_OleContainer (截斷), 可是我開啟另一空白 Word 檔, 然後驗證貼上剛才取得的資料
是正常的(量大的資料), 不知為何會有如此狀況發生, 希望能再從旁給予一些協助與指導, 若能解決則此帖也算是可以結案了,
對於 sryang 大的熱心, 小弟覺得萬分感激!!
sryang
尊榮會員


發表:38
回覆:740
積分:875
註冊:2002-06-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-06-20 15:49:57 IP:122.121.xxx.xxx 訂閱
我也照著試過了,會發生相同的狀況,但是貼到 Word 中或是貼到 Memo 中會有全部的內容
原因不明,且暫時找不到解決方案
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
sryang
尊榮會員


發表:38
回覆:740
積分:875
註冊:2002-06-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-06-20 16:29:05 IP:122.121.xxx.xxx 訂閱
又試著把拷貝到的內容貼到 TRichEdit 上,格式雖然沒辦法 100% 相同,但至少內容是完整的了
RichEdit1->PasteFromClipboard; // 從剪貼簿貼上
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
mike1000
一般會員


發表:2
回覆:5
積分:1
註冊:2011-06-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-06-20 17:08:37 IP:124.219.xxx.xxx 訂閱
感謝 sryang 大大熱心的幫小弟測試, 是的 RichEdit 確實可以將拷貝的完整資料貼上,
但是因為我的 Word 檔案中除了文字及圖片外,另外還夾雜了其他的方程式符號,而
這些特殊符號卻無法為 RichEdit 所貼上及呈現,所以我才會選用 OleContainer 來作為容器的
物件,但是如果 clipboard 中有了完整的資料, 理論上 OleContainer 也應該會把全部的
資料完整的呈現出來才對, 可是卻發生了資料被截斷的問題, 不知是否在 OleContainer 本身的
設定上有所疏漏呢? 還是這個物件本身有 bug, 希望能經由測試結果得到答案. Thks for your help.
系統時間:2017-10-17 7:58:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!