目前分類:電腦玩咖 (98)

瀏覽方式: 標題列表 簡短摘要
    public partial class MainForm : Form
    {
        System.IO.Ports.SerialPort serialport = new System.IO.Ports.SerialPort();//宣告連接埠
        Boolean light = false, serialportopen = false;
        
        public MainForm()
        {
            InitializeComponent();
            
            foreach(string com in System.IO.Ports.SerialPort.GetPortNames())//取得所有可用的連接埠
            {
                cbPortName.Items.Add(com);
            }
            if (cbPortName.Items.Count > 0)
                cbPortName.SelectedIndex = 0;
            
            cbCmd.Items.Add("0-讀取");
            cbCmd.Items.Add("1-寫入");
            cbCmd.Items.Add("7-強制ON");
            cbCmd.Items.Add("8-強制OFF");
            if(cbCmd.Items.Count>1)
                cbCmd.SelectedIndex=0;
        }
        
        void Button1Click(object sender, EventArgs e)
        {
            if (serialportopen == false && !serialport.IsOpen)
            {
                try
                {
                    //設定連接埠
                    serialport.PortName = cbPortName.Text;//連線埠
                    serialport.BaudRate = 9600;//鮑率
                    serialport.DataBits = 7;//數據位元
                    serialport.Parity = System.IO.Ports.Parity.Even;//偶同位
                    serialport.StopBits = System.IO.Ports.StopBits.One;//停止位元
                    serialport.Encoding = Encoding.Default;//傳輸編碼方式
                    serialport.Open();
                    serialportopen = true;
                    button2.Enabled = true;
                    txtSTX.Enabled = true;
                    if (this.backgroundWorker1.IsBusy != true)
                    {
                        this.backgroundWorker1.WorkerReportsProgress = true;
                        this.backgroundWorker1.RunWorkerAsync();
                    }
                    button1.Text = "中斷";
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
            else if (serialportopen == true && serialport.IsOpen)
            {
                try
                {
                    serialport.Close();
                    if (!serialport.IsOpen)
                    {
                        serialportopen = false;
                        button2.Enabled = false;
                        txtSTX.Enabled = false;
                        this.backgroundWorker1.WorkerReportsProgress = false;
                        this.backgroundWorker1.CancelAsync();
                        this.backgroundWorker1.Dispose();
                        label3.ForeColor = Color.Red;
                        button1.Text = "連線";
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }
        

        private void Button2Click(object sender, EventArgs e)
        {
            try
            {
                string str = "";
                //STX Cmd Addrs Bytes Data ETX SUM
                //str = (Char)2 + "70008" + (Char)3 + "02";//M0
                //str = (Char)2 + "70108" + (Char)3 + "03";//M1
                //str = (Char)2 + "70208" + (Char)3 + "04";//M2
                //str = (Char)2 + "70308" + (Char)3 + "05";//M3
                str = (Char)2 + txtCmd.Text + txtAddrs.Text + txtBytes.Text + txtData.Text + (Char)3 + txtSum.Text;
                serialport.Write(str);
                AddText(MsgType.Error, "傳送:" + str + "\r\n");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(e.KeyChar==(Char)13)
            {
                Button2Click(sender, e);
            }
        }

        private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
        {
            for (; ; )
            {
                if (backgroundWorker1.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    try
                    {
                        backgroundWorker1.ReportProgress(0);
                        System.Threading.Thread.Sleep(1000);
                    }
                    catch (Exception)
                    {
                        e.Cancel = true;
                        break;
                    }
                }
            }
        }

        private void BackgroundWorker1ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (serialport.BytesToRead != 0)
                {
                    label2.Text = "緩衝區:" + serialport.BytesToRead.ToString();
                    AddText(MsgType.System, "接收:" + serialport.ReadExisting() + "\r\n");
                    serialport.DiscardInBuffer();
                }
            }
            catch(Exception)
            {}
        }

        private void AddText(MsgType msgtype, string msg)
        {
            richTextBox1.Invoke(new EventHandler(delegate
            {
                richTextBox1.SelectedText = string.Empty;
                richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, FontStyle.Bold);
                richTextBox1.SelectionColor = MsgTypeColor[(int)msgtype];
                richTextBox1.AppendText(msg);
                richTextBox1.ScrollToCaret();
            }));
        }
        
        //FX2N CheckSum,取 CMD、ADDR、DATA、ETX 各字元的 ASCII碼 16進位表示法 加總,然後取最後兩個字元。
        private string CheckSum()
        {
            //宣告:int為整數、string為字符串
            int sum = 0;
            string checkstring = "";
            string checksum = "";
        
            //通訊格式中的英文字符必須為大寫(a~f),故先行將text所輸入之傳送數據,經由程序自動轉換為大寫字母,然後加上結束碼etx:chr(3),形成一字符串checkstring
            checkstring = (String)txtCmd.Text + txtAddrs.Text + txtBytes.Text + txtData.Text + (Char)3;
        
            // for屬於重複結構中之計數循環,指令pc在一定的次數內,重複的執行某一敘述區段,亦即取出checkstring字符串中每一個字符,並累加每一個字符的ascii碼,而得出一整數sum。
            for (int i = 0; i < checkstring.Length; i++) {
                sum = sum + Convert.ToInt32(checkstring[i]);
            }
        
            //將10進制整數sum轉換為16進制,並取其右邊二位數,即為所求檢查碼。
            checksum = String.Format("{0:X}", sum);
            checksum.PadLeft(2,'0');
            checksum = checksum.Substring(checksum.Length - 2, 2);
            
            return checksum;
        }
        
        void Button3Click(object sender, EventArgs e)
        {
            string sum = CheckSum();
            txtSum.Text = sum;
        }
        
        void CbCmdSelectedIndexChanged(object sender, EventArgs e)
        {
            string cmd = cbCmd.Text.Split('-')[0];
            txtCmd.Text = cmd;
        }
        
        void SendStr(string str)
        {
            try
            {
                //STX Cmd Addrs Bytes Data ETX SUM
                //str = (Char)2 + "70008" + (Char)3 + "02";//M0
                //str = (Char)2 + "70108" + (Char)3 + "03";//M1
                //str = (Char)2 + "70208" + (Char)3 + "04";//M2
                //str = (Char)2 + "70308" + (Char)3 + "05";//M3
                serialport.Write(str);
                AddText(MsgType.Error, "傳送:" + str + "\r\n");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }

伊 發表在 痞客邦 留言(2) 人氣()

【通訊】

RS232(PC) 對 RS422(PLC)

宣告RS232Port:
System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort();

通訊設定:
1. Port Name (EX. COM1, COM2 ...)
2. 非同步雙向 Baud Rate = 9600
3. 資料7位元 Data Bits = 7
4. 停止位元1個 Stop Bits = System.IO.Ports.StopBits.One
5. 檢查位元為偶同位 Parity = System.IO.Ports.Parity.Even

傳送格式:
STX + Cmd + Address + Bytes + Data + ETX + CheckSum


查資料Y20的元件位址是0510
單一元件通訊命令(起始碼+控制碼+元件位址+結束碼+偵誤碼)
起始碼是ASCII碼02
控制碼強制ON是7,強制OFF是8
元件位址要上下位互換,所以在這裡要輸入1005
結束碼是ASCII碼03PL
偵誤碼是控制碼+元件位址的每個字元轉成ASCII碼數值全部相加,在轉成16進制數值取最後2位
其中ASCII碼02和03是不可見字元,就算輸入螢幕上也是看不到字的
Y20強制ON的字串→(ASCII碼02)71005(ASCII碼03)00→算出的偵誤碼是00
Y20強制OFF的字串→(ASCII碼02)81005(ASCII碼03)01→算出的偵誤碼是01

查資料D112的元件群組位址是10E0
D暫存器的字元寫入命令(起始碼+控制碼+元件群組位址+寫入組數+寫入資料+結束碼+偵誤碼)
起始碼是ASCII碼02
控制碼寫入是1
元件群組位址不用換位所以是10E0
三菱PLC每筆資料是8位元,D暫存器是16位元,所以寫入組數是02組(要輸入16進制數值)
寫入資料是1,換算成16進制字串是0001,寫入資料每8位元1組分成上下位元,上下位元要互換位置,所以在這裡要輸入0100
結束碼是ASCII碼03
偵誤碼是控制碼+元件群組位址+寫入組數+寫入資料的每個字元轉成ASCII碼數值全部相加,在轉成16進制數值取最後2位
D112寫入1的字串→(ASCII碼02)110E0020100(ASCII碼03)2D→算出的偵誤碼是2D


【指令】

[K4M100 的意思]

K1代表連續的4個位址,K4代表4×4個連續位址,也就是16個。

同理,K2是8個連續位址;K3是12個連續位址。

M100是一個位址,K4代表M100到M115這16個位址,不是M100代表16個位址。


[TO 指令]

TO 模組索引 記憶體位址(BFM) 值 傳幾個

※記憶體位址(BFM)編號從0開始,0~31,共32個,每個位址有16bit可用。

例. TO K0 K3 H0000 K1
將H0000傳送到PLC後面順位第1的模組的BFM#3。

如果改成 TO K0 K3 H0000 K2
將H0000傳送到PLC後面順位第1的模組的BFM#3、#4。

另有:
DTO 一次傳輸32bit


[FROM 指令]

FROM 模組索引 記憶體位址(BFM) 存放位址 傳幾個

另有:
DFROM 一次傳輸32bit


[FMOV 指令]

16位元連續執行多點傳送指令

例. FMOV K0 D300 K2
將K0(值0)傳送到D300~D301

另有:
FMOVP 16位元脈衝執行多點傳送指令
DFMOV 32位元連續執行多點傳送指令
DFMOVP 32位元脈衝執行多點傳送指令


[SET/RST 指令]

SET:置位指令,使操作保持ON的指令。
RST:复位指令,使操作保持OFF的指令。

SET指令可用于Y,M和S,RST指令可用于复位Y,M,S,T,C,或将字元件D,V和Z清零。


[ZRST 指令]

重置

例. ZRST M0 M499
將M0~M499的值全部復位


[PLS/PLF 指令]

PLS(Pulse):上升沿微分輸出指令。
PLF:下降沿微分輸出指令。
PLS和PLF指令只能用於輸出繼電器和輔助繼電器(不包括特殊輔助繼電器)。

PLC_PLS_PLF

圖中的M0僅在X0的常開觸點由斷開變為接通(即X0的上升沿)時的一個掃描週期內為ON,M1僅在X0的常開觸點由接通變為斷開(即X0的下降沿)時的_個掃描週期內為ON。
當PLC從RUN到STOP,然後又由STOP進入RUN狀態時,其輸入信號仍然為ON,PLS M0指令將輸出一個脈衝。然而,如果用電池後備(鎖存)的輔助繼電器代替M0,其PLS指令在這種情況下不會輸出脈衝。


[比較指令]
如CMP K100 C30 M0
简单说就是前两个数(100和计数器C30里的数)比较,将>、<、=三个状态输出到三个位!而M0为首地址、依次是M0、M1、M2
K100>C30 M0=1 M1=0 M2=0
K100=C30 M0=0 M1=1 M2=0
K100
[<= Z0 D20] 的意思是: 如果Z0 <= D20成立,则执行后面的程序


[ADD]

ADD D21 D201Z0 D21 意思是 D21 = D21 + D201Z0; Z0是变址寄存器,所以到底加那个D地址由Z0的偏移后得出


[INC/DEC]

逻辑运算指令 INC 加1指令 DEC 减1

比如说定时器设定值就要用INC 加1 指令或 DEC 减1指令来改变寄存器的常数。

INC,INCP,DEC,DECP:16位指令
DINC,DINCP,DDEC,DDECP:32位指令
P是脉冲执行指令

增加指令与减少指令编程方式如下:
INC D10
DEC D10
*D10的值加1,可以为寄存器,T,C或是位元件的组合如K4Y0

假设程序扫描周期为2ms,M0闭合时间为10ms,执行前D10的值为0。下面两段程序的执行结果为:
LD M0
INC D10
D10的值为5

LD M0
INCP D10
D10的值为1

INCP Z1
累加的就是Z1
如Z1第一次为1、执行一次就是2
如果用D0Z1,则Z1=0时,对应D0,执行一次对应D1,再后面依次D2、D3
Z1里面的数据+1,如果这个数据你用在地址上,那就是地址加一
Z是变址寄存器,所以最终改变的是地址


[SUBP 减法指令]

P表示该指令为脉冲指令,只在上升沿时执行1次。下次执行须重新触发

伊 發表在 痞客邦 留言(2) 人氣()

object.options.length = 0;

document.getElementById(Id).options.length = 0;

document.getElementByName(Name).options.length = 0;

document.forms[FormName].elements[SelectName].options.length = 0;

伊 發表在 痞客邦 留言(0) 人氣()

var curMonthDays = new Date(year,month,0).getDate();

伊 發表在 痞客邦 留言(0) 人氣()

這個範例程式,會顯示進度字串到textbox內,textbox會自動捲動到最下方,會顯示進度條(0~100),可讓使用者中斷程序。
VB部分的程式碼我是用網路上C#toVB轉換器轉的,所以不知道有無錯誤,請網友費心試試看囉~

程式元件畫面:
NET背景執行

//C#

//---------設計畫面時的設定---------
this.button1.Text = "開始";
this.button2.Text = "停止";
this.textBox1.Multiline = true; //多行
this.textBox1.ScrollBars = ScrollBars.Vertical; //顯示垂直捲軸
this.backgroundWorker1.WorkerReportsProgress = true; //回報進度
this.backgroundWorker1.WorkerSupportsCancellation = true; //允許中斷
this.timer1.Interval = 1000;
//--------------------------------

string msg; //存放回報訊息
DateTime TimerTick; //計時器時間

private void button1_Click(object sender, EventArgs e)
{
    this.TimerTick = DateTime.Parse("2000/1/1 00:00:00"); //初始時間點
    this.timer1.Start(); //啟動計時器
    this.progressBar1.Visible = true; //顯示進度條
    this.backgroundWorker1.RunWorkerAsync(); //呼叫背景程式
}

private void button2_Click(object sender, EventArgs e)
{
    this.backgroundWorker1.CancelAsync(); //中斷背景程式
}

private void todo(BackgroundWorker worker, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++ )
    {
        if (worker.CancellationPending) //如果被中斷...
        {
            e.Cancel = true;
            break;
        }
        System.Threading.Thread.Sleep(300); //延遲300毫秒
        this.msg = "第 " + i + " 圈 ... \r\n"; //設定訊息
        worker.ReportProgress(i); //回報進度
    }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    if (backgroundWorker1.CancellationPending) //如果被中斷...
        e.Cancel = true;

    BackgroundWorker worker = (BackgroundWorker)sender;
    this.todo(worker, e); //欲背景執行的function
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    this.textBox1.Text += msg;
    this.textBox1.SelectionStart = this.textBox1.Text.Length;
    this.textBox1.ScrollToCaret();
    this.textBox1.Refresh();
    this.progressBar1.Value = e.ProgressPercentage;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if ((e.Error != null))
        MessageBox.Show(e.Error.Message);
    else if (e.Cancelled)
        MessageBox.Show("使用者中斷程式");
    else
        MessageBox.Show("完成");

    this.progressBar1.Visible = false; //隱藏進度條
    this.timer1.Stop(); //停止計時器
}

private void timer1_Tick(object sender, EventArgs e)
{
    this.TimerTick = this.TimerTick.AddSeconds(1); //計時器 每秒+1
    this.label1.Text = this.TimerTick.ToString("HH:mm:ss"); //設定顯示格式
}
'VB

'---------設計畫面時的設定---------
Me.button1.Text = "開始"
Me.button2.Text = "停止"
Me.textBox1.Multiline = True '多行
Me.textBox1.ScrollBars = ScrollBars.Vertical '顯示垂直捲軸
Me.backgroundWorker1.WorkerReportsProgress = True '回報進度
Me.backgroundWorker1.WorkerSupportsCancellation = True '允許中斷
Me.timer1.Interval = 1000
'--------------------------------

Private msg As String '存放回報訊息
Private TimerTick As DateTime '計時器時間

Private Sub button1_Click(sender As Object, e As EventArgs)
    Me.TimerTick = DateTime.Parse("2000/1/1 00:00:00") '初始時間點
    Me.timer1.Start() '啟動計時器
    Me.progressBar1.Visible = True '顯示進度條
    Me.backgroundWorker1.RunWorkerAsync() '呼叫背景程式
End Sub

Private Sub button2_Click(sender As Object, e As EventArgs)
    Me.backgroundWorker1.CancelAsync() '中斷背景程式
End Sub

Private Sub todo(worker As BackgroundWorker, e As DoWorkEventArgs)
    For i As Integer = 1 To 100
        If worker.CancellationPending Then '如果被中斷...
            e.Cancel = True
            Exit For
        End If
        System.Threading.Thread.Sleep(300) '延遲300毫秒
        Me.msg = "第 " & i & " 圈 ... " & vbCr & vbLf '設定訊息
        worker.ReportProgress(i) '回報進度
    Next
End Sub

Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    If backgroundWorker1.CancellationPending Then '如果被中斷...
        e.Cancel = True
    End If

    Dim worker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
    Me.todo(worker, e) '欲背景執行的function
End Sub

Private Sub backgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
    Me.textBox1.Text += msg
    Me.textBox1.SelectionStart = Me.textBox1.Text.Length
    Me.textBox1.ScrollToCaret()
    Me.textBox1.Refresh()
    Me.progressBar1.Value = e.ProgressPercentage
End Sub

Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
    If (e.Error IsNot Nothing) Then
        MessageBox.Show(e.Error.Message)
    ElseIf e.Cancelled Then
        MessageBox.Show("使用者中斷程式")
    Else
        MessageBox.Show("完成")
    End If

    Me.progressBar1.Visible = False '隱藏進度條
    Me.timer1.Stop() '停止計時器
End Sub

Private Sub timer1_Tick(sender As Object, e As EventArgs)
    Me.TimerTick = Me.TimerTick.AddSeconds(1) '計時器 每秒+1
    Me.label1.Text = Me.TimerTick.ToString("HH:mm:ss") '設定顯示格式
End Sub

伊 發表在 痞客邦 留言(6) 人氣()

//C#

//開啟檔案
OpenFileDialog OpenFileDialog1 = new OpenFileDialog();
OpenFileDialog1.CheckFileExists = true;
OpenFileDialog1.Filter = "txt files (*.txt)|*.txt";
OpenFileDialog1.Multiselect = false;
OpenFileDialog1.ShowDialog();
TextBox.Text = OpenFileDialog1.FileName;

//開啟資料夾
FolderBrowserDialog FolderBrowserDialog1= new FolderBrowserDialog();
FolderBrowserDialog1.ShowDialog();
TextBox.Text = FolderBrowserDialog1.SelectedPath;
'VB

'開啟檔案
Dim OpenFileDialog1 As OpenFileDialog = New OpenFileDialog
OpenFileDialog1.CheckFileExists = True
OpenFileDialog1.Filter = "txt files (*.txt)|*.txt"
OpenFileDialog1.Multiselect = False
OpenFileDialog1.ShowDialog()
TextBox.Text = OpenFileDialog1.FileName

'開啟資料夾
Dim FolderBrowserDialog1 As FolderBrowserDialog = New FolderBrowserDialog
FolderBrowserDialog1.ShowDialog()
TextBox.Text = FolderBrowserDialog1.SelectedPath

伊 發表在 痞客邦 留言(0) 人氣()

C#
//檢查檔案是否存在
if (!File.Exists(FilePath))
{
    MessageBox.Show("找不到檔案");
    return;
}

StreamReader objReader = new StreamReader(FilePath);
string sLine = "";
ArrayList arrText = new ArrayList();

do
{
    sLine = objReader.ReadLine();
    if (sLine != null)
    {
        arrText.Add(sLine);
    }
} while (sLine != null);
objReader.Close();

//把讀取檔案的結果放到ListBox,您也可以另做運用。
ListBox.Items.AddRange(arrText);
VB
'檢查檔案是否存在
If Not FileIO.FileSystem.FileExists(FilePath) Then
    MsgBox("找不到檔案")
    Return
End If

Dim objReader As New StreamReader(FilePath)
Dim sLine As String = ""
Dim arrText As New ArrayList()

Do
    sLine = objReader.ReadLine()
    If Not sLine Is Nothing Then
        arrText.Add(sLine)
    End If
Loop Until sLine Is Nothing
objReader.Close()

'把讀取檔案的結果放到ListBox,您也可以另做運用。
ListBox.Items.AddRange(arrText)

伊 發表在 痞客邦 留言(0) 人氣()

C#
int 這個月的天數 = DateTime.DaysInMonth(年,月);

VB
Dim 這個月的天數 As Integer = DateTime.DaysInMonth(年,月)

伊 發表在 痞客邦 留言(0) 人氣()

C#
//檔案是否存在
bool result = System.IO.File.Exists(檔案路徑);

//資料夾是否存在
bool result = System.IO.Directory.Exists(資料夾路徑);

//建立資料夾
System.IO.Directory.CreateDirectory(資料夾路徑);

//檢查是否為合法路徑
public bool isValidPath(string path)
{
    bool result = true;
    string err = "";
    try
    {
        System.IO.FileInfo info = new System.IO.FileInfo(path);
    }
    catch (Exception ex)
    {
        result = false;
        err = "err:" + ex.Message;
    }
    Console.WriteLine("{0} {1} {2}", result, path, err);
    return result;
}

//取得資料夾資訊
DirectoryInfo dir = new DirectoryInfo(資料夾路徑);

//搜尋資料夾1
DirectoryInfo[] dirList = dir.GetDirectories(搜尋字串, SearchOption);
//搜尋資料夾2
string[] dirList = Directory.GetDirectories(資料夾路徑, 搜尋字串, SearchOption);

//搜尋檔案1
FileInfo[] fileList = dir.GetFiles(搜尋字串, SearchOption);
//搜尋檔案2
string[] fileList = Directory.GetFiles(資料夾路徑, 搜尋字串, SearchOption);

//巡覽DirectoryInfo
foreach (DirectoryInfo _event in dirList)
{
    //...
}

//巡覽FileInfo
foreach (FileInfo _event in fileList)
{
    //...
}

//取得目前使用者桌面路徑
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string filePath =desktopPath +@"\FolderTest\";
//檢查資料夾是否存在
if (!Directory.Exists(filePath))
{
    //不存在則建立
    Directory.CreateDirectory(filePath);
}
//檢查檔案是否存在
if (!File.Exists(filePath))
{
    //不存在則拷貝
    File.Copy(來源路徑含檔名, 目的路徑含檔名, true);
}
VB
'檔案是否存在
FileIO.FileSystem.FileExists(檔案路徑)

'資料夾是否存在
FileIO.FileSystem.DirectoryExists(資料夾路徑)

'建立資料夾
FileIO.FileSystem.CreateDirectory(資料夾路徑)

'檢查是否為合法路徑
Public Function isValidPath(ByVal path As String) As Boolean
    Dim result As Boolean = True
    Dim err As String = ""
    Try
        Dim info As New System.IO.FileInfo(path)
    Catch ex As Exception
        result = False
        err = "err:" & ex.Message
    End Try
    Console.WriteLine("{0} {1} {2}", result, path, err)
    Return result
End Function

'取得資料夾資訊
Dim dir As New DirectoryInfo(資料夾路徑)

'搜尋資料夾1
Dim dirList As DirectoryInfo() = dir.GetDirectories(搜尋字串, SearchOption)
'搜尋資料夾2
Dim dirList As String() = Directory.GetDirectories(資料夾路徑, 搜尋字串, SearchOption)

'搜尋檔案1
Dim fileList As FileInfo() = dir.GetFiles(搜尋字串, SearchOption)
'搜尋檔案2
Dim fileList As String() = Directory.GetFiles(資料夾路徑, 搜尋字串, SearchOption)

'巡覽DirectoryInfo
For Each _event As DirectoryInfo In dirList
	'...
Next

'巡覽FileInfo
For Each _event As FileInfo In fileList
	'...
Next

伊 發表在 痞客邦 留言(0) 人氣()

C#
textbox1.SelectionStart = textbox1.Text.Length; 
textbox1.ScrollToCaret(); 
textbox1.Refresh();
VB
textbox1.SelectionStart = textbox1.Text.Length
textbox1.ScrollToCaret()
textbox1.Refresh()

伊 發表在 痞客邦 留言(0) 人氣()

C#
[DllImport("mpr.dll", EntryPoint = "WNetAddConnectionA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern long WNetAddConnection(string lpszNetPath, string lpszPassword, string lpszLocalName);

[DllImport("mpr.dll", EntryPoint = "WNetCancelConnectionA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern long WNetCancelConnection(string lpszName, long bForce);

//無密碼可傳空字串
public long AddConnection(string 路徑, string 登入密碼, string 磁碟機代號)
{
    try
    {
        return WNetAddConnection(路徑, 登入密碼, 磁碟機代號);
    }
    catch (Exception ex)
    {
        DebugMsg(ex.Message.ToString());
        return 0;
    }
}

//Force: 0 如有檔案開啟中則傳回ERROR_OPEN_FILES, 1 強制關閉
//ERROR_OPEN_FILES: There are open files, and the fForce parameter is FALSE.
public long CancelConnection(string 磁碟機代號, int Force)
{
    try
    {
        return WNetCancelConnection(磁碟機代號, Force);
    }
    catch (Exception ex)
    {
        DebugMsg(ex.Message.ToString());
        return 0;
    }
}
VB
Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" _
(ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName _
As String) As Long

Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" _
(ByVal lpszName As String, ByVal bForce As Long) As Long

Function AddConnection(ByVal 路徑 As String, ByVal 登入密碼 As String, ByVal 磁碟機代號 As String) As Long
    Try
        Return WNetAddConnection(路徑, 登入密碼, 磁碟機代號)
    Catch ex As Exception
        DebugMsg(ex.Message.ToString())
    End Try
End Function

Function CancelConnection(ByVal 磁碟機代號 As String, ByVal Force As Integer) As Long
    Try
        Return WNetCancelConnection(磁碟機代號, Force)
    Catch ex As Exception
        DebugMsg(ex.Message.ToString())
    End Try
End Function

伊 發表在 痞客邦 留言(0) 人氣()

C#
//宣告: 型別[] 變數名稱 = { 陣列內容1, 陣列內容2, 陣列內容3, 陣列內容4 ... };
string[] LocalNameList = { "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V" };

//巡覽1 foreach
foreach (string _event in LocalNameList)
{
    textbox1.text = _event;
}

//巡覽2 for
for (i = 0; i < LocalNameList.Length; i++)
{
    textbox1.text = LocalNameList[i];
}

//排序   使用Array.Sort ( , )    
//範例: 
//依檔名排序 = _event.Name;
//or 
//依檔案最後修改的日期時間 = _event.LastWriteTime.ToString()
private FileInfo[] SortFiles(FileInfo[] files)
{
    int array_length = files.Length;
    string[] sort_key = new string[array_length];

    foreach (FileInfo _event in files)
    {
        sort_key[0] = _event.Name; //依檔名
        //sort_key[0] = _event.LastWriteTime.ToString(); //依檔案最後修改的日期時間
    }

    Array.Sort(sort_key, files); //由小到大排序
    Array.Reverse(files); //反轉 由大到小排序

    return files;
}

//陣列Function的宣告
//類型 型別[] 名稱(參數...) 
private FileInfo[] SortFiles(FileInfo[] files)
{
    return files;
}
VB
'宣告: Dim 變數名稱() As 型別 = { 陣列內容1, 陣列內容2, 陣列內容3, 陣列內容4 ... }
Dim LocalNameList() As String = {"G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V"}

'巡覽1 For Each
For Each _event As String In LocalNameList
    textbox1.text = _event 
Next

'巡覽2 For
For i = 0 To LocalNameList.Length - 1
    textbox1.text = LocalNameList(i)
Next

'排序   使用Array.Sort ( , )    
'範例: 
'依檔名排序 = _event.Name;
'or 
'依檔案最後修改的日期時間 = _event.LastWriteTime.ToString()
Private Function SortFiles(ByVal files As FileInfo()) As FileInfo()
    Dim array_length As Integer = files.GetUpperBound(0)
    Dim sort_key(array_length) As String

    For Each dir As FileInfo In files
        sort_key(0) = dir.Name '依檔名
        'sort_key(0) = dir.LastWriteTime.ToString '依檔案最後修改的日期時間
    Next

    Array.Sort(sort_key, files) '由小到大排序
    Array.Reverse(files) '反轉 由大到小排序

    Return files
End Function

'陣列Function的宣告
'類型 Function 名稱(參數...) As 型別() 
Private Function SortFiles(ByVal files As FileInfo()) As FileInfo()
    Return files
End Function

伊 發表在 痞客邦 留言(0) 人氣()

原本就有在網拍賣舊手機~(8310)
沒想到有人來提議以手機換手機~
因為我8310已經沒在用了,所以就隨便換吧~反正只要能當備用機就好~
8310也不值多少錢了,只是擁有我太多回憶...拋不掉的回憶(其時留著甜美的回憶也未嘗不是好事)
結果就換了一支6260回來,因為對方全機包膜,所以完全沒刮傷,原廠電池也沒用過,對方直接買台製的使用。
換回家後,我就把它的包膜都撕掉了,因為我喜歡直接觸摸手機殼質感的感覺,沒想到它的質感還不錯,是霧面的,全黑的,一支很man的手機。
我的8310超粉嫩,都是女生的機殼說~~

6260像是早期的智慧型手機,是有作業系統的,剛開始覺得很不習慣~
沒想到功能跟我的Sony C510差不多(當然照像功能沒得比)
古董6260還有支援MMC記憶卡,放了幾個好玩的遊戲進去,都可以正常執行,速度也蠻順的~
內建Realplayer,可以聽音樂/看影片~
還有中英辭典、電子書、Word、PowerPoint的軟體...

而且我的習慣就是拿到2手手機一定要factory default(原廠出廠初始化設定),
但是這支手機內建的 設定>手機設定>一般設定>原廠設定,並沒有辦法完全出始化,
所以我就上網找了初始化的代碼:*#7370#,
開機後~輸入這個代碼,就會問你是否要初始化,按下確定,就會徹底把手機初始化。
記得記憶卡要拔起來,因為內含原廠贈送的軟體:電子書、3D撞球遊戲、射飛鏢遊戲,沒拔起來會被格式化。
其他記憶卡內的主題被我刪除了,實在好醜~~

※國外網站還有提供一招初始化的方式,可能是用於手機徹底當機無法開機使用:
同時按以下三個鈕:*、3、call(綠色撥號鍵) 不要放開,並且按電源鍵開機,就會執行初始化。

伊 發表在 痞客邦 留言(0) 人氣()

【Excel 小數點後位數指定 及 小數位數為0不顯示】

使用:ROUND(儲存格,欲顯示幾位小數位數)

數值為7.5時,會顯示7.5;數值為10.0時,會顯示10;數值為16.6666時,會顯示16.7。





【Excel 限制輸入儲存格區域】
http://pignet.wordpress.com/2009/11/14/excel-2/


1.選取要可以輸入的儲存格區域。
2.右鍵→儲存格格式→選擇『保護』頁籤,取消「鎖定」,按下確定。
3.功能表『工具』→保護→保護工作表,取消「選取鎖定的儲存格」。
4.「要保護工作表的密碼」可以設定密碼,就不會被解開保護了。

這樣,就只剩下剛剛我們選擇的儲存格區域可以輸入資料,
其他的都不行。

加上使用:資料→驗證→設定,
使用資料驗證,
限制輸入的值內容。

伊 發表在 痞客邦 留言(0) 人氣()

免費圖片空間imageshack今年改版
使用者需要登入才能觀看該空間的圖片
若是大型論壇/討論區,可申請免登入貼圖
但是其他空間使用者就需要登入了
很麻煩,分享圖片還要其他人先登入imageshack才可觀看圖片
其實有一個很簡單的方法可以破解:
將原本圖片網址:http://img789.imageshack.us/imgxx/xxxx.jpg
改為:http://a.imageshack.us/imgxx/xxxx.jpg
即可正常顯示圖片

伊 發表在 痞客邦 留言(0) 人氣()

最近很無聊
一直玩FB遊戲
但是好友名單沒半個人
索性自己申請FB分身帳號來當好友

剛開始,申請第1、2個分身,都沒有問題(aaa01@mail.com, aaa02@mail.com)
但是申請到第3、4個,就被鎖住了~(aaa03@mail.com, aaa04@mail.com)
且連帶第2個成功的分身也被鎖住...(aaa02@mail.com)
並不是鎖帳號那種鎖住,而是出現了「手機認證」這種鳥東西

當下就非常不爽啦!
馬上去國外找跳板申請帳號
成功申請了第5、6個帳號(aaa05@mail.com, aaa06@mail.com)
也順利開心的玩了2天

其實3個分身對我來說錯錯有餘了~
但我就很想實驗
又跑去找跳板申請了第7個帳號(aaa07@mail.com)
沒想到剛用完,登入FB卻出現「手機認證」
心裡想說慘了><
試了先前能夠正常登入的帳號(aaa01@mail.com, aaa05@mail.com, aaa06@mail.com)
也都出現「手機認證」...

所以這個教訓就是...申請帳號不要都連號阿~><~
剛剛又去申請了第8個分身,這次特地為它取了一個非常正常~不連號的email了...囧


技術上的交流~

我做以上動作都沒有執行清除瀏覽器cookie的動作...連續申請帳號時也沒有...(一定被大師們笑我是笨蛋吧><)
應該是每次申請帳號都要清除cookie,而且登入不同帳號前也要清除cookie

FB有鎖拋棄式郵件地址,因為拋棄式郵件地址都有固定的規則,所以蠻好判斷出來的,如果是同一個拋棄式郵件準則產生出來的郵件地址,只能申請一次帳號,FB在註冊時就會提示。

剛剛申請完第8個分身,也順便跟FB把之前用掉的email都要回來了...我不喜歡有空頭email卡在FB上面
感覺真是累阿~><~

伊 發表在 痞客邦 留言(0) 人氣()

請參考微軟官網:
http://msdn.microsoft.com/zh-tw/library/dayb112d.aspx

伊 發表在 痞客邦 留言(0) 人氣()

table
{
position:relative; 
margin-left:auto; 
margin-right:auto; 
width:auto;
}
很簡單吧~^^~
position 跟 width 的值請自行替換,
margin 左跟右用 auto 是為了讓它置中,
想要不對稱的話,把 width 拿掉再調左右就好。

其它請利用 w3c.org 的資源。
http://w3c.org/

伊 發表在 痞客邦 留言(0) 人氣()

使用Button的Command,CommandArgument來實現。

.aspx
實作3個Button Object,
OnCommand呼叫同一個Function,
CommandArgument設定參數,此處設定Object名稱。

<asp:Button ID="Button1" runat="server" Text="Button1" 
CommandArgument="Calendar1" OnCommand="ButtonCommand" />

<asp:Button ID="Button2" runat="server" Text="Button2" 
CommandArgument="Calendar2" OnCommand="ButtonCommand" />

<asp:Button ID="Button3" runat="server" Text="Button3" 
CommandArgument="Calendar3" OnCommand="ButtonCommand" />


.vb
使用FindControl取得Object。
按各別按鈕會顯示/隱藏指定的日曆元件。

Public Sub ButtonCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
    Dim c As Calendar = FindControl(e.CommandArgument)
    c.Visible = Not c.Visible
End Sub

伊 發表在 痞客邦 留言(0) 人氣()

1. 一般頁面
Dim tb as TextBox = FindControl("TextBox1")

2. 有MasterPage的頁面
Dim tb as TextBox = Master.FindControl("Content").FindControl("TextBox1")

伊 發表在 痞客邦 留言(0) 人氣()