| ฟังก์ชั่น getKbStatus (): สตริง; // กลับไปที่สถานะแป้นพิมพ์ปัจจุบันรวมถึง numloce, caps lock, แทรก // ข้อมูลสถานะแต่ละตัวมีสองอักขระตามลำดับ: numloce, caps lock, แทรก // คัดลอกขวา 549@11: 29 2003-7-22 สถานะ var: สตริง; KeyStates: TKEYBOARDSTATE; เริ่ม GetKeyboardState (KeyStates); ถ้าแปลก (keystates [vk_numlock]) แล้ว สถานะ: = 'หมายเลข' อื่น สถานะ: = 'เคอร์เซอร์'; ถ้าแปลก (keystates [vk_capital]) แล้ว สถานะ: = สถานะ+'caps' อื่น สถานะ: = สถานะ+'ตัวพิมพ์เล็ก'; ถ้าแปลก (keystates [vk_insert]) แล้ว สถานะ: = สถานะ+'แทรก' อื่น สถานะ: = สถานะ+'rewrite'; ผลลัพธ์: = สถานะ; ปลายทาง; const errhead = 'ข้อผิดพลาดเกิดขึ้นในการดำเนินการข้อความแสดงข้อผิดพลาดคือ:'+#13 พยายาม - ยกเว้น บน E: Exception Do ShowMessage (Errhead+E.Message+#13+'การดำเนินการปัจจุบันคือ: xxxxx'); จบ; ช่วยให้ผู้ใช้เห็นข้อความแสดงข้อผิดพลาดเพิ่มเติมซึ่งช่วยให้ลูกค้ามีข้อผิดพลาดของโปรแกรมความคิดเห็น ฉันเขียนความคิดที่ดี แต่ฉันมักจะใช้: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> // ดำเนินการ SQL // พารามิเตอร์อินพุต: sqlstring, adoquery // type: string, tadoquery ขั้นตอน tmainform.exesql (sqlstring: string; adoquery: tadoquery); เริ่ม กับ Adoquery Do เริ่ม การเชื่อมต่อ: = dm.dbaccinfo; // นี่เป็นของฉันคุณสามารถเพิ่มการเชื่อมต่อ // หรือใช้ ถ้าใช้งานแล้ว ใช้งาน: = false; เปิด; sql.clear; sql.add (sqlstring); execsql; ปิด; จบ; สิ้นสุด; อย่างไรก็ตามในรหัสที่ฉันได้เห็นดูเหมือนว่ามีเพียงไม่กี่คนที่เขียนกระบวนการอิสระดังกล่าว นี่รับประกันว่าจะเป็นต้นฉบับด้วยตัวเอง ... // Open Adoquery // ดัดแปลงมาจากกระบวนการของจริง (Aixiang (Lizzy เท่านั้นที่สามารถบอกได้ว่าคนอื่นไม่สามารถ)) // สนับสนุน SQL หลายบรรทัด // คุณสามารถแก้ไขด้วยตัวเองได้ตามต้องการเพื่อสนับสนุนขั้นตอน SQL แบบบรรทัดเดียวเท่านั้นหรือขั้นตอน exesql // การทดสอบภายใต้ Delphi6 ผ่าน ขั้นตอน OPENSQL (SQLSTRING: TSTRINGS; Adoquery: Tadoquery); var i: จำนวนเต็ม; เริ่ม กับ Adoquery Do เริ่ม ปิด; sql.clear; สำหรับ i: = 0 ถึง sqlstring.count-1 ทำ sql.add (sqlstring [i]); พยายาม เปิด; ยกเว้น ใน E: Exception Do ShowMessage ('ข้อผิดพลาด: ข้อความมีดังนี้'+#13+E.Message); จบ; จบ; จบ; นี่คือ SQL บรรทัดเดียว ขั้นตอน OPENSQL1 (SQLSTRING: String; Adoquery: Tadoquery); เริ่ม กับ Adoquery Do เริ่ม ปิด; sql.clear; sql.add (sqlstring); พยายาม เปิด; ยกเว้น ใน E: Exception Do ShowMessage ('ข้อผิดพลาด: ข้อความมีดังนี้'+#13+E.Message); จบ; จบ; จบ; Hoho ขอบคุณที่ช่วยฉันแก้ไขสิ่งนี้ แต่คุณไม่ได้ใช้ execsql? ฉันมักจะเพิ่มลองนอกกระบวนการนี้นั่นคือที่ซึ่งเขาอ้างถึง นั่นคือการลอง exesql (sqlstring, adoquery1) ยกเว้น // ข้อผิดพลาดพรอมต์เรื่องยุ่งเหยิง จบ ถึง: reallike (aixiang (มีเพียง Lizzy เท่านั้นที่บอกได้ว่าคนอื่นไม่สามารถ)) ฉันก็ทำเช่นกัน // execsql adoquery // สนับสนุน SQL หลายบรรทัด // คุณสามารถแก้ไขด้วยตัวเองได้ตามต้องการเพื่อสนับสนุนขั้นตอน SQL แบบบรรทัดเดียวเท่านั้นหรือขั้นตอน exesql // การทดสอบภายใต้ Delphi6 ผ่าน ขั้นตอน exesql (sqlstring: tstrings; adoquery: tadoquery); var i: จำนวนเต็ม; เริ่ม ด้วยการเริ่มต้นของ Adoquery ปิด; sql.clear; สำหรับ i: = 0 ถึง sqlstring.count-1 ทำ sql.add (sqlstring [i]); พยายาม execsql; ยกเว้น ใน E: Exception Do ShowMessage ('ข้อผิดพลาด: ข้อความมีดังนี้'+#13+E.Message); จบ; จบ; จบ; // ฉันคิดว่ามันเหมือนกันที่ยกเว้นจะวางไว้ข้างนอกเพราะคุณสามารถเพิ่มข้อมูลการดีบักอื่น ๆ ได้ //คุณคิดอย่างไร? // คือใครก็ตามที่รวมสองกระบวนการของการดำเนินการบรรทัดเดียวและดำเนินการหลายบรรทัดเป็นหนึ่งเดียวซึ่งจะดีมาก ฉันจะทำอีกสองและฉันสามารถเพิ่มและลบออกตามความต้องการของฉัน แต่ฉันใช้ dbgrideh เพื่อสร้าง col แบบไดนามิก Procedure BuildCol (VFieldName: String; Vcaption: String; VWIDTH: Integer; VAR; VGRID: TDBGRIDEH; ส่วนท้าย: tfootervaluetype = fvtnon; boolreadonly: boolean = true; วาจา CCOL: TDBGRIDCOLUMNEH; CFOOTERCOL: TCOLUMNFOTEREH; เริ่ม CCOL: = tdbgridcolumneh.create (vgrid.columns); ccol.fieldName: = vfieldName; ccol.width: = vwidth; ccol.title.caption: = vcaption; ccol.title.Alignment: = tacenter; ccol.title.color: = vColor; ccol.readonly: = boolreadonly; // ถ้าค่าแท็กคือ -1 คอลัมน์จะไม่ถูกพิมพ์เมื่อพิมพ์ dbgrid ccol.tag: = itag; เริ่ม cfootercol: = ccol.footers.add; cfootercol.valueType: = ส่วนท้าย; ถ้า footerType = fvtStaticText แล้ว เริ่ม VGrid.FooterRowCount: = 1; cfootercol.value: = footertext; จบ; //ccol.footer.fieldName:=; จบ; สิ้นสุด; ขั้นตอน titlebtnclick (ผู้ส่ง: tobject; ACOL: จำนวนเต็ม; คอลัมน์: tcolumneh; วาจา CDSTMP: TClientDataset; เริ่ม ด้วย (ผู้ส่งเป็น tdbgrideh) ทำ เริ่ม CDSTMP: = (dataSource.dataset เป็น tclientDataset); ถ้าไม่ใช่ cdstmp.active ให้ออก; // ตั้งค่าวิธีการเรียงลำดับของแถวปัจจุบัน ถ้า column.title.sortmarker = smnoneeh แล้ว เริ่ม column.title.sortmarker: = smupeh; CDSHELPER.SORTBYFIELD (คอลัมน์ฟิลด์ชื่อ, soAsCending); จบ อื่น ถ้า column.title.sortmarker = smupeh แล้ว เริ่ม column.title.sortmarker: = smdowneh; CDSHELPER.SORTBYFIELD (คอลัมน์. ฟิลด์ชื่อ, sodescending); จบ อื่น เริ่ม column.title.sortmarker: = smnoneeh; CDSHELPER.SORTBYFIELD (คอลัมน์ฟิลด์ชื่อ Sonosort); จบ; จบ; สิ้นสุด; ขั้นตอน f_readini (const now_dbgrid: tdbgrid; form_name: string); วาจา Filepath: String; MyInifile: Tinifile; grid_name, field_name: String; ความกว้าง: จำนวนเต็ม; i, j, n: จำนวนเต็ม; คอลัมน์: อาร์เรย์ [0..100] ของสตริง; ความกว้าง: อาร์เรย์ [0..100] ของจำนวนเต็ม; เริ่ม FilePath: = ExtractFilePath (Application.exename); myInifile: = tinifile.create (filepath+'gsp.ini'); grid_name: = form_name+','+now_dbgrid.name; n: = now_dbgrid.columns.count-1; สำหรับ i: = 0 ถึง n ทำ เริ่ม field_name: = now_dbgrid.columns [i] .fieldName; J: = myInifile.readinteger (grid_name, field_name, i); คอลัมน์ [j]: = field_name; ความกว้าง [j]: = myInifile.readinteger (grid_name, field_name+'_ width', now_dbgrid.columns [i] .width); สิ้นสุด; สำหรับ i: = 0 ถึง n เริ่ม now_dbgrid.columns [i] .fieldName: = คอลัมน์ [i]; now_dbgrid.columns [i] .width: = ความกว้าง [i]; สิ้นสุด; สิ้นสุด; ขั้นตอน f_writeini (const now_dbgrid: tdbgrid; form_name: string); วาจา Filepath: String; MyInifile: Tinifile; grid_name, field_name: String; ความกว้าง: จำนวนเต็ม; ฉัน: จำนวนเต็ม; เริ่ม FilePath: = ExtractFilePath (Application.exename); myInifile: = tinifile.create (filepath+'gsp.ini'); grid_name: = form_name+','+now_dbgrid.name; เริ่ม field_name: = now_dbgrid.columns [i] .fieldName; ความกว้าง: = now_dbgrid.columns [i] .width; myInifile.writeInteger (grid_name, field_name, i); myInifile.writeInteger (grid_name, field_name+'_ width', ความกว้าง); สิ้นสุด; สิ้นสุด; หน่วย myfunc; อินเตอร์เฟส ใช้ Windows, sysutils, mmsystem, winsvc, รีจิสทรี; ฟังก์ชั่น copystrleft (ch: char; str: string): string; ฟังก์ชั่น copystrright (ch: char; str: string): string; ฟังก์ชั่น getselfpath: สตริง; ขั้นตอน Hidetask (Bhide: Boolean); ฟังก์ชั่น SoundCardInstalled: บูลีน; ฟังก์ชั่น gethostip: สตริง; ขั้นตอน disablevc (svcname: string); ฟังก์ชั่น getregisteredowner: สตริง; ฟังก์ชั่น GetRegisterEdorganization: String; เริ่ม ผลลัพธ์: = สำเนา (str, 1, pos (ch, str) -1) end; ฟังก์ชั่น copystrright (ch: char; str: string): string; เริ่ม ผลลัพธ์: = สำเนา (str, pos (ch, str) +1, ความยาว (str) -pos (ch, str) +1) สิ้นสุด; ฟังก์ชั่น getselfpath: สตริง; เริ่ม ผลลัพธ์: = ExtractFilePath (Paramstr (0)) สิ้นสุด; ขั้นตอน hidetask (Bhide: บูลีน); เริ่ม ถ้า bhide ลงทะเบียน process (getCurrentProcessId, 1) else registerServiceProcess (getCurrentProcessId, 0); สิ้นสุด; ฟังก์ชั่น SoundCardInstalled: บูลีน; เริ่ม ผลลัพธ์: = waveoutgetNumDevs> 0 สิ้นสุด; ฟังก์ชั่น gethostip: สตริง; พิมพ์ tapinaddr = array [0..10] ของ pinaddr; papinaddr = ^tapinaddr; วาจา PHE: Phostent; PPTR: Papinaddr; บัฟเฟอร์: อาร์เรย์ [0..63] ของถ่าน; ฉัน: จำนวนเต็ม; ginitdata: twsadata; เริ่ม wsastartup ($ 101, ginitdata); gethostname (บัฟเฟอร์, sizeof (บัฟเฟอร์)); phe: = gethostbyname (บัฟเฟอร์); ถ้า phe = nil จากนั้นออก; pptr: = papinaddr (phe^.h_addr_list); i: = 0; ผลลัพธ์: = inet_ntoa (pptr^[i]^); WSACLEANUP; สิ้นสุด; ขั้นตอนการปิดใช้งาน VCC (SVCNAME: String); วาจา scmngr: Thandle; SCSVC: Thandle; เริ่ม scmngr: = openScManager (nil, nil, sc_manager_all_access); scsvc: = openService (scmngr, svcname, service_change_config); ChangeServiceConfig (SCSVC, service_no_change Service_disabled service_no_change ไม่มี, ไม่มี, ไม่มี, ไม่มี, ไม่มี, ไม่มี); ปิดเซิร์ฟเวอร์แฮนด์เล่ (SCSVC); สิ้นสุด; ฟังก์ชั่น getregisteredowner: สตริง; วาจา Osversion: TosversionInfo; Swinkey: String; เริ่ม Osversion.dwosversionInfosize: = sizeof (Osversion); GetVersionex (Osversion); case osversion.dwplatformid ของ ver_platform_win32_windows: swinkey: = '/ซอฟต์แวร์/microsoft/windows/currentversion'; ver_platform_win32_nt: swinkey: = '/ซอฟต์แวร์/microsoft/windows nt/currentversion'; จบ; ด้วย tregistry.create do พยายาม rootkey: = hkey_local_machine; OpenKey (Swinkey, False); ผลลัพธ์: = readString ('registerowner'); ในที่สุด ฟรี; จบ; สิ้นสุด; ฟังก์ชั่น getRegisteredorganization: สตริง; วาจา Osversion: TosversionInfo; Swinkey: String; เริ่ม Osversion.dwosversionInfosize: = sizeof (Osversion); GetVersionex (Osversion); case osversion.dwplatformid ของ ver_platform_win32_windows: swinkey: = '/ซอฟต์แวร์/microsoft/windows/currentversion'; ver_platform_win32_nt: swinkey: = '/ซอฟต์แวร์/microsoft/windows nt/currentversion'; จบ; ด้วย tregistry.create do พยายาม rootkey: = hkey_local_machine; OpenKey (Swinkey, False); ผลลัพธ์: = readString ('registerorganization'); ในที่สุด ฟรี; จบ; จบ; จบ. ใส่สองสามตัวแรก // ลบไฟล์ส่วนขยายที่ระบุทั้งหมดในไดเรกทอรีที่แน่นอน ฟังก์ชั่น delfile (sdir, fext: string): บูลีน; วาจา hfindfile: hwnd; findfiledata: win32_find_data; SR: TsearchRec; เริ่ม sdir: = sdir + '/'; hfindfile: = findfirstfile (pchar (sdir + fext), findfiledata); ถ้า hfindfile <> null แล้ว เริ่ม DELETEFILE (SDIR + FINDFILEDATA.CFILENAME); ในขณะที่ findnextfile (hfindfile, findfiledata) <> false do DELETEFILE (SDIR + FINDFILEDATA.CFILENAME); จบ; sr.findhandle: = hfindfile; FindClose (SR); สิ้นสุด; // ล่าช้า ขั้นตอน mdelay (MSECs: DWORD); วาจา Begintime: DWORD; เริ่ม Begintime: = getTickCount; ทำซ้ำ Application.processMessages; จนกระทั่ง getTickCount - Begintime> = msecs; สิ้นสุด; // รูปแบบประเภทจุดลอยตัว ฟังก์ชั่น my_formatfloat (r: real; u: จำนวนเต็ม): จริง; วาจา vstr: สตริง; ฉัน: จำนวนเต็ม; เริ่ม ถ้าคุณ <= 0 แล้ว ผลลัพธ์: = r อื่น เริ่ม vstr: = '0'; สำหรับ i: = 1 ถึง u - 1 ทำ vstr: = vstr + '0'; vstr: = '0. ' + vstr; ผลลัพธ์: = strtofloat (formatfloat (vstr, r)); จบ; end; // รับ substring ที่ตำแหน่งที่ระบุในสตริงที่แน่นอน // ตัวอย่างเช่น get_substr ('aa ## bb#cc ## dd', '##', 3) ส่งคืน 'cc' ฟังก์ชั่น get_substr (s_str, d_str: string; po: จำนวนเต็ม): สตริง; วาจา I, J, K: จำนวนเต็ม; เริ่ม ผลลัพธ์: = ''; ถ้า po <1 แล้ว ออก; s_str: = trim (s_str)+d_str; i: = 0; ในขณะที่ 1 = 1 ทำ เริ่ม ถ้า pos (d_str, s_str)> 0 แล้ว เริ่ม j: = pos (d_str, s_str)+ความยาว (d_str); K: = ความยาว (s_str)-(j-1); i: = i+1; ถ้า i = po แล้ว เริ่ม j: = pos (d_str, s_str); ผลลัพธ์: = คัดลอก (s_str, 1, j-1); หยุดพัก; จบ; S_STR: = COPY (S_STR, J, K); จบ อื่น หยุดพัก; จบ; สิ้นสุด; // รับครั้งแรกและสิ้นเดือนของวันที่ปัจจุบัน ฟังก์ชั่น get_date (da: tdatetime; zt: จำนวนเต็ม): tdatetime; วาจา yy, mm, dd: string; เริ่ม yy: = formatDateTime ('yyyy', da); MM: = FormatDateTime ('MM', DA); ถ้า zt = 0 แล้ว dd: = '01' อื่น เริ่ม ถ้า strtoint (mm) ใน [1,3,5,7,8,10,12] แล้ว dd: = '31' อื่น ถ้า mm <> '2' แล้ว dd: = '30' อื่น ถ้า isleapyear (ปี (da)) แล้ว dd: = '29' อื่น DD: = '28'; จบ; datesparator: = '-'; ผลลัพธ์: = strtodate (yy + '-' + mm + '-' + dd); สิ้นสุด; // การดำรงอยู่หรือไม่ของตาราง ฟังก์ชั่น isexist (tb: string; query: tadoquery): บูลีน; วาจา SQLSTR: String; เริ่ม sqlstr: = 'เลือก * จาก sysobjects โดยที่ id = object_id ('+tb+'' ')'; ด้วยการสืบค้นทำ เริ่ม ปิด; sql.clear; sql.add (SQLSTR); เปิด; จบ; ถ้า query.recordset.eof แล้ว isExist: = false อื่น isExist: = true; สิ้นสุด; // ใช้ใน Excel มันเทียบเท่ากับการแปลงเลขฐานสิบหก ฟังก์ชั่น int2letter (num: จำนวนเต็ม): สตริง; const LettersTr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; วาจา ฉัน, J: จำนวนเต็ม; เริ่ม ถ้า num <= 26 แล้ว เริ่ม ผลลัพธ์: = ตัวอักษร [num]; จบ อื่น เริ่ม J: = num mod 26; i: = num div 26; ถ้า j = 0 แล้ว เริ่ม J: = 26; i: = i-1; จบ; ผลลัพธ์: = int2letter (i)+ตัวอักษร [j]; จบ; สิ้นสุด; // เป็นประเภทจำนวนเต็ม ฟังก์ชัน ISINT (AST: String): บูลีน; วาจา ค่ารหัส: จำนวนเต็ม; เริ่ม Val (Astr, Value, Code); ผลลัพธ์: = รหัส = 0; จบ; // เป็นประเภทจุดลอยตัว ฟังก์ชั่น isfloat (string: string): บูลีน; วาจา ค่า: จริง; รหัส: จำนวนเต็ม; เริ่ม Val (Astr, Value, Code); ผลลัพธ์: = รหัส = 0; สิ้นสุด; ขั้นตอน runscreensave (); //-เรียกใช้การป้องกันหน้าจอ เริ่ม SendMessage (hwnd_broadcast, wm_syscommand, sc_screensave, 0); จบ; // สองฟังก์ชั่นต่อไปนี้เป็นส่วนใหญ่เพื่อแสดงวิธีคิดคุณสามารถใช้หนึ่งในนั้น ฟังก์ชั่น myround (ค่า: สองเท่า): จำนวนเต็ม; // เติมและกลม // ลิขสิทธิ์นี้เป็นของ Xiaofeng เริ่ม ผลลัพธ์: = strToint (formatfloat ('#', ค่า)); สิ้นสุดฟังก์ชั่น doround (ค่า: สองเท่า): จำนวนเต็ม; // เติมและกลม // ฉันมีครึ่งหนึ่งของสิ่งนี้ฮ่าฮ่า เริ่ม ถ้าค่า <0 จากนั้นผลลัพธ์: = - doround (-value) อื่น ผลลัพธ์: = รอบ (int ((ค่า + 0.5) * 10)) div 10; จบ; // แน่นอนมีวิธีอื่นในการเขียนฟังก์ชั่นนี้ - - หมายเหตุเพิ่มเติม: ฟังก์ชั่นรอบตัวเองใช้กฎของ "การปัดเศษหกเป็นห้าคู่" ฉันยังโพสต์การใช้งานทั่วไปบางส่วน: {--------------------------------------------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ---------- ชื่อกระบวนการ: ผงชูรส ผู้แต่ง: กงคิน วันที่: 2003-6-9 16:57:44 พารามิเตอร์: AMSG: String; atype: = 1 แสดงไอคอน "ข้อมูล" 2 แสดงไอคอน "ข้อผิดพลาด" AMSG (แสดงเนื้อหาข้อความ) atitle (แสดงชื่อ) btn: = 0 แสดงตกลง 1 แสดงตกลงยกเลิก 2 โชว์ใช่ไม่ใช่ 3 Show retry และยกเลิก 4 แสดงการยกเลิกการลองใหม่และเพิกเฉย ค่าส่งคืน: จำนวนเต็ม คำอธิบาย: กล่องโต้ตอบแสดงข้อความ ------------------------------------------------------ ------------------------------------------------------ ------------------------ ---------------------------------------------------------------------------------------------------------------- --------------} ฟังก์ชั่น MSG (AMSG: String; atitle: String; atype: byte; btn: longint): จำนวนเต็ม; VAR Flag: Longint; เริ่ม กรณีที่พิมพ์ผิดของ 1: Flag: = MB_ICONQUESTION; 2: ธง: = mb_iconerror; 3: Flag: = MB_ICONSTOP; อื่น ธง: = mb_iconwarning; จบ; กรณี btn ของ 0: Flag: = Flag + Mb_ok; 1: Flag: = Flag + Mb_okcancel; 2: Flag: = Flag + Mb_yesno; 3: Flag: = Flag + Mb_yesnocancel; 4: Flag: = Flag + Mb_retryCancel; 5: Flag: = Flag + MB_ABORTRETRYIGNORE; จบ; ผลลัพธ์: = application.messagebox (pchar (amsg), pchar (atitle), ธง); จบ;{----------------------------------------------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ---------- ชื่อกระบวนการ: getAppPath ผู้แต่ง: กงคิน วันที่: 2003-6-9 17:01:17 พารามิเตอร์: ไม่มี ค่าส่งคืน: สตริง คำอธิบาย: นำเส้นทางไปยังแอปพลิเคชัน หากคุณใช้ ExtractFilePath เท่านั้น (ExtractFilePath (application.exename)) เพื่อรับเส้นทาง อาจมีข้อผิดพลาดดังนั้นจึงถูกประมวลผล ------------------------------------------------------ ------------------------------------------------------ ------------------------ ---------------------------------------------------------------------------------------------------------------- --------------} ฟังก์ชั่น getAppPath: สตริง; วาจา strtmp: สตริง; เริ่ม strtmp: = ExtractFilePath (ExtractFilePath (application.exename)); ถ้า strtmp [ความยาว (strtmp)] <> '/' แล้ว strtmp: = strtmp + '/'; ผลลัพธ์: = strtmp; จบ; ด้านล่างคือสิ่งที่ฉันรวบรวมตัวเอง http://www.myf1.net/bbs/dispbbs.asp?boardId=5&id=215239 // คำนวณเดือนแรกและเดือนสุดท้ายของไตรมาสที่วันที่ปัจจุบันอยู่ // Ultimate Edition ฟังก์ชั่น quarterbegin (thedate: tdatetime = 0): จำนวนเต็ม; // คัดลอกขวา 549@18: 25 2003-9-3 เริ่ม ผลลัพธ์: = (ไตรมาส (เดท) - 1) * 3 + 1; สิ้นสุด; ฟังก์ชั่นไตรมาส (เดท: tdatetime = 0): จำนวนเต็ม; // คัดลอกขวา 549@18: 25 2003-9-3 เริ่ม ผลลัพธ์: = (ไตรมาส (เดท) - 1) * 3 + 3; สิ้นสุด; ฟังก์ชั่นไตรมาส (TheDate: tDatetime = 0): จำนวนเต็ม; // คัดลอกขวา 549@10: 06 2003-9-5 เริ่ม ผลลัพธ์: = เดือนของ (เดท); ถ้า thedate = 0 แล้วผลลัพธ์: = monthof (วันที่); ผลลัพธ์: = (ผลลัพธ์ + 2) Div 3; จบ; |