2012年9月4日 星期二

[VS]visual studio 2010 之 消失的scrollbar

雖然說vs2012都出了
不過小弟我最近才剛開始從vs2008轉到vs2010
題外話,雖然我的NB只是兩萬塊的便宜貨又沒有ssd
但i5開vs2010慢成這樣也著實令我驚訝

安裝完也是用了很久的telerik web元件之後
遇到了神秘的狀況,我的toolbox的scroll bar消失了
用滾輪也滾不動,下面還卡了好幾個東西選不到
試了一下子之後發現了這個神祕的現象
不囉嗦直接看影片
一直展開項目開到一定程度之後scroll bar就會消失
同時可以發現的是scroll bar的拉bar小到一個程度以後就不再縮小
看起來是個故意設定的行為
理由為何就要問問微軟囉

2012年8月9日 星期四

[windows]我的圖哩??

今天這一篇,實際上跟寫程式一點關係也沒有
只能算是一個windows設定的線上問題處理經驗分享

故事是這樣的
昨天早上接獲通報,我做的winform功能在某台電腦上都顯示不出圖片
"某台",一聽就覺得是電腦狀況造成的個案不太想理
不過進去以後發現了有趣的現象
不是所有圖都不見,也不是只有我的功能圖會不見
交叉比對了大家的功能內容之後發現一件事
消失的只有BackgroundImage,就是背景圖
這下子我開始對這問題產生興趣了
這是一個winform程式又不是web會有不同瀏覽器造成的靈異現象
究竟是怎樣的一個狀況可以造成這種情形呢
讓我們繼續看下去

一、修個案必經路程--重開機
很遺憾,這個嘗試完全沒有效果

二、換個帳號登入
同一台電腦其他User登入跑同一份程式居然是正常的
這種現象要嘛是權限要嘛是設定
把測試帳號開到power user的權限試試
遺憾,無效,往下一步發展

三、既然是圖片,應該是顯示設定吧(?)
不才小弟我就這樣在這個設定畫面卡了一個早上
翻過來又翻過去,把裡面每個設定值都玩了一次
依然無解

四、一切都只是巧合
窮途末路想到頭都痛起來的我
痴痴地對著控制台畫面發呆
這時很不巧的讓我看到了這一行字
Windows用了這麼多年,第一次覺得他的註解這麼重要
這時心想"是阿,會不會有盲人不想看到背景圖只想聽聲音?"
但我馬上覺得自己這個想法五告北七
即使如此,我還是點進去了
罷了,死馬當活馬醫試試看囉
進去協助工具選項->畫面
恩,沒什麼選擇性阿
游標就不用看了,高對比是啥?
應該只是讓他更明顯吧,不然勾掉看看囉
就在這時,一切的謎團全都解開了,圖全都回來了
但是,另一個謎團又出現了
究竟為什麼一個高對比會讓我的圖全都神隱呢???

這時我回到自己的電腦想再複製一次這個現象看看
我是Win7,win7的高對比藏在輕鬆存取中心裡面
點畫面中那個小項他很北七的開去控制台->外觀及個人化->個人化
要先點輕鬆存取中心->設定高對比
跟WinXP不同的,裡面有很多細項選擇
這邊就不一一提了
但其中有一個選項能夠完美的解釋這一切糾結的因果
我想不用做太多解釋了,各位客官直接看圖吧


2012年5月21日 星期一

[C#]幫我換行謝謝

今天不才小弟接到一個需求,是要將一串樂樂長的字串印到小小標籤上
每行22個字元,gotta be twenty two,twenty two lucky
不喇賽,換行而已嘛,很簡單,大家都會換行,不就是\n\r這麼簡單
不過後續來了,因為有人反應,單純用22這個幸運數字來抓index切字串的話
英文單字會被腰斬屍首分散兩地,所以必須判斷相連的英文字太長就去下一行
這功能用過word的人都知道這功能
就是這樣的感覺

遺憾的是標籤列印的程式不在我這邊
所以不能挑一個會自動換行的列印程式來印,我必須幫他換行
這時問題來了
我要去判斷連接的字和空白嗎?
字串裡包含中英文數字和特殊符號,分析這個會不會太"搞剛"?
因此我心頭一轉,C#的RichTextBox不是也會自動換行
如果宣告一個RichTextBox設定寬度讓他幫我換行不好嗎?
身為一個極力幫自己偷空閒時間的programmer,我想這是一個最快速的解法
以此方向為基準產生了第一次嘗試
        private void button1_Click(object sender, EventArgs e)
        {
            //要換行的字串
            string sourcetext = "Who knows what tomorrow brings In a world where few hearts survive All I know is the way I feel When it's real I keep it alive The road is long There are mountains in the way But we climb a  step every day Love lift us up where we belong Where the eagles cry On a mountain high Love lift us up where we belong Far from the world we know Up where the clear winds blow Some hang on to used to be Live their lives looking behind When all we have is here and now All our lives Out there to find The road is long There are mountains in the way But we climb a step every day Love lift us up where we belong Where the eagles cry On a mountain high Love lift us up where we belong Far from the world we know Up where the clear winds blow";
            //宣告一個RichTextBox來用
            RichTextBox rtbWrap = new RichTextBox();
            //設定自動換行
            rtbWrap.WordWrap = true;
            //設定寬度
            rtbWrap.Width = 140;
            //字串給rtb
            rtbWrap.Text = sourcetext;
            string resultstr = "";
            foreach (string line in rtbWrap.Lines)
            {
                resultstr += line + "\n";
            }
          MessageBox.Show(resultstr);
         }

看起來一切都很順利,但是出來的結果....
說好的換行呢?
遺憾的,rtbWrap.Lines裡面只有一個字串,也就是原本的樣子
這下可好,我要怎麼抓他的每一行呢?
不用怕,微軟有他貼心的一面RichTextBox中有這麼一個method
GetFirstCharIndexFromLine
這東西會根據你給他的行號回傳那一行第一個字的index
當沒有那一行的時候他則會回傳-1
有了這東西就一切好辦了啦
這是成果
        private void button1_Click(object sender, EventArgs e)
        {
            //要換行的字串
            string sourcetext = "Who knows what tomorrow brings In a world where few hearts survive All I know is the way I feel When it's real I keep it alive The road is long There are mountains in the way But we climb a  step every day Love lift us up where we belong Where the eagles cry On a mountain high Love lift us up where we belong Far from the world we know Up where the clear winds blow Some hang on to used to be Live their lives looking behind When all we have is here and now All our lives Out there to find The road is long There are mountains in the way But we climb a step every day Love lift us up where we belong Where the eagles cry On a mountain high Love lift us up where we belong Far from the world we know Up where the clear winds blow";

            //宣告一個RichTextBox來用
            RichTextBox rtbWrap = new RichTextBox();
            //設定自動換行
            rtbWrap.WordWrap = true;
            //設定寬度
            rtbWrap.Width = 140;
            //字串給rtb
            rtbWrap.Text = sourcetext;

            string resultstr = "";
            int i = 0;
            while (rtbWrap.GetFirstCharIndexFromLine(i) != -1)
            {
                int thislineindex = rtbWrap.GetFirstCharIndexFromLine(i);
                int nextlineindex = rtbWrap.GetFirstCharIndexFromLine(i + 1);
                if (nextlineindex == -1)
                {
                    resultstr += sourcetext.Substring(thislineindex) + "\n";
                }
                else
                {
                    resultstr += sourcetext.Substring(thislineindex, nextlineindex - thislineindex) + "\n";
                }
                i++;
            }

            MessageBox.Show(resultstr);
        }

就是這樣
換行的標準取決於RichTextBox的寬度,寫活一點的話可以隨著紙張大小去做調整
各位請自行運用