วันจันทร์ที่ 6 ตุลาคม พ.ศ. 2557


โปรแกรม Batch Editor 1.0 รุ่นนี้...สร้างมาจาก HTML Application ซึ่งเดิมที่...เป็น Notepad แต่ผมจะมาประยุกต์ให้มันทำงานซับซ้อนมากยิ่งขึ้นด้วยการพัฒนาให้มันประมวลผลหรือ ดีบัก แบตช์ไฟล์...แต่สำหรับตอนนี้...เอารุ่น 1.0 ไปศึกษากันก่อนนะครับ...สำหรับรุ่นที่สามารถเขียนแบตช์ได้อย่างมืออาชีพ...โดยแผนงานแล้ว..."ไม่ฟรี" จึงยังไม่แจกนะครับ...

แต่สำหรับโค้ดรุ่น 1.0 Open Source Software ครับ

<html><head>
<HTA:APPLICATION
APPLICATIONNAME="HTML NotePad" ID="oHTA" BORDER="thick"
BORDERSTYLE="normal" CAPTION="yes" CONTEXTMENU="yes"
INNERBORDER="no" MAXIMIZEBUTTON="yes" MINIMIZEBUTTON="yes"
NAVIGABLE="yes"
ICON="NOTEPAD.EXE" SCROLL="no" SCROLLFLAT="no"
SELECTION="no" SHOWINTASKBAR="yes" SINGLEINSTANCE="no"
SYSMENU="yes" VERSION="1.0" WINDOWSTATE="normal">
<STYLE TYPE="text/css">
<!--
BODY { xfont-family: "Verdana, Arial, Helvetica, sans-serif";
font:menu;
background-color:Menu;
color:MenuText;
xfont-size: 8pt;
cursor:default; //auto, text, pointer
}
TABLE { xfont-family:"Arial";
xfont-size:8pt;
font:menu;
padding:0pt;
border:0pt;
FILTER: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=90);
}
IFrame { height:expression(document.body.clientHeight-MenuTable.clientHeight);
width:100%;
}
TD { border:"1px solid Menu";}
.submenu {position:absolute;top=20;
background-color:Menu;
border="2px outset";}
.MenuIn {border:'1px inset';}
.Menuover {border:'1px outset';}
.Menuout {border:'1px solid';}
.Submenuover {background-color:highlight;color:highlighttext;}
.Submenuout {background-color:Menu;color:MenuText;}
-->
</STYLE>
<script language=vbscript>
'We can handle a file as a parameter to this HTA
Dim x
FileName=Trim(oHTA.CommandLine)
x=Instr(2,FileName,"""")
If x=Len(FileName) Then
FileName="" 'No File Loaded
Else
FileName=Trim(Mid(FileName,x+1))
OpenIt
End If
</script>
<script language=vbscript>
option explicit
Dim FileName,fModif,LastChildMenu,LastMenu
fModif=False 'Not modified
DisplayTitle
Set LastChildMenu=Nothing
Set LastMenu=Nothing
Sub DisplayTitle
If FileName="" Then
document.Title="Batch Editor - " & oHTA.ApplicationName
Else
document.Title=FileName & " - " & oHTA.ApplicationName
End If
End Sub

'''''''''''''''''''
' File management '
'''''''''''''''''''
Sub SaveAs
Dim oDLG
Set oDLG=CreateObject("MSComDlg.CommonDialog")
With oDLG
.DialogTitle="SaveAs"
.Filter="Batch File|*.bat;*.cmd|Text Files|*.txt|All files|*.*"
.MaxFileSize=255
.ShowSave
If .FileName<>"" Then
FileName=.FileName
Save
End If
End With
Set oDLG=Nothing
DisplayTitle
End Sub
Sub Save()
Dim fso,f
If FileName<>"" Then
Set fso=CreateObject("Scripting.FileSystemObject")
Set f=fso.CreateTextFile(FileName,True)
f.Write MyFrame.MyText.Value
f.Close
Set f=Nothing
Set fso=Nothing
Else
SaveAs
End If
End Sub
Sub OpenIt
Dim fso,f
Set fso=CreateObject("Scripting.FileSystemObject")
Set f=fso.OpenTextFile(FileName,1)
MyFrame.MyText.Value=f.ReadAll
f.close
Set f=Nothing
Set fso=Nothing
DisplayTitle
End Sub
Sub Open()
If fModif Then
Select Case Msgbox("The text in the file " & FileName & " has been changed." _
& vbCrLf & "Do you want to save the changes ?",51,oHTA.ApplicationName)
Case 6 'Yes
Save
Case 7 'No
Case 2 'Cancel
Exit Sub
End Select
End If
Dim oDLG
Set oDLG=CreateObject("MSComDlg.CommonDialog")
With oDLG
.DialogTitle="Open"
.Filter="Batch File|*.bat;*.cmd|Text Files|*.txt|All files|*.*"
.MaxFileSize=255
.Flags=.Flags Or &H1000 'FileMustExist (OFN_FILEMUSTEXIST)
.ShowOpen
If .FileName<>"" Then
FileName=.FileName
OpenIt
End If
End With
Set oDLG=Nothing
End Sub
Sub NewText
If fModif Then
Select Case Msgbox("The text in the file " & FileName & " has been changed." _
& vbCrLf & "Do you want to save the changes ?",51,oHTA.ApplicationName)
Case 6 'Yes
Save
Case 7 'No
Case 2 'Cancel
Exit Sub
End Select
End If
MyFrame.MyText.Value=""
FileName=""
DisplayTitle
End Sub

'''''''''''''''
' Drag & Drop '
'''''''''''''''
Sub ChangeIFrame
'We use an Iframe to allow Drag&Drop
MyFrame.Document.Body.InnerHTML="<textarea ID=MyText WRAP=OFF onChange" & _
"='vbscript:parent.fModif=True' onclick='vbscript:parent.HideMenu' " & _
"style='width:100%;height:100%'></textarea>"
With MyFrame.Document.Body.Style
.marginleft=0
.margintop=0
.marginright=0
.marginbottom=0
End With
With MyFrame.MyText.Style
.fontfamily="Lucida Console"
'.fontsize="16pt"
End With
Select Case UCase(MyFrame.location.href)
Case "ABOUT:BLANK"
FileName=""
Case Else
FileName=Replace(Mid(MyFrame.location.href,9),"/","\") 'suppress file:///
OpenIt
End Select
End Sub

'''''''''''''''''''
' Menu management '
'''''''''''''''''''
Sub Batch(Cmd)
    Dim objShell
    Set objShell=CreateObject("wscript.shell")
objShell.run("cmd.exe /c " & Cmd & "/? & PAUSE")
End Sub

Sub ShowSubMenu(Parent,Child)
If Child.style.display="block" Then
Parent.classname="Menuover"
Child.style.display="none"
Set LastChildMenu=Nothing
Else
Parent.classname="Menuin"
Child.style.display="block"
Set LastChildMenu=Child
End If
Set LastMenu=Parent
End Sub
Sub MenuOver(Parent,Child)
If LastChildMenu is Nothing Then
Parent.className="MenuOver"
Else
If LastMenu is Parent Then
Parent.className="MenuIn"
Else
HideMenu
ShowSubMenu Parent,Child
End If
End If
End Sub
Sub MenuOut(Menu)
If LastChildMenu is Nothing Then Menu.className="MenuOut"
End Sub
Sub HideMenu
If Not LastChildMenu is Nothing Then
LastChildMenu.style.display="none"
Set LastChildMenu=Nothing
LAstMenu.classname="Menuout"
End If
End Sub
Sub SubMenuOver(Menu)
Menu.className="SubMenuOver"
'LastMenu.classname="Menuin"
End Sub
Sub SubMenuOut(Menu)
Menu.className="SubMenuOut"
End Sub
</script>
</head>
<body leftmargin=0 topmargin=0 rightmargin=0>
<TABLE id=MenuTable><TR>
<TD onclick='ShowSubMenu Me,MyFileMenu'
onmouseover='MenuOver Me,MyFileMenu'
onmouseout='MenuOut Me'> แฟ้มข้อมูล   </TD>
<TD onclick='ShowSubMenu Me,MyEditMenu'
onmouseover='MenuOver Me,MyEditMenu'
onmouseout='MenuOut Me'> คำสั่ง Batch</TD>
<TD onclick='ShowSubMenu Me,MyHelpMenu'
onmouseover='MenuOver Me,MyHelpMenu'
onmouseout='MenuOut Me'> ผู้เขียน </TD>
<TD onclick="HideMenu" width=100% border=2></TD>
</TR>
</TABLE>
<TABLE ID=MyFileMenu class=submenu style="left=2;display:none;"><TR>
<TD onclick="HideMenu:NewText"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> สร้างใหม่</TD></TR>
<TR><TD onclick="HideMenu:open"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> เปิดแฟ้ม</TD></TR>
<TR><TD onclick="HideMenu:save"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> บันทึกแฟ้ม</TD></TR>
<TR><TD onclick="HideMenu:saveAs"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> บันทึกแฟ้มเป็น...</TD></TR>
<TR><TD><HR></TD></TR>
<TR><TD onclick="HideMenu:window.close"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> ออก</TD>
</TR>
</TABLE>
<TABLE ID=MyEditMenu class=submenu style="left=30;display:none;">
<TR><TD onclick="HideMenu:Batch('ASSOC')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> ASSOC</TD>
   <TD onclick="HideMenu:Batch('ATTRIB')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> ATTRIB</TD>
   <TD onclick="HideMenu:Batch('BREAK')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> BREAK</TD>
   <TD onclick="HideMenu:Batch('BCDEDIT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> BCDEDIT</TD></TR>
<TR><TD onclick="HideMenu:Batch('CACLS')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CACLS</TD>
   <TD onclick="HideMenu:Batch('CALL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CALL</TD>
   <TD onclick="HideMenu:Batch('CD')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CD</TD>
   <TD onclick="HideMenu:Batch('CHCP')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CHCP</TD></TR>
<TR><TD onclick="HideMenu:Batch('CHDIR')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CHDIR</TD>
   <TD onclick="HideMenu:Batch('CHKDSK')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CHKDSK</TD>
   <TD onclick="HideMenu:Batch('CHKNTFS')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CHKNTFS</TD>
   <TD onclick="HideMenu:Batch('CLS')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CLS</TD></TR>
<TR><TD onclick="HideMenu:Batch('CMD')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CMD</TD>
   <TD onclick="HideMenu:Batch('COLOR')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> COLOR</TD>
   <TD onclick="HideMenu:Batch('COMP')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> COMP</TD>
   <TD onclick="HideMenu:Batch('COMPACT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> COMPACT</TD></TR>
<TR><TD onclick="HideMenu:Batch('CONVERT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> CONVERT</TD>
   <TD onclick="HideMenu:Batch('COPY')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> COPY</TD>
   <TD onclick="HideMenu:Batch('DATE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> DATE</TD>
   <TD onclick="HideMenu:Batch('DEL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> DEL</TD></TR>
<TR><TD onclick="HideMenu:Batch('COPY')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> COPY</TD>
   <TD onclick="HideMenu:Batch('DISKCOMP')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> DISKCOMP</TD>
   <TD onclick="HideMenu:Batch('DISKCOPY')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> DISKCOPY</TD>
   <TD onclick="HideMenu:Batch('DISKPART')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> DISKPART</TD></TR>
<TR><TD onclick="HideMenu:Batch('DOSKEY')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> DOSKEY</TD>
   <TD onclick="HideMenu:Batch('DRIVERQUERY')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> DRIVERQUERY</TD>
   <TD onclick="HideMenu:Batch('ECHO')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> ECHO</TD>
   <TD onclick="HideMenu:Batch('ENDLOCAL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> ENDLOCAL</TD></TR>
<TR><TD onclick="HideMenu:Batch('ERASE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> ERASE</TD>
   <TD onclick="HideMenu:Batch('EXIT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> EXIT</TD>
   <TD onclick="HideMenu:Batch('FC')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> FC</TD>
   <TD onclick="HideMenu:Batch('FIND')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> FIND</TD></TR>
<TR><TD onclick="HideMenu:Batch('FINDSTR')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> FINDSTR</TD>
   <TD onclick="HideMenu:Batch('FOR')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> FOR</TD>
   <TD onclick="HideMenu:Batch('FC')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> FC</TD>
   <TD onclick="HideMenu:Batch('FORMAT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> FORMAT</TD></TR>
<TR><TD onclick="HideMenu:Batch('FSUTIL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> FSUTIL</TD>
   <TD onclick="HideMenu:Batch('FTYPE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> FTYPE</TD>
   <TD onclick="HideMenu:Batch('GOTO')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> GOTO</TD>
   <TD onclick="HideMenu:Batch('GPRESULT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> GPRESULT</TD></TR>
<TR><TD onclick="HideMenu:Batch('GRATABL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> GRAFTABL</TD>
   <TD onclick="HideMenu:Batch('HELP')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> HELP</TD>
   <TD onclick="HideMenu:Batch('ICACLS')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> ICACLS</TD>
   <TD onclick="HideMenu:Batch('IF')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> IF</TD></TR>
<TR><TD onclick="HideMenu:Batch('LABEL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> LABEL</TD>
   <TD onclick="HideMenu:Batch('MD')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> MD</TD>
   <TD onclick="HideMenu:Batch('MKDIR')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> MKDIR</TD>
   <TD onclick="HideMenu:Batch('MKLINK')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> MKLINK</TD></TR>
<TR><TD onclick="HideMenu:Batch('MODE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> MODE</TD>
   <TD onclick="HideMenu:Batch('MORE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> MORE</TD>
   <TD onclick="HideMenu:Batch('MOVE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> MOVE</TD>
   <TD onclick="HideMenu:Batch('OPENFILES')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> OPENFILES</TD></TR>
<TR><TD onclick="HideMenu:Batch('PATH')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> PATH</TD>
   <TD onclick="HideMenu:Batch('PAUSE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> PAUSE</TD>
   <TD onclick="HideMenu:Batch('POPD')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> POPD</TD>
   <TD onclick="HideMenu:Batch('PRINT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> PRINT</TD></TR>
<TR><TD onclick="HideMenu:Batch('PROMPT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> PROMPT</TD>
   <TD onclick="HideMenu:Batch('PUSHD')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> PUSHD</TD>
   <TD onclick="HideMenu:Batch('RD')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> RD</TD>
   <TD onclick="HideMenu:Batch('RECOVER')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> RECOVER</TD></TR>
<TR><TD onclick="HideMenu:Batch('REM')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> REM</TD>
   <TD onclick="HideMenu:Batch('REN')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> REN</TD>
   <TD onclick="HideMenu:Batch('RENAME')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> RENAME</TD>
   <TD onclick="HideMenu:Batch('REPLACE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> REPLACE</TD></TR>
<TR><TD onclick="HideMenu:Batch('RMDIR')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> RMDIR</TD>
   <TD onclick="HideMenu:Batch('ROBOCOPY')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> ROBOCOPY</TD>
   <TD onclick="HideMenu:Batch('SET')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SET</TD>
   <TD onclick="HideMenu:Batch('SETLOCAL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SETLOCAL</TD></TR>
<TR><TD onclick="HideMenu:Batch('SC')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SC</TD>
   <TD onclick="HideMenu:Batch('SCHTASKS')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SCHTASKS</TD>
   <TD onclick="HideMenu:Batch('SHIFT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SHIFT</TD>
   <TD onclick="HideMenu:Batch('SHUTDOWN')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SHUTDOWN</TD></TR>
<TR><TD onclick="HideMenu:Batch('SORT')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SORT</TD>
   <TD onclick="HideMenu:Batch('START')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> START</TD>
   <TD onclick="HideMenu:Batch('SUBST')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SUBST</TD>
   <TD onclick="HideMenu:Batch('SYSTEMINFO')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> SYSTEMINFO</TD></TR>
<TR><TD onclick="HideMenu:Batch('TASKLIST')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> TASKLIST</TD>
   <TD onclick="HideMenu:Batch('TASKILL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> TASKKILL</TD>
   <TD onclick="HideMenu:Batch('TIME')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> TIME</TD>
   <TD onclick="HideMenu:Batch('TITLE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> TITLE</TD></TR>
<TR><TD onclick="HideMenu:Batch('TREE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> TREE</TD>
   <TD onclick="HideMenu:Batch('TYPE')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> TYPE</TD>
   <TD onclick="HideMenu:Batch('VER')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> VER</TD>
   <TD onclick="HideMenu:Batch('VERIFY')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> VERIFY</TD></TR>
<TR><TD onclick="HideMenu:Batch('VOL')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> VOL</TD>
   <TD onclick="HideMenu:Batch('XCOPY')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> XCOPY</TD>
   <TD onclick="HideMenu:Batch('WMIC')"
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'> WMIC</TD>
</TR>
</TABLE>
<TABLE ID=MyFindMenu class=submenu style="left=60;display:none;"><TR>
<TD><HR width=50px></TD></TR>
</TABLE>
<TABLE ID=MyHelpMenu class=submenu style="left=90;display:none;"><TR>
<TD onclick='HideMenu:msgbox "ความช่วยเหลืออยู่ในเวป www.thaibatchfile.blogspot.com"'
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'>Help</TD></TR>
<TR><TD onclick='HideMenu:msgbox "ธนัตถ์เดชน์  บุญลือลักษณ์, 2014; www.thaibatchfile.blogspot.com"'
onmouseover='Submenuover Me'
onmouseout='Submenuout Me'>About</TD>
</TR>
</TABLE>
<iframe id=MyFrame application=yes scrolling=no onload="ChangeIFrame"></iframe>
</script>
</body>
</html>

วันอังคารที่ 26 สิงหาคม พ.ศ. 2557

การเขียนแบตช์ไฟล์เพื่อแสดงผลใน HTML Application ตอนที่ 2

วันนี้นั่งแกะ HTML ครึ่งวัน...จะทำ Explorer ฉบับ Console เล่นเอาซะเหนื่อย ไม่ถนัด VBScript ที่มันติดนั่นติดนี่ แต่ก็เดาทางจนจบ...หลายๆ คนอยากเขียนแบตช์ไฟล์ให้สามารถทำงานร่วมกับ HTML Application โดยใช้ Environment โอย...ยากมาก...ยังเดาทางมันไม่ได้เลย...เพราะการโปรเซสของมันแยกคนละเซกชั่น...หากนำมารวมกัน...มันยากมาก...และถ้ามีการประมวลผล...หลายแบตช์ไฟล์พร้อมกัน...มั่วแน่..ๆ ครับท่าน...เลยใช้วิธีเดิม...คือโยน Parameter ระหว่างกันซะ...โดยโปรแกรมที่สร้างขึ้นมาด้วย VBScript จะรับการทำงานของแบตช์รอการเรียกใช้งานผ่าน Parameter 3 (เทียบได้กับ Parameter1 ของแบตช์ไฟล์) ถ้าไม่มีการเรียกมาจากแบตช์ไฟล์โปรแกรมจะไม่ทำงาน...ถ้ามีการส่งชื่อโปรแกรมแบตช์ไฟล์ที่เรียกใช้...มันจะโยนค่าแฟ้มที่เลือกผ่านโปรแกรมไปยังแบตช์ไฟล์ที่เรียกเท่านั้น...เพื่อไม่ให้เกิดการทำงานที่ชนกัน...หรือเขียนทับเส้นทาง...ตัวอย่าง...
โปรแกรมนี้...จะทำหน้าที่เป็นเมนูให้แบตช์ไฟล์เลือกไฟล์ที่อยู่ในคอมพิวเตอร์และโยนชื่อแฟ้มที่เลือกให้แบตช์ไฟล์นำไปใช้งานต่อ...นั้นเอง...(ธีม...แบบ Monochrome อีกแล้ว) โปรแกรมสามารถมีแถบเมนูให้เลือกด้วยเมาส์...ไม่ต้องละมือไปจับแป้นคีย์ใดๆ เพื่อให้การเขียนแบตช์ข้ามขีดความสามารถแบบยุคคุณปู่ไป...ตัวอย่าง...
ส่วนภาษาไทยนะเหรอ...ลองรับทุกสถานการณ์...ฮ่าฮ่า...(แต่เมื่อโยนไปที่แบตช์ไฟล์แล้ว...ตัวใครตัวมัน)
คุณสามารถใช้คำสั่ง Ctrl+F เพื่อหาข้อความภายใน HTML แบบเดียวกับหน้าเวป...เพื่อช่วยหาแฟ้มข้อมูลที่มีหลายๆ บรรทัดได้เช่นกัน ที่นี้...การเขียนแบตช์ไฟล์ให้เป็น Hi-End ก็จะเริ่มก็ตัวขึ้นล่ะทีนี้...
โค้ด...แจกฟรี...และ Open Source เช่นเดิม...

ถ้าจะทดสอบ...ให้บันทึกชื่อ XFile.HTA

<HTML>
 <HEAD>
 <HTA:APPLICATION ID="FileBrowser"
    APPLICATIONNAME="FileBrowser"
    WINDOWSTATE="normal"
    SINGLEINSTANCE="no"
 >
 <TITLE>กรุณาเลือกไฟล์</TITLE>
  <style type="text/css">
   ul { list-style-type:none; margin:1; padding:1; padding-top:7px; padding-bottom:5px; }
   li { display:inline; }
   a:link,a:visited { color:#00FF00; background-color:Black; }
   a:hover,a:active { color:Black; background-color:#00FF00; }
 </style>
 <SCRIPT LANGUAGE="VBScript">
  public A1
  Sub window_onLoad()
    Dim arrCommands
    arrCommands = Split(FileBrowser.commandLine, chr(34))
    For i = 3 to (Ubound(arrCommands) - 1) Step 2
        A1 = arrCommands(i)
    Next
If A1 = "" Then
 msgbox "กรุณาสารระบบ  Batch File ที่จะรับพารามิเตอร์"
Else
      Call ListDrive()
      Call DoList()
End If
  End Sub

 Function ListDrive()
   Dim objFSO, colDrives, N
   Set objFSO = CreateObject("Scripting.FileSystemObject")
   Set colDrives = objFSO.Drives
   N = 0
   For Each objDrive in colDrives
     N = N + 1
     ShowDrive.innerhtml = showDrive.innerhtml & "<a href=#Top onClick=ChangeDrive(" & chr(34) & objDrive.DriveLetter & ":" & chr(34) & ")>" & objDrive.DriveLetter & ": </a>"
   Next
 End Function

 Sub DoList()
  Dim SubDir, N, fso, fPath, O
  Set fso = CreateObject("scripting.FilesystemObject")
  fPath = CDir()
  Set folder = fso.getfolder(fPath)
  ShowDir.innerhtml = "<a href=#Top onClick=BackDir()>\..</a><br>"
  ShowFile.innerhtml = ""
  N = 0
  For Each f in folder.subfolders
    N = N + 1
    SubDir =  mid(f.path, instrrev(f.path,"\"))
    ShowDir.innerhtml = ShowDir.innerhtml & "<a href=#Top onClick=ChangeDir(" & N & ")>" & SubDir & "</a><br>"
  Next
  O = 0
  For Each f in folder.files
    O = O + 1
ShowFile.innerhtml = ShowFile.innerhtml & "<a href=#Top onClick=SelectFile(" & O & ")>" &  f.name & "</a><br>"
  Next
  PathDir.innerhtml = CDir()
 End Sub

 Function ChangeDir(N)
  Dim O, fPath, objShell
  Set fso = CreateObject("scripting.FilesystemObject")
  Set objShell = CreateObject("Wscript.Shell")
  fPath = CDir()
  Set folder = fso.getfolder(fPath)
  O = 0
  For Each f in folder.subfolders
    O = O + 1
    If N = O Then
 objShell.CurrentDirectory = f.path
 Call DoList()
End If
  Next
 End Function

 Function BackDir()
  Dim objShell, FolPath, f
  FolPath = CDir()
  f = left(FolPath,InstrRev(FolPath,"\")-1)
  If Len(f) < 3 Then f = f & "\"
  Set objShell = CreateObject("Wscript.Shell")
  objShell.CurrentDirectory = f
  Call DoList()
 End Function

 Function CDir()
   Set WshShell = CreateObject("WScript.Shell")
   CDir = WshShell.CurrentDirectory
 End Function

 Function ChangeDrive(Drive)
  Set objShell = CreateObject("Wscript.Shell")
  objShell.CurrentDirectory = Drive
  Call DoList()
End Function

 Function SelectFile(O)
  Dim P, fPath, objShell, fso, WshShell, WS
  Set WshShell = CreateObject("WScript.Shell")
  Set fso = CreateObject("scripting.FilesystemObject")
  Set objShell = CreateObject("Wscript.Shell")
  fPath = CDir()
  Set folder = fso.getfolder(fPath)
  Set WS=CreateObject("WScript.Shell")
  P = 0
  For Each f in folder.files
    P = P + 1
    If O = P Then
 If Len(fPath) > 3 Then
        WS.Run "cmd /c " & A1 & " " & chr(34) & fPath & "\" & f.name & chr(34)
 Else
        WS.Run "cmd /c " & A1 & " " & chr(34) & fPath & f.name & chr(34)
 End If
End If
  Next
  WshShell.SendKeys "%{F4}"
 End Function

 </SCRIPT>
</HEAD>
<BODY bgcolor="Black">
 <FONT FACE="MS Sans Serif" SIZE=2 COLOR=#00FF00>
 <div id=Top></div>
 <div id=ShowDrive>ไดร์ฟ-></div>
 <hr color=#00FF00>
 <div id=PathDir></div>
 <hr color=#00FF00>
 <div id=ShowDir></div>
 <hr color=#00FF00>
 <div id=ShowFile></div>
 </FONT>
</BODY>
</HTML>

มาถึงการเรียกใช้งานกัน...
นี้คือคำสั่งที่ทดสอบเรียกแฟ้ม XFile.HTA ทำงาน
:: Test Explorer.BAT
@echo off
if "%1" == "" XFile.hta %0
if not "%1" == "" echo %1 & pause
goto :EOF
ด้านบนรับพารามิเตอร์แบบ วรรคไม่ได้
:: Test Explorer.BAT
@echo off
if '%1 == ' XFile.hta %0
if not '%1 == ' echo %1 & pause
goto :EOF
ทีนี้...รับค่าโปรแกรมได้แล้ว...

แบตช์ไฟล์สามารถรับการประมวลผลแบบข้ามเซกชั่้น...แต่คุณต้องเขียนแบตช์ไฟล์แบบแยกโมดูลและจบท้ายด้วย goto :EOF เพื่อให้มันทำงานแยกเป็นโมดูล ๆ ไป...วันหน้าจะมาสอนเขียนให้มันซับซ้อนอย่าง ที่สุดของการทำงานระดับ Hi-End

วันอังคารที่ 5 สิงหาคม พ.ศ. 2557

รวมรวมคำสั่งภายในของ CMD (ภาษาอังกฤษ)

หลายท่าน...ที่่ผ่านการทำงานบน DOS อาจนึกว่า...มันน่าจะถึงทางตันของแบตช์ไฟล์แล้ว...แต่ลองสังเกตดูดีๆ ในคำสั่ง DOS โหมด x64 มีคำสั่งจัดการเรื่องพาร์ทิชั่นและ WMI เพิ่มเข้ามา...เป็นที่น่าสังเกตุว่า...ไมโครซอต์ยังไม่ทิ้ง DOS นะครับ...แต่กลับเสริมสมรรถนะด้วยคำสั่งหลายๆ คำสั่เข้ามา แต่ผมรวบรวมเอามาให้อ่านเพื่อที่จะทำความเข้าใจแบบเจาะลึก...ก่อนจะเดินหน้าปูพื้นฐานคำสั่งระดับ Hi-end ซึ่งจะเสริมในเรื่องของ HTML Application เข้าไปด้วย...เพื่อเป็นตัวเลือกให้หลายๆ คนชำนาญแบบสองภาษาเพื่อเข้าสู่ยุคการสื่อสารไร้สาย...
ทำไมต้องเอา HTML Applicaiton เข้ามาเกี่ยวข้อง
ตอบ ด้วยตัวคำสั่งสคริปตัวนี้...มันครอบคลุม GUI ของวินโดวส์แบบรอบด้าน...ทั้งแสดงผล พิมพ์ผ่านเครื่องพิมพ์ อ่านไฟล์ และทำอะไรอีกหลายๆ อย่างที่ DOS ทำไม่ได้ ทั้งๆ ที่เป็นเพียงเพนเท็กซ์แบบเดียวกัน ผู้เขียนต้องปรับตัวให้ทันต่อยุคเหมือนกันเพื่อไม่ให้หลุดวงโคจร...การทำงานของแบตช์ไฟล์ต้องอาศัยมาร์กอัป ในการเรียกใช้งาน...และตัวมันทำงานเป็น เบื้องหลังวงการ...(ไม่ใช่พระเอกนางเอกอีกต่อไป)
ตัวอย่างของโปรแกรม HelpDOS.EXE ครับ...

โปรแกรมสร้างโดย แฟ้ม HTML Application เรียกผ่าน Batch File และสร้างจาก Batch File Convert EXE เพื่อมี ไอคอนน่าใช้พร้อมภาพแบ็กกาวน์ดสวยงามด้านหลังเมนู... (จากแบตช์ไฟล์ที่แสดงรูปภาพด้านหลังและเมนูไม่สวยงาม...ถูกเรียกใช้ครั้งเดียวหรือเป็นตัวประกอบในบทละครที่ .HTA เล่นเป็นพระเอก)

แต่อย่าน้อยใจ...ไปสำหรับแฟนๆ แบตช์ไฟล์...บล็อกนี้ยังไม่ทิ้งความสำคัญของมันไป...เพียงแต่ต้องเดินบนทางที่โชคชะตาของแบตช์ไฟล์เป็นเพียงลูกเมียน้อย...เนื่องจากความสามารถของมันยังไม่ถึงขั้นด้านการแสดงผล...เท่านั้น...แต่ที่จริงมันมีความสามารถระดับล่างที่ภาษาอื่นไม่สามารถมาแทนมันได้อย่างเต็มตัว...จึงเสนอเนื้อหาควบคู่กันไปสักพัก...ใครดีใครอยู่

ดาวน์โหลดคำสั่ง CMD (คำสั่งภายในของ DOS) ไปอ่านกันนะครับ...(ไม่แปลให้นะ)
Download Help DOS.EXE

วันเสาร์ที่ 26 กรกฎาคม พ.ศ. 2557

การเขียน Batch File เพื่อแสดงผลใน HTML Application ตอน 1

บางครั้ง...การแสดงผลภาษาไทยนั้นทำได้ไม่ค่อยดีใน Console ผมจึงหาวิธีให้แบทต์ไฟล์แสดงผลผ่านภาษา VBScript ภายใน HTML Application ก็ต้องยอมรับว่า...ติดปัญหาตรงที่มันไม่สามารถรับคีย์บอร์ดและรับสถานกาณ์บน CMD ได้ทั้งหมด...แต่ก็สามารถแสดงผลเป็นภาษาไทยได้อย่างที่ตั้งใจ...สามารถสร้าง Log File หรือ Dir /s แบบเรียวทามต์ได้...โดยไม่ติดปัญหาหรือรอการแสดงผลของแบตช์ไฟล์ให้จบ..เสียก่อน...โปรแกรมนี้สามารถ แคปเจอร์หน้าจอขณะทำงาน...
ดูตัวอย่างนะครับ...

คัดลอกคำสั่งไปสร้างเป็น LAN.BAT เพื่อทดสอบ...
@echo off
echo ทดสอบปิงในวงแลน
for /l %%a in (1,1,255) do (
  for /f "tokens=1,2,3,4,*" %%b in ('ping 192.168.1.%%a -n 1') do (
    if "%%b"=="Request" ( echo [ไม่สามารถเรียกได้  ] 192.168.1.%%a )
    if "%%b"=="Reply"   ( if "%%e"=="Destination" echo [ไม่ได้เชื่อมต่อ    ] 192.168.1.%%a)
    if "%%b"=="Reply"   ( if "%%e"=="bytes=32"    echo [เชื่อมต่อได้แล้ว  ] 192.168.1.%%a)
  )
)

ส่วนคำสั่งของ HTML Application ก็สร้างในพาทเดียวกัน...ชื่อ MS_DOS.HTA
<html>
<head>
<title>My HTML Application</title>
 <hta:application
     applicationname="MyHTA"   
     border="thick"
     borderstyle="normal"
     caption="My HTML Application"
     contextmenu="no"
     icon="myicon.ico"
     maximizebutton="no"
     minimizebutton="yes"
     navigable="no"
     scroll="no"
     selection="no"
     showintaskbar="yes"
     singleinstance="yes"
     sysmenu="yes"
     version="1.0"
     windowstate="maximize" >
  <script language="VBScript">
  Sub Window_onLoad()
runMS_DOS
  End Sub   

  Sub runMS_DOS()
    Dim objCap 
Dim objShell
Dim objStdOut
    Set objShell=CreateObject("wscript.shell")
    Set objCap=objShell.Exec("cmd /c " & "LAN.BAT")
    Do Until objCap.Status
      strHtml=objCap.StdOut.ReadLine
      frmData.document.write "<font face=&#34MS Sans Serif&#34 size=2>" & strHtml & "</font><br>"  
      frmData.focus
      Call ForceRefresh()
      frmData.Scrollto 0, 99999999
    Loop
    MsgBox "เสร็จเรียบร้อย" 
  End Sub

  Function ForceRefresh()
    Set oShell = CreateObject("WScript.Shell")
    oShell.Run "cmd /c", 0, True  
  End Function
  sub checkEnter
    With window.event
      if .keycode = 13 then
        runMS_DOS
      Else
        .cancelbubble = false
        .returnvalue = true
      End if
    End With
  End sub

  </script>
 </head>
 <body bgcolor="Black" color="Green">
   <iframe id="frmData" scrolling="Yes" width="100%" height="80%" frameborder="1" style="background: Black;">
   <div id="divTest"></div> 
   </iframe>
 </body>
</html>


ผลการทำงาน...

โปรแกรมจะเลื่อน Scroll ลงไปเรื่อย...จึงทำให้ทราบผลการทำงานของแบตช์ทันที...

โปรแกรมนี้...ขอเสียคือ...การหยุดประมวลผลระหว่าง...ทำงานจะส่งผลให้มันไม่สามารถทำงานได้...จนกว่า...จะมีการเซ็ตค่า Handle ใหม่...(มันไม่สามารถทำงานครั้งที่สอง...ถ้าไม่ล็อกออฟออกไป...ให้มันรีเซ็ต Handle ใหม่อีกครั้ง...)

สีแดงที่ขีดไว้ในคำสั่ง HTA คือการเรียกคำสั่ง Batch file หรือ DOS Command สามรถเปลี่ยนตามใจชอบเพื่อให้โปรแกรมของคุณ แสดงผลได้ในภาษาที่ต้องการ

วันอังคารที่ 22 กรกฎาคม พ.ศ. 2557

รวมสคริปมาเป็นไฟล์ HTML Application


โปรแกรมนี้...เช่นเดิมเหมือนตัวก่อน..ๆ เพียงแต่ตัวนี้...จบ...สร้างเป็นแฟ้ม HTML Application  มันไม่ต้องมีคำถามด้านความปลอดภัยอีกต่อไป...อยากเรียกใช้งานเมื่อไหร่...ที่ไหน...ก็ได้...


โปรแกรมนี้...จบแหละ...ไม่ต้องต้องสร้าง Assembly Application  หรือ Compile ด้วยภาษาอะไรทั้งนั้น...

วันพฤหัสบดีที่ 17 กรกฎาคม พ.ศ. 2557

จาก DOS Batch File มาเป็น HTML Application

ผมมัวแต่หาทางเขียนโปรแกรมบีบอัดข้อมูลให้เสร็จ...(ทำตามความฝัน) แต่ความเป็นจริงคือโลกมันก้าวไปข้างหน้าโดยไม่รอเรา...จาก ปี 1995 ความฝันคือทำโปรแกรมที่บีบอัดเพลง .MP3 ใส่ใน Floppy Disk ให้ได้...แต่ด้วยความรู้ที่มีมาคือมันต้องเป็น .OGG เท่านั้น...หรือ .MID (มิดิ) แต่ยุคนั้นโปรแกรมแปลงไฟล์เหล่านี้ไม่มี...และความรู้และโปรแกรมอันหลากหลายในโลกอินเตอร์เน็ตที่เป็นของเถื่อน...ก็ยังไม่เยอะ...ความบ้าพลัง...คือจะสร้างโปรแกรมที่ "บีบอัดข้อมูลแบบไม่สูญเสีย...ที่ทำซ้ำกระบวนการได้" มันจึงเป็นความบ้าอันยิ่งใหญ่...ที่ตอนนี้ผ่านมา เกือบ "ยี่สิบปี" มันก็ยังไม่สำเร็จ แต่เข้าใกล้ความจริงทุกขณะ
แต่ก็ขอทำใจ...ในวันนี้ว่า... Source ที่จะทดสอบวันนี้...มันจะเป็นเพียงความฝันหรือความบ้าก็ตามแต่...เท่าที่คำนวณใน Excel มันมีความหวังเล็ก...ว่าโลกนี้ข้อมูลทุกอย่างสามารถบีบซ้ำได้...ก็ทำให้อารมณ์ดี...มานั่งเขียนบล็อก...ต่อ...ให้หลายๆ คนอ่านเล่นๆ ....เข้าเรื่อง
แบตช์...ความรู้ที่จะเป็นเพียงอดีตหรือจบลงใน x86 แต่สิ่งหนึ่งที่เป็นสคริปที่ทนทานกว่า...แข็งแรงกว่า...กลับไม่ใช่ Power Shell แต่มันคือ HTML Application เพราะจากที่ศึกษามา Pain text ตัวนี้มีความสามารถที่แสดงผลภาษาไทยอันยอดเยี่ยม...มีความสามรถทางสีสัน...เหลือพรรณา...และที่สำคัญมันยังทำงานได้อยู่แม้จะเป็น x64 หรือ Windows 8 แม้ครั้งหนึ่งในยุค ME มันเป็นคำสั่งที่ไวรัส RedLof อาศัยพืิ้นฐานของ Desktop.ini มาเป็นเครื่องมือแพร่เชื้อ...แต่จากที่เล่นเวปกว่า 1 ชั่วโมง...ดูคำสั่ง HACK สาระพัดเกี่ยวกับ HTML Applicaion หรือเจ้านามสกุล .HTA แปลกแฮะ...มันคือ .HTM ที่มีแท็ก <HTA: เพิ่มเข้ามาและกำหนดคุณสมบัติของหน้าตางและสภาวะแวดล้อม...คลิกเรียกทำงานมันจะทำงานทันที...โดยไม่มีคำถามความปลอดภัยอะไร...ฮ่าฮ่า...สวมรอยง่ายละทีนี้...แต่กว่าจะเก่งขั้นนั้น...ก็โดนเข้าเหมือนกันเพราะคำสั่งของ HTML Application สามารถลิงค์สคริป...ไปยังแฮกเกอร์ได้...ต้องศึกษาดีๆ ครับ...โดนมาแล้ว...เจ้าตัวแปลง Encoding ของเมืองนอก...หน้าตาหรู่อย่างมาก...มี Matirx แสดงเป็นพื้นหลัง...แต่    "แม่ม" ลิงก์ไปยังเวปที่เข้ารหัส...ฮืม...นึกว่าจะได้โค้ดมาฟรีๆ ... แต่ไม่เป็นไร...หาใน Google สักพัก...เราก็เจอสิ่งที่ต้องการ... Matirx.HTA ... ครับงานนี้...ก็เผยแพร่...ผ่านเครดิตเจ้าของเวปกัน....และจากนี้...บล็อกนี้...จะสอนการ เขียน Batch File ควบคู่ VBScirpt และ ทำงานบน HTML Application เป็นภาษาไทยเต็มรูปแบบซะที...ไม่ติดปัญหาด้านภาษาอีกต่อไป...


จากภาพตัวอย่าง...คือคำสั่งที่ลองกทำงานแล้ว...ให้กด Escape เพื่อออกจากโปรแกรม

นี้คือโค้ด
<html>
<head>
<HTA:APPLICATION ID="matrix" APPLICATIONNAME="matrixhta"
WINDOWSTATE="maximize"
BORDER="none"
SCROLL="no">
<title>Matrix 0.1</title>
<style type="text/css">
body{background-color:black; color:DarkSlateGray; font-size:12px;}
div{width:21px; float:left;}
</style>
<script language="vbscript">
Public n, iTimerID, MyTitle, colnum, carset
ReDim M(1,1)
ReDim SpecCar(64)
SpecCar(0)="&permil;"
SpecCar(1)="&fnof;"   : SpecCar(11)="&Omega;"   : SpecCar(21)="&lambda;" : SpecCar(31)="&phi;"
SpecCar(2)="&Gamma;"  : SpecCar(12)="&alpha;"   : SpecCar(22)="&mu;"     : SpecCar(32)="&psi;"
SpecCar(3)="&Delta;"  : SpecCar(13)="&beta;"    : SpecCar(23)="&nu;"     : SpecCar(33)="&omega;"
SpecCar(4)="&Theta;"  : SpecCar(14)="&delta;"   : SpecCar(24)="&xi;"     : SpecCar(34)="&trade;"
SpecCar(5)="&Lambda;" : SpecCar(15)="&epsilon;" : SpecCar(25)="&pi;"     : SpecCar(35)="&larr;"
SpecCar(6)="&Xi;"     : SpecCar(16)="&zeta;"    : SpecCar(26)="&rho;"    : SpecCar(36)="&uarr;"
SpecCar(7)="&Pi;"     : SpecCar(17)="&eta;"     : SpecCar(27)="&sigmaf;" : SpecCar(37)="&rarr;"
SpecCar(8)="&Sigma;"  : SpecCar(19)="&iota;"    : SpecCar(29)="&tau;"    : SpecCar(39)="&harr;"
SpecCar(10)="&Psi;"   : SpecCar(20)="&kappa;"   : SpecCar(30)="&upsilon;": SpecCar(40)="&radic;"
SpecCar(41)="&infin;" : SpecCar(46)="&there4;"  : SpecCar(51)="&ge;"     : SpecCar(56)="&clubs;"
SpecCar(42)="&ang;"   : SpecCar(47)="&asymp;"   : SpecCar(52)="&oplus;"  : SpecCar(57)="&hearts;"
SpecCar(43)="&cap;"   : SpecCar(48)="&ne;"      : SpecCar(53)="&perp;"   : SpecCar(58)="&diams;"
SpecCar(44)="&cup;"   : SpecCar(49)="&equiv;"   : SpecCar(54)="&loz;"    : SpecCar(59)="&OElig;"
SpecCar(45)="&int;"   : SpecCar(50)="&le;"      : SpecCar(55)="&spades;" : SpecCar(60)="&dagger;"
SpecCar(61)="&Dagger;": SpecCar(62)="&euro;"    : SpecCar(63)="&oelig;"  : SpecCar(64)="&Scaron;"

Sub window_onLoad()
n=54
colnum=48
carset=1
ReDim M(colnum,1)
    For i=1 To colnum
    M(i,0) = Int(53*Rnd)
    t=""
 For j=1 To n
 t = t & "&nbsp;<br>"
 Next
    M(i,1) = t
    Next
    iTimerID = window.setInterval("Progress", 10)
End Sub

Sub Progress
    For i=1 To colnum
    l = Split(M(i,1), "<br>") '--- split by each character in the collumn
    cpos = M(i,0)  '--- position of the character to be written on the screen at this time
 If Int(carset)=1 Then
 l(cpos) = "<span style=""color:White"">" & Chr( 32 + Int(223*Rnd) ) & "</span>"
 carset = carset +0.25
 ElseIf Int(carset)=2 Then
 l(cpos) = "<span style=""color:White"">" & SpecCar( Int(64*Rnd) )  & "</span>"
 carset = 1
 End If
          y=-1
      For j = cpos-1 To cpos-11 Step -1
 tempj = j
 If j < 0 Then
       j = UBound(l) +j +1
 End If
       y=y+1
                Select Case y
Case 0 color="GreenYellow"
Case 1 color="LimeGreen"
Case 2 color="LimeGreen"
Case 3 color="LimeGreen"
Case 4 color="ForestGreen"
Case 5 color="ForestGreen"
Case 6 color="Green"
Case 7 color="Green"
Case 8 color="DarkGreen"
Case 9 color="DarkGreen"
Case 10 color="Black"
End Select
       clj = l(j)
If InStr(1, clj, "<span", 1)>0 Then
clj = Left(clj, InStrRev(clj, "<") -1)
clj = Mid(clj, InStr(clj, ">") +1)
End If
If color <> "" Then
l(j) = "<span style=""color:" & color & """>" & clj & "</span>"
Else
l(j) = clj
End If
 j = tempj
 Next
        t = Join(l, "<br>")
        M(i,1) = t  '--- M(i,1) contains the html of the column
        cpos = cpos +1
If cpos > UBound(l) Then
   cpos = 0
End If
        M(i,0) = cpos   '--- M(i,0) contains the number of the character to be written
        id("col" & i).innerHTML = t  '--- Show the result for this the collumn on the screen
    Next
End Sub

Sub checkKey
    Select Case window.event.keycode
    Case 27  Call ExitMatrix '---escape: Quit the program
    End Select
End Sub

Sub ExitMatrix
window.clearInterval(iTimerID)  '---You must always clear the intervals before leaving
window.close
End Sub

Function id(o)
Set id = document.getElementById(o)
End Function

</script>
</head>
<body onKeyDown="checkKey">
<div id="col1"></div><div id="col12"></div><div id="col23"></div><div id="col34"></div>
<div id="col2"></div><div id="col13"></div><div id="col24"></div><div id="col35"></div>
<div id="col3"></div><div id="col14"></div><div id="col25"></div><div id="col36"></div>
<div id="col4"></div><div id="col15"></div><div id="col26"></div><div id="col37"></div>
<div id="col5"></div><div id="col16"></div><div id="col27"></div><div id="col38"></div>
<div id="col6"></div><div id="col17"></div><div id="col28"></div><div id="col39"></div>
<div id="col7"></div><div id="col18"></div><div id="col29"></div><div id="col40"></div>
<div id="col8"></div><div id="col19"></div><div id="col30"></div><div id="col41"></div>
<div id="col9"></div><div id="col20"></div><div id="col31"></div><div id="col42"></div>
<div id="col10"></div><div id="col21"></div><div id="col32"></div><div id="col43"></div>
<div id="col11"></div><div id="col22"></div><div id="col33"></div><div id="col44"></div>
<div id="col45"></div><div id="col46"></div><div id="col47"></div><div id="col48"></div>
</body>
</html>

หวังว่า...จะสนุกกับการเขียนภาษาคอมพิวเตอร์นะครับ...

วันจันทร์ที่ 23 มิถุนายน พ.ศ. 2557

สร้างเมนูพร้อมคำสั่งแบตช์ไฟล์ด้วยโปรแกรม (Create Batch File Menu)

หลายๆ คนคงอ่านกระทู้เก่าๆ ของผมแล้ว...จะพบว่า...มีการสอนสร้างเมนูแบบ Pull Down แต่อาจจะทำตามอย่างยากซักหน่อย...ต้องอาศัยความรู้พอสมควร...วันนี้ผมมีทางเลือกสร้างแบตช์ไฟล์ด้วยโปรแกรมที่ผมเขียนขึ้น...เพื่อให้ง่ายต่อการเขียนโปรแกรมของตัวเอง...
หน้าตามันเป็นอย่างนี้ครับ...
เขียนขึ้นด้วย VB6 แต่ให้ Commondialog ของระบบ อาจจะมีปัญหาสำหรับท่านที่ไม่ได้ติดตั้งVB6 Runtime แต่ในบางเครื่องก็ทำงานได้ตามปกติครับ...
ขั้นตอนแรก เลือกสีพื้นเมนู
ขั้นตอนสอง เลือกสีตัวเลือกของเมนู
ขั้นตอนที่สาม เลือกสีทั่วไปเมนู
ขั้นตอนที่ห้า ทดสอบคำสั่งว่าเมนูเป็นไปตามต้องการหรือไม่...ขั้นตอนนี้...โปรแกรมจะสร้างแบตช์ไฟล์ที่ชื่อ TestMenu.CMD มา ณ ตำแหน่งที่โปรแกรมทำงานอยู่
ขั้นตอนที่หก ดูว่า...เมนูเป็นไปตามตัวอย่างถ้าไม่ชอบสีดังกล่าว...ให้ย้อนกลับไปขั้นตอนที่ 1 ใหม่
ขั้นตอนที่เจ็ด คลิกที่คำว่า "Pulldown Menu1" เพื่อกำหนดคำสั่งและข้อความในเมนูที่ 1 (สามารถบรรจุคำสั่งที่เป็นแบตช์ไฟล์แฟ้มอื่นเข้ามาผสมกับแบตช์ไฟล์ที่กำลังสร้างขึ้นได้
ขั้นตอนที่แปด กรอกข้อความในเมนู เป็นภาษาอังกฤษ นะครับ...เพราะบน Console ภาษาไทยยังไม่สามารถแสดงผลได้ โดยข้อความต้องไม่เกิน 70 ตัวอักษร
ขั้นตอนต่อไป ใส่คำสั่งในเมนู 2 3 4 ตามลำดับ...
ขั้นตอนต่อไป ทำซ้ำไปเรื่อย...จนกว่าจะได้เมนู แต่ต้องไม่เกิน 9 รายการ
เมื่อครบคำสั่งแล้ว ให้สร้างแบตช์ไฟล์ได้ทันที
จัดเก็บในที่อยู่และชื่อแฟ้มที่ต้องการ
ลองรันดู จะเป็นไปตามที่ต้องการครับ...ขอให้สนุกกับการเขียนโปรแกรมนะครับ...

รุ่น 1.6 พัฒนาให้เล่นใน Windows 7 และ Windows 8 โดยไม่ต้องติดตั้ง Runtime VB6

วันพุธที่ 11 มิถุนายน พ.ศ. 2557

ล็อกโฟลเดอร์...ด้วยเทคนิคง่ายๆ ผ่าน หนูนา GUI


Downlod Now

ผมเคยสอนวิธีการล็อกโฟลเดอร์ ด้วยแบตช์ไฟล์ ไปในพันทิป...แล้ว...ครั้งนั้นผม อาศัยการล็อกด้วยการสร้างแฟ้ม Desktop.ini ซึ่งเป็นวิธีโบราณ...หากถูกคำสั่ง Attrib แก้โฟลเดอรที่ล็อกมันก็ปลดล็อกได้...เลยใช้วิธีเดียวกันท่าน "Hunter Virus Pantip" คือเปลี่ยนนามสกุลโฟลเดอร์ซะ...แต่วิธีนี้...คำสั่ง Attrib จะไม่ส่งผลเพราะโฟลเดอร์ถูกเปลี่ยนชื่อไป... แต่ยังไงก็ปลดล็อกได้อยู่ดีครับ...แค่ DIR Class ID ที่อยู่ด้านท้าย...
เอาไว้จะมาเจาะลึกกัน... และเปลี่ยนมันกลับมาเป็นชื่อเดิม...จึงทำให้โปรแกรมที่นำเสนอนี้...ไม่อันตรายครับ...มันไม่ล็อกโฟลเดอร์แบบเรียกค่าไถ่...ฉนั้น...เอาไปหัดเล่นได้ครับ...ป้องกันลูกหลาน...มือซนได้ในระดับที่หลานๆ เอง...ต้องเป็น แฮกส์ตัวน้อย ระดับ "สคริปคิดดี้"...กันเลย ฉนั้น...ลองไปหัดเล่นดูครับ...ไม่มีไวรัส...วันหลังจะมาเปิดเผยการถอดรหัสแบบยกไดร์ฟด้วย แบตช์ไฟล์กัน

วันอาทิตย์ที่ 8 มิถุนายน พ.ศ. 2557

ทำภาพเป็น Icon 256 x 256 ง่ายๆ

นำโปรแกรมของคนไทยมาเล่น หลายโปรแกรมแล้ว...หรือโปรแกรมเมืองนอก...(มีของแถม) มาทำไอคอนง่ายๆ ส่วนตัว...มันไม่เห็นมีโปรแกรมดีๆ ซักตัว...เลยนำโปรแกรมที่เขียนเอง...ออกมาแจกดีกว่า...
ทำงานง่ายกว่า...เป็น Portable พกพาสะดวกไม่ต้องติดตั้ง...ดูตัวอย่างนะครับ...

เรียก iCon CatEye.EXE ทำงานเลยครับ...
เปิดภาพขึ้นมา...ด้วย (ด้วย Dialog ที่ไม่เหมือนชาวบ้าน...เพราะสร้างขึ้นเองครับ)
บันทึก Icon เก็บที่ใด...ก็บอกมา...มันจะสุ่มชื่อไฟล์(ป้องกันการเขียนซ้ำ) และไปเปลี่ยนชื่อเองครับ...ถ้าชอบภาพที่สร้าง...ก็ค่อยเปลี่ยนชื่อเก็บไว้...
ถ้าดับเบิ้ลคลิก Icon มันจะแสดงภาพ (ในวินโดวส์ 7 และ 8 สำหรับ XP มันไม่แสดงภาพให้นะครับ แต่ใช้งานกับ Icon ของภาษาคอมพิวเตอร์หรือสร้างเป็น Icon บนไฟล์ .EXE ได้ทุกคอมพายน์เลอร์บนวินโดวส์)

ซอสโค้ดโปรแกรมนี้...ยังไม่แจกนะครับ...ขอใช้หากินก่อน...

และมันเกี่ยวกับ Batch File ตรงไหน...มันเกี่ยวตรงที่...สามารถสร้างเป็น Icon ของแบตส์ไฟล์ ด้วยโปรแกรม Batch Convert To EXE ไงครับ... หวังว่า...คงจะสร้างความสะดวกให้...ไม่มากก็น้อย