我是把 tree 指令加到 Vista 資料夾與磁碟的右鍵選單的隱藏選項,參考看看:
把以下內容複製,存成 .reg 檔,點兩下即可。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\FolderTree]
@="列出資料夾的樹狀結構"
"Extended"=""
[HKEY_CLASSES_ROOT\Directory\shell\FolderTree\command]
@="cmd.exe /c \"tree \"%v\" /f > C:\\資料夾的樹狀結構.txt\""
[HKEY_CLASSES_ROOT\Drive\shell\FolderTree]
@="列出磁碟的樹狀結構"
"Extended"=""
[HKEY_CLASSES_ROOT\Drive\shell\FolderTree\command]
@="cmd.exe /c \"tree \"%v\" /f > C:\\磁碟的樹狀結構.txt\""
使用方法:點選資料夾或磁碟並按著 Shift 鍵不放,再按下滑鼠右鍵,
然後點選﹝列出資料夾(磁碟)的樹狀結構﹞就會將結果輸出到 C :\。
註:Windows XP 可能不支援紅色部分,請刪除紅色部分。
出處
2010/01/10
列出資料夾的樹狀結構
2009/09/16
網路關機
我找到方法了
在要進行關機的電腦上,按下開始-執行,然後在執行對話盒輸入gpedit.msc再按下確定
群組原則視窗出現後,找到本機電腦原則-電腦設定-Windows設定這個項目,然後依序展開安全性設定-本機原則,最後在使用者權限指派上按一下滑鼠左鍵。
在右邊窗格找到從遠端榭統強制關機,然後在這個項目上按一下滑鼠右鍵,從選單中選內容
對話盒出現後,裡面只有Administrator這個使用者,在新增使用者或群組上按一下滑鼠左鍵,準備將Guest使用者新增進來
選擇使用或群組對話盒出現後,在下方的進階上按一下滑鼠左鍵。
接著在對話盒按下立即尋找,下方的方塊就會顯示所有的使用者,在
Guest使用者上按一下滑鼠左鍵,然後按下確定
現在對話盒中就會出現Guest使用者,按下確定,回到上個對話盒再按一次確定
現在到採取遙控的電腦上,建立捷徑圖示來進行遠端關機,先在桌面上空白的地方按一下滑鼠右鍵,依序點選新增-捷徑
建立捷徑對話盒出現後,輸入shutdown -s -m 電腦名稱或ip -t 3格式的指令,再按下一步
最後設定捷徑的名稱,如遠端關機,再按下完成,以後只要在建立好的捷徑圖示上連續按兩下滑鼠左鍵,就可以讓家裡的電腦關機了。
2009/05/07
VB6 二進位資料 轉 數值
VB6 二進位資料 轉 數值
當我們有二進位資料 如 &H3483126f
如何才能轉成 2.44141e-7 數值
使用 CopyMemory 函數 參考如下
範例:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Dim lVar As Long
Dim iLoop As Integer
Dim bArray(1 To 4) As Byte
lVar = &H40030201
CopyMemory bArray(1), lVar, 4
For iLoop = 1 To 4
If bArray(iLoop) And &HF0 Then
Debug.Print Hex$(bArray(iLoop));
Else
Debug.Print "0" & Hex$(bArray(iLoop));
End If
Next
這段程式把 lVar 的值原封不動地複製到 bArray 之中,由於 lVar 的大小為 4 個位元組,因此我們設定 bArray 的元素個數為 4 個。Array 在下下期電子期將會被介紹到,在這�暫時只要知道數字陣列的元素在記憶體中是連續的就好了。用白話來解釋 CopyMemory bArray(1), lVar, 4 這行程式碼是:
將由 lVar 變數起始的 4 個位元組複製到由 bArray(1) 起始 4 位元組大小的位元區塊。
由 lVar = &H40030201 我們知道了 lVar 的內容。最後一部分的 For…Next 是將 bArray 中複製的內容印在即時視窗中以便與 lVar 的內容對照。如果您把程式放到 VB 中執行,您將會得到結果:01020340!
咦?lVar 的內容為 40030201 呀,怎麼我們得到 01020340 呢?這到底是怎麼一回事?
這個問題牽涉到電腦二進位資料儲存的順序,叫做 Little Endian。簡單的說 little endian 是指資料儲存時的順序將是低順位的位元儲存在較低位址的記憶體中,當 CPU 由記憶體中讀取資料時,由較低的位址開始讀起。因此在上例中當 lVar 引數傳 CopyMemory 中時,所傳入的記憶體位址是位元值 01 的最低順位位元,之後由低往高讀上去,所以在 bArray 中的元素值才會是顛倒的。
2009/01/08
VB6 動態新增控制項物件
【方法一】增加動態物件陣列
1.最初物件陣列必須先存在,如 Text1(0)。
2.引數Index不可以重複。
優點:
Load 新增的控制項物件會繼承(Inheritance)原先控制項物件的屬性設定,
刪除方法:
事件觸發:
Select Case Index
Case 1
'..... 觸發的控制項
End Select
End Sub
【方法二】控制項集合(Controls collection)
Set ControlRef=Controls.Add(ProgID,Name [,Container])
2.Name 是您給控制項的名稱, (這就是控制項Name屬性所傳回名稱) 。
3.Container 為選擇性參數,是一個對收納器控制項(如PictureBox 或
4.ControlRef 為物件變數,是一個對該控制項的引用,透過此變數可
範例:
Private Sub Command1_Click()
Set textCtrl1 = Controls.Add("vb.textbox", "textCtrl1")
textCtrl1.Text = "textCtrl1"
textCtrl1.Visible = True
Set textCtrl2 = Controls.Add("vb.textbox", "textCtrl2")
textCtrl2.Top = 500
textCtrl2.Text = "textCtrl2"
textCtrl2.Visible = True
End Sub
無須最初物件陣列 textCtrl(0),便可以無中生有來動態新增控制項。
Controls.Remove Control
Private Sub Command3_Click()
UnLoadCtrl "textCtrl1"
End Sub
Dim Ctrls As Control
For Each Ctrls In Controls
If Ctrls.Name = ctrlName Then Controls.Remove Ctrls
Next
End Sub
Controls.Remove Control 只能刪除Controls.Add 所建立之物件,不然會發生執行階段錯誤 729。
事件觸發:
使用到 WithEvents 變數可以讓您對它的事件作處理。
Option Explicit
'--- textCtrl 先設定 Events
Dim WithEvents textCtrl1 As TextBox
Dim WithEvents textCtrl2 As TextBox
Private Sub textCtrl1_Change()
Me.Caption = "textCtrl1_Change"
End Sub
Private Sub textCtrl1_GotFocus()
Me.Caption = "textCtrl1_GotFocus"
End Sub
Private Sub textCtrl2_Change()
Me.Caption = "textCtrl2_Change"
End Sub
Private Sub textCtrl2_GotFocus()
Me.Caption = "textCtrl2_GotFocus"
End Sub
《問題》每一次新增控制項就要先設定 WithEvents,使用上非常不方便。
【以下範例可改良上面 WithEvents 的不方便,使用 SubClassing 方法】
Command2_Click 動態新增物件的手法
' 於表單
Option Explicit
'--- textCtrl 設定 Events
Dim WithEvents textCtrl1 As TextBox
Dim WithEvents textCtrl2 As TextBox
Private Sub Command1_Click()
Set textCtrl1 = Controls.Add("vb.textbox", "textCtrl1")
textCtrl1.Text = "textCtrl1"
textCtrl1.Visible = True
Set textCtrl2 = Controls.Add("vb.textbox", "textCtrl2")
textCtrl2.Top = 500
textCtrl2.Text = "textCtrl2"
textCtrl2.Visible = True
End Sub
'----- 新增10個 TextBox 控制項 ( Controls.Add )
Private Sub Command2_Click()
Dim txtArray As Object
Dim Index As Long
Dim str As String
'新增10個 TextBox
Index = 10
ReDim CtrlhWnd(Index - 1)
For Index = 0 To Index - 1
str = "txtArray" & Index
Set txtArray = Controls.Add("vb.textbox", str)
With txtArray
.Top = Index * 300
.Left = 1300
.Height = 280
.Width = 1000
.Text = str
.Visible = True
CtrlhWnd(Index) = .hwnd
End With
Next
'--- txtArray 設定 Events
MeProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Command3_Click()
UnLoadCtrl "textCtrl1"
End Sub
Private Sub UnLoadCtrl(ByVal ctrlName As String)
Dim Ctrls As Control
For Each Ctrls In Controls
If Ctrls.Name = ctrlName Then Controls.Remove Ctrls
Next
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hwnd, GWL_WNDPROC, MeProc
End Sub
'---------- ALL Events()
Private Sub textCtrl1_Change()
Me.Caption = "textCtrl1_Change"
End Sub
Private Sub textCtrl1_GotFocus()
Me.Caption = "textCtrl1_GotFocus"
End Sub
Private Sub textCtrl2_Change()
Me.Caption = "textCtrl2_Change"
End Sub
Private Sub textCtrl2_GotFocus()
Me.Caption = "textCtrl2_GotFocus"
End Sub
Public Sub txtArray_Change(Index As Integer)
Me.Caption = "txtArray" & Index & "_Change"
End Sub
Public Sub txtArray_GotFocus(Index As Integer)
Me.Caption = "txtArray" & Index & "_GotFocus"
End Sub
' 於模組
Option Explicit
Public Type LongToByte
B0 As Byte
B1 As Byte
B2 As Byte
B3 As Byte
End Type
Public bLong As LongToByte
Public Const WM_COMMAND = &H111
Public Const GWL_WNDPROC = (-4)
Public MeProc As Long
Public CtrlhWnd() As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_COMMAND
Dim Index As Integer
For Index = 0 To UBound(CtrlhWnd)
If lParam = CtrlhWnd(Index) Then
CopyMemory bLong, wParam, 4
Select Case bLong.B3
Case &H3
Form1.txtArray_Change (Index)
Case &H1
Form1.txtArray_GotFocus (Index)
End Select
End If
Next
End Select
WindowProc = CallWindowProc(MeProc, hwnd, uMsg, wParam, lParam)
End Function
2008/08/04
自動關機 指令 shutdown.exe
它的位置放在windows\system32中。這個文件就是Windows自帶的
關機程式只不過是被隱藏起來了不太好找到。
下面舉個例子來演示一下如何設置shutdown.exe命令:
1.假如您17:00下班您需要電腦在17:01分關機,可以選擇「開始→運行」,
輸入「at 17:01 Shutdown -s」,這樣,到了17:01分電腦就會出現
「系統關機」對話方塊,默認有30秒鍾的倒計時並提示你保存工作。
如果你想以倒計時的方式關機,可以輸入「Shutdown.exe -s -t 3600」,
這裡表示60分鍾後自動關機,「3600」代表60分鍾。
如果想讓Windows 2000也實現同樣的效果,可以把Shutdown.exe複製到系統目錄下。
2.設置好自動關機後,如果想取消的話,可以在運行中輸入「shutdown -a」。
另外輸入「shutdown -i」,則可以打開設置自動關機對話方塊,對自動關機進行設置。
3.Shutdown.exe的參數,每個都具有特定的用途,執行每一個都會產生不同的效果,
比如「-s」就表示關閉本地電腦,「-a」表示取消關機操作,下面列出了更多參數,
大家可以在Shutdown.exe中按需使用。
-f:強行關閉應用程式
-m ╲╲電腦名:控制遠程電腦
-i:顯示圖形用戶界面,但必須是Shutdown的第一個選項
-l:註銷當前用戶
-r:關機並重啟
-t時間:設置關機倒計時
-c "消息內容":輸入關機對話方塊中的消息內容(不能超127個字符)
2008/07/15
建立透明文件夾(看不見可以使用)
建立透明文件夾(看不見可以使用)
第一步:新建一文件夾,命名時先按住[Alt]鍵的同時使用小鍵盤輸入0160數字。
這樣,就得到一個只有文件夾圖標沒有名稱的文件夾。
第二步:右擊文件夾,選「屬性」,打開對話框。切換至「自定義」,單擊「更改圖標」按鈕,彈出「為文件夾更改圖標」對話框。向右拖動下面的滑塊,選擇一個為空的圖標,一路點擊「確定」按鈕,即建立一無名稱、圖標的文件夾。
一般,照名稱排列文件和文件夾裡,透明文件夾會排在第一位。所以,建議在路徑較深的空文件夾來創建,以更隱蔽。
如果忘記文件夾所在位置,可按下[Alt+A]鍵,即可找到。
2008/05/26
對稱式加解
2008/03/14
使用OWC11 畫出統計圖表
先在設計畫面的工具列新增三個項目(三個都在COM元件內).
Microsoft Office Chart 11.0
Microsoft Office PivotTable 11.0
Microsoft Office Spreadsheet 11.0
之後拉一個Microsoft Office Chart 11.0到Form上.
一個Timer
3個RadioButton.
rdb_chChartTypeLine
rdb_chChartTypeLine3D
rdb_chChartTypeLineMarkers
以下即為程式碼原始碼.
private void showChart(ChartChartTypeEnum Type) objChart.Type = Type; objChart.SeriesCollection.Add(0); objChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimCategories, objChart.SeriesCollection.Add(1); objChart.SeriesCollection[1].SetData(ChartDimensionsEnum.chDimCategories, objChart.SeriesCollection[1].SetData(ChartDimensionsEnum.chDimValues, private void rdb_chChartTypeLine_CheckedChanged(object sender, EventArgs e) private void timer1_Tick(object sender, EventArgs e)using Microsoft.Office.Interop.Owc11;
ChartChartTypeEnum _Type;
private void Form1_Load(object sender, EventArgs e)
{
showChart(ChartChartTypeEnum.chChartTypeLine);
}
{
try
{
axChartSpace1.Clear();
ChChart objChart = axChartSpace1.Charts.Add(0);
objChart.HasLegend = true;
objChart.HasTitle = true;
objChart.Title.Caption = "數量統計";
objChart.Axes[0].HasTitle = true;
objChart.Axes[0].Title.Caption = "月份";
objChart.Axes[1].HasTitle = true;
objChart.Axes[1].Title.Caption = "個";
objChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimSeriesNames,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "3C");
+(int)ChartSpecialDataSourcesEnum.chDataLiteral,
"Jan" + '\t' + "Feb" + '\t' + "Mar" + '\t' + "Apr" + '\t' + "May" + '\t' + "Jun" + '\t');
Random r = new Random(DateTime.Now.Second);
string w1 = r.Next(300).ToString();
string w2 = r.Next(300).ToString();
string w3 = r.Next(300).ToString();
string w4 = r.Next(300).ToString();
string w5 = r.Next(300).ToString();
string w6 = r.Next(300).ToString();
objChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimValues,
(int)ChartSpecialDataSourcesEnum.chDataLiteral,
w1 + '\t' + w2 + '\t' + w3 + '\t' + w4 + '\t' + w5 + '\t' + w6 + '\t');
objChart.SeriesCollection[1].SetData(ChartDimensionsEnum.chDimSeriesNames,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "Daily Needs");
+(int)ChartSpecialDataSourcesEnum.chDataLiteral,
"Jan" + '\t' + "Feb" + '\t' + "Mar" + '\t' + "Apr" + '\t' + "May" + '\t' + "Jun" + '\t');
string b1 = r.Next(300).ToString();
string b2 = r.Next(300).ToString();
string b3 = r.Next(300).ToString();
string b4 = r.Next(300).ToString();
string b5 = r.Next(300).ToString();
string b6 = r.Next(300).ToString();
(int)ChartSpecialDataSourcesEnum.chDataLiteral,
b1 + '\t' + b2 + '\t' + b3 + '\t' + b4 + '\t' + b5 + '\t' + b6 + '\t');
}
catch (Exception ex)
{
timer1.Enabled = false;
MessageBox.Show(ex.Message);
}
finally
{
_Type = Type;
}
}
{
if (rdb_chChartTypeLine.Checked)
{
showChart(ChartChartTypeEnum.chChartTypeLine);
return;
}
if (rdb_chChartTypeLine3D.Checked)
{
showChart(ChartChartTypeEnum.chChartTypeLine3D);
return;
}
if (rdb_chChartTypeLineMarkers.Checked)
{
showChart(ChartChartTypeEnum.chChartTypeLineMarkers);
return;
}
}
{
showChart(_Type);
}
2008/03/06
[C#]動態陣列 使用 ArrayList
using System;
using System.Collections; //記得要宣告的
public class SamplesArrayList
{
public static void Main()
{
// Creates and initializes a new ArrayList.
ArrayList myAL = new ArrayList();
myAL.Add("Hello");
myAL.Add("World");
myAL.Add("!");
// Displays the properties and values of the ArrayList.
Console.WriteLine( "myAL" );
Console.WriteLine( " Count: {0}", myAL.Count );
Console.WriteLine( " Capacity: {0}", myAL.Capacity );
Console.Write( " Values:" );
PrintValues( myAL );
}
public static void PrintValues( IEnumerable myList )
{
foreach ( Object obj in myList )
Console.Write( " {0}", obj );
Console.WriteLine();
}
}//This code produces output similar to the following:
//myAL
//Count: 3
//Capacity: f
//Values: Hello World !
[C#]從陣列中移除一行值
static void Main(string[])
{
//array 是固定的,不能動態去變更大小
//只能重新宣告一個新的陣例才能達到你 Remove 的需求
//一般如果是動態的,會用 ArrayList 或是 List<> 來做
string[] aryStr = { "A", "B", "C", "D" };
int removeIndex = 2;//把 C 移掉
// ======= sample 1 ==> 改用 List<string> ====
List<string> list = new List<string>();
foreach (string str in aryStr)
{
list।Add(str);
}
list।RemoveAt(removeIndex);
string[] aryStrRemoveByList = list।ToArray();
foreach (string str in aryStrRemoveByList)
{
Console।WriteLine(str);
}
Console।WriteLine(new String('=', 20));
// ======== sample 2 自已寫Method去轉,不過還是要new新的
string[] aryStrRemoveByArray = new string[aryStr।Length - 1];
int count = 0;
for (int i = 0; i < aryStr।Length; i++)
{
if (i != removeIndex)
{
aryStrRemoveByArray[count] = aryStr[i];
count++;
}
}
foreach (string str in aryStrRemoveByArray)
{
Console।WriteLine(str);
}
}
2008/02/25
C# DateTime 日期格式轉換
C#有個DateTime的物件用來處理日期的其中DateTime.ParseExact 方法(System)方法可以將日期和時間的指定字串表示轉換為其對等的DateTime。
字串表示的格式必須完全符合指定的格式。
再搭配DateTime.ToString (IFormatProvider)
方法使用格式資訊,將這個執行個體的值轉換為它的對等字串表示。
// 將字串日期轉整數
// 日期字串
// 整數日期格式
private static int ParseDate(string _date)
{
//這裡定義所有日期格式
string[] dateFormats = { "yyyy/MM/dd", "yyy/MM/dd", "yy/MM/dd", "y/MM/dd",
"yyyy-MM-dd", "yyy-MM-dd", "yy-MM-dd", "y-MM-dd",
"yyyy/M/dd","yyy/M/dd","yy/M/dd","y/M/dd",
"yyyy-M-dd","yyy-M-dd","yy-M-dd","y-M-dd",
"yyyy/MM/d","yyy/MM/d","yy/MM/d","y/MM/d",
"yyyy-MM-d","yyy-MM-d","yy-MM-d","y-MM-d",
"yyyy/M/d","yyy/M/d","yy/M/d","y/M/d",
"yyyy-M-d","yyy-M-d","yy-M-d","y-M-d"};
try
{
//這裡來處理傳入的格式是否為日期格式,只需要簡單一行
DateTime datetime = DateTime.ParseExact(_date, dateFormats, null, DateTimeStyles.AllowWhiteSpaces);
int iToken = _date.IndexOf("-", 0);
if (iToken == -1)
iToken = _date.IndexOf("/",0);
string iYear = _date.Substring(0, iToken);
switch (iYear.Length)
{
//這裡是利用datetime.ToString(IFormatProvider)
//的方法傳出自己想要的統一格式
case 1:
return Int32.Parse(datetime.ToString("yMMdd"));
case 2:
return Int32.Parse(datetime.ToString("yyMMdd"));
case 3:
return Int32.Parse(datetime.ToString("yyyMMdd"));
case 4:
return Int32.Parse(datetime.ToString("yyyyMMdd"));
}
return 0;
}
catch (Exception)
{
return 0;
}
}
甚至時間也可以這樣來做
// 將字串時間轉換為整數時間
// 時間字串(HH:mm:ss
// HHmmss整數格式
private static int ParseTime(string _time)
{
string[] timeFormats = { "HH:mm:ss", "HH:mm:s","HH:m:ss", "HH:m:s",
"H:mm:ss","H:mm:s","H:m:ss","H:m:s"};
try
{
DateTime datetime = DateTime.ParseExact(_time, timeFormats, null,DateTimeStyles.AllowWhiteSpaces);
return Int32.Parse(datetime.ToString("HHmmss"));
}
catch(Exception)
{
return 0;
}
}
2008/02/21
C# 日期 轉 農曆
System.Globalization 這個命名空間很有趣,竟然有 TaiwanCalendar 與 TaiwanLunisolarCalendar 類別!
TaiwanCalendar 是指台灣使用的曆法,也就是「民國年」的計算法。
DateTime now = DateTime.Now;
TaiwanCalendar tc = new TaiwanCalendar();int year = tc.GetYear(now);
MessageBox.Show(year.ToString());
// Output : 96int month = tc.GetMonth(now);
// Output : 12int daysOfMonth = tc.GetDaysInMonth(year, month);
MessageBox.Show(daysOfMonth.ToString());
// Output : 4
TaiwanLunisolarCalendar 是指台灣使用的陰陽曆(農曆)。和 TaiwanCalendar 相同,但可以使用西元年份計算,而日期和月份則使用陰陽曆計算,真的很省事!
TaiwanLunisolarCalendar tlc = new TaiwanLunisolarCalendar(); // 取得目前支援的農曆日曆到幾年幾月幾日( 2051-02-10 )
tlc.MaxSupportedDateTime.ToShortDateString();
// 取得今天的農曆年月日
txtContent.Text =
tlc.GetYear(DateTime.Now).ToString() + "-" +
tlc.GetMonth(DateTime.Now).ToString() + "-" +
tlc.GetDayOfMonth(DateTime.Now).ToString();
C# 計算日期 是 星期幾
基姆拉爾森計算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來代入公式計算。
代碼如下:
//y-年,m-月,d-日期
string CaculateWeekDay(int y,int m, int d)
{
if(m==1) m=13;
if(m==2) m=14;
int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
string weekstr="";
switch(week)
{
case 1: weekstr="星期一"; break;
case 2: weekstr="星期二"; break;
case 3: weekstr="星期三"; break;
case 4: weekstr="星期四"; break;
case 5: weekstr="星期五"; break;
case 6: weekstr="星期六"; break;
case 7: weekstr="星期日"; break;
}
return weekstr;
}
調用方法:
Label2।Text=CaculateWeekDay(2004,12,9);
取得一年中某一個月天數,EX 2008/01
label4।Text = DateTime.DaysInMonth(2008,1).ToString();
或
先取得2月在減1天,就是1月的最後一天了.
//今天
DateTime.Now.Date.ToString();
//昨天
DateTime.Now.AddDays(-1).ToString();
//明天
DateTime.Now.AddDays(1).ToString();
//本週第1天及最後1天 (要注意的是這裡的每一週是從週日始至週六止)
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek).ToString();
//上週, 一個周是7天,上週就是本週再減去7天
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek - 7).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek - 7).ToString();
//下周
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek + 7).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek + 7).ToString();
//巧用C#裡ToString的字符格式化
//本用第1天及最後1天
DateTime.Now.ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).AddDays(-1).ToString();
//上個月第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(-1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1).ToString();
//下個月第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(2).AddDays(-1).ToString();
//今年第1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).ToString();
//今年最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1).ToString();
//去年第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1).ToString();
//明年第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(2).AddDays(-1).ToString();
//本季,一年四個季度,一個季度三個月
//先把日期推到本季度第一個月,然後這個月的第一天就是本季度的第一天了
DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
//本季度的最後一天就是下季度的第一天減一
DateTime.Parse(DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToString();
//下季
DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.AddMonths(6 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToString();
//上季
DateTime.Now.AddMonths(-3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToString();
2007/10/31
隱藏資料夾 & 隱藏自己的電腦
隱藏資料夾
要想讓其他用戶無法通過網路芳鄰直接來訪問某個資料夾(例如「我的共享」資料夾),我們可以將其「隱藏」起來,具體方法如下:
右擊資料夾圖示,選項彈出快捷功能表中的「共用和安全」,在開啟的視窗中選項「共享」標籤,選項「共享該檔案夾」,在「共享名」後面的文本項中輸入共用資料夾名並在資料夾名後增加一個半形的「$」字元,最後按下「確定」儲存設定。
如果沒有在上面的視窗中給共享檔案名增加「$」符,也可以右擊該共用資料夾,選項「重新命名」將這個共享的檔案名稱後增加一個半形的「$」字元(例如「我的共享$」)。
經過這樣的操作之後,其他用戶開啟網路芳鄰時,在網路芳鄰列表中將不會看到該共用資料夾了。
如果你希望某個用戶去訪問你的這個共用資料夾,只要告訴他這個共用資料夾的絕對路徑即可,此路徑為「\\你的電腦名稱\我的共享$」,只要將其輸入到檔案總管的位址欄中並Enter鍵即可訪問了,注意:後面的「$」是必不可少的,如果少了該字元將訪問不成功。
隱藏自己的電腦
上面的方法是在區域網路內隱藏一個特定的資料夾,如果你想將自己的電腦也隱藏起來,請看:
按下「開始→執行」,在開啟的「執行」對話視窗中輸入「cmd」開啟指令行視窗,輸入「net config server /hidden:yes」,再Enter鍵就可以了,這樣,別人就無法從網路芳鄰中直接看到你的電腦,只有通過在檔案總管位址欄中輸入「\\電腦名稱」 才來訪問你的電腦。
不過,通過上面的方法只能對當前有效,以後每次重新啟動系統後要重新執行該指令才行,如果希望將自己的電腦從網路芳鄰中永久隱藏,可以通過修改註冊表來達到目的:
開啟註冊表編輯器,在左側視窗中展開「HKEY_LOCAL_MACHINE\
SYSTEM\CurrentControlSet\Services\lanmanserver\Parameters」,在右側視窗中找到DWORD檔案檔案類型值改為「1」,按「F5」重新整理註冊表即可。
2007/10/30
別讓 MsgBox 中斷了一些 Background 的處理作業
在 VB 中,一旦您呼叫了 MsgBox,您正在執行的一些 Background 的處理作業,例如計數器或時鐘...等,都會停下來,直到您回應了 MsgBox 之后,一切才會恢复正常!或許您并不希望如此,這也有可能造成一些不必要的錯誤!
要解決這個問題,您必須使用 Windows API 去呼叫 MessageBox Function,它的使用方法、外觀和 MsgBox 的結果完全相同,但是它卻不會中斷一些 Background 的處理作業!
在以下的范例中,您要在 Form 中加入一個 Label、二個 CommandButton 及一個 Timer,不更改任何屬性。
'在聲明區中加入以下聲明:
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
'加入以下程序碼:
Private Sub Command1_Click()
MsgBox "計時器停掉了!", 64, "VB 的訊息框"
End Sub
Private Sub Command2_Click()
MessageBox Me.hwnd, "注意!計時器還在跑!", "API 的訊息框", 64
End Sub
Private Sub Form_Load()
Timer1.Interval = 1000
Label1.Caption = "目前的時間是:" & Time
End Sub
Private Sub Timer1_Timer()
Label1.Caption = "目前的時間是:" & Time
End Sub
2007/10/25
VB程式中跳下一個駐點的方法
'檢查是否為數值 and 檢查是否按下"Enter"
a = MsgBox("Input Error", , "Error")
Else
If KeyCode = 13 Then
SendKeys "{TAB}" '傳送"Tab"鍵值
End If
End If
End Sub
VB程式中使用滑鼠滾倫
說明
由於VB自訂的事件中,並沒有這項訊息,於是只好自己攔截WM_MOUSEWHEEL這個訊息了
程式
'以下在.Bas
Option Explicit
'用以告訴系統當這個視窗的msg事件發生時 執行lpPrevWndFunc
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'lpPrevWndFunc執行函數的位址
'hwnd 就是視窗的hwnd屬性
'Msg就是訊息 例如按下滑鼠右鍵 最大化....
'wParam,lParam會因Msg不同而有不同的用途
'用以設定視窗的程序
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
'hwnd 就是所要設定視窗的hwnd屬性
'nIndex 是要設定的程序
'dwNewLong 所指定的程序(nIndex)所要執行的動作
Public Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEWHEEL = &H20A
Public PrevWndProc As Long
Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim t(0 To 1) As Integer
If uMsg = WM_MOUSEWHEEL Then '如果是滾輪
If wParam < 0 Then 'backward
Form1.Top = Form1.Top + 10
Else 'forforward
Form1.Top = Form1.Top - 10
End If
Else
WndProc = CallWindowProc(PrevWndProc, hwnd, uMsg, wParam, lParam)
'其他訊息用原來的回呼函數處理
End If
End Function
'以下在Form1中
Option Explicit
Private Sub Form_Load()
PrevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
'設定新的回呼函式 以攔截訊息
'note: 傳回值PrevWndProc是原來視窗的回呼函數
'WndProc函數放在模組 因為AddressOf只能取得模組下函數的位址
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim lResult As Long
lResult = SetWindowLong(Me.hwnd, GWL_WNDPROC, PrevWndProc)
'結束時歸還原來的回呼函數 不然會當機
End Sub
相關資訊
WM_MOUSEWHEEL
SetWindowLong
CallWindowProc
文件出處
Honey
2007/04/24
使用EXCEL計算貸款金額
使用PMT公式計算貸款的每月繳款金額,=PMT(月利率 rate , 總期數 nper, 貸款金額 pv),
月利率rate、總期數nper、貸款金額pv都是正數,正數表示領到金額,PMT算出的數字會是負數,
而負數表示要付出金錢。
如果希望知道繳了一年12期之後,還剩下多少貸款金額尚未償還,
可以利用PMT加上FV兩個公式來合併計算,首先,計算出每期的繳款金額,
然後利用FV,=FV(月利率 rate , 繳費幾期之後 nper, 每期繳款 pmt, 貸款金額 pv),
FV會算出負數,而負數表示還剩下多少貸款金額尚未償還。
想知道每期繳款中,有多少是繳付本金,有多少是繳付利息,
可以分別使用PPMT與IPMT這兩個公式,=PPMT(月利率 rate,
哪一期 per , 總期數 nper, 貸款金額 pv),PPMT會算出負數,
而負數表示那期繳款中,償還本金的金額。同格式,IPMT表示那期繳款中,
償還利息的金額。
2007/03/13
VB中各種進制的轉換
'-------------------------------------------
' 輸入:Dec(十進制數)
' 輸入數據類型:Long
' 輸出:DEC_to_BIN(二進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647,輸出最大數為1111111
'-------------------------------------------
Public Function DEC_to_BIN(Dec As Long) As String
DEC_to_BIN = ""
Do While Dec > 0
DEC_to_BIN = Dec Mod 2 & DEC_to_BIN
Dec = Dec \ 2
Loop
End Function
'-------------------------------------------
' 用途:將二進制轉化為十進制
' 輸入:Bin(二進制數)
' 輸入數據類型:String
' 輸出:BIN_to_DEC(十進制數)
' 輸出數據類型:Long
' 輸入的最大數為111111111111111111111111
'-------------------------------------------
Public Function BIN_to_DEC(ByVal Bin As String) As Long
Dim i As Long
For i = 1 To Len(Bin)
BIN_to_DEC = BIN_to_DEC * 2 + Val(Mid(Bin, i, 1))
Next i
End Function
'-------------------------------------------
' 用途:將十六進制轉化為二進制
' 輸入:Hex(十六進制數)
' 輸入數據類型:String
' 輸出:HEX_to_BIN(二進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647個字符
'-------------------------------------------
Public Function HEX_to_BIN(ByVal Hex As String) As String
Dim i As Long
Dim B As String
Hex = UCase(Hex)
For i = 1 To Len(Hex)
Select Case Mid(Hex, i, 1)
Case "0": B = B & "0000"
Case "1": B = B & "0001"
Case "2": B = B & "0010"
Case "3": B = B & "0011"
Case "4": B = B & "0100"
Case "5": B = B & "0101"
Case "6": B = B & "0110"
Case "7": B = B & "0111"
Case "8": B = B & "1000"
Case "9": B = B & "1001"
Case "A": B = B & "1010"
Case "B": B = B & "1011"
Case "C": B = B & "1100"
Case "D": B = B & "1101"
Case "E": B = B & "1110"
Case "F": B = B & "1111"
End Select
Next i
While Left(B, 1) = "0"
B = Right(B, Len(B) - 1)
Wend
HEX_to_BIN = B
End Function
'-------------------------------------------
' 用途:將二進制轉化為十六進制
' 輸入:Bin(二進制數)
' 輸入數據類型:String
' 輸出:BIN_to_HEX(十六進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647個字符
'-------------------------------------------
Public Function BIN_to_HEX(ByVal Bin As String) As String
Dim i As Long
Dim H As String
If Len(Bin) Mod 4 <> 0 Then
Bin = String(4 - Len(Bin) Mod 4, "0") & Bin
End If
For i = 1 To Len(Bin) Step 4
Select Case Mid(Bin, i, 4)
Case "0000": H = H & "0"
Case "0001": H = H & "1"
Case "0010": H = H & "2"
Case "0011": H = H & "3"
Case "0100": H = H & "4"
Case "0101": H = H & "5"
Case "0110": H = H & "6"
Case "0111": H = H & "7"
Case "1000": H = H & "8"
Case "1001": H = H & "9"
Case "1010": H = H & "A"
Case "1011": H = H & "B"
Case "1100": H = H & "C"
Case "1101": H = H & "D"
Case "1110": H = H & "E"
Case "1111": H = H & "F"
End Select
Next i
While Left(H, 1) = "0"
H = Right(H, Len(H) - 1)
Wend
BIN_to_HEX = H
End Function
'-------------------------------------------
' 用途:將十六進制轉化為十進制
' 輸入:Hex(十六進制數)
' 輸入數據類型:String
' 輸出:HEX_to_DEC(十進制數)
' 輸出數據類型:Long
' 輸入的最大數為7FFFFFFF,輸出的最大數為21474836
'-------------------------------------------
Public Function HEX_to_DEC(ByVal Hex As String) As Long
Dim i As Long
Dim B As Long
Hex = UCase(Hex)
For i = 1 To Len(Hex)
Select Case Mid(Hex, Len(Hex) - i + 1, 1)
Case "0": B = B + 16 ^ (i - 1) * 0
Case "1": B = B + 16 ^ (i - 1) * 1
Case "2": B = B + 16 ^ (i - 1) * 2
Case "3": B = B + 16 ^ (i - 1) * 3
Case "4": B = B + 16 ^ (i - 1) * 4
Case "5": B = B + 16 ^ (i - 1) * 5
Case "6": B = B + 16 ^ (i - 1) * 6
Case "7": B = B + 16 ^ (i - 1) * 7
Case "8": B = B + 16 ^ (i - 1) * 8
Case "9": B = B + 16 ^ (i - 1) * 9
Case "A": B = B + 16 ^ (i - 1) * 10
Case "B": B = B + 16 ^ (i - 1) * 11
Case "C": B = B + 16 ^ (i - 1) * 12
Case "D": B = B + 16 ^ (i - 1) * 13
Case "E": B = B + 16 ^ (i - 1) * 14
Case "F": B = B + 16 ^ (i - 1) * 15
End Select
Next i
HEX_to_DEC = B
End Function
'-------------------------------------------
' 用途:將十進制轉化為十六進制
' 輸入:Dec(十進制數)
' 輸入數據類型:Long
' 輸出:DEC_to_HEX(十六進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647,輸出最大數為7FFFFFF
'-------------------------------------------
Public Function DEC_to_HEX(Dec As Long) As String
Dim a As String
DEC_to_HEX = ""
Do While Dec > 0
a = CStr(Dec Mod 16)
Select Case a
Case "10": a = "A"
Case "11": a = "B"
Case "12": a = "C"
Case "13": a = "D"
Case "14": a = "E"
Case "15": a = "F"
End Select
DEC_to_HEX = a & DEC_to_HEX
Dec = Dec \ 16
Loop
End Function
'-------------------------------------------
' 用途:將十進制轉化為八進制
' 輸入:Dec(十進制數)
' 輸入數據類型:Long
' 輸出:DEC_to_OCT(八進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647,輸出最大數為1777777
'-------------------------------------------
Public Function DEC_to_OCT(Dec As Long) As String
DEC_to_OCT = ""
Do While Dec > 0
DEC_to_OCT = Dec Mod 8 & DEC_to_OCT
Dec = Dec \ 8
Loop
End Function
'-------------------------------------------
' 用途:將八進制轉化為十進制
' 輸入:Oct(八進制數)
' 輸入數據類型:String
' 輸出:OCT_to_DEC(十進制數)
' 輸出數據類型:Long
' 輸入的最大數為17777777777,輸出的最大數為21474
'-------------------------------------------
Public Function OCT_to_DEC(ByVal Oct As String) As Long
Dim i As Long
Dim B As Long
For i = 1 To Len(Oct)
Select Case Mid(Oct, Len(Oct) - i + 1, 1)
Case "0": B = B + 8 ^ (i - 1) * 0
Case "1": B = B + 8 ^ (i - 1) * 1
Case "2": B = B + 8 ^ (i - 1) * 2
Case "3": B = B + 8 ^ (i - 1) * 3
Case "4": B = B + 8 ^ (i - 1) * 4
Case "5": B = B + 8 ^ (i - 1) * 5
Case "6": B = B + 8 ^ (i - 1) * 6
Case "7": B = B + 8 ^ (i - 1) * 7
End Select
Next i
OCT_to_DEC = B
End Function
'-------------------------------------------
' 用途:將二進制轉化為八進制
' 輸入:Bin(二進制數)
' 輸入數據類型:String
' 輸出:BIN_to_OCT(八進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647個字符
'-------------------------------------------
Public Function BIN_to_OCT(ByVal Bin As String) As String
Dim i As Long
Dim H As String
If Len(Bin) Mod 3 <> 0 Then
Bin = String(3 - Len(Bin) Mod 3, "0") & Bin
End If
For i = 1 To Len(Bin) Step 3
Select Case Mid(Bin, i, 3)
Case "000": H = H & "0"
Case "001": H = H & "1"
Case "010": H = H & "2"
Case "011": H = H & "3"
Case "100": H = H & "4"
Case "101": H = H & "5"
Case "110": H = H & "6"
Case "111": H = H & "7"
End Select
Next i
While Left(H, 1) = "0"
H = Right(H, Len(H) - 1)
Wend
BIN_to_OCT = H
End Function
'-------------------------------------------
' 用途:將八進制轉化為二進制
' 輸入:Oct(八進制數)
' 輸入數據類型:String
' 輸出:OCT_to_BIN(二進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647個字符
'-------------------------------------------
Public Function OCT_to_BIN(ByVal Oct As String) As String
Dim i As Long
Dim B As String
For i = 1 To Len(Oct)
Select Case Mid(Oct, i, 1)
Case "0": B = B & "000"
Case "1": B = B & "001"
Case "2": B = B & "010"
Case "3": B = B & "011"
Case "4": B = B & "100"
Case "5": B = B & "101"
Case "6": B = B & "110"
Case "7": B = B & "111"
End Select
Next i
While Left(B, 1) = "0"
B = Right(B, Len(B) - 1)
Wend
OCT_to_BIN = B
End Function
'-------------------------------------------
' 用途:將八進制轉化為十六進制
' 輸入:Oct(八進制數)
' 輸入數據類型:String
' 輸出:OCT_to_HEX(十六進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647個字符
'-------------------------------------------
Public Function OCT_to_HEX(ByVal Oct As String) As String
Dim Bin As String
Bin = OCT_to_BIN(Oct)
OCT_to_HEX = BIN_to_HEX(Bin)
End Function
'-------------------------------------------
' 用途:將十六進制轉化為八進制
' 輸入:Hex(十六進制數)
' 輸入數據類型:String
' 輸出:HEX_to_OCT(八進制數)
' 輸出數據類型:String
' 輸入的最大數為2147483647個字符
'-------------------------------------------
Public Function HEX_to_OCT(ByVal Hex As String) As String
Dim Bin As String
Hex = UCase(Hex)
Bin = HEX_to_BIN(Hex)
HEX_to_OCT = BIN_to_OCT(Bin)
End Function
VB自帶函數:
十進制轉八進制:Oct(num)
十六進制轉八進制:oct("&H" & num)
十進制轉十六進制:hex(num)
八進制轉十六進制:hex("&O" & num)
十六進制轉換為十進制
Dim str As String
str = Text2.Text
Text10.Text = CLng("&H" & str)
