0% found this document useful (0 votes)
57 views

Programing SQLite Using Lazarus PDF

This document provides an introduction to programming SQLite databases in Lazarus, a free and open source cross-platform IDE for Pascal and Object Pascal. It discusses Lazarus as an environment for developing desktop applications for multiple operating systems. Programming in Lazarus produces native executable files that are relatively small in size, fast executing, and lightweight on memory. Lazarus is similar to Delphi in providing a large set of tools and components to easily program applications. It allows creating a user interface where what is seen is what is obtained, and includes an editor, formatting, debugger, and project management.

Uploaded by

Asem Shahen
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
57 views

Programing SQLite Using Lazarus PDF

This document provides an introduction to programming SQLite databases in Lazarus, a free and open source cross-platform IDE for Pascal and Object Pascal. It discusses Lazarus as an environment for developing desktop applications for multiple operating systems. Programming in Lazarus produces native executable files that are relatively small in size, fast executing, and lightweight on memory. Lazarus is similar to Delphi in providing a large set of tools and components to easily program applications. It allows creating a user interface where what is seen is what is obtained, and includes an editor, formatting, debugger, and project management.

Uploaded by

Asem Shahen
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 59

‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪SQLITE‬‬

‫ﳲ ﻻﺯﺍﺭﻭﺱ‬

‫ﺇﻋﺪﺍﺩ‬

‫ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬

‫‪2015‬‬
‫ﺍﻟﻔﻬﺮﺱ‬
‫ﺭﻗﻢ ﺍﻟﺼﻔﺤﺔ‬ ‫ﺍﻟﻤﻮﺿﻮﻉ‬
‫‪1‬‬ ‫ﻻﺯﺍﺭﻭﺱ ‪Lazarus‬‬
‫‪3‬‬ ‫ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪SQLite3‬‬
‫ﺍﻟﺒﺎﺏ ﺍﻷﻭﻝ ‪ :‬ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ‬
‫‪6‬‬ ‫‪SQLDB‬‬
‫‪7‬‬ ‫ﺍﻟﻜﻼﺱ ‪TSQLConnection‬‬
‫‪10‬‬ ‫ﺍﻟﻜﻼﺱ ‪TSQLDBLibraryLoader‬‬
‫‪11‬‬ ‫ﺍﻟﻜﻼﺱ ‪TSQLQuery‬‬
‫‪11‬‬ ‫ﺍﻟﻜﻼﺱ ‪TDatasource‬‬
‫‪12‬‬ ‫ﺍﻟﻜﻼﺱ ‪TSQLTransaction‬‬
‫‪13‬‬ ‫ﺍﻟﺨﻼﺻﺔ‬
‫ﺍﻟﺒﺎﺏ ﺍﻟﺜﺎﻧﻲ ‪ :‬ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ )ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ(‬
‫‪15‬‬ ‫ﻓﻜﺮﺓ ﻋﺎﻣﺔ‬
‫‪15‬‬ ‫ﺗﻨﻮﻳﻪ‬
‫‪17‬‬ ‫ﺧﻄﺔ ﺍﻟﻌﻤﻞ‬
‫‪18‬‬ ‫ﺇﻧﺸﺎﺀ ﻭﺍﺟﻬﺔ ﺍﻟﻤﺴﺘﺨﺪﻡ‬
‫‪20‬‬ ‫ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫‪21‬‬ ‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺨﺎﺻﺔ ﺑﺈﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫‪24‬‬ ‫ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ ‪Counters‬‬
‫‪26‬‬ ‫ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ ‪Contacts‬‬
‫‪29‬‬ ‫ﺑﺮﻣﺠﺔ ﺍﻟﺤﺪﺙ ‪ FormActivate‬ﻟﻠﺘﺄﻛﺪ ﻣﻦ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻋﺪﻣﻪ‬
‫‪30‬‬ ‫ﺗﻨﺴﻴﻖ ﻋﺮﺽ ﺍﻟﺴﺠﻼﺕ‬
‫‪33‬‬ ‫ﺇﺿﺎﻓﺔ ﺍﻟﺴﺠﻼﺕ‬
‫‪40‬‬ ‫ﺍﻟﺒﺤﺚ ﻋﻦ ﺍﻟﺴﺠﻼﺕ‬
‫‪43‬‬ ‫ﺗﻌﺪﻳﻞ ‪ /‬ﺣﺬﻑ ﺍﻟﺴﺠﻼﺕ‬
‫‪50‬‬ ‫ﺇﻧﺸﺎﺀ ﺍﻟﺘﻘﺎﺭﻳﺮ‬
‫ﻣﻘﺪﻣﺔ ﻭﺗﻤﻬﻴﺪ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﻣﻘﺪﻣﺔ ﻭﺗﻤﻬﻴﺪ[‬

‫ﻻﺯﺍﺭﻭﺱ ‪Lazarus‬‬
‫ﻫﻲ ﺑﻴﺌﺔ ﺗﻄﻮﻳﺮﻳﺔ ﻣﺘﻜﺎﻣﻠﺔ‪ ،‬ﻣﺘﻌﺪﺩﺓ ﺍﻟﻤﻨﺼﺎﺕ‪ ،‬ﺣﺮﺓ ﻭﻣﺠﺎﻧﻴﺔ‪ ،‬ﻣﻔﺘﻮﺣﺔ ﺍﻟﻤﺼﺪﺭ‪ .‬ﺗﺴﺘﺨﺪﻡ ﻣﺘﺮﺟﻢ ﻓﺮﻱ‬
‫ﺑﺎﺳﻜﺎﻝ ﺍﻟﺬﻱ ﻳﺪﻋﻢ ﺃﻭﺑﺠﻜﺖ ﺑﺎﺳﻜﺎﻝ‪ .‬ﻭﺇﻥ ﺳﺄﻟﻚ ﺃﺣﺪﻫﻢ ﺑﻢ ﺗﻄﻮﺭ ﺑﺮﺍﻣﺠﻚ‪ ،‬ﻗﻞ ﻟﻪ‪ :‬ﺃﺳﺘﺨﺪﻡ ﻟﻐﺔ ﻓﺮﻱ‬
‫ﺑﺎﺳﻜﺎﻝ – ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ‪.‬‬

‫ﻳﻤﻜﻦ ﻟﻤﻄﻮﺭﻱ ﺳﻄﺢ ﺍﻟﻤﻜﺘﺐ ﺍﺳﺘﺨﺪﺍﻡ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ – ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ ﻟﺘﻄﻮﻳﺮ ﺗﻄﺒﻴﻘﺎﺕ ﺗﻌﻤﻞ ﻋﻠﻰ ﻋﺪﺓ‬
‫ﺃﻧﻈﻤﺔ ﺗﺸﻐﻴﻞ ﻣﺜﻞ ﻭﻧﺪﻭﺯ ﻭﻟﻴﻨﻮﻛﺲ ﻭﻣﺎﻙ‪.‬‬

‫ﻧﺘﺎﺝ ﺍﻟﺒﺮﻣﺠﺔ ﻓﻲ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ – ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ ﻫﻲ ﻣﻠﻔﺎﺕ ﺗﻨﻔﻴﺬﻳﺔ ﻃﺒﻴﻌﻴﺔ ‪ Native‬ﺑﺄﺣﺠﺎﻡ ﺻﻐﻴﺮﺓ‬
‫ﻧﺴﺒﻴﺎً‪ ،‬ﺳﺮﻳﻌﺔ ﺍﻟﺘﻨﻔﻴﺬ‪ ،‬ﺧﻔﻴﻔﺔ ﻋﻠﻰ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬

‫ﺗﺸﺒﻪ ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ ﺇﻟﻰ ﺣﺪ ﻛﺒﻴﺮ ﺑﻴﺌﺔ ﺩﻟﻔﻲ ﻟﺘﻄﻮﻳﺮ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ‪ ،‬ﺣﻴﺚ ﺗﻮﻓﺮ ﻣﺠﻤﻮﻋﺔ ﻛﺒﻴﺮﺓ ﻣﻦ ﺍﻷﺩﻭﺍﺕ‬
‫ﻭﺍﻟﻌﻨﺎﺻﺮ ﺍﻟﻤﺴﺎﻋﺪﺓ ﻋﻠﻰ ﺑﺮﻣﺠﺔ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺑﺴﻬﻮﻟﺔ ﺑﺎﻟﻐﺔ‪.‬‬

‫ﺗﻮﻓﺮ ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ ﻋﻨﺎﺻﺮ ﺗﺴﺎﻋﺪ ﻋﻠﻰ ﺇﻧﺸﺎﺀ ﻭﺍﺟﻬﺔ ﺍﻟﻤﺴﺘﺨﺪﻡ ﺑﺤﻴﺚ ﻣﺎ ﺗﺮﺍﻩ ﻫﻮ ﻣﺎ ﺗﺤﺼﻞ ﻋﻠﻴﻪ‪،‬‬
‫ﻭﻣﺤﺮﺭ ﻟﻠﻜﻮﺩ‪ ،‬ﻭﺍﻟﺘﻨﺴﻴﻖ‪ ،‬ﻭﻣﺘﺘﺒﻊ ﺍﻷﺧﻄﺎﺀ‪ ،‬ﻭﺇﺩﺍﺭﺓ ﺍﻟﻤﺸﺎﺭﻳﻊ ‪.‬‬

‫ﻛﻤﺎ ﺗﻮﻓﺮ ﺇﻣﻜﺎﻧﻴﺔ ﺍﻻﺗﺼﺎﻝ ﻭﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻣﺨﺘﻠﻒ ﺃﻧﻮﺍﻉ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﺜﻞ ‪ MySql‬ﻭ‪Postgresql‬‬
‫ﻭ‪ Sqlite3‬ﻭ‪ FireBird‬ﻭ‪ Oracle‬ﻭﻏﻴﺮﻫﺎ‪.‬‬

‫ﺍﻟﻌﻤﻞ ﻋﻠﻰ ﻫﺬﻩ ﺍﻟﺒﻴﺌﺔ ﺳﻬﻞ ﻭﻣﻤﺘﻊ‪ ،‬ﻭﻻ ﻳﺤﺘﺎﺝ ﻣﻨﻚ ﺇﻻ ﺍﻹﻟﻤﺎﻡ ﺑﺄﺳﺎﺳﻴﺎﺕ ﻟﻐﺔ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ‪ ،‬ﺍﻟﺘﻲ ﻟﻬﺎ‬
‫ﻣﺴﺘﻨﺪﺍﺕ ﻭﻣﺠﺘﻤﻊ ﺯﺍﺧﺮ ﺑﺎﻟﻤﻌﻠﻮﻣﺎﺕ‪.‬‬

‫ﺻﻔﺤﺔ ‪1‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﻣﻘﺪﻣﺔ ﻭﺗﻤﻬﻴﺪ[‬

‫ﻣﻦ ﺍﻷﻣﻮﺭ ﺍﻟﻤﻤﺘﻌﺔ ﻓﻲ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ – ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ‪ ،‬ﺃﻧﻪ ﻳﻤﻜﻨﻚ ﺑﺮﻣﺠﺔ ﻣﺸﺮﻭﻉ ﺗﻄﺒﻴﻖ ﻋﻠﻰ ﻭﻧﺪﻭﺯ‬
‫ﻣﺜﻼً‪ ،‬ﻭﺗﻨﺘﺞ ﺑﻪ ﺑﺮﻧﺎﻣﺠﺎً ﻳﻌﻤﻞ ﻋﻠﻰ ﺃﻱ ﺟﻬﺎﺯ ﺑﻪ ﻧﻈﺎﻡ ﻭﻧﺪﻭﺯ ﺑﻤﺠﺮﺩ ﻧﺴﺦ ﺍﻟﻤﻠﻒ ﺍﻟﺘﻨﻔﻴﺬﻱ )ﻭﺑﻌﺾ‬
‫ﺍﻟﻤﻠﻔﺎﺕ ﺍﻟﻀﺮﻭﺭﻳﺔ ﻟﻠﻌﻤﻞ ﻣﺜﻞ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺃﻭ ﻣﻠﻔﺎﺕ ﺍﻟﺘﻘﺎﺭﻳﺮ( ﻭﺗﺸﻐﻴﻠﻪ ﺩﻭﻥ ﺃﻳﺔ ﻣﺸﺎﻛﻞ ﺗﺬﻛﺮ ‪.‬‬

‫ﻛﻤﺎ ﻳﻤﻜﻨﻚ ﻧﺴﺦ ﺍﻟﻜﻮﺩ ﺍﻟﺒﺮﻣﺠﻲ ﻟﻠﻤﺸﺮﻭﻉ ﻭﻧﻘﻠﻪ ﺇﻟﻰ ﻣﻨﺼﺔ ﺃﺧﺮﻯ ﻣﺜﻞ ﻟﻴﻨﻮﻛﺲ ﺃﻭﺑﻮﻧﺘﻮ‪ ،‬ﻭﻋﻤﻞ‬
‫‪ Compile‬ﻓﻴﻨﺘﺞ ﺗﻄﺒﻴﻘﺎً ﻳﻌﻤﻞ ﻋﻠﻰ ﻟﻴﻨﻮﻛﺲ ﺩﻭﻥ ﺗﻐﻴﻴﺮ ﺣﻘﻴﻘﻲ ﻓﻲ ﺍﻟﻜﻮﺩ! ﻫﺬﺍ ﻫﻮ ﻣﻌﻨﻰ ﺍﻟﺸﻌﺎﺭ‬
‫‪.Write once, Compile Anywhere‬‬

‫ﻟﺘﻨﺰﻳﻞ ﻧﺴﺨﺘﻚ ﻣﻦ ﺍﻟﺒﻴﺌﺔ‪ ،‬ﺍﺩﺧﻞ ﻣﻮﻗﻊ ﺍﻟﺒﻴﺌﺔ ‪www.lazarus-ide.org :‬‬

‫ﻭﻟﻠﻤﺰﻳﺪ ﻣﻦ ﺍﻟﻤﻌﻠﻮﻣﺎﺕ ﻋﻦ ﻟﻐﺔ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ‪ ،‬ﻳﻤﻜﻨﻚ ﻣﻄﺎﻟﻌﺔ ﺍﻟﻤﻮﻗﻊ ﺍﻟﺨﺎﺹ ﺑﻬﺎ‪:‬‬
‫‪www.freepascal.org‬‬

‫ﻭﺃﻧﺼﺢ ﺍﻟﻤﺒﺘﺪﺉ ﺑﺘﻨﺰﻳﻞ ﻭﺩﺭﺍﺳﺔ ﻛﺘﺐ ﺍﻷﺳﺘﺎﺫ ﻣﻌﺘﺰ ﻋﺒﺪ ﺍﻟﻌﻈﻴﻢ ﻣﻦ ﻣﻮﻗﻌﻪ ﻋﻠﻰ ﺍﻹﻧﺘﺮﻧﺖ‪:‬‬
‫‪www.code-sd.com‬‬

‫ﻓﻲ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﺳﻨﺘﻌﻠﻢ ﻛﻴﻔﻴﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪ SQLite3‬ﻓﻲ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ – ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ‪،‬‬
‫ﻋﻠﻰ ﻧﻈﺎﻡ ﻭﻧﺪﻭﺯ ﻣﻦ ﻣﺎﻳﻜﺮﻭﺳﻮﻓﺖ‪ ،‬ﺑﺎﻋﺘﺒﺎﺭ ﺃﻥ ﺍﻟﻐﺎﻟﺒﻴﺔ ﺍﻟﻌﻈﻤﻲ ﻣﻦ ﺍﻟﻤﺴﺘﺨﺪﻣﻴﻦ ﺍﻟﻌﺮﺏ ﻳﺴﺘﻌﻤﻠﻮﻥ‬
‫ﻭﻧﺪﻭﺯ‪ ،‬ﺑﺤﻴﺚ ﻧﺴﺘﻜﺸﻒ ﺍﻟﻤﻜﻮﻧﺎﺕ ﺍﻟﺘﻲ ﺻﻤﻤﺖ ﻟﺘﺴﻬﻴﻞ ﺍﻟﻌﻤﻞ‪ ،‬ﻭﻧﺘﻌﺮﻑ ﻋﻠﻰ ﺧﺼﺎﺋﺼﻬﺎ ﻭﻭﻇﺎﺋﻔﻬﺎ‬
‫ﻭﺃﺣﺪﺍﺛﻬﺎ‪.‬‬

‫ﺳﻨﻌﻤﻞ ﻋﻠﻰ ﺇﻧﺸﺎﺀ ﻣﺸﺮﻭﻉ ﻟﺘﻄﺒﻴﻖ ﺧﺎﺹ ﺑﺪﻟﻴﻞ ﻫﺎﺗﻒ ﻣﺒﺴﻂ‪ ،‬ﻧﺠﺮﻱ ﻋﻠﻴﻪ ﻛﻞ ﺍﻟﻌﻤﻠﻴﺎﺕ‪ ،‬ﻣﻦ ﺇﺿﺎﻓﺔ‬
‫ﻭﺑﺤﺚ ﻭﺗﻌﺪﻳﻞ ﻭﺣﺬﻑ‪ ،‬ﻛﻤﺎ ﺳﻨﺘﻌﻠﻢ ﺑﻌﺾ ﺍﻷﻣﻮﺭ ﺍﻟﺒﺮﻣﺠﻴﺔ ﺍﻟﺘﻲ ﺳﻨﺤﺘﺎﺟﻬﺎ ﻓﻲ ﺳﻴﺎﻕ ﺍﻟﻌﻤﻞ‪ ،‬ﻭﺍﻟﺘﻲ ﻻ‬
‫ﻋﻼﻗﺔ ﻟﻬﺎ ﺑﻘﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬

‫ﻗﻠﺖُ ﻗﺒﻞ ﻗﻠﻴﻞ ﺃﻧﻨﺎ ﺳﻨﺘﻌﻠﻢ ﻛﻴﻔﻴﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪ SQLite3‬ﻣﻦ ﺧﻼﻝ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ – ﺑﻴﺌﺔ‬
‫ﻻﺯﺍﺭﻭﺱ‪ ،‬ﻓﻤﺎ ﻫﻲ ‪ SQLite3‬ﺃﻭ ﺳﻴﻜﻮﻳﻼﻳﺖ؟‬

‫ﺻﻔﺤﺔ ‪2‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﻣﻘﺪﻣﺔ ﻭﺗﻤﻬﻴﺪ[‬

‫ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪SQLite3‬‬

‫ﺑﺸﻜﻞ ﻋﺎﻡ‪ ،‬ﻫﻨﺎﻙ ﻧﻮﻋﺎﻥ ﻣﻦ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ﺗﻌﺘﻤﺪ ﻓﻲ ﻋﻤﻠﻬﺎ ﻋﻠﻰ ﺧﺎﺩﻡ ‪ ،Server‬ﻭﻗﻮﺍﻋﺪ‬
‫ﺑﻴﺎﻧﺎﺕ ﻋﺒﺎﺭﺓ ﻋﻦ ﻣﻠﻒ ﻭﺍﺣﺪ ﻏﻴﺮ ﻣﻌﺘﻤﺪ ﻋﻠﻰ ﺳﻴﺮﻓﺮ‪.‬‬

‫ﻣﻦ ﺃﻣﺜﻠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺳﻴﺮﻓﺮﺍﺕ‪ MySql :‬ﻭ‪ MariaDB‬ﻭ‪ Postgresql‬ﻭ‪ .Oracle‬ﻭﻣﻦ‬
‫ﺃﻣﺜﻠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﻻ ﺗﻌﺘﻢ ﻋﻠﻰ ﺳﻴﺮﻓﺮﺍﺕ ‪ Access‬ﻭ‪.SQLite3‬‬

‫ﻓﻲ ﺍﻟﺒﺮﺍﻣﺞ ﺍﻟﻜﺒﻴﺮﺓ‪ ،‬ﻭﺣﺘﻰ ﺍﻟﻤﻮﺍﻗﻊ ﺍﻟﻜﺒﻴﺮﺓ‪ ،‬ﻳﻔﻀﻞ ﺍﺳﺘﺨﺪﺍﻡ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺳﻴﺮﻓﺮﺍﺕ‬
‫ﻹﺩﺍﺭﺗﻬﺎ‪ ،‬ﺍﻷﻣﺮ ﻃﺒﻴﻌﻲ‪ ،‬ﻧﻈﺮﺍً ﻟﻠﻜﻤﻴﺔ ﺍﻟﻬﺎﺋﻠﺔ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﻳﺘﻢ ﺇﺩﺍﺭﺗﻬﺎ‪.‬‬

‫ﺃﻣﺎ ﻓﻲ ﺍﻟﺒﺮﺍﻣﺞ ﺍﻟﺼﻐﻴﺮﺓ‪ ،‬ﻭﺍﻟﻤﺘﻮﺳﻄﺔ‪ ،‬ﻭﺍﻟﺘﻲ ﻧﻌﻠﻢ – ﻣﺴﺒﻘﺎً – ﺃﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻬﻤﺎ ﻛﺜﺮﺕ ﻟﻦ ﺗﺼﻞ ﺇﻟﻰ ﺣﺠﻢ‬
‫ﻣﻌﻴﻦ ﻟﻴﺤﺘﺎﺝ ﺇﻟﻰ ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ﻛﺒﻴﺮﺓ ﺟﺪﺍً‪ ،‬ﻓﺎﻷﻧﺴﺐ ﻫﻮ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻨﻮﻉ ﺍﻟﺜﺎﻧﻲ ﻣﻦ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪،‬‬
‫ﻭﺃﻗﺼﺪ ﺗﻠﻚ ﺍﻟﺘﻲ ﺗﻜﻮﻥ ﻋﻠﻰ ﻫﻴﺌﺔ ﻣﻠﻒ ﻭﺍﺣﺪ‪.‬‬

‫ﻭﻟﻜﻲ ﻧﺴﺘﻄﻴﻊ ﺍﻟﻌﻤﻞ ﻣﻊ ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ﺳﻴﻜﻮﻳﻼﻳﺖ‪ ،‬ﻧﺤﺘﺎﺝ ﻟﻮﺟﻮﺩ ﻣﻠﻒ ﻣﻜﺘﺒﺔ ﺧﺎﺹ ﺑﻬﺎ )ﺫﻭ ﺍﻣﺘﺪﺍﺩ ‪،(.dll‬‬
‫ﻫﺬﻩ ﺍﻟﻤﻜﺘﺒﺔ ﻛُﺘﺒﺖ ﺑﻠﻐﺔ ‪ ،C‬ﺗﻌﺘﺒﺮ ﻣﺤﺮﻛﺎً ﻟﻘﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQL‬ﻣﻀﻤﻨﺎً ﻭﺻﻐﻴﺮ ﺍﻟﺤﺠﻢ )ﻻ ﻳﺘﻌﺪﻯ ﺣﺠﻤﻪ‬
‫‪ 700‬ﻛﻴﻠﻮ ﺑﺎﻳﺖ‪ ،(،‬ﻳﻮﺿﻊ ﻓﻲ ﻧﻔﺲ ﻣﺠﻠﺪ ﺍﻟﺘﻄﺒﻴﻖ‪ ،‬ﻭﻳﺘﻢ ﺇﺭﻓﺎﻗﻪ ﻣﻊ ﺍﻟﺘﻄﺒﻴﻖ ﻟﻴﻌﻤﻞ ﻋﻠﻰ ﺟﻬﺎﺯ ﺍﻟﺰﺑﻮﻥ‪.‬‬

‫ﻟﻬﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻴﺰﺍﺕ ﻭﻋﻴﻮﺏ‪ ،‬ﻭﺗﺘﻤﺜﻞ ﺍﻟﻤﻴﺰﺍﺕ ﻓﻲ ﻛﻮﻥ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺻﻐﻴﺮ ﺍﻟﺤﺠﻢ‬
‫ﻧﺴﺒﻴﺎً‪ ،‬ﺳﻬﻞ ﺍﻹﻧﺸﺎﺀ ﻭﺍﻟﺘﺮﻛﻴﺐ‪ ،‬ﻳﻤﻜﻦ ﻧﻘﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺟﻬﺎﺯ ﺇﻟﻰ ﺁﺧﺮ ﺑﺴﻬﻮﻟﺔ )ﻧﺴﺦ – ﻟﺼﻖ(‪ ،‬ﻻ ﻣﺸﺎﻛﻞ‬
‫ﻓﻲ ﺍﻟﺘﺮﻣﻴﺰ ﻭﺧﺎﺻﺔ ﻣﻊ ﺍﻟﻠﻐﺔ ﺍﻟﻌﺮﺑﻴﺔ‪ ،‬ﻻ ﺣﺎﺟﺔ ﻹﻋﺪﺍﺩﺍﺕ ﺧﺎﺻﺔ‪.‬‬

‫ﻳﻤﻜﻦ ﺃﻥ ﻳﺘﺤﻤﻞ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺣﺠﻤﺎً ﻳﺼﻞ ﺇﻟﻰ ‪ 2048‬ﺟﻴﺠﺎﺑﺎﻳﺖ ﺃﻱ ‪ 2‬ﺗﻴﺮﺍﺑﺎﻳﺖ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻛﺤﺪ‬
‫ﺃﻗﺼﻰ! ﺟﻤﻴﻞ ﺃﻟﻴﺲ ﻛﺬﻟﻚ؟‬

‫ﻛﻤﺎ ﻳﻤﻜﻦ ﺍﺳﺘﻌﻤﺎﻟﻬﺎ ﻓﻲ ﺍﻟﻤﻮﺍﻗﻊ ﺍﻟﺘﻲ ﻻ ﺗﺪﻋﻢ ‪.MySql‬‬

‫ﺻﻔﺤﺔ ‪3‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﻣﻘﺪﻣﺔ ﻭﺗﻤﻬﻴﺪ[‬

‫ﺍﻟﻘﺎﻋﺪﺓ ﺍﻟﺮﺋﻴﺴﻴﺔ ﺗﻘﻮﻝ‪ :‬ﺇﻥ ﺳﻴﻜﻮﻳﻼﻳﺖ ﺻﻤﻤﺖ ﻟﺘﻜﻮﻥ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﻣﻀﻤﻨﺔ ﺿﻤﻦ ﺍﻟﺒﺮﺍﻣﺞ ﻭﺍﻟﺘﻄﺒﻴﻘﺎﺕ‬
‫ﺍﻟﺼﻐﻴﺮﺓ ﻭﺍﻟﻤﺘﻮﺳﻄﺔ‪ ،‬ﻟﺬﺍ ﻣﻦ ﺍﻟﺨﻄﺄ ﺍﺳﺘﻌﻤﺎﻟﻬﺎ ﻓﻲ ﺣﺎﻟﺔ ﺍﻟﻤﺸﺎﺭﻳﻊ ﺍﻟﻜﺒﻴﺮﺓ ﻭﺍﻟﺘﻲ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺍﻟﻤﺸﺎﺭﻛﺔ‬
‫ﻓﻲ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺑﻴﻦ ﺍﻟﻤﺴﺘﺨﺪﻣﻴﻦ ‪) .‬ﻭﻫﺬﺍ ﻣﻦ ﺃﻫﻢ ﻋﻴﻮﺏ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪(.‬‬

‫ﻳﻤﻜﻦ ﺗﻨﺰﻳﻞ ﻣﻠﻒ ﺍﻟﻤﻜﺘﺒﺔ ﻣﻦ ﻣﻮﻗﻊ ﺳﻴﻜﻮﻳﻼﻳﺖ ﺍﻟﺮﺳﻤﻲ ‪www.sqlite.org‬‬

‫ﻓﻲ ﺭﻛﻦ ﺍﻟﺘﻨﺰﻳﻼﺕ ﺍﺧﺘﺮ ‪ ،sqlite-dll-win32-x86-3080803.zip‬ﺗﺤﺖ ﺍﻟﺒﻨﺪ ‪Precompiled‬‬


‫‪.Binaries for Windows‬‬

‫ﻓﻚ ﺍﻟﻀﻐﻂ‪ ،‬ﻭﺧﺬ ﻧﺴﺨﺔ ﻣﻦ ﺍﻟﻤﻠﻒ ‪ sqlite3.dll‬ﻭﺿﻌﻬﺎ ﻓﻲ ﻣﺠﻠﺪ ﺧﺎﺹ ﻟﺘﺮﺟﻊ ﺇﻟﻴﻪ ﻻﺣﻘﺎً‪.‬‬

‫ﺻﻔﺤﺔ ‪4‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺍﻟﺒﺎﺏ ﺍﻷﻭﻝ‬

‫ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ‬

‫‪SQLDB‬‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ ‪[SQLDB -‬‬

‫‪SQLDB‬‬
‫ﻳﺘﻢ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﻜﻞ ﺃﻧﻮﺍﻋﻬﺎ ﻓﻲ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ – ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ ﻣﻦ ﺧﻼﻝ )ﻭﺣﺪﺓ( ﺧﺎﺻﺔ‬
‫ﺑﻬﺬﺍ ﺍﻟﻌﻤﻞ‪ ،‬ﻭﻫﻲ ﺍﻟﻮﺣﺪﺓ ‪.SQLdb‬‬

‫ﻭﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻔﺌﺎﺕ )ﺍﻟﻜﻼﺳﺎﺕ ‪ (Classes‬ﻧﺴﺘﻐﻠﻬﺎ ﻟﻼﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺇﺟﺮﺍﺀ‬
‫ﻣﺨﺘﻠﻒ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻴﻬﺎ ﻣﻦ ﺇﺿﺎﻓﺔ ﺳﺠﻼﺕ ﻭﺑﺤﺚ ﻭﻋﺮﺽ ﻭﺗﻌﺪﻳﻞ ﻭﺣﺬﻑ‪.‬‬

‫ﻭﺑﺼﻮﺭﺓ ﺃﺩﻕ‪ ،‬ﺗﺤﺘﻮﻱ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ ﻋﻠﻰ ﺛﻼﺙ ﻛﻼﺳﺎﺕ ﺃﺳﺎﺳﻴﺔ ﻟﻠﺮﺑﻂ ﺑﻴﻦ ﺍﻟﺘﻄﺒﻴﻖ ﻭﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫ﺗﻤﻬﻴﺪﺍً ﻟﻠﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﻭﻫﻲ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻟﻜﻼﺱ‬
‫ﻭﻳﻤﺜﻞ ﺍﺗﺼﺎﻻً ﺑﻴﻦ ﺍﻟﺘﻄﺒﻴﻖ ﻭﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ .‬ﻭﻟﺪﻳﻪ ﻣﺠﻤﻮﻋﺔ ﻣﻦ‬
‫ﺍﻟﺨﺼﺎﺋﺺ ﺍﻟﺘﻲ ﻳﺠﺐ ﺿﺒﻄﻬﺎ ﻗﺒﻞ ﺍﻟﺸﺮﻭﻉ ﻓﻲ ﺍﻻﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫‪TSQLConnection‬‬
‫ﻭﻗﺖ ﺍﻟﺘﺸﻐﻴﻞ‪ .‬ﻭﻟﻜﻞ ﻧﻮﻉ ﻣﻦ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ Connection‬ﺧﺎﺹ ﺑﻪ‪،‬‬
‫ﻭﻳﺠﺐ ﺗﺬﻛّﺮ ﺫﻟﻚ‬
‫ﻫﻮ ﺑﻤﺜﺎﺑﺔ ﺻﻮﺭﺓ ﻣﻦ ﺍﻟﻔﺌﺔ ‪ ،Dataset‬ﻭﻧﺴﺘﻐﻠﻪ ﻓﻲ ﺇﺟﺮﺍﺀ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻣﺜﻞ‬
‫ﺍﺳﺘﺮﺟﺎﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﺃﻭ ﺇﺿﺎﻓﺔ ﺍﻟﺴﺠﻼﺕ‪ ،‬ﺃﻭ ﺗﻌﺪﻳﻠﻬﺎ ﻭﺣﺘﻰ ﺣﺬﻓﻬﺎ ﺑﻌﺪ‬ ‫‪TSQLQuery‬‬
‫ﺭﺑﻄﻪ ﺑﺎﻟﻜﻼﺱ ‪Connection‬‬
‫ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﻫﻮ ﺍﻟﻤﺴﺌﻮﻝ ﻋﻦ ﺗﻄﺒﻴﻖ ﺍﻟﺘﻐﻴﻴﺮﺍﺕ ﺍﻟﺘﻲ ﻧﻘﻮﻡ ﺑﻬﺎ ﻋﻠﻰ‬
‫ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻋﺪﻣﻪ‪ .‬ﺑﺤﻴﺚ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻛﺘﻠﺔ ﻛﺎﻣﻠﺔ ﻣﻦ ﺍﻷﻭﺍﻣﺮ ﺃﻭ‬ ‫‪TSQLTransaction‬‬
‫ﺍﻟﺘﺮﺍﺟﻊ ﻋﻨﻬﺎ ﺩﻓﻌﺔ ﻭﺍﺣﺪﺓ‪ .‬ﻭﻳﺘﻢ ﺭﺑﻄﻪ ﺃﻳﻀﺎً ﺑﺎﻟﻜﻼﺱ ‪Connection‬‬

‫ﻫﺬﻩ ﺍﻟﻜﻼﺳﺎﺕ ﻭﻏﻴﺮﻫﺎ ﻣﺘﻮﻓﺮﺓ ﻛﺄﺩﻭﺍﺕ ﻳﻤﻜﻦ ﺍﺳﺘﻌﻤﺎﻟﻬﺎ ﻣﺮﺋﻴﺎً‪ ،‬ﻣﻦ ﺧﻼﻝ ﻓﺘﺢ ﺍﻟﺘﺒﻮﻳﺐ ‪ SQLdb‬ﻓﻲ ﺃﻋﻠﻰ‬
‫ﺍﻟﺸﺎﺷﺔ ﺍﻟﺮﺋﻴﺴﻴﺔ ﻟﻠﺒﻴﺌﺔ‪ ،‬ﻛﻤﺎ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻭﺑﻤﺠﺮﺩ ﺇﺩﺭﺍﺝ ﺃﺣﺪﻫﺎ‪ ،‬ﻳﺘﻢ ﺗﻀﻤﻴﻦ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ ﻓﻲ ﺍﻟﺒﺮﻧﺎﻣﺞ‪ .‬ﻭﻟﻜﻦ ﻗﺒﻞ ﺗﻮﺿﻴﺢ ﺫﻟﻚ‪ ،‬ﺃﻭﺩ ﺃﻥ ﺃﺷﺮﺡ‬
‫ﺍﻟﻤﺰﻳﺪ ﻋﻦ ﻫﺬﻩ ﺍﻟﻜﻼﺳﺎﺕ‪.‬‬

‫ﺻﻔﺤﺔ ‪6‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ ‪[SQLDB -‬‬

‫‪ - 1‬ﺍﻟﻜﻼﺱ ‪TSQLConnection‬‬

‫ﻳﻤﺜﻞ ﺍﺗﺼﺎﻻً ﺑﻴﻦ ﺍﻟﺘﻄﺒﻴﻖ ﺍﻟﺬﻱ ﻧﺒﺮﻣﺠﻪ ﻭﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻭﺑﻤﺎ ﺃﻧﻪ ﻳﻮﺟﺪ ﻟﺪﻳﻨﺎ ﻋﺪﺓ ﺃﻧﻮﺍﻉ ﻣﻦ ﻗﻮﺍﻋﺪ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻓﻠﻜﻞ ﻧﻮﻉ ﻛﻼﺱ ‪ TSQLConnection‬ﺧﺎﺹ ﺑﻪ‪.‬‬

‫ﺍﻟﻜﻼﺱ ‪ TSQLConnection‬ﻟﺪﻳﻪ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺨﺼﺎﺋﺺ ﺍﻟﺘﻲ ﻳﺠﺐ ﺗﻌﻴﻴﻦ ﻗﻴﻤﻬﺎ ﻗﺒﻞ ﺍﻟﺒﺪﺀ ﻓﻲ‬
‫ﺍﻻﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬

‫ﻭﻟﻜﻦ ﺑﺎﻋﺘﺒﺎﺭ ﺃﻥ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻳﻤﻜﻦ ﺗﺼﻨﻴﻔﻬﺎ ﺇﻟﻰ ﻗﺴﻤﻴﻦ‪ ،‬ﻗﺴﻢ ﻳﻌﻤﻞ ﻣﻦ ﺧﻼﻝ ﺳﻴﺮﻓﺮ‪ ،‬ﻭﻗﺴﻢ ﻗﺎﺋﻢ‬
‫ﺑﺬﺍﺗﻪ‪ ،‬ﻓﺈﻥ ﺍﻟﺨﺼﺎﺋﺺ ﺳﺘﺨﺘﻠﻒ ﻓﻲ ﺍﻟﺤﺎﻟﺘﻴﻦ‪.‬‬

‫ﻓﻤﺜﻼً‪ ،‬ﻓﻲ ﺣﺎﻟﺔ ﺍﻻﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ‪ ،MySql‬ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻳﻌﺘﻤﺪ ﻋﻠﻰ ﺳﻴﺮﻓﺮ‪ ،‬ﻭﺑﺎﻟﺘﺎﻟﻲ‬
‫ﺳﻨﺨﺘﺎﺭ ﺍﻟـ‪ Connection‬ﺍﻟﻤﻼﺋﻢ ﻟﻬﺎ ﻣﻦ ﺍﻟﺘﺒﻮﻳﺐ ‪ ،SQLdb‬ﻭﻫﻮ ﺃﺣﺪ ﺍﻹﺻﺪﺍﺭﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻭﺗﻌﻨﻲ ﺍﻷﺭﻗﺎﻡ ﻓﻲ ﺍﻟﺼﻮﺭﺓ ﺇﺻﺪﺍﺭﺍﺕ ﻛﻞ ﺳﻴﺮﻓﺮ‪ ،‬ﻭﺑﺎﻟﺘﺎﻟﻲ ﺳﻴﻌﺘﻤﺪ ﺍﺧﺘﻴﺎﺭﻙ ﻟﻠـ‪Connection‬‬


‫ﻋﻠﻰ ﺭﻗﻢ ﺇﺻﺪﺍﺭﺓ ‪ MySql‬ﻟﺪﻳﻚ‪.‬‬

‫ﻭﻓﻲ ﻫﺬﻩ ﺍﻟﺤﺎﻟﺔ‪ ،‬ﺳﻴﺘﻢ ﺗﻌﻴﻴﻦ ﻗﻴﻢ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺨﺼﺎﺋﺺ ﻗﺒﻞ ﺍﻻﺗﺼﺎﻝ ﻭﻫﻲ‪HostName :‬‬
‫ﻭ‪ DatabaseName‬ﻭ‪ UserName‬ﻭ‪.Password‬‬

‫ﺃﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﺍﻟﻨﻮﻉ ﺍﻟﺜﺎﻧﻲ ﻣﻦ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻫﻮ ﺍﻟﻨﻮﻉ ﺍﻟﻘﺎﺋﻢ ﺑﺬﺍﺗﻪ ﻋﻠﻰ ﻫﻴﺌﺔ ﻣﻠﻒ ﻭﺍﺣﺪ‪،‬‬
‫ﻓﺨﺼﺎﺋﺺ ﺍﻟـ‪ Connection‬ﺍﻟﻤﻄﻠﻮﺏ ﺗﻌﻴﻴﻦ ﻗﻴﻤﻬﺎ ﺗﺨﺘﻠﻒ‪ ،‬ﻓﻼ ﻧﺤﺘﺎﺝ ﺇﻟﻰ ‪ HostName‬ﻭﻻ ﺇﻟﻰ‬
‫‪ UserName‬ﻭﻻ ‪.Password‬‬

‫ﻓﻌﻠﻲ ﺳﺒﻴﻞ ﺍﻟﻤﺜﺎﻝ‪ ،‬ﻋﻨﺪ ﺍﻻﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ‪ – SQLite3‬ﻭﻫﻮ ﻣﻮﺿﻮﻉ ﺍﻟﻜﺘﺎﺏ – ﺳﻨﻌﻴﻦ‬
‫ﻗﻴﻤﺔ ﺍﻟﺨﺎﺻﻴﺔ ‪ DatabaseName‬ﻓﻘﻂ‪ ،‬ﻭﺑﻜﻞ ﺗﺄﻛﻴﺪ ﺳﻴﺨﺘﻠﻒ ﻧﻮﻉ ﺍﻟـ‪ Connection‬ﻋﻦ ﺍﻟﻨﻮﻉ‬
‫ﺳﺎﻟﻒ ﺍﻟﺬﻛﺮ‪.‬‬

‫ﺻﻔﺤﺔ ‪7‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ ‪[SQLDB -‬‬

‫ﻭﻋﻠﻰ ﻛﻞ ﺣﺎﻝ‪ ،‬ﺳﺄﺷﺮﺡ ﻛﺎﻓﺔ ﺍﻟﺨﺼﺎﺋﺺ ﺁﻧﻔﺔ ﺍﻟﺬﻛﺮ‪ ،‬ﺑﺸﻲﺀ ﻣﻦ ﺍﻟﺘﻔﺼﻴﻞ‪ ،‬ﺣﺘﻰ ﻳﺴﺘﻔﻴﺪ ﻣﻦ ﻳﺮﻳﺪ‬
‫ﺍﻻﺗﺼﺎﻝ ﺑﺄﻧﻮﺍﻉ ﺃﺧﺮﻯ ﻣﻦ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬
‫ﻭﺗﻤﺜﻞ ﺍﺳﻢ ﺍﻟﺴﻴﺮﻓﺮ ﺍﻟﻤﺮﺍﺩ ﺍﻻﺗﺼﺎﻝ ﺑﻪ‪ ،‬ﺃﻭ ﺭﻗﻢ ﺍﻟـ‪ IP‬ﺍﻟﺨﺎﺹ ﺑﻪ‪ ،‬ﻗﺪ‬
‫ﻳﻜﻮﻥ ﻫﺬﺍ ﺍﻟﺴﻴﺮﻓﺮ ﻣﺤﻠﻴﺎً ) ﻋﻠﻰ ﻧﻔﺲ ﻛﻤﺒﻴﻮﺗﺮ ﺍﻟﺰﺑﻮﻥ( ﺃﻭ ﻛﻤﺒﻴﻮﺗﺮ‬ ‫‪HostName‬‬
‫ﺿﻤﻦ ﺷﺒﻜﺔ ﻣﺤﻠﻴﺔ‪ ،‬ﺃﻭ ﻗﺪ ﻳﻜﻮﻥ ﻣﺴﺘﻀﺎﻓﺎً ﻋﻠﻰ ﺍﻹﻧﺘﺮﻧﺖ‬
‫ﻭﺗﻤﺜﻞ ﺍﺳﻢ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﻧﺮﻳﺪ ﺍﻻﺗﺼﺎﻝ ﺑﻬﺎ ﻭﻓﺘﺤﻬﺎ ﻭﺇﺟﺮﺍﺀ‬
‫‪DatabaseName‬‬
‫ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻴﻬﺎ‬
‫ﻭﺗﻤﺜﻞ ﺍﺳﻢ ﺍﻟﻤﺴﺘﺨﺪﻡ ﺍﻟﻤﺴﻤﻮﺡ ﻟﻪ ﺑﺎﻻﺗﺼﺎﻝ ﺑﺴﻴﺮﻓﺮ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫‪UserName‬‬
‫ﻭﻟﺪﻳﻪ ﺻﻼﺣﻴﺎﺕ ﻣﻌﻴﻨﺔ‬
‫ﻭﺗﻤﺜﻞ ﻛﻠﻤﺔ ﺍﻟﻤﺮﻭﺭ ﺍﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺴﺘﺨﺪﻡ ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﺃﻫﻠﻴﺘﻪ ﻟﻼﺗﺼﺎﻝ‬
‫‪Password‬‬
‫ﺑﺴﻴﺮﻓﺮ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫ﻫﺬﻩ ﺍﻟﺨﺼﺎﺋﺺ ﻛﻤﺎ ﻗﻠﺖ ﻫﻲ ﺧﺎﺻﺔ ﺑﺎﻟـ‪ Connection‬ﺍﻟﺬﻱ ﺳﻴﺘﺼﻞ ﺑﺴﻴﺮﻓﺮ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ‪ ،‬ﻭﻻ ﻧﺤﺘﺎﺟﻬﺎ‬
‫ﻟﻼﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ‪ SQLite3‬ﻣﺜﻼ‪.‬‬

‫ﻫﺬﻩ ﻫﻲ ﺍﻟﺨﺼﺎﺋﺺ ﺍﻷﺳﺎﺳﻴﺔ ﺍﻟﺘﻲ ﻳﺠﺐ ﺗﺤﺪﻳﺪ ﻗﻴﻤﻬﺎ ﻗﺒﻞ ﻣﺤﺎﻭﻟﺔ ﺍﻻﺗﺼﺎﻝ ﺑﺴﻴﺮﻓﺮ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﺃﻱ‬
‫ﺇﻫﻤﺎﻝ ﻹﺣﺪﻯ ﻫﺬﻩ ﺍﻟﺨﺼﺎﺋﺺ ﻳﻮﻟﺪ ﺧﻄﺄ‪ ،‬ﻭﻟﻦ ﻳﺘﻢ ﺍﻻﺗﺼﺎﻝ ﺑﻨﺠﺎﺡ‪ ،‬ﻭﻟﻜﻦ ﺗﻮﺟﺪ ﺧﺼﺎﺋﺺ ﺃﺧﺮﻯ ﻣﺘﻤﻤﺔ‬
‫ﻟﻬﺎ‪ ،‬ﻣﻨﻬﺎ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬
‫ﻭﻣﻦ ﺧﻼﻟﻬﺎ ﻳﻤﻜﻦ ﺿﺒﻂ ﻧﻮﻉ ﺍﻟﺘﺮﻣﻴﺰ ﺍﻟﻤﺴﺘﺨﺪﻡ ﻓﻲ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫‪CharSet‬‬
‫ﺍﻟﻤﻄﻠﻮﺑﺔ‪ .‬ﺑﺎﻟﻨﺴﺒﺔ ﻟﻲ‪ ،‬ﺃﻓﻀﻞ ﺩﻭﻣﺎً ‪utf8‬‬
‫ﻭﻫﻲ ﺧﺎﺻﻴﺔ ﻣﻨﻄﻘﻴﺔ‪ ،‬ﺗﺮﺟﻊ ﻗﻴﻤﺔ ‪ True‬ﺇﺫﺍ ﻧﺠﺢ ﺍﻻﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻭ‪ False‬ﺇﺫﺍ ﻓﺸﻞ ﺍﻻﺗﺼﺎﻝ‪ .‬ﻭﺗﺴﺘﺨﺪﻡ ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﺍﺗﺼﺎﻝ‬ ‫‪Connected‬‬
‫ﺍﻟﺘﻄﺒﻴﻖ ﺑﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫ﺻﻔﺤﺔ ‪8‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ ‪[SQLDB -‬‬

‫ﻛﻤﺎ ﻳﺪﻋﻢ ﺍﻟـ‪ Connection‬ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻹﺟﺮﺍﺀﺍﺕ ﺃﻭ ﺍﻷﻭﺍﻣﺮ‪ ،‬ﻣﻨﻬﺎ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻹﺟﺮﺍﺀ‬
‫ﻭﻳﺴﺘﺨﺪﻡ ﻟﺘﻄﺒﻴﻖ ﺃﻭﺍﻣﺮ ‪ SQL‬ﻋﻠﻰ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ .‬ﻛﻌﻤﻠﻴﺎﺕ ﺇﻧﺸﺎﺀ‬
‫‪ExecuteDirect‬‬
‫ﺍﻟﺠﺪﺍﻭﻝ ﻭﺇﺩﺧﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫ﻭﻳﺴﺘﺨﺪﻡ ﻻﺳﺘﺮﺟﺎﻉ ﻗﺎﺋﻤﺔ ﺑﺄﺳﻤﺎﺀ ﺍﻟﺠﺪﺍﻭﻝ ﺍﻟﻤﻮﺟﻮﺩﺓ ﻓﻲ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫‪GetTableNames‬‬
‫ﺍﻟﻤﺤﺪﺩﺓ‬
‫ﻭﻳﺴﺘﺨﺪﻡ ﻻﺳﺘﺮﺟﺎﻉ ﻗﺎﺋﻤﺔ ﺑﺄﺳﻤﺎﺀ ﺍﻟﺤﻘﻮﻝ ﺍﻟﻤﻮﺟﻮﺩﺓ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ﺍﻟﻤﺤﺪﺩ‬ ‫‪GetFieldNames‬‬
‫ﻭﻳﺴﺘﺨﺪﻡ ﻹﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ‪) .‬ﻳﻌﻤﻞ ﻣﻊ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ‬
‫‪CreateDB‬‬
‫ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺳﻴﺮﻓﺮ(‬
‫ﻭﻳﺴﺘﺨﺪﻡ ﻟﺤﺬﻑ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﻣﻮﺟﻮﺩﺓ‪) .‬ﻳﻌﻤﻞ ﻣﻊ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ‬
‫‪DropDB‬‬
‫ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺳﻴﺮﻓﺮ(‬
‫ﻭﻳﺴﺘﺨﺪﻡ ﻟﻔﺘﺢ ﺍﻻﺗﺼﺎﻝ‬ ‫‪Open‬‬
‫ﻭﻳﺴﺘﺨﺪﻡ ﻹﻏﻼﻕ ﺍﻻﺗﺼﺎﻝ‬ ‫‪Close‬‬
‫ﻭﻳﺴﺘﺨﺪﻡ ﻟﺘﺤﺮﻳﺮ ﺍﻟﻤﻮﺍﺭﺩ ﺍﻟﻤﺴﺘﻌﻤﻠﺔ ﻣﻦ ﻗﺒﻞ ﺍﻟـ‪Connection‬‬ ‫‪Free‬‬

‫ﺻﻮﺭﺓ ﺃﻳﻘﻮﻧﺔ ﺍﻟﻜﻼﺱ ‪ Connection‬ﺍﻟﺨﺎﺹ ﺑﻘﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪ SQLite3‬ﻫﻲ‪:‬‬

‫ﺍﻟﺒﺮﻣﺠﺔ ﻓﻲ ﻓﺮﻱ ﺑﺎﺳﻜﺎﻝ – ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ ﻣﺴﻴﺮﺓ ﺑﺎﻷﺣﺪﺍﺙ‪ .‬ﺑﻤﻌﻨﻰ ﺃﻧﻪ ﻟﻦ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻟﻜﻮﺩ ﺇﻻ ﻋﻨﺪ‬
‫ﻭﻗﻮﻉ ﺣﺪﺙ ﻣﺎ‪ ،‬ﻛﻨﻘﺮ ﺯﺭ‪ ،‬ﺃﻭ ﺗﺤﻤﻴﻞ ‪ ،Form‬ﺃﻭ ﻋﻨﺪ ﺇﻏﻼﻗﻪ‪ ،‬ﺃﻭ ﻋﻨﺪ ﺍﻟﻨﻘﺮ ﺍﻟﻤﺰﺩﻭﺝ ﻋﻠﻰ ﻛﺎﺋﻦ ﻣﺎ‪ ،‬ﺃﻭ ﺍﻧﺘﻘﺎﻝ‬
‫ﺍﻟﺘﺮﻛﻴﺰ ‪ ،Focus‬ﺃﻭ ﻏﻴﺮ ﺫﻟﻚ‪.‬‬

‫ﺃﻧﺴﺐ ﺣﺪﺙ ﻟﺘﻌﻴﻴﻦ ﻗﻴﻢ ﺧﺼﺎﺋﺺ ﺍﻟـ‪ Connection‬ﻫﻮ ﺍﻟﺤﺪﺙ ‪ OnCreate‬ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﻮﺭﻡ ﺍﻟﺮﺋﻴﺴﻲ‬
‫ﻟﻠﺘﻄﺒﻴﻖ‪ .‬ﺑﻴﻨﻤﺎ ﻳﻜﻮﻥ ﺍﻟﺤﺪﺙ ‪ OnActivate‬ﻟﻨﻔﺲ ﺍﻟﻔﻮﺭﻡ ﻫﻮ ﺍﻟﺤﺪﺙ ﺍﻷﻧﺴﺐ ﻟﻠﺒﺪﺀ ﻓﻲ ﺍﻻﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬

‫ﺻﻔﺤﺔ ‪9‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ ‪[SQLDB -‬‬

‫ﻳﺠﺐ ﺍﻻﻧﺘﺒﺎﻩ ﺇﻟﻰ ﻧﻘﻄﺔ ﻣﻬﻤﺔ ﻓﻲ ﺣﺎﻟﺔ ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪:SQLite3‬‬

‫ﺇﺫﺍ ﻗﻤﻨﺎ ﺑﺘﺤﺪﻳﺪ ﺍﺳﻢ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻟﻠـ‪ ،Connection‬ﻭﻻ ﻳﻮﺟﺪ ﺍﻟﻤﻠﻒ ﻓﻌﻠﻴﺎً‪ ،‬ﺳﻴﺘﻢ ﺇﻧﺸﺎﺀ‬
‫ﻣﻠﻒ ﺟﺪﻳﺪ ﻟﻘﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﻓﺎﺭﻏﺔ )ﻻ ﺗﺤﺘﻮﻱ ﻋﻠﻰ ﺟﺪﺍﻭﻝ ﺃﻭ ﺑﻴﺎﻧﺎﺕ( ﺑﺎﻻﺳﻢ ﺍﻟﻤﻌﻄﻰ‪.‬‬

‫ﻭﻟﺬﻟﻚ‪ ،‬ﻳﺠﺐ ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻗﺒﻞ ﺍﻟﺒﺪﺀ ﻓﻲ ﺗﺸﻐﻴﻞ ﺍﻟﺘﻄﺒﻴﻖ ﻓﻌﻠﻴﺎً‪،‬‬
‫ﻭﺍﻟﻘﻴﺎﻡ ﺑﺎﻟﺨﻄﻮﺍﺕ ﺍﻟﻀﺮﻭﺭﻳﺔ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪﻡ ﻭﺟﻮﺩ ﺍﻟﻤﻠﻒ‪.‬‬

‫ﻗﻠﺖ ﻓﻲ ﻣﺎ ﺳﺒﻖ‪ ،‬ﺃﻧﻪ ﻋﻨﺪﻣﺎ ﻧﺘﻌﺎﻣﻞ ﻣﻊ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ ، SQLite3‬ﻓﺈﻧﻨﺎ ﻧﺤﺘﺎﺝ ﺇﻟﻰ ﻣﻜﺘﺒﺔ ﺧﺎﺻﺔ‪ ،‬ﺃﻗﺼﺪ‬
‫ﺗﺤﺪﻳﺪﺍً ﺍﻟﻤﻠﻒ )‪ (sqlite3.dll‬ﺍﻟﺬﻱ ﺳﺒﻖ ﻭﺃﻧﺰﻟﻨﺎﻩ ﻣﻦ ﺍﻟﻤﻮﻗﻊ ﺍﻟﺮﺳﻤﻲ ﻟـ‪. SQLite3‬‬

‫ﻭﻟﻜﻲ ﻧﺴﺘﻌﻤﻞ ﻫﺬﺍ ﺍﻟﻤﻠﻒ ﻓﻲ ﺍﻟﺘﻄﺒﻴﻖ‪ ،‬ﻧﺴﺘﺨﺪﻡ ﺍﻟﻜﻼﺱ ‪.TSQLDBLibraryLoader‬‬

‫ﺍﻟﻜﻼﺱ ‪TSQLDBLibraryLoader‬‬

‫ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﻫﻮ ﻣﻦ ﺿﻤﻦ ﻛﻼﺳﺎﺕ ﺍﻟﻮﺣﺪﺓ ‪ ،SQLDB‬ﻭﻭﻇﻴﻔﺘﻪ ﺗﺤﻤﻴﻞ ﺍﻟﻤﻜﺘﺒﺎﺕ )‪(dll,so,dylibs‬‬


‫ﻭﺗﻌﺮﻳﻔﻬﺎ ﻟﻠﺘﻄﺒﻴﻖ‪.‬‬

‫ﻳﺪﻋﻢ ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺨﺼﺎﺋﺺ ﻭﻫﻲ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬
‫ﻭﺗﻤﺜﻞ ﻧﻮﻉ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﻤﺮﻏﻮﺏ ﺍﻻﺗﺼﺎﻝ ﺑﻬﺎ‪ .‬ﻓﻲ ﺣﺎﻟﺘﻨﺎ ﺳﺘﻜﻮﻥ‬
‫‪ConnectionType‬‬
‫‪SQLite3‬‬
‫ﻭﺗﻤﺜﻞ ﻣﺴﺎﺭ ﻭﺍﺳﻢ ﺍﻟﻤﻜﺘﺒﺔ‪ ،‬ﻓﻲ ﺣﺎﻟﺘﻨﺎ ﺳﺘﻜﻮﻥ ‪sqlite3.dll‬‬ ‫‪LibraryName‬‬
‫ﺧﺎﺻﻴﺔ ﻣﻨﻄﻘﻴﺔ‪ True ،‬ﺗﻌﻨﻲ ﺃﻥ ﺍﻟﻜﻼﺱ ﻳﻌﻤﻞ‬ ‫‪Enabled‬‬
‫ﻭﻧﺴﺘﺨﺪﻣﻬﺎ ﻟﻠﺒﺪﺀ ﻓﻲ ﺗﺤﻤﻴﻞ ﺍﻟﻤﻜﺘﺒﺔ ﺇﻟﻰ ﺍﻟﺬﺍﻛﺮﺓ‬ ‫‪LoadLibrary‬‬

‫ﺃﻧﺴﺐ ﺣﺪﺙ ﻟﺘﺤﺪﻳﺪ ﻗﻴﻢ ﻫﺬﻩ ﺍﻟﺨﺼﺎﺋﺺ ﻫﻮ ﺍﻟﺤﺪﺙ ‪ OnCreate‬ﻟﻠﻔﻮﺭﻡ ﺍﻟﺮﺋﻴﺴﻲ ﻟﻠﺘﻄﺒﻴﻖ‪.‬‬

‫ﺻﻔﺤﺔ ‪10‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ ‪[SQLDB -‬‬

‫‪ – 2‬ﺍﻟﻜﻼﺱ ‪TSQLQuery‬‬

‫ﻫﻮ ﺑﻤﺜﺎﺑﺔ ﺻﻮﺭﺓ ﻣﻦ ﺍﻟﻔﺌﺔ ‪ ،Dataset‬ﻭﻧﺴﺘﻐﻠﻪ ﻹﺟﺮﺍﺀ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﻲ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪،‬‬
‫ﻛﺎﻟﺒﺤﺚ ﻭﺍﻻﺳﺘﺮﺟﺎﻉ ﻭﺍﻟﻌﺮﺽ‪ ،‬ﻭﺇﺿﺎﻓﺔ ﺳﺠﻼﺕ‪ ،‬ﻭﺗﻌﺪﻳﻠﻬﺎ‪ ،‬ﻭﺣﺬﻓﻬﺎ ﺑﻌﺪ ﺭﺑﻄﻪ ﺑﺎﻟﻜﻼﺱ ‪.Connection‬‬

‫ﻣﻦ ﺃﻫﻢ ﺧﺼﺎﺋﺺ ﻫﺬﺍ ﺍﻟﻜﻼﺱ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬
‫ﻭﻫﻲ ﺧﺎﺻﻴﺔ ﻧﺼﻴﺔ‪ ،‬ﻭﺗﻜﻮﻥ ﻣﺴﺎﻭﻳﺔ ﻻﺳﻢ ﺍﻟـ‪.Connection‬‬ ‫‪Database‬‬
‫ﻭﻫﻲ ﺍﻟﻤﻜﺎﻥ ﺍﻟﺬﻱ ﻧﻜﺘﺐ ﻓﻴﻪ ﺟﻤﻞ ‪ SQL‬ﻟﺘﻨﻔﻴﺬﻫﺎ ﻋﻠﻰ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬ ‫‪SQL.Text‬‬
‫ﻭﻧﺴﺘﺨﺪﻣﻬﺎ ﻟﺘﻌﻴﻴﻦ ﻗﻴﻢ ﺍﻟﺒﺎﺭﺍﻣﺘﺮﺍﺕ ﻓﻲ ﺟﻤﻠﺔ ‪ SQL‬ﺍﻟﻤﻄﻠﻮﺏ ﺗﻨﻔﻴﺬﻫﺎ‬
‫‪ParamByName‬‬
‫ﻓﻲ ‪SQL.Text‬‬

‫ﻛﻤﺎ ﻟﻠﻜﻼﺱ ‪ TSQLQuery‬ﺇﺟﺮﺍﺀﺍﺕ ﻣﻨﻬﺎ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻹﺟﺮﺍﺀ‬
‫ﻭﻧﺴﺘﺨﺪﻣﻪ ﻟﻠﺒﺪﺀ ﻓﻲ ﺗﻨﻔﻴﺬ ﺍﺳﺘﻌﻼﻣﺎﺕ ‪ SQL‬ﺍﻟﻤﺤﺪﺩﺓ‪ ،‬ﻭﺍﻟﺘﻲ ﺗﻜﻮﻥ‬
‫‪Open‬‬
‫ﻟﻐﺮﺽ ﺍﻟﺒﺤﺚ ﻭﺍﺳﺘﺮﺟﺎﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﻘﻂ‪.‬‬
‫ﻭﻧﺴﺘﺨﺪﻣﻪ ﻟﻠﺒﺪﺀ ﻓﻲ ﺗﻨﻔﻴﺬ ﺍﺳﺘﻌﻼﻣﺎﺕ ‪ SQL‬ﺍﻟﻤﺤﺪﺩﺓ‪ ،‬ﻭﺍﻟﺘﻲ ﺗﻜﻮﻥ‬
‫‪ExecSQL‬‬
‫ﺧﺎﺻﺔ ﺑﻌﻤﻠﻴﺎﺕ ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﻟﺤﺬﻑ‪.‬‬

‫ﺑﻌﺒﺎﺭﺓ ﺃﺧﺮﻯ‪ ،‬ﻧﺴﺘﺨﺪﻡ ﺍﻹﺟﺮﺍﺀ ‪ Open‬ﻓﻲ ﺣﺎﻟﺔ ﺟﻤﻠﺔ ‪ ،select‬ﻭﻧﺴﺘﺨﺪﻡ ﺍﻹﺟﺮﺍﺀ ‪ ExecSQL‬ﻓﻲ ﺣﺎﻻﺕ‬
‫‪ insert‬ﻭ‪ update‬ﻭ‪.delete‬‬

‫ﺻﻮﺭﺓ ﺃﻳﻘﻮﻧﺔ ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﻫﻲ ‪:‬‬

‫ﺍﻟﻜﻼﺱ ‪TDatasource‬‬

‫ﻓﻲ ﺣﺎﻟﺔ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻹﺟﺮﺍﺀ ‪ Open‬ﺃﻱ ﺃﻥ ﺍﻟﻌﻤﻠﻴﺔ ﻫﻲ ﻋﻤﻠﻴﺔ ﺑﺤﺚ ﻭﺍﺳﺘﺮﺟﺎﻉ ﻟﻠﺴﺠﻼﺕ‪ ،‬ﺳﺘﻜﻮﻥ ﻧﺘﻴﺠﺔ‬
‫ﺍﻻﺳﺘﻌﻼﻡ ﻫﻲ ‪ Dataset‬ﺗﺘﻜﻮﻥ ﻣﻦ ﺳﺠﻞ ﺃﻭ ﺃﻛﺜﺮ‪ ،‬ﺳﻨﺤﺘﺎﺝ ﺇﻟﻰ ﻛﺎﺋﻦ ﻳﺴﺘﻘﺒﻞ ﺍﻟـ‪ Dataset‬ﺍﻟﻤﺴﺘﺮﺟﻌﺔ‬
‫ﻭﻣﻦ ﺛﻢ ﻳﻤﻜﻨﻨﺎ ﺍﺳﺘﻐﻼﻟﻪ ﻟﻌﺮﺽ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﻤﺨﺰﻧﺔ ﻓﻲ ﺗﻠﻚ ﺍﻟـ‪.Dataset‬‬

‫ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﻫﻮ ‪ ،TDatasource‬ﻭﻫﻮ ﻻ ﻳﺘﺒﻊ ﺍﻟﻮﺣﺪﺓ ‪ ،SQLDB‬ﺑﻞ ﻳﺘﺒﻊ ﺍﻟﻮﺣﺪﺓ ‪.DB‬‬

‫ﺻﻔﺤﺔ ‪11‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ ‪[SQLDB -‬‬

‫ﻳﻤﻜﻨﻨﺎ ﻭﺿﻊ ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﻋﻠﻰ ﺍﻟﻔﻮﺭﻡ ‪ -‬ﻻﺳﺘﻌﻤﺎﻟﻪ ﺑﺮﻣﺠﻴﺎً ‪ -‬ﻣﻦ ﺧﻼﻝ ﻟﺴﺎﻥ ﺍﻟﺘﺒﻮﻳﺐ ‪ Data Access‬ﻓﻲ‬
‫ﻻﺯﺍﺭﻭﺱ‪ ،‬ﻭﻫﻮ ﻋﻨﺼﺮ ﻏﻴﺮ ﻣﺮﺋﻲ ﻭﻗﺖ ﺍﻟﺘﺸﻐﻴﻞ‪ .‬ﻳﺘﻢ ﺭﺑﻄﻪ ﺑﺎﻟﻜﻼﺱ ‪ TSQLQuery‬ﺑﻌﺪ ﺇﺟﺮﺍﺀ ﻋﻤﻠﻴﺔ‬
‫ﺍﻟﺒﺤﺚ ﻭﺍﻻﺳﺘﺮﺟﺎﻉ ﻣﻦ ﺧﻼﻝ ﺍﻟﺨﺎﺻﻴﺔ ‪ Dataset‬ﺍﻟﺘﺎﺑﻌﺔ ﻟﻪ‪.‬‬

‫ﻣﻦ ﺃﻫﻢ ﺧﺼﺎﺋﺺ ﻫﺬﺍ ﺍﻟﻜﻼﺱ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬
‫ﺗﺤﺪﺩ ﺍﻟـ ‪ TSQLQuery‬ﺍﻟﺬﻱ ﺗﺴﺘﺮﺟﻊ ﻣﻨﻪ ﺍﻟﺴﺠﻼﺕ‪ ،‬ﻭﺗﻜﻮﻥ ﻣﺴﺎﻭﻳﺔ‬
‫‪Dataset‬‬
‫ﻻﺳﻢ ﺍﻟـ‪TSQLQuery‬‬

‫ﺑﻌﺪ ﺫﻟﻚ ﻳﺘﻢ ﺭﺑﻂ ﺍﻟﻌﻨﺎﺻﺮ ﺍﻟﺘﻲ ﻧﺮﻏﺐ ﻓﻲ ﻋﺮﺽ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﻤﺴﺘﺮﺟﻌﺔ ﻋﻠﻴﻬﺎ ﻣﺜﻞ ﺻﻨﺎﺩﻳﻖ ﺍﻟﻨﺼﻮﺹ‬
‫‪ Edits‬ﻭ‪ Labels‬ﻭ‪ TDBGrids‬ﻭﻏﻴﺮﻫﺎ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﺨﺎﺻﻴﺔ ‪ Datasource‬ﺍﻟﺘﻲ ﺗﺘﺒﻌﻬﺎ‪.‬‬

‫ﺻﻮﺭﺓ ﺃﻳﻘﻮﻧﺔ ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﻫﻲ ‪:‬‬

‫‪ – 3‬ﺍﻟﻜﻼﺱ ‪TSQLTransaction‬‬

‫ﻭﻫﻮ ﺍﻟﻤﺴﺌﻮﻝ ﻋﻦ ﺗﻨﻔﻴﺬ ﺃﻭ ﺍﻟﺘﺮﺍﺟﻊ ﻋﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺘﻲ ﻳﻘﻮﻡ ﺑﻬﺎ ﺍﻟﻜﻼﺱ ‪. TSQLQuery‬‬

‫ﻣﻦ ﺃﻫﻢ ﺇﺟﺮﺍﺀﺍﺕ )ﺃﻭﺍﻣﺮ( ﻫﺬﺍ ﺍﻟﻜﻼﺱ‪:‬‬

‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻹﺟﺮﺍﺀ‬
‫ﻭﻳﻘﻮﻡ ﺑﺘﺄﻛﻴﺪ ﺍﻟﻌﻤﻠﻴﺔ ﺍﻟﺘﻲ ﻗﺎﻡ ﺑﻬﺎ ﺍﻟﻜﻼﺱ ‪.TSQLQuery‬‬ ‫‪Commit‬‬
‫ﻭﻳﻘﻮﻡ ﺑﺎﻟﺘﺮﺍﺟﻊ ﻋﻦ ﺍﻟﻌﻤﻠﻴﺔ ﺍﻷﺧﻴﺮﺓ‪.‬‬ ‫‪RollBack‬‬
‫ﻭﻳﻘﻮﻡ ﺑﺎﻟﺘﻤﻬﻴﺪ ﻟﻠﻌﻤﻠﻴﺔ ﺍﻟﺠﺪﻳﺪﺓ‪.‬‬ ‫‪StartTransaction‬‬
‫ﻭﻳﻘﻮﻡ ﺑﺈﻧﻬﺎﺀ ﺍﻟﻌﻤﻠﻴﺔ ﺍﻟﺠﺪﻳﺪﺓ‪.‬‬ ‫‪EndTransaction‬‬

‫ﻳﺘﻢ ﺭﺑﻂ ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﺑﺎﻟﻜﻼﺱ ‪ TSQLConnection‬ﻣﻦ ﺧﻼﻝ ﺍﻟﺨﺎﺻﻴﺔ ‪ Transaction‬ﺍﻟﺘﻲ ﺗﺘﺒﻊ ﺍﻷﺧﻴﺮ‪.‬‬

‫ﺻﻮﺭﺓ ﺃﻳﻘﻮﻧﺔ ﻫﺬﺍ ﺍﻟﻜﻼﺱ ﻫﻲ ‪:‬‬

‫ﻭﺧﻼﺻﺔ ﺍﻟﻘﻮﻝ‪ ،‬ﺃﻥ ﺃﻱ ﻋﻤﻠﻴﺔ ﺇﺿﺎﻓﺔ ﺃﻭ ﺗﻌﺪﻳﻞ ﺃﻭ ﺣﺬﻑ ﻟﻦ ﺗﺘﻢ ﻓﻌﻠﻴﺎً ﺇﻻ ﻣﻦ ﺧﻼﻝ ﻫﺬﺍ ﺍﻟﻜﻼﺱ‪.‬‬

‫ﺻﻔﺤﺔ ‪12‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻨﻈﺮﻱ ‪[SQLDB -‬‬

‫ﺍﻟﺨﻼﺻﺔ‬

‫ﻟﻜﻲ ﻧﺴﺘﻄﻴﻊ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLite3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ ﻧﺴﺘﺨﺪﻡ ﺍﻟﻜﻼﺳﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﺍﻟﻜﻼﺱ ‪ TSQLDBLibraryLoader‬ﻟﺘﺤﻤﻴﻞ ﻣﻜﺘﺒﺔ ‪.sqlite3.dll‬‬ ‫‪‬‬


‫ﺍﻟﻜﻼﺱ ‪ TSQLConnection‬ﻟﻼﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺃﻭ ﺇﻧﺸﺎﺋﻬﺎ‪.‬‬ ‫‪‬‬
‫ﺍﻟﻜﻼﺱ ‪ TSQLQuery‬ﻹﺟﺮﺍﺀ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬ ‫‪‬‬
‫ﺍﻟﻜﻼﺱ ‪ TSQLTransaction‬ﻹﺗﻤﺎﻡ ﺃﻭ ﺍﻟﺘﺮﺍﺟﻊ ﻋﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ‪.‬‬ ‫‪‬‬
‫ﺍﻟﻜﻼﺱ ‪ TDatasource‬ﻻﺳﺘﻘﺒﺎﻝ ﺍﻟﺴﺠﻼﺕ ﺍﻟﻤﺴﺘﺮﺟﻌﺔ ﻭﺗﻮﺯﻳﻌﻬﺎ ﻋﻠﻰ ﻋﻨﺎﺻﺮ ﺍﻟﻌﺮﺽ ‪.‬‬ ‫‪‬‬

‫ﺻﻔﺤﺔ ‪13‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺍﻟﺒﺎﺏ ﺍﻟﺜﺎﻧﻲ‬

‫ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ‬

‫ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻓﻜﺮﺓ ﻋﺎﻣﺔ‬
‫ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ ﻫﻮ ﺑﺮﻧﺎﻣﺞ ﺑﺴﻴﻂ‪ ،‬ﻳﻤﻜﻦ ﻟﻤﺴﺘﺨﺪﻣﻪ ﺗﺴﺠﻴﻞ ﺑﻴﺎﻧﺎﺕ ﺍﻷﺷﺨﺎﺹ ﻭﺍﻟﺠﻬﺎﺕ‬
‫ﺍﻟﺘﻲ ﻳﺘﺼﻞ ﺑﻬﺎ‪ ،‬ﻭﺗﻌﺪﻳﻠﻬﺎ ﻭﺣﺬﻓﻬﺎ‪ ،‬ﻭﺣﺘﻰ ﺇﻇﻬﺎﺭ ﺗﻘﺮﻳﺮ ﻭﺳﺤﺒﻪ ﻋﻠﻰ ﺍﻟﻮﺭﻕ‪.‬‬

‫ﺃﻱ ﺃﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﺳﻴﺴﺠﻠﻬﺎ ﺍﻟﻤﺴﺘﺨﺪﻡ ﻫﻲ‪:‬‬

‫ﺍﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‬ ‫‪‬‬


‫ﺃﺭﻗﺎﻡ ﺍﻟﻬﻮﺍﺗﻒ‬ ‫‪‬‬
‫ﺍﻟﺒﺮﻳﺪ ﺍﻹﻟﻜﺘﺮﻭﻧﻲ‬ ‫‪‬‬

‫ﺇﺫﻥ‪ ،‬ﺳﻨﺼﻤﻢ ﺟﺪﻭﻻً ﻟﺘﺨﺰﻳﻦ ﻫﺬﻩ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻭﺳﻴﻜﻮﻥ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪Contacts‬‬
‫ﺍﻟﻨﻮﻉ‬ ‫ﺍﻟﻮﺻﻒ‬ ‫ﺍﻟﺤﻘﻞ‬
‫‪INTEGER‬‬ ‫ﻳﻤﺜﻞ ﺍﻟﺮﻗﻢ ﺍﻟﺘﺴﻠﺴﻠﻲ ﻟﻠﺴﺠﻞ‬ ‫‪Id‬‬
‫‪STRING‬‬ ‫ﻳﻤﺜﻞ ﺍﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‬ ‫‪contactName‬‬
‫‪STRING‬‬ ‫ﻳﻤﺜﻞ ﺃﺭﻗﺎﻡ ﺍﻟﻬﻮﺍﺗﻒ‬ ‫‪phoneNumbers‬‬
‫‪STRING‬‬ ‫ﻳﻤﺜﻞ ﺍﻟﺒﺮﻳﺪ ﺍﻹﻟﻜﺘﺮﻭﻧﻲ‬ ‫‪emailAddress‬‬

‫ﺗﻨﻮﻳﻪ‬
‫ﺃﺣﺐ ﺃﻥ ﺃﺷﻴﺮ ﺇﻟﻰ ﺃﻥ ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪ SQLite3‬ﻻ ﺗﺪﻋﻢ ﺧﺎﺻﻴﺔ ﺍﻟﺰﻳﺎﺩﺓ ﺍﻟﺘﻠﻘﺎﺋﻴﺔ ﻓﻲ ﺣﻘﻮﻝ ‪ ،ID‬ﻭﻟﺬﺍ‬
‫ﺳﻨﻌﻤﻞ ﺣﺮﻛﺔ ﺍﻟﺘﻔﺎﻑ ﻋﻠﻴﻬﺎ ﻋﻦ ﻃﺮﻳﻖ ﺇﻧﺸﺎﺀ ﺟﺪﻭﻝ ﺧﺎﺹ )ﺑﺎﻟﻌﺪﺍﺩﺍﺕ( ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪Counters‬‬
‫ﺍﻟﻨﻮﻉ‬ ‫ﺍﻟﻮﺻﻒ‬ ‫ﺍﻟﺤﻘﻞ‬
‫‪INTEGER‬‬ ‫ﻳﻤﺜﻞ ﺍﻟﺮﻗﻢ ﺍﻟﺘﺴﻠﺴﻠﻲ ﻟﻠﺴﺠﻞ‪ ،‬ﻭﺳﻴﻜﻮﻥ ﺩﺍﺋﻤﺎً = ‪1‬‬ ‫‪Id‬‬
‫‪INTEGER‬‬ ‫ﺳﻴﻤﺜﻞ ﻋﺪﺍﺩ ﺍﻟـ‪ ID‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﺠﺪﻭﻝ ‪Contacts‬‬ ‫‪contactid‬‬

‫ﺻﻔﺤﺔ ‪15‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻣﺎ ﻳﻌﻨﻲ ﺃﻧﻪ ﻋﻨﺪ ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ ‪ Counters‬ﺑﺮﻣﺠﻴﺎً‪ ،‬ﻳﺘﻮﺟﺐ ﻋﻠﻴﻨﺎ ﺇﺩﺭﺍﺝ ﺳﺠﻞ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪Counters‬‬
‫ﺍﻟﻘﻴﻤﺔ‬ ‫ﺍﻟﺤﻘﻞ‬
‫‪1‬‬ ‫‪Id‬‬
‫‪0‬‬ ‫‪contactid‬‬

‫ﻳﻌﻨﻲ‪:‬‬

‫ﻧﻌﻄﻲ ﺃﻣﺮ ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ ‪ Counters‬ﻭﺣﻘﻮﻟﻪ ‪.‬‬ ‫‪‬‬


‫ﻧﺪﺭﺝ ﺳﺠﻼً ﺟﺪﻳﺪﺍً‪.‬‬ ‫‪‬‬

‫ﻭﻻﺣﻘﺎً‪ ،‬ﻋﻨﺪ ﺇﺩﺭﺍﺝ ﺳﺠﻞ ﺟﺪﻳﺪ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ ، Counters‬ﻧﻘﻮﻡ ﺑﺎﻵﺗﻲ‪:‬‬

‫‪ . 1‬ﻧﺒﺤﺚ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ Counters‬ﻋﻦ ﻗﻴﻤﺔ ﺍﻟﺤﻘﻞ ‪ ، contactid‬ﻭﻧﺨﺰﻧﻬﺎ ﻓﻲ ﻣﺘﻐﻴﺮ ﻭﻟﻴﻜﻦ ﺍﺳﻤﻪ‬


‫‪.LastID‬‬
‫‪ . 2‬ﻧﻀﻴﻒ ﺇﻟﻴﻪ )‪ ،(1‬ﻳﻌﻨﻲ ;‪.LastID := LastID + 1‬‬
‫‪ .3‬ﻧﻘﻮﻡ ﺑﺘﻌﺪﻳﻞ ﺍﻟﺤﻘﻞ ‪ contactid‬ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ Counters‬ﺑﺤﻴﺚ ﻳﺄﺧﺬ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺠﺪﻳﺪﺓ‪.‬‬
‫‪ . 4‬ﺍﻵﻥ ﻧﺴﺘﺨﺪﻡ ﺍﻟﻤﺘﻐﻴﺮ ‪ LastID‬ﻟﻨﺨﺰﻧﻪ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ Contacts‬ﻓﻲ ﺍﻟﺤﻘﻞ ‪.ID‬‬
‫‪ . 5‬ﻧﺨﺰﻥ ﺑﺎﻗﻲ ﺍﻟﺤﻘﻮﻝ ﻓﻲ ﻧﻔﺲ ﺍﻟﺼﻒ ‪.‬‬

‫ﻭﻳﻨﻄﺒﻖ ﻣﺎ ﻗﻴﻞ ﻫﻨﺎ ﻋﻠﻰ ﺇﺿﺎﻓﺔ ﺳﺠﻞ ﺟﺪﻳﺪ ﻷﻱ ﺟﺪﻭﻝ ﺁﺧﺮ‪.‬‬

‫ﺭﺑﻤﺎ ﻳﻜﻮﻥ ﺍﻟﻜﻼﻡ ﻣﺒﻬﻤﺎً ﺍﻵﻥ‪ ،‬ﻭﻟﻜﻦ ﺳﻨﻔﻬﻤﻪ ﻋﻨﺪ ﺍﻟﺘﻄﺒﻴﻖ ﺍﻟﻌﻤﻠﻲ ﺇﻥ ﺷﺎﺀ ﺍﷲ‪.‬‬

‫ﺻﻔﺤﺔ ‪16‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺧﻄﺔ ﺍﻟﻌﻤﻞ‬
‫ﺇﻧﺸﺎﺀ ﻭﺍﺟﻬﺔ ﺍﻟﻤﺴﺘﺨﺪﻡ‪.‬‬ ‫‪‬‬
‫ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪:‬‬ ‫‪‬‬
‫‪ o‬ﻓﻲ ﺣﺎﻟﺔ ﻋﺪﻡ ﻭﺟﻮﺩﻩ‪:‬‬
‫ﺑﺮﻣﺠﺔ ﺇﺟﺮﺍﺀ ﺇﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬ ‫‪‬‬
‫‪ o‬ﻓﻲ ﺣﺎﻟﺔ ﻭﺟﻮﺩﻩ‪:‬‬
‫ﺍﻻﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬ ‫‪‬‬
‫ﺇﺿﺎﻓﺔ ﺍﻟﺴﺠﻼﺕ‪.‬‬ ‫‪‬‬
‫ﺍﻟﺒﺤﺚ ﻋﻦ ﺍﻟﺴﺠﻼﺕ‪.‬‬ ‫‪‬‬
‫ﺗﻌﺪﻳﻞ ‪ /‬ﺣﺬﻑ ﺍﻟﺴﺠﻼﺕ‪.‬‬ ‫‪‬‬
‫ﺇﻧﺸﺎﺀ ﺍﻟﺘﻘﺮﻳﺮ ‪.‬‬ ‫‪‬‬

‫ﺇﻟﻰ ﺍﻟﻌﻤﻞ ‪...‬‬

‫ﺻﻔﺤﺔ ‪17‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

User Interface ‫ﺇﻧﺸﺎﺀ ﻭﺍﺟﻬﺔ ﺍﻟﻤﺴﺘﺨﺪﻡ‬


.‫ﻧﻔﺘﺢ ﻣﺸﺮﻭﻋﺎً ﺟﺪﻳﺪﺍً ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬ 
.frmMainUnit ‫ ﻭﺍﻟﻮﺣﺪﺓ ﺍﻟﺨﺎﺻﺔ ﺑﻪ ﺑﺎﺳﻢ‬،frmMain :‫ﻧﺴﻤﻲ ﺍﻟﻨﺎﻓﺬﺓ ﺍﻷﻭﻟﻰ ﺑﺎﻻﺳﻢ‬ 
:‫ﻧﻌﺪﻝ ﺧﺼﺎﺋﺺ ﺍﻟﻨﺎﻓﺬﺓ ﻛﻤﺎ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ﺍﻟﺘﺎﻟﻲ‬ 

‫ﺍﻟﻘﻴﻤﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬
bdRightToLeft BiDiMode
False BorderIcons -> biMaximize
bsSingle BorderStyle
‫ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬ Caption
poScreenCenter Position

.‫ ﻓﻲ ﻣﺠﻠﺪ ﺧﺎﺹ ﻋﻠﻰ ﺳﻄﺢ ﺍﻟﻤﻜﺘﺐ‬Contacts ‫ﻧﺨﺰﻥ ﺍﻟﻤﺸﺮﻭﻉ ﺑﺎﺳﻢ‬ 


:‫ ﻭﻧﻌﺪﻝ ﺍﻟﺨﺼﺎﺋﺺ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‬،frmMain ‫ﻧﻀﻊ ﺍﻟﻌﻨﺎﺻﺮ ﺍﻟﺘﺎﻟﻴﺔ ﻋﻠﻰ ﺍﻟﻨﺎﻓﺬﺓ‬ 

‫ﺍﻟﻘﻴﻤﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬ ‫ﺍﻟﻌﻨﺼﺮ‬


bdRightToLeft BiDiMode
Options->
False
dgAlwaysShowSelection
TDBGrid
True Options-> dgRowSelect
ssVertical ScrollBars
dgvContacts Name
btnNew Name
TButton
‫ﺟﺪﻳﺪ‬ Caption
btnEdit Name
‫ﺗﻌﺪﻳﻞ‬ Caption TButton
False Enabled
btnShowReport Name
TButton
‫ﻋﺮﺽ ﺗﻘﺮﻳﺮ‬ Caption
btnClose Name
TButton
‫ﺇﻏﻼﻕ‬ Caption
btnRefresh Name TButton

18 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

‫ﺗﺤﺪﻳﺚ‬ Caption
txtSearchInNames Name TEdit
txtSearchInNumbers Name TEdit
pnlSelectedContact Name TPanel
LibLoader Name TSQLDBLibraryLoader
conn Name TSQLite3Connection
Trans Name TSQLTransaction
UpdateQuery Name TSQLQuery
UpdateDataSource Name UpdateDataSource
theReport Name TfrReport
repDataSet Name TfrDBDataSet

:‫ﻭﻧﻨﺴﻘﻬﺎ ﺣﺘﻰ ﻳﺼﻴﺮ ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﻛﻤﺎ ﻓﻲ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‬

19 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫‪ -1‬ﺗﻤﻬﻴﺪ‬

‫ﻫﻞ ﺗﺘﺬﻛﺮ – ﻋﺰﻳﺰﻱ – ﻣﻠﻒ ‪ sqlite3.dll‬ﺍﻟﺬﻱ ﺃﻧﺰﻟﻨﺎﻩ ﻣﻦ ﻣﻮﻗﻊ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪SQLite3‬؟ ﻓﻘﺪ ﺣﺎﻥ ﻭﻗﺖ‬
‫ﺗﺤﻤﻴﻠﻪ ﻭﺭﺑﻄﻪ ﺑﺎﻟﺘﻄﺒﻴﻖ‪.‬‬

‫ﻓﻲ ﺍﻟﺒﺪﺍﻳﺔ‪ ،‬ﻧﻨﺴﺦ ﺫﻟﻚ ﺍﻟﻤﻠﻒ ﻭﻧ ﻀﻌﻪ ﻓﻲ ﻣﺠﻠﺪ ﺍﻟﻤﺸﺮﻭﻉ‪.‬‬ ‫‪‬‬


‫ﻧﻌﻮﺩ ﺇﻟﻰ ﻻﺯﺍﺭﻭﺱ‪ ،‬ﻧﺨﺘﺎﺭ ﺍﻟﻔﻮﺭﻡ ‪ ،frmMain‬ﻭﻧﺬﻫﺐ ﺇﻟﻰ ﻧﺎﻓﺬﺓ ﺍﻟﺨﺼﺎﺋﺺ‪.‬‬ ‫‪‬‬
‫ﻓﻲ ﺍﻟﺘﺒﻮﻳﺐ ‪ Events‬ﻧﻨﻘﺮ ﻋﻠﻰ ﺍﻟﺤﺪﺙ ‪ OnCreate‬ﻧﻘﺮﺗﻴﻦ ﺳﺮﻳﻌﺘﻴﻦ ﻓﻴﺘﻢ ﺇﻇﻬﺎﺭ ﻛﻮﺩ ﺍﻟﺤﺪﺙ‬ ‫‪‬‬
‫‪ Create‬ﻟﻠﻔﻮﺭﻡ ‪ frmMain‬ﻛﻤﺎ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫;)‪procedure TfrmMain.FormCreate(Sender: TObject‬‬


‫‪begin‬‬

‫;‪end‬‬
‫ﻧﻜﺘﺐ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ ﺑﻴﻦ ‪ Begin‬ﻭ‪:End‬‬

‫;'‪LibLoader.ConnectionType:='SQLite3‬‬
‫;'‪LibLoader.LibraryName:='sqlite3.dll‬‬
‫;‪LibLoader.Enabled:=True‬‬

‫ﻓﻴﺼﻴﺮ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫;)‪procedure TfrmMain.FormCreate(Sender: TObject‬‬


‫‪begin‬‬
‫;'‪LibLoader.ConnectionType:='SQLite3‬‬
‫;'‪LibLoader.LibraryName:='sqlite3.dll‬‬
‫;‪LibLoader.Enabled:=True‬‬
‫;‪end‬‬

‫ﻭﻓﻲ ﻫﺬﺍ ﺍﻟﻜﻮﺩ ‪:‬‬

‫ﺗﻢ ﺿﺒﻂ ﺍﻟﺨﺎﺻﻴﺔ ‪ ConnectionType‬ﻟﻠـ‪ LibLoader‬ﺑﺤﻴﺚ ﺧﺼﺼﻨﺎﻫﺎ ﻟﻠـ‪ ،SQLite3‬ﻳﻌﻨﻲ‬ ‫‪‬‬


‫ﺣﺪﺩﻧﺎ ﻧﻮﻉ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﻧﺮﻳﺪ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﻓﻲ ﺑﺮﻧﺎﻣﺠﻨﺎ‪.‬‬
‫ﺗﻢ ﺿﺒﻂ ﺍﻟﺨﺎﺻﻴﺔ ‪ LibraryName‬ﺑﺎﺳﻢ ﻭﻣﺴﺎﺭ ﻣﻠﻒ ﻣﺤﺮﻙ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻫﻮ ﺍﻟﻤﻠﻒ‬ ‫‪‬‬
‫‪.sqlite3.dll‬‬
‫ﺗﻢ ﺗﻔﻌﻴﻞ ﺍﻟـ‪ LibLoader‬ﻭﺍﻟﺒﺪﺀ ﻓﻲ ﺗﺤﻤﻴﻞ ﺍﻟﻤﻜﺘﺒﺔ ﻣﻦ ﺧﻼﻝ ﺍﻟﺨﺎﺻﻴﺔ ‪.Enabled‬‬ ‫‪‬‬

‫ﺻﻔﺤﺔ ‪20‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫‪ -2‬ﺍﻟﻮﺣﺪﺓ ﺍﻟﺨﺎﺻﺔ ﺑﺈﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫ﻗﻠﺖُ ﻗﺒﻞ ﻗﻠﻴﻞ ﺃﻧﻪ ﻋﻨﺪﻣﺎ ﻻ ﻧﺠﺪ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻳﺘﻮﺟﺐ ﻋﻠﻴﻨﺎ ﺍﻟﻘﻴﺎﻡ ﺑﺈﺟﺮﺍﺀ ﺇﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫ﻭﺟﺪﺍﻭﻟﻬﺎ‪ ،‬ﻭﺑﺎﻟﺘﺎﻟﻲ ﺳﻨﻜﺘﺐ ﺍﻟﻜﻮﺩ ﺍﻟﺨﺎﺹ ﺑﺬﻟﻚ ﻭﻧﺨﺰﻧﻪ ﻓﻲ ﻭﺣﺪﺓ ﺧﺎﺻﺔ‪ ،‬ﺛﻢ ﻧﺴﺘﺪﻋﻲ ﺇﺟﺮﺍﺀ ﺇﻧﺸﺎﺀ‬
‫ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﻲ ﺍﻟﻮﻗﺖ ﻭﺍﻟﻤﻜﺎﻥ ﺍﻟﻤﻨﺎﺳﺒﻴﻦ‪.‬‬

‫ﻓﻲ ﺍﻟﻘﺎﺋﻤﺔ ‪ File‬ﻓﻲ ﺑﻴﺌﺔ ﻻﺯﺍﺭﻭﺱ ﻧﺨﺘﺎﺭ ‪.New Unit‬‬ ‫‪‬‬


‫ﻳﻔﺘﺢ ﻣﺤﺮﺭ ﺍﻟﻜﻮﺩ ﻭﺣﺪﺓ ﺑﺮﻣﺠﻴﺔ ﺟﺪﻳﺪﺓ ﺑﺎﺳﻢ ‪ Unit1‬ﻛﻤﺎ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬ ‫‪‬‬

‫;‪unit Unit1‬‬

‫}‪{$mode objfpc}{$H+‬‬

‫‪interface‬‬

‫‪uses‬‬
‫;‪Classes, SysUtils‬‬

‫‪implementation‬‬

‫‪end.‬‬

‫ﻧﺨﺰﻥ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ ﻓﻲ ﻣﺠﻠﺪ ﺍﻟﻤﺸﺮﻭﻉ ﺑﺎﺳﻢ‪.DataBaseWorks :‬‬ ‫‪‬‬


‫ﺗﺤﺖ ﺍﻟﻘﺴﻢ ‪ implementation‬ﻧﻜﺘﺐ‪:‬‬ ‫‪‬‬

‫;‪Uses frmMainUnit‬‬

‫ﻭﻫﺬﺍ ﺍﻟﺴﻄﺮ ﻫﻮ ﻟﻠﺮﺑﻂ ﺑﻴﻦ ﺍﻟﻮﺣﺪﺓ ‪ DataBaseWorks‬ﻭﺍﻟﻮﺣﺪﺓ ‪ frmMainUnit‬ﺑﺎﺗﺠﺎﻩ ﻭﺍﺣﺪ‪ ،‬ﺑﺤﻴﺚ‬


‫ﻳﻤﻜﻦ ﻓﻲ ﺍﻟﻮﺣﺪﺓ ‪ DataBaseWorks‬ﺍﻻﺳﺘﻔﺎﺩﺓ ﻣﻦ ﺍﻟﻌﻨﺎﺻﺮ ﺍﻟﻤﻮﺟﻮﺩﺓ ﻋﻠﻰ ﺍﻟﻔﻮﺭﻡ ‪،frmUnit‬‬
‫ﻭﺳﻨﺴﺘﻐﻞ ﻫﺬﻩ ﺍﻟﻌﻼﻗﺔ ﻓﻲ ﺇﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺟﺪﺍﻭﻟﻬﺎ ﻣﻦ ﺧﻼﻝ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻛﻞ ﻣﻦ‪:‬‬

‫ﻣﻜﻮﻥ ﺍﻻﺗﺼﺎﻝ ‪.Conn‬‬ ‫‪‬‬


‫ﺍﻟﻤﻜﻮﻥ ‪.Trans‬‬ ‫‪‬‬

‫ﻭﺫﻟﻚ ﻣﻦ ﺧﻼﻝ ﺇﺟﺮﺍﺀ ‪ procedure‬ﺳﻨﻜﺘﺒﻪ ﺍﻵﻥ ﻓﻲ ﺍﻟﻮﺣﺪﺓ ‪ DataBaseWorks‬ﺑﺎﺳﻢ‬


‫‪ CreateDataBase‬ﺑﺎﻟﻄﺮﻳﻘﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﺻﻔﺤﺔ ‪21‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺗﺤﺖ ﺍﻟﺴﻄﺮ ‪ uses frmMainUnit‬ﻧﻨﺰﻝ ﻗﻠﻴﻼً )ﻗﺒﻞ ﺍﻟﺴﻄﺮ ‪ (End‬ﻭﻧﻜﺘﺐ‪:‬‬ ‫‪‬‬

‫;‪procedure CreateDataBase‬‬
‫‪begin‬‬

‫;‪end‬‬

‫ﺍﻵﻥ‪ ،‬ﻧﻌﺮﻑ ﻣﺘﻐﻴﺮﺍً ﻳﻌﻤﻞ ﻓﻲ ﻧﻄﺎﻕ ﻫﺬﺍ ﺍﻹﺟﺮﺍﺀ ﺑﺎﺳﻢ ‪ QueryString‬ﻭﺑﺎﻟﻨﻮﻉ ‪ ،String‬ﻗﺒﻞ‬ ‫‪‬‬
‫ﻛﻠﻤﺔ ‪ Begin‬ﻭﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﻟﻲ‪:‬‬

‫;‪procedure CreateDataBase‬‬
‫‪var‬‬
‫;‪QueryString: String‬‬
‫‪begin‬‬

‫;‪end‬‬

‫ﺍﻵﻥ‪ ،‬ﺳﻨﻘﻮﻡ ﺑﻀﺒﻂ ﺑﻌﺾ ﺍﻟﺨﺼﺎﺋﺺ ﺍﻟﻤﺘﻌﻠﻘﺔ ﺑﻜﺎﺋﻦ ﺍﻻﺗﺼﺎﻝ ‪ Conn‬ﺍﻟﺘﺎﺑﻊ ﺑﺪﻭﺭﻩ ﻟﻠﻔﻮﺭﻡ‬ ‫‪‬‬
‫‪ frmMain‬ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫;‪procedure CreateDataBase‬‬
‫‪var‬‬
‫;‪QueryString: String‬‬
‫‪begin‬‬
‫;'‪frmMain.conn.DatabaseName:='Contacts.db‬‬
‫;‪frmMain.conn.Transaction:=frmMain.Trans‬‬
‫;‪frmMain.conn.Open‬‬
‫;‪end‬‬

‫ﻭﻓﻲ ﻫﺬﺍ ﺍﻟﻜﻮﺩ ‪:‬‬

‫ﺗﻢ ﺿﺒﻂ ﻗﻴﻤﺔ ﺍﻟﺨﺎﺻﻴﺔ ‪ DatabaseName‬ﻟﻠـ‪ Conn‬ﺑﺎﺳﻢ ﻭﺍﻣﺘﺪﺍﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪،‬‬ ‫‪‬‬
‫ﻭﻋﻨﺪ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻟﺴﻄﺮ ﺳﻴﺘﻢ ﺇﻧﺸﺎﺀ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ Contacts.db‬ﻓﻲ ﻧﻔﺲ ﻣﺠﻠﺪ‬
‫ﺍﻟﺒﺮﻧﺎﻣﺞ‪ ،‬ﻭﻻ ﻳﺤﺘﻮﻱ ﻋﻠﻰ ﺃﻳﺔ ﺟﺪﺍﻭﻝ‪.‬‬
‫ﺗﻢ ﺿﺒﻂ ﻣﺪﻳﺮ ﺍﻟﻌﻤﻠﻴﺎﺕ ‪ Trans‬ﻟﻠﺨﺎﺻﻴﺔ ‪ Transaction‬ﺍﻟﺘﺎﺑﻌﺔ ﻟﻠـ‪ ،Conn‬ﻭﻫﻮ ﻣﻬﻢ ﻭﻻ‬ ‫‪‬‬
‫ﻳﻤﻜﻦ ﺗﻄﺒﻴﻖ ﺃﻭﺍﻣﺮ ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﺍﻭﻝ ﺇﻻ ﻣﻦ ﺧﻼﻝ ﻣﺪﻳﺮ ﺍﻟﻌﻤﻠﻴﺎﺕ ‪.Trans‬‬
‫ﺗﻢ ﻓﺘﺢ ﺍﺗﺼﺎﻝ ﺑﻤﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ Open‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Conn‬‬ ‫‪‬‬

‫ﺻﻔﺤﺔ ‪22‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

‫ﺍﻵﻥ ﻧﻌﻮﺩ ﺇﻟﻰ ﻣﺎ ﺗﺤﺖ ﺍﻟﺴﻄﺮ‬

Classes, SysUtils;
:‫ ﻧﻨﺰﻝ ﻗﻠﻴﻼً ﺛﻢ ﻧﻨﺴﺦ ﺍﻟﺴﻄﺮ‬،DataBaseWorks ‫ﻓﻲ ﺍﻟﻮﺣﺪﺓ‬

procedure CreateDataBase;
:‫ﻭﻧﻠﺼﻘﻪ ﺗﺤﺘﻬﺎ ﻓﻴﺼﻴﺮ ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ‬

unit DataBaseWorks;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils;

procedure CreateDataBase;

implementation
Uses frmMainUnit;

procedure CreateDataBase;
var
QueryString: String;
begin
frmMain.conn.DatabaseName:='Contacts.db';
frmMain.conn.Transaction:=frmMain.Trans;
frmMain.conn.Open;
end;

end.

...‫ ﻧﺒﺪﺃ ﻋﻠﻰ ﺑﺮﻛﺔ ﺍﷲ‬...‫ ﻧﺸﺮﻉ ﻓﻲ ﻛﺘﺎﺑﺔ ﺃﻭﺍﻣﺮ ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﺍﻭﻝ‬،‫ﻭﺍﻵﻥ‬

23 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ ‪Counters‬‬

‫ﻗﻠﺖُ ﺑﺄﻥ ﺟﺪﻭﻝ ﺍﻟﻌﺪﺍﺩﺍﺕ ﻳﺘﻜﻮﻥ ﻣﻦ ﺍﻟﺤﻘﻮﻝ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪Counters‬‬
‫ﺍﻟﻨﻮﻉ‬ ‫ﺍﻟﻮﺻﻒ‬ ‫ﺍﻟﺤﻘﻞ‬
‫‪INTEGER‬‬ ‫ﻳﻤﺜﻞ ﺍﻟﺮﻗﻢ ﺍﻟﺘﺴﻠﺴﻠﻲ ﻟﻠﺴﺠﻞ‪ ،‬ﻭﺳﻴﻜﻮﻥ ﺩﺍﺋﻤﺎً = ‪1‬‬ ‫‪Id‬‬
‫‪INTEGER‬‬ ‫ﺳﻴﻤﺜﻞ ﻋﺪﺍﺩ ﺍﻟـ‪ ID‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﺠﺪﻭﻝ ‪Contacts‬‬ ‫‪contactid‬‬

‫ﺗﺤﺖ ﺁﺧﺮ ﺳﻄﺮ ﻛﺘﺒﻨﺎﻩ ﻓﻲ ﺍﻹﺟﺮﺍﺀ ‪ CreateDataBase‬ﻧﻜﺘﺐ‪:‬‬

‫‪QueryString:='CREATE TABLE IF NOT EXISTS Counters('+‬‬


‫‪'id INTEGER, ' +‬‬
‫;')‪'contactID INTEGER‬‬

‫;‪frmMain.Trans.StartTransaction‬‬

‫;)‪frmMain.conn.ExecuteDirect(QueryString‬‬

‫;‪frmMain.Trans.Commit‬‬

‫ﻭﻓﻲ ﺍﻟﻜﻮﺩ ﺍﻷﺧﻴﺮ‪:‬‬

‫ﺗﻢ ﻛﺘﺎﺑﺔ ﺟﻤﻠﺔ ‪ SQL‬ﻹﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ ‪ Counters‬ﻭﺣﻘﻮﻟﻪ ‪ ،‬ﻭﻣﻦ ﺛﻢ ﻭﺿﻌﻬﺎ ﻓﻲ ﺍﻟﻤﺘﻐﻴﺮ‬ ‫‪‬‬
‫‪ QueryString‬ﻟﺘﻨﻔﻴﺬﻫﺎ ﻻﺣﻘﺎً‪.‬‬
‫ﺇﻋﻄﺎﺀ ﺍﻷﻣﺮ ﻟﻠﺒﺪﺀ ﻓﻲ ﺍﻟﻌﻤﻠﻴﺔ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ StartTransaction‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Conn‬‬ ‫‪‬‬
‫ﺗﻨﻔﻴﺬ ﺍﻻﺳﺘﻌﻼﻡ ‪ QueryString‬ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ ExecuteDirect‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Conn‬‬ ‫‪‬‬
‫ﺗﺄﻛﻴﺪ ﺃﻣﺮ ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ Commit‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Trans‬‬ ‫‪‬‬

‫ﺑﻌﺪ ﺫﻟﻚ‪ ،‬ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻓﻬﺮﺱ ﻟﻬﺬﺍ ﺍﻟﺠﺪﻭﻝ ﺑﺎﻟﻄﺮﻳﻘﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫;')‪QueryString:='CREATE UNIQUE INDEX CountersIndex ON Counters(id ASC‬‬

‫;‪frmMain.Trans.StartTransaction‬‬
‫;)‪frmMain.conn.ExecuteDirect(QueryString‬‬
‫;‪frmMain.Trans.Commit‬‬

‫ﺻﻔﺤﺔ ‪24‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻓﻲ ﺍﻟﻜﻮﺩ ﺍﻟﺴﺎﺑﻖ‪:‬‬

‫ﺗﻢ ﻛﺘﺎﺑﺔ ﺟﻤﻠﺔ ﺇﻧﺸﺎﺀ ﻓﻬﺮﺱ ﺑﺎﺳﻢ ‪ CountersIndex‬ﺍﻋﺘﻤﺎﺩﺍً ﻋﻠﻰ ﺍﻟﺤﻘﻞ ‪ id‬ﻓﻲ ﺍﻟﺠﺪﻭﻝ‬ ‫‪‬‬
‫‪ Counters‬ﻭﺗﺨﺼﻴﺼﻬﺎ ﻟﻠﻤﺘﻐﻴﺮ ‪ QueryString‬ﻟﺘﻨﻔﻴﺬﻫﺎ ﻻﺣﻘﺎً‪.‬‬
‫ﺇﻋﻄﺎﺀ ﺍﻷﻣﺮ ﻟﻠﺒﺪﺀ ﻓﻲ ﺍﻟﻌﻤﻠﻴﺔ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ StartTransaction‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Conn‬‬ ‫‪‬‬
‫ﺗﻨﻔﻴﺬ ﺍﻻﺳﺘﻌﻼﻡ ‪ QueryString‬ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ ExecuteDirect‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Conn‬‬ ‫‪‬‬
‫ﺗﺄﻛﻴﺪ ﺃﻣﺮ ﺇﻧﺸﺎﺀ ﺍﻟﻔﻬﺮﺱ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ Commit‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Trans‬‬ ‫‪‬‬

‫ﺑﻌﺪ ﺫﻟﻚ‪ ،‬ﻧﻘﻮﻡ ﺑﺈﺩﺭﺍﺝ ﺳﺠﻞ ﺟﺪﻳﺪ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ Counters‬ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫;')‪QueryString:='INSERT INTO Counters VALUES(1,0‬‬

‫;‪frmMain.Trans.StartTransaction‬‬
‫;)‪frmMain.conn.ExecuteDirect(QueryString‬‬
‫;‪frmMain.Trans.Commit‬‬

‫ﻓﻲ ﺍﻟﻜﻮﺩ ﺍﻟﺴﺎﺑﻖ‪:‬‬

‫‪ ‬ﺗﻢ ﻛﺘﺎﺑﺔ ﺟﻤﻠﺔ ﺇﺿﺎﻓﺔ ﺳﺠﻞ ﺟﺪﻳﺪ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ Counters‬ﻭﺗﺨﺼﻴﺼﻬﺎ ﻟﻠﻤﺘﻐﻴﺮ ‪QueryString‬‬
‫ﻟﺘﻨﻔﻴﺬﻫﺎ ﻻﺣﻘﺎً‪.‬‬
‫ﺇﻋﻄﺎﺀ ﺍﻷﻣﺮ ﻟﻠﺒﺪﺀ ﻓﻲ ﺍﻟﻌﻤﻠﻴﺔ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ StartTransaction‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Conn‬‬ ‫‪‬‬
‫ﺗﻨﻔﻴﺬ ﺍﻻﺳﺘﻌﻼﻡ ‪ QueryString‬ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ ExecuteDirect‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪.Conn‬‬ ‫‪‬‬
‫ﺗﺄﻛﻴﺪ ﺃﻣﺮ ﺇﺿﺎﻓﺔ ﺍﻟﺴﺠﻞ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ ‪ Commit‬ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‪. Trans‬‬ ‫‪‬‬

‫ﺻﻔﺤﺔ ‪25‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

Contacts ‫ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ‬

:‫ ﺗﺮﻛﻴﺒﺔ ﻫﺬﺍ ﺍﻟﺠﺪﻭﻝ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‬،‫ﻟﻠﺘﺬﻛﻴﺮ‬

Contacts
‫ﺍﻟﻨﻮﻉ‬ ‫ﺍﻟﻮﺻﻒ‬ ‫ﺍﻟﺤﻘﻞ‬
INTEGER ‫ﻳﻤﺜﻞ ﺍﻟﺮﻗﻢ ﺍﻟﺘﺴﻠﺴﻠﻲ ﻟﻠﺴﺠﻞ‬ Id
STRING ‫ﻳﻤﺜﻞ ﺍﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‬ contactName
STRING ‫ﻳﻤﺜﻞ ﺃﺭﻗﺎﻡ ﺍﻟﻬﻮﺍﺗﻒ‬ phoneNumbers
STRING ‫ﻳﻤﺜﻞ ﺍﻟﺒﺮﻳﺪ ﺍﻹﻟﻜﺘﺮﻭﻧﻲ‬ emailAddress

:‫ ﻧﻜﺘﺐ‬CreateDataBase ‫ﺗﺤﺖ ﺁﺧﺮ ﺳﻄﺮ ﻛﺘﺒﻨﺎﻩ ﻓﻲ ﺍﻹﺟﺮﺍﺀ‬

QueryString:= 'CREATE TABLE IF NOT EXISTS Contacts(' +


'id INTEGER,' +
'contactName VARCHAR(255),' +
'phoneNumbers VARCHAR(255),' +
'emailAddress VARCHAR(255))';
frmMain.Trans.StartTransaction;
frmMain.conn.ExecuteDirect(QueryString);
frmMain.Trans.Commit;
: ‫ﻓﻲ ﻫﺬﺍ ﺍﻟﻜﻮﺩ‬

‫ ﻭﻣﻦ ﺛﻢ ﻭﺿﻌﻬﺎ ﻓﻲ ﺍﻟﻤﺘﻐﻴﺮ‬، ‫ ﻭﺣﻘﻮﻟﻪ‬Contacts ‫ ﻹﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ‬SQL ‫ﺗﻢ ﻛﺘﺎﺑﺔ ﺟﻤﻠﺔ‬ 


.ً‫ ﻟﺘﻨﻔﻴﺬﻫﺎ ﻻﺣﻘﺎ‬QueryString
.Description ‫ ﻷﻧﻪ ﺃﻧﺴﺐ ﻟﻠﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﺳﻴﺤﻤﻠﻬﺎ ﺍﻟﺤﻘﻞ‬VARCHAR ‫ﺍﺳﺘﺨﺪﻣﻨﺎ ﺍﻟﻨﻮﻉ‬ 
.Conn‫ ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‬StartTransaction ‫ﺇﻋﻄﺎﺀ ﺍﻷﻣﺮ ﻟﻠﺒﺪﺀ ﻓﻲ ﺍﻟﻌﻤﻠﻴﺔ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ‬ 
.Conn‫ ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‬ExecuteDirect ‫ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ‬QueryString ‫ﺗﻨﻔﻴﺬ ﺍﻻﺳﺘﻌﻼﻡ‬ 
.Trans‫ ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‬Commit ‫ﺗﺄﻛﻴﺪ ﺃﻣﺮ ﺇﻧﺸﺎﺀ ﺍﻟﺠﺪﻭﻝ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ‬ 

:‫ ﻧﻨﺸﺊ ﺍﻟﻔﻬﺮﺱ ﺍﻟﺨﺎﺹ ﺑﻬﺬﺍ ﺍﻟﺠﺪﻭﻝ‬،‫ﺑﻌﺪ ﺫﻟﻚ‬

QueryString:='CREATE UNIQUE INDEX ContactsIndex' +


' ON Contacts(id ASC)';
frmMain.Trans.StartTransaction;
frmMain.conn.ExecuteDirect(QueryString);
frmMain.Trans.Commit;

26 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

: ‫ﻭﻓﻲ ﻫﺬﺍ ﺍﻟﻜﻮﺩ‬

‫ ﻓﻲ ﺍﻟﺠﺪﻭﻝ‬id ‫ ﺍﻋﺘﻤﺎﺩﺍً ﻋﻠﻰ ﺍﻟﺤﻘﻞ‬ContactsIndex ‫ﺗﻢ ﻛﺘﺎﺑﺔ ﺟﻤﻠﺔ ﺇﻧﺸﺎﺀ ﻓﻬﺮﺱ ﺑﺎﺳﻢ‬ 
.ً‫ ﻟﺘﻨﻔﻴﺬﻫﺎ ﻻﺣﻘﺎ‬QueryString ‫ ﻭﺗﺨﺼﻴﺼﻬﺎ ﻟﻠﻤﺘﻐﻴﺮ‬Contacts
.Conn‫ ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‬StartTransaction ‫ﺇﻋﻄﺎﺀ ﺍﻷﻣﺮ ﻟﻠﺒﺪﺀ ﻓﻲ ﺍﻟﻌﻤﻠﻴﺔ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ‬ 
.Conn‫ ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‬ExecuteDirect ‫ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ‬QueryString ‫ﺗﻨﻔﻴﺬ ﺍﻻﺳﺘﻌﻼﻡ‬ 
.Trans‫ ﺍﻟﺘﺎﺑﻊ ﻟﻠـ‬Commit ‫ﺗﺄﻛﻴﺪ ﺃﻣﺮ ﺇﻧﺸﺎﺀ ﺍﻟﻔﻬﺮﺱ ﻣﻦ ﺧﻼﻝ ﺍﻹﺟﺮﺍﺀ‬ 

:‫ﻓﻴﺼﻴﺮ ﺍﻟﻜﻮﺩ ﻛﺎﻣﻼً ﻛﻤﺎ ﻳﻠﻲ‬

procedure CreateDataBase;
var
QueryString: String;
begin
frmMain.conn.DatabaseName:='Contacts.db';
frmMain.conn.Transaction:=frmMain.Trans;
frmMain.conn.Open;

QueryString:='CREATE TABLE IF NOT EXISTS Counters('+


'id INTEGER, ' +
'contactID INTEGER)';
frmMain.Trans.StartTransaction;
frmMain.conn.ExecuteDirect(QueryString);
frmMain.Trans.Commit;

QueryString:='CREATE UNIQUE INDEX CountersIndex ' +


'ON Counters(id ASC)';
frmMain.Trans.StartTransaction;
frmMain.conn.ExecuteDirect(QueryString);
frmMain.Trans.Commit;

QueryString:='INSERT INTO Counters VALUES(1,0)';


frmMain.Trans.StartTransaction;
frmMain.conn.ExecuteDirect(QueryString);
frmMain.Trans.Commit;

QueryString:= 'CREATE TABLE IF NOT EXISTS Contacts(' +


'id INTEGER,' +
'contactName VARCHAR(255),' +
'phoneNumbers VARCHAR(255),' +
'emailAddress VARCHAR(255))';
frmMain.Trans.StartTransaction;
frmMain.conn.ExecuteDirect(QueryString);
frmMain.Trans.Commit;

QueryString:='CREATE UNIQUE INDEX ContactsIndex' +


' ON Contacts(id ASC)';
frmMain.Trans.StartTransaction;
frmMain.conn.ExecuteDirect(QueryString);
frmMain.Trans.Commit;
end;

27 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺍﻵﻥ‪ ..‬ﻧﻨﺴﺦ ﺍﻟﺴﻄﺮ ﺍﻟﺘﺎﻟﻲ‪:‬‬

‫;‪procedure CreateDataBase‬‬
‫ﻭﻧﻠﺼﻘﻪ ﺗﺤﺖ‬

‫‪uses‬‬
‫;‪Classes, SysUtils‬‬

‫;‪procedure Createdatabase‬‬
‫ﻓﻲ ﺍﻟﻮﺣﺪﺓ ‪.DataBaseWorks‬‬

‫ﻭﻟﻜﻲ ﻧﺴﺘﻄﻴﻊ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻹﺟﺮﺍﺀ ‪ CreateDataBase‬ﻓﻲ ﺍﻟﻮﺣﺪﺓ ﺍﻟﺨﺎﺻﺔ ﺑﺎﻟﻔﻮﺭﻡ ‪ ،frmMain‬ﻧﻘﻮﻡ‬


‫ﺑﺎﻟﺮﺑﻂ ﺑﻴﻦ ﺍﻟﻮﺣﺪﺗﻴﻦ ﻓﻲ ﺍﻻﺗﺠﺎﻩ ﺍﻵﺧﺮ‪ ،‬ﺑﺤﻴﺚ ﻳﻤﻜﻦ ﺍﻻﺳﺘﻔﺎﺩﺓ ﻣﻦ ﻣﻜﻮﻧﺎﺕ ﺍﻟﻮﺣﺪﺓ ‪DataBaseWorks‬‬
‫ﻓﻲ ﻛﻮﺩ ‪.frmMainUnit‬‬

‫ﻧﺬﻫﺐ ﺇﻟﻰ ﺍﻟﻮﺣﺪﺓ ‪ ،frmMainUnit‬ﻭﺗﺤﺖ ‪ implementation‬ﻧﻜﺘﺐ‪:‬‬

‫;‪Uses DataBaseWorks‬‬

‫ﻭﺑﺎﻟﺘﺎﻟﻲ ﻳﻤﻜﻨﻨﺎ ﺍﻵﻥ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻹﺟﺮﺍﺀ ‪ CreateDataBase‬ﻭﺇﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬

‫ﺻﻔﺤﺔ ‪28‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫‪ -3‬ﺑﺮﻣﺠﺔ ﺍﻟﺤﺪﺙ ‪ FormActivate‬ﻟﻠﺘﺄﻛﺪ ﻣﻦ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻋﺪﻣﻪ‬

‫ﻧﺄﺗﻲ ﺍﻵﻥ ﻟﻠﺘﺤﻘﻖ ﻓﻌﻠﻴﺎً ﻣﻦ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺃﻭ ﻓﻘﺪﺍﻧﻪ‪ .‬ﻭﺃﻧﺴﺐ ﻭﻗﺖ ﻟﻌﻤﻞ ﺫﻟﻚ ﻫﻮ ﺍﻟﺤﺪﺙ‬
‫‪ Activate‬ﻟﻠﻔﻮﺭﻡ ‪.frmMain‬‬

‫ﻧﻈﻬﺮ ﺍﻟﻔﻮﺭﻡ ‪ frmMain‬ﺃﻣﺎﻣﻨﺎ‪.‬‬ ‫‪‬‬


‫ﻓﻲ ﻧﺎﻓﺬﺓ ﺍﻟﺨﺼﺎﺋﺺ ﻧﺨﺘﺎﺭ ﺍﻟﺘﺒﻮﻳﺐ ‪.Events‬‬ ‫‪‬‬
‫ﻧﻨﻘﺮ ﻋﻠﻰ ﺍﻟﺤﺪﺙ ‪ OnActivate‬ﻧﻘﺮﺗﻴﻦ ﺳﺮﻳﻌﺘﻴﻦ‪ ،‬ﻓﻴﻔﺘﺢ ﺍﻟﻜﻮﺩ ﺍﻟﺨﺎﺹ ﺑﻬﺬﺍ ﺍﻟﺤﺪﺙ ﺑﺎﻟﺸﻜﻞ‬ ‫‪‬‬
‫ﺍﻟﺘﺎﻟﻲ ‪:‬‬

‫;)‪procedure TfrmMain.FormActivate(Sender: TObject‬‬


‫‪begin‬‬

‫;‪end‬‬

‫ﻧﻜﺘﺐ ﺑﻴﻦ ‪ Begin‬ﻭ ‪ End‬ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ ‪:‬‬

‫‪if FileExists('contacts.db') then‬‬


‫‪begin‬‬
‫;'‪conn.DatabaseName:='contacts.db‬‬
‫;‪conn.Transaction:=Trans‬‬
‫;‪conn.Open‬‬
‫;)'‪if conn.Connected = true then showmessage('connected‬‬
‫‪end‬‬
‫‪else‬‬
‫‪begin‬‬
‫‪// make database and tables.‬‬
‫;‪Createdatabase‬‬
‫;)'‪showmessage('Database was created.‬‬
‫;‪end‬‬
‫ﻭﻓﻲ ﻫﺬﺍ ﺍﻟﻜﻮﺩ ‪:‬‬

‫ﺍﺳﺘﺨﺪﻣﻨﺎ ﺍﻟﺪﺍﻟﺔ ‪ FileExists‬ﻭﺍﻟﺘﻲ ﺗﺮﺟﻊ ﺍﻟﻘﻴﻤﺔ ‪ True‬ﺇﺫﺍ ﻛﺎﻥ ﺍﺳﻢ ﺍﻟﻤﻠﻒ ﺍﻟﻤﻌﻄﻰ ﻣﻮﺟﻮﺩﺍً‪،‬‬ ‫‪‬‬
‫ﻭ‪ False‬ﺇﺫﺍ ﻟﻢ ﻳﻜﻦ ﻣﻮﺟﻮﺩﺍً ﺣﺘﻰ ﻧﺘﺄﻛﺪ ﻣﻦ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻋﺪﻣﻪ‪.‬‬
‫ﻓﻲ ﺣﺎﻝ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻧﺘﺼﻞ ﺑﻪ ﻋﻦ ﻃﺮﻳﻖ ‪ ،Conn‬ﻭﻓﻲ ﺣﺎﻟﺔ ﺗﺤﻘﻖ ﺍﻻﺗﺼﺎﻝ‬ ‫‪‬‬
‫ﺗﻈﻬﺮ ﺍﻟﺮﺳﺎﻟﺔ ‪.Connected‬‬
‫ﺃﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪﻡ ﻭﺟﻮﺩ ﻣﻠﻒ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻓﻴﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻹﺟﺮﺍﺀ ‪ Createdatabase‬ﺍﻟﺘﺎﺑﻊ‬ ‫‪‬‬
‫ﻟﻠﻮﺣﺪﺓ ‪ ،DataBaseWorks‬ﺍﻟﺬﻱ ﺳﻴﻨﺸﺊ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺟﺪﺍﻭﻟﻬﺎ‪ ،‬ﺛﻢ ﺇﻇﻬﺎﺭ ﺍﻟﺮﺳﺎﻟﺔ ‪:‬‬
‫‪.Database was created‬‬

‫ﺻﻔﺤﺔ ‪29‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

‫ﺗﻨﺴﻴﻖ ﻋﺮﺽ ﺍﻟﺴﺠﻼﺕ‬

‫ ﻟﻌﺮﺽ ﺍﻟﺴﺠﻼﺕ ﺍﻟﻤﺴﺘﺮﺟﻌﺔ ﻣﻦ ﺍﻟﺠﺪﻭﻝ‬dgvContacts ‫ ﻭﺍﻟﺬﻱ ﺃﺳﻤﻴﻨﺎﻩ‬TDBGrid ‫ﺳﻨﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﺼﺮ‬


‫ ﺣﺘﻰ ﻻ‬،‫ ﻳﺠﺐ ﺃﻥ ﻧﻘﻮﻡ ﺑﺘﻨﺴﻴﻘﻪ ﻭﺗﻬﻴﺌﺘﻪ ﻗﺒﻞ ﻋﺮﺽ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻠﻴﻪ‬،‫ ﻭﻟﻜﻦ ﻗﺒﻞ ﺍﺳﺘﺨﺪﺍﻣﻪ‬.Contacts
.‫ﺗﻈﻬﺮ ﺃﺳﻤﺎﺀ ﺍﻟﺤﻘﻮﻝ ﻛﻤﺎ ﻫﻲ ﻣﺨﺰﻧﺔ ﻓﻲ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫ ﻭﻧﺮﺑﻄﻬﺎ ﻣﻊ ﺍﻟﻮﺣﺪﺓ ﺍﻟﺨﺎﺻﺔ ﺑﺎﻟﻔﻮﺭﻡ‬،MainWindowSetup ‫ﻧﻨﺸﺊ ﻭﺣﺪﺓ ﺟﺪﻳﺪﺓ ﻭﻧﺨﺰﻧﻬﺎ ﺑﺎﺳﻢ‬


.frmMainUnit ‫ﺍﻟﺮﺋﻴﺴﻲ ﻭﻫﻲ‬

:‫ ﺳﻨﻨﺸﺊ ﺇﺟﺮﺍﺀﻳﻦ‬،‫ﻓﻲ ﺍﻟﻮﺣﺪﺓ ﺍﻟﺠﺪﻳﺪﺓ‬

.dgvContcts‫ﺍﻷﻭﻝ ﻟﺘﻨﺴﻴﻖ ﺍﻟـ‬ 


‫ ﺑﺤﻴﺚ ﻧﺴﺘﺪﻋﻴﻪ ﻋﻨﺪ ﺍﻟﻀﺮﻭﺭﺓ‬.Contacts ‫ﻭﺍﻟﺜﺎﻧﻲ ﻟﻌﺮﺽ ﻛﺎﻓﺔ ﺍﻟﺴﺠﻼﺕ ﺍﻟﻤﺨﺰﻧﺔ ﻓﻲ ﺍﻟﺠﺪﻭﻝ‬ 
.ً‫ﻻﺣﻘﺎ‬

Get_Grid_Ready ‫ﺍﻹﺟﺮﺍﺀ‬

:‫ﻭﻓﻲ ﻫﺬﺍ ﺍﻹﺟﺮﺍﺀ ﻧﻜﺘﺐ‬

procedure Get_Grid_Ready;
begin
frmMain.dgvContacts.BiDiMode:=bdRightToLeft;

frmMain.dgvContacts.Columns[0].Title.Caption:='‫م‬.‫;'ر‬
frmMain.dgvContacts.Columns[0].Width:=50;
frmMain.dgvContacts.Columns[0].Alignment:=taCenter;
frmMain.dgvContacts.Columns[0].Title.Alignment:=taCenter;

frmMain.dgvContacts.Columns[1].Title.Caption:='‫;'اﺳﻢ ﺟﮭﺔ اﻻﺗﺼﺎل‬


frmMain.dgvContacts.Columns[1].Width:=230;
frmMain.dgvContacts.Columns[1].Title.Alignment:=taCenter;

frmMain.dgvContacts.Columns[2].Title.Caption:='‫;'أرﻗﺎم اﻟﮭﻮاﺗﻒ‬
frmMain.dgvContacts.Columns[2].Width:=250;
frmMain.dgvContacts.Columns[2].Title.Alignment:=taCenter;
frmMain.dgvContacts.Columns[2].Alignment:=taCenter;

frmMain.dgvContacts.Columns[3].Title.Caption:='‫;'اﻟﺒﺮﯾﺪ اﻹﻟﻜﺘﺮوﻧﻲ‬
frmMain.dgvContacts.Columns[3].Width:=250;
frmMain.dgvContacts.Columns[3].Title.Alignment:=taCenter;
frmMain.dgvContacts.Columns[3].Alignment:=taCenter;
end;

30 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻭﻓﻲ ﻫﺬﺍ ﺍﻟﻜﻮﺩ ‪:‬‬

‫ﺗﻢ ﺗﻐﻴﻴﺮ ﺍﺗﺠﺎﻩ ﺍﻟﻜﺘﺎﺑﺔ ﻋﻠﻰ ‪ dgvContacts‬ﻟﻴﻜﻮﻥ ﻣﻦ ﺍﻟﻴﻤﻴﻦ ﺇﻟﻰ ﺍﻟﻴﺴﺎﺭ‪.‬‬ ‫‪‬‬
‫ﺿﺒﻂ ﺍﻟﻨﺺ ﺍﻟﻈﺎﻫﺮ ﺃﻋﻠﻰ ﺍﻟﻌﻤﻮﺩ ﺍﻷﻭﻝ )ﺍﻟﺘﺮﻗﻴﻢ ﻳﺒﺪﺃ ﻣﻦ ﺍﻟﺼﻔﺮ( ﺑـ ﺭ‪.‬ﻡ‪.‬‬ ‫‪‬‬
‫ﺿﺒﻂ ﺍﺗﺴﺎﻉ ﺍﻟﻌﻤﻮﺩ ﺍﻷﻭﻝ ﻟﻴﺴﺎﻭﻱ ‪.50‬‬ ‫‪‬‬
‫ﺿﺒﻂ ﻣﺤﺎﺫﺍﺓ ﻋﻨﻮﺍﻥ ﺍﻟﻌﻤﻮﺩ ﺍﻷﻭﻝ ﻓﻲ ﺍﻟﻮﺳﻂ‪.‬‬ ‫‪‬‬
‫ﺿﺒﻂ ﻣﺤﺎﺫﺍﺓ ﻣﺤﺘﻮﻳﺎﺕ ﺍﻟﻌﻤﻮﺩ ﺍﻷﻭﻝ ﻓﻲ ﺍﻟﻮﺳﻂ‪.‬‬ ‫‪‬‬
‫‪ ‬ﻭﻫﻜﺬﺍ ﻟﺒﻘﻴﺔ ﺍﻷﻋﻤﺪﺓ‪.‬‬

‫ﺍﻹﺟﺮﺍﺀ ‪Update_Grid‬‬

‫ﻭﻓﻲ ﻫﺬﺍ ﺍﻹﺟﺮﺍﺀ ﻧﻜﺘﺐ‪:‬‬

‫;‪procedure Update_Grid‬‬
‫‪begin‬‬
‫;‪frmMain.UpdateQuery.Close‬‬
‫;‪frmMain.UpdateQuery.DataBase:=frmMain.conn‬‬
‫;'‪frmMain.UpdateQuery.SQL.Text:='SELECT * FROM Contacts‬‬
‫;‪frmMain.UpdateQuery.open‬‬

‫;‪frmMain.UpdateDataSource.DataSet:=frmMain.UpdateQuery‬‬

‫;‪frmMain.dgvContacts.DataSource:=frmMain.UpdateDataSource‬‬
‫;‪Get_Grid_Ready‬‬
‫;‪end‬‬

‫ﻭﻓﻴﻪ‪:‬‬

‫ﺗﻢ ﺍﻻﺗﺼﺎﻝ ﺑﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ .‬ﻭﺍﻟﺮﺑﻂ ﺑﻴﻦ ‪ UpdateQuery‬ﻭ‪.Conn‬‬ ‫‪‬‬


‫ﺗﻢ ﺍﺳﺘﺮﺟﺎﻉ ﻛﺎﻓﺔ ﺍﻟﺴﺠﻼﺕ ﺍﻟﻤﺨﺰﻧﺔ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ Contacts‬ﻋﻦ ﻃﺮﻳﻖ ‪.UpdateQuery‬‬ ‫‪‬‬
‫ﻓﻲ‬ ‫ﻭﺣﻔﻈﻬﺎ‬ ‫‪UpdateQuery‬‬ ‫ﻣﻦ‬ ‫ﺍﻟﻤﺴﺘﺮﺟﻌﺔ‬ ‫ﺍﻟـ‪Dataset‬‬ ‫ﺍﺳﺘﻘﺒﺎﻝ‬ ‫ﺗﻢ‬ ‫‪‬‬
‫‪.UpdateDataSource‬‬
‫ﺗﻢ ﺍﻟﺮﺑﻂ ﺑﻴﻦ ‪ dgvContacts‬ﻭ‪.UpdateDataSource‬‬ ‫‪‬‬
‫ﺗﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻹﺟﺮﺍﺀ ﺍﻟﺴﺎﺑﻖ ‪ Get_Grid_Ready‬ﻟﺘﻨﺴﻴﻖ ﺍﻟـ‪ ،dgvContacts‬ﻭﻣﻦ ﺛﻢ ﻋﺮﺽ‬ ‫‪‬‬
‫ﺍﻟﺴﺠﻼﺕ ﺑﺎﻟﺘﻨﺴﻴﻖ ﺍﻟﺠﺪﻳﺪ‪.‬‬

‫ﻟﻌﺮﺽ ﻛﺎﻓﺔ ﺍﻟﺴﺠﻼﺕ ﺍﻟﻤﺨﺰﻧﺔ ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ ،Contacts‬ﻧﺴﺘﺪﻋﻲ ﺍﻹﺟﺮﺍﺀ ‪ Update_Grid‬ﻓﻲ ﺍﻟﻮﻗﺖ‬


‫ﻭﺍﻟﻤﻜﺎﻥ ﺍﻟﻤﻨﺎﺳﺒﻴﻦ‪.‬‬

‫ﺻﻔﺤﺔ ‪31‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

‫ ﻭﻧﻌﺪﻟﻪ ﺑﺤﻴﺚ ﻳﺘﻢ ﻋﺮﺽ ﺍﻟﺴﺠﻼﺕ ﻓﻲ ﺣﺎﻟﺔ ﻭﺟﻮﺩ ﻣﻠﻒ‬،FormActivate ‫ ﻧﻌﻮﺩ ﻟﺒﺮﻣﺠﺔ ﺍﻟﺤﺪﺙ‬،‫ﻭﺑﺎﻟﺘﺎﻟﻲ‬
:‫ ﻭﻧﺤﺬﻑ ﺍﻟﺮﺳﺎﻟﺔ ﺍﻟﺨﺎﺻﺔ ﺑﻨﺠﺎﺡ ﺍﻻﺗﺼﺎﻝ ﻭﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‬،‫ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

procedure TfrmMain.FormActivate(Sender: TObject);


begin
if fileexists('contacts.db') then
begin
conn.DatabaseName:='contacts.db';
conn.Transaction:=Trans;
conn.Open;
Update_Grid;
end
else
begin
// make database and tables.
Createdatabase;
showmessage('Database was created.');
end;
end;

32 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺇﺿﺎﻓﺔ ﺍﻟﺴﺠﻼﺕ‬
‫ﻗﻤﻨﺎ ﻓﻴﻤﺎ ﺳﺒﻖ ﺑﺈﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺟﺪﺍﻭﻟﻬﺎ‪ ،‬ﻭﺍﻻﺗﺼﺎﻝ ﺑﻬﺎ‪ ،‬ﻭﻋﺮﺽ ﺍﻟﺴﺠﻼﺕ ﻋﻠﻰ‬
‫ﺍﻟـ‪ ،dgvContacts‬ﺑﺎﻟﻄﺒﻊ ﻟﻦ ﻳﻜﻮﻥ ﻫﻨﺎﻙ ﺳﺠﻼﺕ‪ ،‬ﻷﻧﻨﺎ ﻟﻢ ﻧﻀﻒ ﺃﻳﺎً ﻣﻨﻬﺎ ﺑﻌﺪ‪.‬‬

‫ﻹﺿﺎﻓﺔ ﺳﺠﻼﺕ ﺟﺪﻳﺪﺓ‪ ،‬ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻧﺎﻓﺬﺓ ﺟﺪﻳﺪﺓ‪ ،‬ﻭﻧﺴﻤﻴﻬﺎ ‪ ،frmNewContact‬ﻭﺍﻟﻮﺣﺪﺓ ﺍﻟﺨﺎﺻﺔ ﺑﻬﺎ‬
‫ﻧﺴﻤﻴﻬﺎ ‪ frmNewContactUnit‬ﻭﻧﻀﻊ ﻋﻠﻴﻬﺎ ﺍﻟﻌﻨﺎﺻﺮ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﺍﻟﻘﻴﻤﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬ ‫ﺍﻟﻌﻨﺼﺮ‬


‫‪txtContactName‬‬ ‫‪Name‬‬ ‫‪TEdit‬‬
‫‪txtPhoneNumbers‬‬ ‫‪Name‬‬ ‫‪TEdit‬‬
‫‪txtEmailAddress‬‬ ‫‪Name‬‬ ‫‪TEdit‬‬
‫‪btnSave‬‬ ‫‪Name‬‬
‫‪TButton‬‬
‫ﺣﻔﻆ‬ ‫‪Caption‬‬
‫‪btnCancel‬‬ ‫‪Name‬‬
‫‪TButton‬‬
‫ﺇﻟﻐﺎﺀ ﺍﻷﻣﺮ‬ ‫‪Caption‬‬
‫‪OpQuery‬‬ ‫‪Name‬‬ ‫‪TSQLQuery‬‬
‫‪LastIDDataSource‬‬ ‫‪Name‬‬ ‫‪TDataSource‬‬

‫ﻭﻧﻨﺴﻘﻬﺎ ﺑﺤﻴﺚ ﻧﺤﺼﻞ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﺻﻔﺤﺔ ‪33‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻧﺮﺑﻂ ﺑﻴﻦ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ ﻭﺑﻴﻦ ﻛﻞ ﻣﻦ ﺍﻟﻮﺣﺪﺗﻴﻦ ‪ frmMainUnit‬ﻭ‪ MainWindowSetup‬ﺑﺎﻟﺼﻮﺭﺓ‬


‫ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻓﻲ ﺍﻟﻮﺣﺪﺓ ‪: frmNewContact‬‬

‫‪implementation‬‬
‫;‪uses frmMainUnit, MainWindowSetup‬‬

‫ﻓﻲ ﺍﻟﻮﺣﺪﺓ ‪:frmMainUnit‬‬

‫‪implementation‬‬
‫;‪uses DatabaseWorks, MainWindowSetup, frmNewContactUnit‬‬

‫ﻧﻨﻘﺮ ﺍﻟﺰﺭ ‪ btnCancel‬ﻧﻘﺮﺗﻴﻦ ﺳﺮﻳﻌﺘﻴﻦ ﻭﻧﻜﺘﺐ ﻓﻲ ﺣﺪﺙ ﺍﻟﻨﻘﺮ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ‪:‬‬

‫;)‪procedure TfrmNewContact.btnCancelClick(Sender: TObject‬‬


‫‪begin‬‬
‫;‪close‬‬
‫;‪end‬‬
‫ﻭﻫﺬﺍ ﺍﻟﻜﻮﺩ ﺧﺎﺹ ﺑﺈﻏﻼﻕ ﺍﻟﻨﺎﻓﺬﺓ ﻭﺇﻟﻐﺎﺀ ﻋﻤﻠﻴﺔ ﺍﻹﺿﺎﻓﺔ‪.‬‬

‫ﻧﻘﻮﻡ ﺑﺘﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ ﻣﺤﻠﻲ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ Integer‬ﻟﻴﻤﺜﻞ ﺭﻗﻢ ﺁﺧﺮ ﺳﺠﻞ ﺗﻤﺖ ﺇﺿﺎﻓﺘﻪ ﻣﺴﺒﻘﺎً ﻓﻲ ﺍﻟﺠﺪﻭﻝ‬
‫‪ ،Contacts‬ﺗﺤﺖ ﺍﻟﻘﺴﻢ ‪ Private‬ﻓﻲ ﺍﻟﻮﺣﺪﺓ ‪ frmNewContactUnit‬ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪private‬‬
‫} ‪{ private declarations‬‬
‫;‪LastID: Integer‬‬

‫ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﺍﻟﺤﻘﻮﻝ ﺍﻹﺟﺒﺎﺭﻳﺔ ﻫﻲ ﺣﻘﻞ ﺍﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ ﻭﺣﻘﻞ ﺃﺭﻗﺎﻡ ﺍﻟﻬﻮﺍﺗﻒ‪ ،‬ﺑﻴﻨﻤﺎ ﺣﻘﻞ ﺍﻟﺒﺮﻳﺪ‬
‫ﺍﻹﻟﻜﺘﺮﻭﻧﻲ ﺍﺧﺘﻴﺎﺭﻱ‪.‬‬

‫ﺍﻵﻥ ‪ ..‬ﻧﻨﻘﺮ ﺍﻟﺰﺭ ‪ btnSave‬ﻭﻧﻜﺘﺐ ﻓﻲ ﺣﺪﺙ ﺍﻟﻨﻘﺮ ﺍﻟﺨﺎﺹ ﺑﻪ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ ‪:‬‬

‫‪if txtContactName.Text = '' then‬‬


‫‪begin‬‬
‫;)'ﯾﺠﺐ ﻛﺘﺎﺑﺔ اﺳﻢ ﺟﮭﺔ اﻻﺗﺼﺎل'(‪showmessage‬‬
‫;‪txtContactName.SetFocus‬‬
‫;‪exit‬‬
‫;‪end‬‬
‫ﻭﻓﻲ ﻫﺬﺍ ﺍﻟﻜﻮﺩ‪ ،‬ﻧﻔﺤﺺ ﺍﻟﻤﺪﺧﻼﺕ ﻓﻲ ﺍﻟﻌﻨﺼﺮ ‪ ،txtContactName‬ﻓﺈﻥ ﻛﺎﻧﺖ ﻓﺮﺍﻏﺎً ﻳﺘﻢ ﺇﻇﻬﺎﺭ ﺭﺳﺎﻟﺔ‬
‫ﺗﻔﻴﺪ ﺑﺬﻟﻚ‪ ،‬ﺛﻢ ﻭﺿﻊ ﺍﻟﺘﺮﻛﻴﺰ ‪ Focus‬ﻓﻴﻪ‪ ،‬ﻭﺍﻟﺨﺮﻭﺝ ﻣﻦ ﺍﻹﺟﺮﺍﺀ ﺍﻟﺤﺎﻟﻲ ‪ .‬ﺃﻱ ﺃﻧﻪ ﻋﻨﺪ ﺗﺤﻘﻖ ﺍﻟﺸﺮﻁ ﻓﻲ‬
‫ﺟﻤﻠﺔ ‪ ،if‬ﻟﻦ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻣﺎ ﺑﻌﺪﻫﺎ ﻣﻦ ﺃﻛﻮﺍﺩ ﺑﺴﺒﺐ ﺗﻨﻔﻴﺬ ﺍﻹﺟﺮﺍﺀ ‪.Exit‬‬

‫ﺻﻔﺤﺔ ‪34‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺑﻌﺪ ﺫﻟﻚ ﻧﻜﺘﺐ ﺍﻟﻜﻮﺩ ﺍﻟﺨﺎﺹ ﺑﻔﺤﺺ ﺍﻟﻌﻨﺼﺮ ‪ txtPhoneNumbers‬ﻭﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪if txtPhoneNumbers.Text = '' then‬‬


‫‪begin‬‬
‫;)'ﯾﺠﺐ ﻛﺘﺎﺑﺔ أرﻗﺎم اﻟﮭﻮاﺗﻒ'(‪showmessage‬‬
‫;‪txtPhoneNumbers.SetFocus‬‬
‫;‪exit‬‬
‫;‪end‬‬

‫ﻭﻓﻲ ﺍﻟﻜﻮﺩ ﺍﻟﺴﺎﺑﻖ ﻳﺘﻢ ﺇﻇﻬﺎﺭ ﺭﺳﺎﻟﺔ ﺗﻔﻴﺪ ﺑﻮﺟﻮﺏ ﻛﺘﺎﺑﺔ ﺃﺭﻗﺎﻡ ﺍﻟﻬﻮﺍﺗﻒ ﻓﻲ ﺣﺎﻝ ﻟﻢ ﻳﺪﺧﻠﻬﺎ ﺍﻟﻤﺴﺘﺨﺪﻡ‪،‬‬
‫ﺛﻢ ﻧﻘﻞ ﺍﻟﺘﺮﻛﻴﺰ ﺇﻟﻰ ﺍﻟﻌﻨﺼﺮ ‪ ،txtPhoneNumbers‬ﻭﺍﻟﺨﺮﻭﺝ ﻣﻦ ﺍﻹﺟﺮﺍﺀ ﺍﻟﺤﺎﻟﻲ ﻭﻫﻮ ﺇﺟﺮﺍﺀ ﺣﺪﺙ ﺍﻟﻨﻘﺮ‬
‫ﻋﻠﻰ ﺍﻟﺰﺭ ‪ btnSave‬ﺑﺴﺒﺐ ﺗﻨﻔﻴﺬ ﺍﻹﺟﺮﺍﺀ ‪.Exit‬‬

‫ﺗﺤﺪﻳﺪ ﺭﻗﻢ ﺍﻟـ‪ ID‬ﻟﻠﺴﺠﻞ ﺍﻟﺠﺪﻳﺪ‬

‫ﺑﻌﺪ ﺫﻟﻚ‪ ،‬ﻧﻜﺘﺐ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ ‪:‬‬

‫;‪OpQuery.Close‬‬
‫;‪OpQuery.DataBase:= frmMain.conn‬‬
‫;'‪OpQuery.SQL.Text:= 'SELECT * FROM Counters WHERE id = 1‬‬
‫;‪OpQuery.Open‬‬

‫ﻭﻓﻴﻪ ﺭﺑﻄﻨﺎ ﺑﻴﻦ ﺍﻟـ‪ OpQuery‬ﻭﺍﻟـ‪ Conn‬ﺍﻟﻤﻮﺟﻮﺩ ﻋﻠﻰ ﺍﻟﻔﻮﺭﻡ ‪ . frmMain‬ﺛﻢ ﻛﺘﺒﻨﺎ ﺟﻤﻠﺔ ﺍﻻﺳﺘﻌﻼﻡ‬
‫ﻭﺍﻟﺘﻲ ﺗﺮﺟﻊ ﺍﻟﺴﺠﻞ ﺭﻗﻢ ‪ 1‬ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪.Counters‬‬

‫ﻧﺴﺘﻘﺒﻞ ﺍﻟـ‪ Dataset‬ﺍﻟﻤﺴﺘﺮﺟﻌﺔ ﻭﻧﺤﻔﻈﻬﺎ ﻓﻲ ﺍﻟـ‪ LastIDDataSource‬ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫;‪LastIDDataSource.DataSet:= OpQuery‬‬

‫ﺍﻵﻥ‪ ،‬ﺍﻟـ‪ LastIDDataSource‬ﻳﺤﺘﻮﻱ ﻋﻠﻰ ﺳﺠﻞ ﻭﺍﺣﺪ ﺑﻪ ﺣﻘﻼﻥ‪:‬‬

‫ﺣﻘﻞ ‪.id‬‬ ‫‪‬‬


‫‪ ‬ﻭﺣﻘﻞ ‪.ontactid‬‬

‫ﺣﻘﻞ ‪ contacted‬ﻳﺤﺘﻔﻆ ﺑﺂﺧﺮ ﺭﻗﻢ ﻟﻠـ‪ id‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﺠﺪﻭﻝ ‪ .Contacts‬ﻓﻤﺜﻼً‪ ،‬ﺭﺑﻤﺎ ﻳﻜﻮﻥ ﺁﺧﺮ ﺭﻗﻢ ‪id‬‬
‫ﻫﻮ )‪ ،(x‬ﻧﻘﻮﻡ ﺑﺈﺿﺎﻓﺔ )‪ (1‬ﺇﻟﻴﻪ‪ ،‬ﻟﻴﻜﻮﻥ ﺭﻗﻢ ﺍﻟـ‪ id‬ﻟﻠﺴﺠﻞ ﺍﻟﺠﺪﻳﺪ‪ ،‬ﻭﻧﺨﺰﻧﻪ ﻓﻲ ﺍﻟﻤﺘﻐﻴﺮ ‪ LastID‬ﻭﺑﺎﻟﺼﻮﺭﺓ‬
‫ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫;‪LastID:= LastIDDataSource.DataSet.FieldByName('contactid').AsInteger + 1‬‬

‫ﺻﻔﺤﺔ ‪35‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻳﻌﻨﻲ ﺃﻧﻨﺎ ﺍﻵﻥ ﻧﺤﺘﻔﻆ ﺑﻘﻴﺔ ﺍﻟـ‪ id‬ﻟﻠﺴﺠﻞ ﺍﻟﺠﺪﻳﺪ ﻓﻲ ﺍﻟﻤﺘﻐﻴﺮ ‪.LastID‬‬

‫ﻧﻘﻮﻡ ﺑﺘﺤﺪﻳﺚ ﻗﻴﻤﺔ ﺍﻟﺤﻘﻞ ‪ contacted‬ﻓﻲ ﺍﻟﺠﺪﻭﻝ ‪ Counters‬ﻟﻴﺤﻤﻞ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺠﺪﻳﺪﺓ‪:‬‬

‫;'‪OpQuery.SQL.Text:='UPDATE Counters SET contactid=:contactid WHERE id = 1‬‬

‫ﻻﺣﻆ ﻛﻴﻔﻴﺔ ﺗﺤﺪﻳﺪ ﻗﻴﻤﺔ ﺍﻟﺤﻘﻞ ﺍﻟﺬﻱ ﻧﺮﻳﺪ ﺗﻌﺪﻳﻠﻪ‪ ،‬ﻧﻜﺘﺐ ﺍﺳﻤﻪ ﺛﻢ )=( ﺛﻢ )‪ (:‬ﺛﻢ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻤﺨﺼﺼﺔ ﻟﻪ‬
‫ﻋﻠﻰ ﻫﻴﺌﺔ ﺑﺎﺭﺍﻣﺘﺮ‪.‬‬

‫ﻧﻘﻮﻡ ﺍﻵﻥ ﺑﺘﺤﺪﻳﺪ ﻗﻴﻤﺔ ﺍﻟﺒﺎﺭﺍﻣﺘﺮ ﺍﻟﻤﺮﺳﻞ ﻟﺠﻤﻠﺔ ‪ SQL‬ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫;‪OpQuery.ParamByName('contactid').AsInteger:=LastID‬‬

‫ﺛﻢ ﻧﻌﻄﻲ ﺍﻷﻣﺮ ﺑﺘﻨﻔﻴﺬ ﺍﻟﺘﻌﺪﻳﻞ‪:‬‬

‫;‪OpQuery.ExecSQL‬‬

‫ﻭﻻ ﻧﻨﺲ ﺃﻥ ﻧﺆﻛﺪ ﺍﻟﺘﺤﺪﻳﺚ ﻣﻦ ﺧﻼﻝ ﺍﻟﻌﻨﺼﺮ ‪ Trans‬ﺍﻟﻤﻮﺟﻮﺩ ﻋﻠﻰ ﺍﻟﻔﻮﺭﻡ ‪:frmMain‬‬

‫;‪frmMain.Trans.Commit‬‬

‫ﻋﻤﻠﻴﺔ ﺍﻹﺿﺎﻓﺔ‬

‫ﺍﻵﻥ ‪ ...‬ﺗﺤﺼﻠﻨﺎ ﻋﻠﻰ ﺭﻗﻢ ﺍﻟـ‪ id‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﺴﺠﻞ ﺍﻟﺠﺪﻳﺪ‪ ،‬ﻓﻠﻨﺸﺮﻉ ﻓﻲ ﻛﺘﺎﺑﺔ ﺃﻛﻮﺍﺩ ﻋﻤﻠﻴﺔ ﺍﻹﺿﺎﻓﺔ‪.‬‬

‫ﺗﺤﺖ ﺁﺧﺮ ﺳﻄﺮ ﻛﺘﺒﻨﺎﻩ ﻧﻜﺘﺐ‪:‬‬

‫‪Opquery.SQL.Text:='INSERT INTO Contacts VALUES(' +‬‬


‫‪':id,' +‬‬
‫‪':contactName,'+‬‬
‫‪':phoneNumbers,' +‬‬
‫;')‪':emailAddress‬‬

‫ﺻﻔﺤﺔ ‪36‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻭﻫﻲ ﺟﻤﻠﺔ ‪ SQL‬ﺧﺎﺻﺔ ﺑﺈﺩﺭﺍﺝ ﺳﺠﻞ ﺟﺪﻳﺪ‪ ،‬ﻭﺣﺪﺩﻧﺎ ﻓﻴﻬﺎ ﺑﺎﺭﺍﻣﺘﺮﺍﺕ ﺗﻤﺜﻞ‪:‬‬

‫ﺭﻗﻢ ﺍﻟـ‪.id‬‬ ‫‪‬‬


‫ﺍﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‪.‬‬ ‫‪‬‬
‫ﺃﺭﻗﺎﻡ ﺍﻟﻬﻮﺍﺗﻒ ‪.‬‬ ‫‪‬‬
‫ﺍﻟﺒﺮﻳﺪ ﺍﻹﻟﻜﺘﺮﻭﻧﻲ‪.‬‬ ‫‪‬‬

‫ﺍﻵﻥ ﻧﺮﺳﻞ ﻗﻴﻢ ﺍﻟﺒﺎﺭﺍﻣﺘﺮﺍﺕ‪:‬‬

‫;‪OpQuery.ParamByName('id').AsInteger:=LastID‬‬
‫;‪OpQuery.ParamByName('contactName').AsString:=txtContactName.Text‬‬
‫;‪OpQuery.ParamByName('phoneNumbers').AsString:=txtPhoneNumbers.Text‬‬
‫;‪OpQuery.ParamByName('emailAddress').AsString:=txtEmailAddress.Text‬‬

‫ﻛﻤﺎ ﻧﺮﻯ‪ ،‬ﻳﺠﺐ ﺗﺤﺪﻳﺪ ﻧﻮﻉ ﻛﻞ ﺑﺎﺭﺍﻣﺘﺮ ﺑﺤﻴﺚ ﻳﻜﻮﻥ ﻣﺘﻮﺍﻓﻘﺎً ﻣﻊ ﺍﻟﻨﻮﻉ ﺍﻟﻤﻘﺎﺑﻞ ﻟﻪ ﻓﻲ ﺍﻟﺠﺪﻭﻝ‪.‬‬

‫ﻭﻧﻌﻄﻲ ﺍﻷﻣﺮ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺴﺠﻞ ﺍﻟﺠﺪﻳﺪ‪:‬‬

‫;‪OpQuery.ExecSQL‬‬

‫ﻭﻛﻜﻞ ﻣﺮﺓ‪ ،‬ﻻ ﻧﻨﺲ ﺃﻥ ﻧﺆﻛﺪ ﺍﻟﺘﺤﺪﻳﺚ ﻣﻦ ﺧﻼﻝ ﺍﻟﻌﻨﺼﺮ ‪ Trans‬ﺍﻟﻤﻮﺟﻮﺩ ﻋﻠﻰ ﺍﻟﻔﻮﺭﻡ ‪:frmMain‬‬

‫;‪frmMain.Trans.Commit‬‬

‫ﻓﻲ ﻧﻬﺎﻳﺔ ﻫﺬﺍ ﺍﻹﺟﺮﺍﺀ‪ ،‬ﻧﻘﻮﻡ ﺑﺘﺤﺪﻳﺚ ﻣﺤﺘﻮﻳﺎﺕ ﺍﻟـ‪ dgvContacts‬ﻋﻦ ﻃﺮﻳﻖ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻹﺟﺮﺍﺀ‪:‬‬

‫;‪Update_Grid‬‬

‫ﺛﻢ ﺇﻏﻼﻕ ﺍﻟﻨﺎﻓﺬﺓ‪:‬‬

‫;‪Close‬‬

‫ﺻﻔﺤﺔ ‪37‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

:btnSave ‫ﻭﺑﺬﻟﻚ ﻳﻜﻮﻥ ﺍﻟﻜﻮﺩ ﺍﻟﻨﻬﺎﺋﻲ ﻟﻠﺰﺭ‬

procedure TfrmNewContact.btnSaveClick(Sender: TObject);


begin
if txtContactName.Text = '' then
begin
showmessage('‫;)'ﯾﺠﺐ ﻛﺘﺎﺑﺔ اﺳﻢ ﺟﮭﺔ اﻻﺗﺼﺎل‬
txtContactName.SetFocus;
exit;
end;

if txtPhoneNumbers.Text = '' then


begin
showmessage('‫;)'ﯾﺠﺐ ﻛﺘﺎﺑﺔ أرﻗﺎم اﻟﮭﻮاﺗﻒ‬
txtPhoneNumbers.SetFocus;
exit;
end;

// Getting last id
OpQuery.Close;
OpQuery.DataBase:= frmMain.conn;
OpQuery.SQL.Text:= 'SELECT * FROM Counters WHERE id = 1';
OpQuery.Open;

LastIDDataSource.DataSet:= OpQuery;

LastID:= LastIDDataSource.DataSet.FieldByName('contactid').AsInteger + 1;

OpQuery.SQL.Text:='UPDATE Counters SET contactid=:contactid WHERE id = 1';


OpQuery.ParamByName('contactid').AsInteger:=LastID;
OpQuery.ExecSQL;

frmMain.Trans.Commit;
// -------------- end getting last id --------------

Opquery.SQL.Text:='INSERT INTO Contacts VALUES(' +


':id,' +
':contactName,'+
':phoneNumbers,' +
':emailAddress)';
OpQuery.ParamByName('id').AsInteger:=LastID;

OpQuery.ParamByName('contactName').AsString:=txtContactName.Text;
OpQuery.ParamByName('phoneNumbers').AsString:=txtPhoneNumbers.Text;
OpQuery.ParamByName('emailAddress').AsString:=txtEmailAddress.Text;
OpQuery.ExecSQL;

frmMain.Trans.Commit;

Update_Grid;
close;
end;

38 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻭﻟﻜﻲ ﻧﺠﻬﺰ ﻟﻌﻤﻠﻴﺔ ﺍﻹﺿﺎﻓﺔ ﺍﻟﺘﺎﻟﻴﺔ‪ ،‬ﻧﻤﺴﺢ ﺻﻨﺎﺩﻳﻖ ﺍﻟﻨﺼﻮﺹ‪ ،‬ﻭﻧﺼﻔﺮ ﺍﻟﻤﺘﻐﻴﺮ ‪ ، LastID‬ﺛﻢ ﻧ ﻀﻊ‬
‫ﺍﻟﺘﺮﻛﻴﺰ ﻓﻲ ﺻﻨﺪﻭﻕ ﺍﻟﻨﺼﻮﺹ ﺍﻟﺨﺎﺹ ﺑﺎﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‪ ،‬ﻭﺫﻟﻚ ﺑﻜﺘﺎﺑﺔ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ ﻓﻲ ﺍﻟﺤﺪﺙ‬
‫‪ FormClose‬ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﻮﺭﻡ ‪:frmNewContact‬‬

‫;‪procedure TfrmNewContact.FormClose(Sender: TObject‬‬


‫;)‪var CloseAction: TCloseAction‬‬
‫‪begin‬‬
‫;‪txtContactName.Clear‬‬
‫;‪txtPhoneNumbers.Clear‬‬
‫;‪txtEmailAddress.Clear‬‬
‫;‪LastID:=0‬‬
‫;‪txtContactName.SetFocus‬‬
‫;‪end‬‬

‫ﻟﻮ ﺷﻐﻠﻨﺎ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻵﻥ‪ ،‬ﻭﻧﻘﺮﻧﺎ ﻋﻠﻰ ﺍﻟﺰﺭ )ﺟﺪﻳﺪ( ﻟﻦ ﻳﺤﺪﺙ ﺃﻱ ﺷﻲﺀ‪ ،‬ﻭﺍﻟﺴﺒﺐ ﻫﻮ ﺃﻧﻨﺎ ﻟﻢ ﻧﻜﺘﺐ ﺍﻟﻜﻮﺩ‬
‫ﺍﻟﺨﺎﺹ ﺑﺎﻟﻨﻘﺮ ﻋﻠﻰ ﻫﺬﺍ ﺍﻟﺰﺭ‪.‬‬

‫ﻧﺘﻘﻞ ﺇﻟﻰ ﺍﻟﻔﻮﺭﻡ ‪ ،frmMain‬ﻧﻨﻘﺮ ﻋﻠﻰ ﺍﻟﺰﺭ )ﺟﺪﻳﺪ( ﻧﻘﺮﺗﻴﻦ ﺳﺮﻳﻌﺘﻴﻦ ﻭﻧﻜﺘﺐ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ ﻓﻲ ﺣﺪﺙ‬
‫ﺍﻟﻨﻘﺮ ‪:‬‬

‫;)‪procedure TfrmMain.btnNewClick(Sender: TObject‬‬


‫‪begin‬‬
‫;‪frmNewContact.ShowModal‬‬
‫;‪end‬‬

‫ﺍﻵﻥ‪ ..‬ﻧﺸﻐﻞ‪ ،‬ﻭﻧﺠﺮﺏ‪.‬‬

‫ﺻﻔﺤﺔ ‪39‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺍﻟﺒﺤﺚ ﻋﻦ ﺍﻟﺴﺠﻼﺕ‬
‫ﺑﺎﻟﻨﻈﺮ ﺇﻟﻰ ﺍﻟﻨﺎﻓﺬﺓ ‪:frmMain‬‬

‫ﻧﺠﺪ ﺃﻥ ﻫﻨﺎﻙ‪:‬‬

‫ﺍﻟﻌﻨﺼﺮ ‪ :txtSeachInNames‬ﻟﻠﺒﺤﺚ ﺑﺎﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‪.‬‬ ‫‪‬‬


‫‪ ‬ﻭﺍﻟﻌﻨﺼﺮ ‪ : txtSearchInNumbrs‬ﻟﻠﺒﺤﺚ ﺑﺮﻗﻢ ﺍﻟﻬﺎﺗﻒ‪.‬‬

‫ﻭﺍﻟﻔﻜﺮﺓ ﻫﻲ ﺍﻟﺴﻤﺎﺡ ﻟﻠﻤﺴﺘﺨﺪﻡ ﺑﺎﻟﺒﺤﺚ ﻋﻦ ﺍﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ ﻣﺜﻼً ﺑﻤﺠﺮﺩ ﺇﺩﺧﺎﻝ ﺃﻭﻝ ﺣﺮﻑ‪ ،‬ﻓﻴﺘﻢ ﻓﻠﺘﺮﺓ‬
‫ﺍﻟﺴﺠﻼﺕ ﺍﻟﺘﻲ ﻳﻮﺟﺪ ﻓﻴﻬﺎ ﺫﻟﻚ ﺍﻟﺤﺮﻑ‪ ،‬ﺛﻢ ﺇﻋﺎﺩﺓ ﺍﻟﻔﻠﺘﺮﺓ ﻋﻨﺪ ﺇﺩﺧﺎﻝ ﺍﻟﺤﺮﻑ ﺍﻟﺜﺎﻧﻲ‪ ،‬ﻭﺍﻟﺜﺎﻟﺚ ﻭﻫﻜﺬﺍ‪،‬‬
‫ﻟﺘﻀﻴﻴﻖ ﺩﺍﺋﺮﺓ ﺍﻟﺒﺤﺚ‪ ،‬ﻭﻋﺮﺽ ﺍﻟﺴﺠﻼﺕ ﺍﻟﻤﻔﻠﺘﺮﺓ ﻟﺤﻈﻴﺎً ﻋﻠﻰ ﺍﻟﻌﻨﺼﺮ ‪.dgvContacts‬‬

‫ﻭﻓﻲ ﺣﺎﻝ ﻻ ﻳﻮﺟﺪ ﺗﻄﺎﺑﻖ ﺑﻴﻦ ﺍﻟﺤﺮﻭﻑ ﺍﻟﻤﺪﺧﻠﺔ ﻭﻧﻈﻴﺮﺗﻬﺎ ﻓﻲ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻻ ﻳﺘﻢ ﻋﺮﺽ ﺃﻱ ﺷﻲﺀ‬
‫ﻋﻠﻰ ﺍﻟـ‪.dgvContacts‬‬

‫ﻳﻌﻨﻲ ﺗﺘﻢ ﻋﻤﻠﻴﺔﺍﻟﻔﻠﺘﺮﺓ ﻭﻋﺮﺽ ﺍﻟﻤﻘﺘﺮﺣﺎﺕ ﻓﻲ ﻛﻞ ﻣﺮﺓ ﻳﺪﺧﻞ ﺍﻟﻤﺴﺘﺨﺪﻡ ﻓﻴﻬﺎ ﺣﺮﻓﺎً‪ ،‬ﺃﻭ ﺭﻗﻤﺎً‪.‬‬

‫ﺗﻤﺎﻣﺎً ﻣﺜﻞ ﻣﺎ ﻧﺒﺤﺚ ﻋﻦ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ ﻓﻲ ﺟﻬﺎﺯ ﺍﻟﻬﺎﺗﻒ‪.‬‬

‫ﺻﻔﺤﺔ ‪40‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺍﻟﺒﺤﺚ ﺑﺎﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‬

‫ﻧﻨﻘﺮ ﻋﻠﻰ ﺻﻨﺪﻭﻕ ﺍﻟﻨﺼﻮﺹ ‪ txtSearchInNames‬ﻧﻘﺮﺗﻴﻦ ﺳﺮﻳﻌﺘﻴﻦ‪ ،‬ﻓﻴﻈﻬﺮ ﺍﻟﻜﻮﺩ ﺍﻟﺨﺎﺹ ﺑﺎﻟﺤﺪﺙ‬
‫‪ Change‬ﺍﻟﺨﺎﺹ ﺑﻬﺬﺍ ﺍﻟﻌﻨﺼﺮ‪:‬‬

‫;)‪procedure TfrmMain.txtSearchInNamesChange(Sender: TObject‬‬


‫‪begin‬‬

‫;‪end‬‬

‫ﻓﻲ ﻛﻞ ﻣﺮﺓ ﻳﻘﻮﻡ ﺍﻟﻤﺴﺘﺨﺪﻡ ﺑﺈﺩﺧﺎﻝ ﺣﺮﻑ‪ ،‬ﻧﻘﻮﻡ ﺑﺎﻟﺒﺤﺚ ﻋﻦ ﻣﺎ ﻳﺸﺎﺑﻪ ﺍﻟﻤﻜﺘﻮﺏ ﻓﻲ‬
‫‪ txtSearchInNames.Text‬ﻓﻲ ﺳﺠﻼﺕ ﺍﻟﺠﺪﻭﻝ ‪ ،Contacts‬ﻭﻋﺮﺽ ﺍﻟﻨﺘﻴﺠﺔ ﻋﻠﻰ ﺍﻟـ‪.dgvContacts‬‬
‫ﺃﻣﺎ ﺇﻥ ﻟﻢ ﻧﺠﺪ ﺗﺸﺎﺑﻬﺎً ﺃﻭ ﺗﻄﺎﺑﻘﺎً‪ ،‬ﻓﻼ ﻳﺘﻢ ﻋﺮﺽ ﺃﻱ ﺷﻲﺀ‪.‬‬

‫ﻧﻜﺘﺐ ﺑﻴﻦ ‪ Begin‬ﻭ ‪:End‬‬

‫‪if txtSearchInNames.Text = '' then‬‬


‫‪begin‬‬
‫;‪Update_Grid‬‬
‫;‪exit‬‬
‫;‪end‬‬

‫ﻭﻓﻲ ﺍﻟﻜﻮﺩ ﺍﻟﺴﺎﺑﻖ‪ ،‬ﻧﻔﺤﺺ ﺍﻟﻤﻜﺘﻮﺏ ﻓﻲ ﺍﻟﻌﻨﺼﺮ ‪ ،txtSearchInNames‬ﻓﺈﻥ ﻛﺎﻥ ﻓﺮﺍﻏﺎً‪ ،‬ﻧﻌﺮﺽ ﻛﺎﻓﺔ‬
‫ﺍﻟﺴﺠﻼﺕ ﻋﻠﻰ ‪ dgvContacts‬ﺛﻢ ﻧﺨﺮﺝ ﻣﻦ ﺍﻹﺟﺮﺍﺀ‪ .‬ﺃﻣﺎ ﺇﻥ ﻟﻢ ﻳﻜﻦ ﻓﺮﺍﻏﺎً‪ ،‬ﺃﻱ ﺃﻥ ﺍﻟـ‬
‫‪ txtSearchInNames‬ﻳﺤﺘﻮﻱ ﻋﻠﻰ ﺣﺮﻑ ﻋﻠﻰ ﺍﻷﻗﻞ‪ ،‬ﻓﻨﺒﺤﺚ ﻓﻲ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻦ ﺍﻟﺴﺠﻼﺕ ﺍﻟﺘﻲ‬
‫ﻳﻜﻮﻥ ﻓﻴﻬﺎ ﺣﻘﻞ ﺍﻟـ‪ contactName‬ﻣﺸﺎﺑﻬﺎً ﻟﻠﻘﻴﻤﺔ ﺍﻟﻤﻌﻄﺎﺓ ﻓﻲ ‪:txtSearchInNames‬‬

‫;‪UpdateQuery.Close‬‬
‫‪UpdateQuery.SQL.Text:='SELECT * FROM Contacts ' +‬‬
‫'‪'WHERE contactName LIKE ''%‬‬
‫;'''‪+ txtSearchInNames.Text + '%‬‬
‫;‪UpdateQuery.Open‬‬

‫ﺑﻌﺪ ﺫﻟﻚ‪ ،‬ﻧﺮﺑﻂ ﺑﻴﻦ ﺍﻟـ ‪ UpdateQuery‬ﻭ‪:UpdateDataSource‬‬

‫;‪UpdateDataSource.DataSet:=UpdateQuery‬‬

‫ﺛﻢ ﻧﺮﺑﻂ ﺑﻴﻦ ﺍﻟـ‪ dgvContacts‬ﻭﺍﻟـ‪:UdateDataSource‬‬

‫;‪dgvContacts.DataSource:=UpdateDataSource‬‬

‫ﺻﻔﺤﺔ ‪41‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

:dgvCntacts‫ ﻧﺴﺘﺪﻋﻲ ﺇﺟﺮﺍﺀ ﺗﻨﺴﻴﻖ ﺍﻟـ‬،ً‫ﻭﺃﺧﻴﺮﺍ‬

Get_Grid_Ready;

:‫ﻭﻓﻴﻤﺎ ﻳﻠﻲ ﺍﻹﺟﺮﺍﺀ ﺑﺎﻟﻜﺎﻣﻞ‬

procedure TfrmMain.txtSearchInNamesChange(Sender: TObject);


begin
if txtSearchInNames.Text = '' then
begin
Update_Grid;
exit;
end;
UpdateQuery.Close;
UpdateQuery.SQL.Text:='SELECT * FROM Contacts ' +
'WHERE contactName LIKE ''%'
+ txtSearchInNames.Text + '%''';
UpdateQuery.Open;
UpdateDataSource.DataSet:=UpdateQuery;
dgvContacts.DataSource:=UpdateDataSource;
Get_Grid_Ready;
end;

‫ﺍﻟﺒﺤﺚ ﺑﺮﻗﻢ ﺍﻟﻬﺎﺗﻒ‬

‫ ﺍﻟﻜﻮﺩ‬Change ‫ ﻭﻧﻜﺘﺐ ﻓﻲ ﺣﺪﺙ ﺍﻟـ‬،‫ ﻧﻘﺮﺗﻴﻦ ﺳﺮﻳﻌﺘﻴﻦ‬txtSearchInNumbers ‫ﻧﻨﻘﺮ ﻋﻠﻰ ﺍﻟﻌﻨﺼﺮ‬


: ‫ﺍﻟﺘﺎﻟﻲ‬

procedure TfrmMain.txtSearchInNumbersChange(Sender: TObject);


begin
if txtSearchInNumbers.Text = '' then
begin
Update_Grid;
exit;
end;
UpdateQuery.Close;
UpdateQuery.SQL.Text:='SELECT * FROM Contacts ' +
'WHERE phoneNumbers LIKE ''%'
+ txtSearchInNumbers.Text + '%''';
UpdateQuery.Open;
UpdateDataSource.DataSet:=UpdateQuery;
dgvContacts.DataSource:=UpdateDataSource;
Get_Grid_Ready;
end;

. ‫ ﻭﺍﻟﺤﻘﻞ ﺍﻟﺬﻱ ﻧﺮﻳﺪ ﺍﻟﺒﺤﺚ ﻣﻦ ﺧﻼﻟﻪ‬،‫ ﻓﻘﻂ ﻏﻴﺮﻧﺎ ﺍﺳﻢ ﺻﻨﺪﻭﻕ ﺍﻟﻨﺼﻮﺹ‬،‫ﻭﻫﻮ ﻧﻔﺲ ﺍﻟﻜﻮﺩ ﺍﻟﺴﺎﺑﻖ‬

. ‫ﻧﺸﻐﻞ ﻭﻧﺠﺮﺏ‬

42 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺗﻌﺪﻳﻞ ‪ /‬ﺣﺬﻑ ﺍﻟﺴﺠﻼﺕ‬


‫ﻟﺒﺮﻣﺠﺔ ﺟﺰﺋﻴﺔ ﺍﻟﺘﻌﺪﻳﻞ ﺃﻭ ﺍﻟﺤﺬﻑ‪ ،‬ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻧﺎﻓﺬﺓ ﺟﺪﻳﺪﺓ‪ ،‬ﻭﻧﺴﻤﻴﻬﺎ ‪ ،frmEditDelete‬ﻭﺍﻟﻮﺣﺪﺓ‬
‫ﺍﻟﺨﺎﺻﺔ ﺑﻬﺎ ﻧﺴﻤﻴﻬﺎ ‪ frmEditDeleteUnit‬ﻭﻧﻀﻊ ﻋﻠﻴﻬﺎ ﺍﻟﻌﻨﺎﺻﺮ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﺍﻟﻘﻴﻤﺔ‬ ‫ﺍﻟﺨﺎﺻﻴﺔ‬ ‫ﺍﻟﻌﻨﺼﺮ‬


‫‪txtContactName‬‬ ‫‪Name‬‬ ‫‪TEdit‬‬
‫‪txtPhoneNumbers‬‬ ‫‪Name‬‬ ‫‪TEdit‬‬
‫‪txtEmailAddress‬‬ ‫‪Name‬‬ ‫‪TEdit‬‬
‫‪btnSave‬‬ ‫‪Name‬‬
‫‪TButton‬‬
‫ﺣﻔﻆ‬ ‫‪Caption‬‬
‫‪btnCancel‬‬ ‫‪Name‬‬
‫‪TButton‬‬
‫ﺇﻟﻐﺎﺀ ﺍﻷﻣﺮ‬ ‫‪Caption‬‬
‫‪chkDelete‬‬ ‫‪Name‬‬
‫ﺣﺬﻑ ؟‬ ‫‪Caption‬‬ ‫‪TCheckBox‬‬
‫‪False‬‬ ‫‪Checked‬‬
‫‪OpQuery‬‬ ‫‪Name‬‬ ‫‪TSQLQuery‬‬

‫ﻭﻧﻨﺴﻘﻬﺎ ﺑﺤﻴﺚ ﻧﺤﺼﻞ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻧﻘﻮﻡ ﺑﺎﻟﺘﻌﺮﻳﻒ ﺍﻟﻤﺘﺒﺎﺩﻝ ﺑﻴﻦ ‪ frmMainUnit‬ﻭ‪ MainWindowSetup‬ﻣﻦ ﺟﻬﺔ ﻭﺍﻟﻮﺣﺪﺓ‬


‫‪ frmEditDelete‬ﻣﻦ ﺟﻬﺔ ﺃﺧﺮﻯ‪.‬‬

‫ﺻﻔﺤﺔ ‪43‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺍﻟﻔﻜﺮﺓ ﻛﺎﻟﺘﺎﻟﻲ‪ :‬ﻓﻲ ﺍﻟﻨﺎﻓﺬﺓ ﺍﻟﺮﺋﻴﺴﻴﺔ‪ ،‬ﻳﺨﺘﺎﺭ ﺍﻟﻤﺴﺘﺨﺪﻡ ﺳﺠﻼً ﻣﻌﻴﻨﺎً ﺑﺎﻟﻨﻘﺮ ﺍﻟﻤﺰﺩﻭﺝ ﻋﻠﻴﻪ‪ ،‬ﻭﺑﺬﻟﻚ ﻳﺘﻢ‬
‫ﺗﻔﻌﻴﻞ ﺍﻟﺰﺭ )ﺗﻌﺪﻳﻞ(‪ ،‬ﻭﻋﻨﺪ ﺍﻟﻨﻘﺮ ﻋﻠﻴﻪ ﻳﺘﻢ ﺇﺭﺳﺎﻝ ﺑﻴﺎﻧﺎﺕ ﺍﻟﺴﺠﻞ ﺇﻟﻰ ﺍﻟﻔﻮﺭﻡ ‪ ،frmEditDelete‬ﻭﻳﺘﻢ‬
‫ﻋﺮﺿﻪ ﺃﻣﺎﻡ ﺍﻟﻤﺴﺘﺨﺪﻡ ﻟﻴﺘﺨﺬ ﻗﺮﺍﺭﻩ ﺇﻣﺎ ﺑﺎﻟﺘﻌﺪﻳﻞ‪ ،‬ﺃﻭ ﺑﺎﻟﺤﺬﻑ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﺘﺄﺷﻴﺮ ﻋﻠﻰ ﺍﻟﺨﻴﺎﺭ )ﺣﺬﻑ ؟(‬
‫ﺃﺳﻔﻞ ﺍﻟﻔﻮﺭﻡ‪ ،‬ﺛﻢ ﺍﻟﻨﻘﺮ ﻋﻠﻰ ﺍﻟﺰﺭ )ﺣﻔﻆ(‪.‬‬

‫ﻧﺒﺮﻣﺞ ﺍﻟﺰﺭ ﺇﻟﻐﺎﺀ ﺍﻷﻣﺮ ﻭﻧﻜﺘﺐ ﻓﻲ ﺣﺪﺙ ﺍﻟﻨﻘﺮ ﺍﻟﺨﺎﺹ ﺑﻪ ﻣﺎ ﻳﻠﻲ‪:‬‬

‫;)‪procedure TfrmEditDelete.btnCancelClick(Sender: TObject‬‬


‫‪begin‬‬
‫;‪close‬‬
‫;‪end‬‬

‫ﺍﻵﻥ‪ ..‬ﻧﺤﺘﺎﺝ ﺇﻟﻰ ﺗﻌﺮﻳﻒ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻤﺘﻐﻴﺮﺍﺕ ﺍﻟﻌﻤﻮﻣﻴﺔ ‪ ،Public‬ﻓﻨﺼﻌﺪ ﺇﻟﻰ ﺑﺪﺍﻳﺔ ﺍﻟﻮﺣﺪﺓ‬
‫‪ ،frmEditDeleteUnit‬ﻭﺗﺤﺖ ﺍﻟﻘﺴﻢ ‪ Public‬ﻧﻜﺘﺐ‪:‬‬

‫‪public‬‬
‫} ‪{ public declarations‬‬
‫;‪ContactID: Integer‬‬
‫;‪ContactName: String‬‬
‫;‪ContactPhones: String‬‬
‫;‪ContactEmail: String‬‬

‫ﺣﻴﺚ ‪ ContactID‬ﻳﻤﺜﻞ ﺭﻗﻢ ﺍﻟـ ‪ id‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﺴﺠﻞ‪ ContactName ،‬ﻳﻤﺜﻞ ﺍﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‪،‬‬
‫‪ ContactPhones‬ﻳﻤﺜﻞ ﺃﺭﻗﺎﻡ ﺍﻟﻬﻮﺍﺗﻒ‪ ،‬ﻭ‪ ContactEmail‬ﻳﻤﺜﻞ ﺍﻟﺒﺮﻳﺪ ﺍﻹﻟﻜﺘﺮﻭﻧﻲ ‪.‬‬

‫ﻫﺬﻩ ﺍﻟﻤﺘﻐﻴﺮﺍﺕ ﺳﺘﺴﺘﻘﺒﻞ ﺍﻟﻘﻴﻢ ﺍﻟﻤﺮﺳﻠﺔ ﻣﻦ ﺍﻟﻔﻮﺭﻡ ‪ frmMain‬ﺇﻟﻰ ﺍﻟﻔﻮﺭﻡ ‪.frmEditDelete‬‬

‫ﻓﻲ ﺣﺪﺙ ‪ ،FormActivate‬ﻧﻜﺘﺐ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ‪:‬‬

‫;‪Opquery.Close‬‬
‫;‪Opquery.DataBase:=frmMain.conn‬‬

‫ﻭﺫﻟﻚ ﻟﻠﺮﺑﻂ ﺑﻴﻦ ﺍﻟﻌﻨﺼﺮ ‪ OpQuery‬ﻭﺍﻟـ ‪ Conn‬ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﻮﺭﻡ ‪.frmMain‬‬

‫ﺛﻢ ﻧﻘﻮﻡ ﺑﻮﺿﻊ ﺍﻟﻘﻴﻢ ﺍﻟﻤﺴﺘﻘﺒﻠﺔ ﻣﻦ ﺍﻟﻔﻮﺭﻡ ﺍﻟﺮﺋﻴﺴﻲ ﻓﻲ ﻣﺎ ﻳﻘﺎﺑﻠﻬﺎ ﻣﻦ ﺻﻨﺎﺩﻳﻖ ﺍﻟﻨﺼﻮﺹ ﻋﻠﻰ‬
‫ﺍﻟﻔﻮﺭﻡ ﺍﻟﺤﺎﻟﻲ‪:‬‬

‫;‪txtContactName.Text:=ContactName‬‬
‫;‪txtPhoneNumbers.Text:=ContactPhones‬‬
‫;‪txtEmailAddress.Text:=ContactEmail‬‬

‫ﺻﻔﺤﺔ ‪44‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

:‫ ﻓﻲ ﺍﻟﺼﻨﺪﻭﻕ ﺍﻷﻭﻝ ﺍﻟﺨﺎﺹ ﺑﺎﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ‬Focus ‫ﺛﻢ ﻭﺿﻊ ﺍﻟﺘﺮﻛﻴﺰ‬

txtContactName.SelectAll;
:‫ﻓﻴﻜﻮﻥ ﺍﻟﻜﻮﺩ ﻛﺎﻣﻼً ﻛﺎﻟﺘﺎﻟﻲ‬

procedure TfrmEditDelete.FormActivate(Sender: TObject);


begin
Opquery.Close;
Opquery.DataBase:=frmMain.conn;

txtContactName.Text:=ContactName;
txtPhoneNumbers.Text:=ContactPhones;
txtEmailAddress.Text:=ContactEmail;

txtContactName.SelectAll;
end;

.ContactID ‫ ﻟﺪﻳﻨﺎ ﺭﻗﻢ ﺍﻟﺤﻘﻞ ﺍﻟﻤﻄﻠﻮﺏ ﺗﻌﺪﻳﻞ ﺑﻴﺎﻧﺎﺗﻪ ﺃﻭ ﺣﺬﻓﻪ ﻣﺨﺰﻧﺎً ﻓﻲ ﺍﻟﻤﺘﻐﻴﺮ‬..‫ﺍﻵﻥ‬

:‫ ﻧﻜﺘﺐ ﻓﻲ ﻛﻮﺩ ﺣﺪﺙ ﺍﻟﻨﻘﺮ‬،(‫ﻧﺄﺗﻲ ﻟﺒﺮﻣﺠﺔ ﺍﻟﺰﺭ )ﺣﻔﻆ‬

if txtContactName.Text = '' then


begin
showmessage('‫;)'ﯾﺠﺐ ﻛﺘﺎﺑﺔ اﺳﻢ ﺟﮭﺔ اﻻﺗﺼﺎل‬
txtContactName.SetFocus;
exit;
end;

if txtPhoneNumbers.Text = '' then


begin
showmessage('‫;)'ﯾﺠﺐ ﻛﺘﺎﺑﺔ أرﻗﺎم اﻟﮭﻮاﺗﻒ‬
txtPhoneNumbers.SetFocus;
exit;
end;

.‫ﻭﻫﻮ ﻧﻔﺲ ﺍﻟﻜﻮﺩ ﺍﻟﺬﻱ ﺍﺳﺘﺨﺪﻣﻨﺎﻩ ﻟﻔﺤﺺ ﺍﻟﻤﺪﺧﻼﺕ ﻓﻲ ﻋﻤﻠﻴﺔ ﺍﻹﺿﺎﻓﺔ‬

،‫ ﻓﺈﻥ ﻛﺎﻥ ﻣﺆﺷﺮﺍً )ﻋﻠﻴﻪ ﻋﻼﻣﺔ ﺻﺢ( ﻧﻘﻮﻡ ﺑﺤﺬﻑ ﺍﻟﺴﺠﻞ ﺍﻟﺤﺎﻟﻲ‬،chkDelete ‫ﺑﻌﺪ ﺫﻟﻚ ﻧﻔﺤﺺ ﺍﻟﻌﻨﺼﺮ‬
:‫ﻭﺗﺤﺪﻳﺚ ﺍﻟﻔﻮﺭﻡ ﺍﻟﺮﺋﻴﺴﻲ‬

if chkDelete.Checked = true then


begin
OpQuery.SQL.Text:='DELETE FROM Contacts WHERE id=:id';
OpQuery.ParamByName('id').AsInteger:=ContactID;
OpQuery.ExecSQL;
frmMain.Trans.Commit;
Update_Grid;
end;

45 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

:‫ ﻓﻬﺬﺍ ﻳﻌﻨﻲ ﺃﻥ ﺍﻟﻌﻤﻠﻴﺔ ﺗﻌﺪﻳﻞ ﻋﻠﻰ ﺍﻟﺴﺠﻞ ﺍﻟﺤﺎﻟﻲ‬،‫ﺃﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﻏﻴﺮ ﻣﺆﺷﺮ ﺑﻌﻼﻣﺔ ﺻﺢ‬

if chkDelete.Checked = false then


begin
OpQuery.SQL.Text:='UPDATE Contacts SET ' +
'contactName=:contactName, ' +
'phoneNumbers=:phoneNumbers, ' +
'emailAddress=:emailAddress ' +
' WHERE id=:id';
OpQuery.ParamByName('contactName').AsString:=txtContactName.Text;
OpQuery.ParamByName('phoneNumbers').AsString:=txtPhoneNumbers.Text;
OpQuery.ParamByName('emailAddress').AsString:=txtEmailAddress.Text;
OpQuery.ParamByName('id').AsInteger:=ContactID;
OpQuery.ExecSQL;
frmMain.Trans.Commit;
Update_Grid;
end;
:‫ ﻧﻘﻮﻡ ﺑﺈﻏﻼﻕ ﺍﻟﻔﻮﺭﻡ ﺍﻟﺤﺎﻟﻲ‬،ً‫ﻭﺃﺧﻴﺮﺍ‬

close;
: ً‫ﻭﻓﻴﻤﺎ ﻳﻠﻲ ﺍﻟﻜﻮﺩ ﻛﺎﻣﻼ‬

procedure TfrmEditDelete.btnSaveClick(Sender: TObject);


begin
if txtContactName.Text = '' then
begin
showmessage('‫;)'ﯾﺠﺐ ﻛﺘﺎﺑﺔ اﺳﻢ ﺟﮭﺔ اﻻﺗﺼﺎل‬
txtContactName.SetFocus;
exit;
end;
if txtPhoneNumbers.Text = '' then
begin
showmessage('‫;)'ﯾﺠﺐ ﻛﺘﺎﺑﺔ أرﻗﺎم اﻟﮭﻮاﺗﻒ‬
txtPhoneNumbers.SetFocus;
exit;
end;
if chkDelete.Checked = true then
begin
OpQuery.SQL.Text:='DELETE FROM Contacts WHERE id=:id';
OpQuery.ParamByName('id').AsInteger:=ContactID;
OpQuery.ExecSQL;
frmMain.Trans.Commit;
Update_Grid;
end;
if chkDelete.Checked = false then
begin
OpQuery.SQL.Text:='UPDATE Contacts SET ' +
'contactName=:contactName, ' +
'phoneNumbers=:phoneNumbers, ' +
'emailAddress=:emailAddress ' +
' WHERE id=:id';
OpQuery.ParamByName('contactName').AsString:=txtContactName.Text;
OpQuery.ParamByName('phoneNumbers').AsString:=txtPhoneNumbers.Text;
OpQuery.ParamByName('emailAddress').AsString:=txtEmailAddress.Text;
OpQuery.ParamByName('id').AsInteger:=ContactID;
OpQuery.ExecSQL;
frmMain.Trans.Commit;
Update_Grid;
end;
close;
end;

46 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

‫ ﻧﻜﺘﺐ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ ﻓﻲ ﺣﺪﺙ ﺍﻹﻏﻼﻕ ﻟﻠﻔﻮﺭﻡ‬،‫ ﺍﻟﺤﺬﻑ ﺍﻟﺘﺎﻟﻴﺔ‬/ ‫ﻭﻟﻠﺘﻤﻬﻴﺪ ﻟﻌﻤﻠﻴﺔ ﺍﻟﺘﻌﺪﻳﻞ‬
:frmEditDelete

procedure TfrmEditDelete.FormClose(Sender: TObject;


var CloseAction: TCloseAction);
begin
txtContactName.Clear;
txtPhoneNumbers.Clear;
txtEmailAddress.Clear;

ContactID:=0;
ContactName:='';
ContactPhones:='';
ContactEmail:='';
chkDelete.Checked:=False;
end;

‫ ﻟﻠﺘﺠﻬﻴﺰ‬frmMain ‫ ﻭﺍﻵﻥ ﻧﻘﻮﻡ ﺑﺒﺮﻣﺠﺔ ﺍﻟﻔﻮﺭﻡ‬،frmEditDelete ‫ﻛﺎﻥ ﻫﺬﺍ ﻣﺎ ﻳﺘﻌﻠﻖ ﺑﺒﺮﻣﺠﺔ ﺍﻟﻔﻮﺭﻡ‬
.‫ ﺍﻟﺤﺬﻑ‬/ ‫ﻟﻌﻤﻠﻴﺔ ﺍﻟﺘﻌﺪﻳﻞ‬

‫ ﻫﻨﺎ ﻓﻲ ﺍﻟﻔﻮﺭﻡ‬frmEditDelete ‫ ﻧﻌﺮﻑ ﻧﻔﺲ ﺍﻟﻤﺘﻐﻴﺮﺍﺕ ﺍﻟﺘﻲ ﻋﺮﻓﻨﺎﻫﺎ ﻋﻠﻰ ﺍﻟﻔﻮﺭﻡ‬،‫ﻓﻲ ﺍﻟﺒﺪﺍﻳﺔ‬
:‫ ﻭﻛﻤﺎ ﻳﻠﻲ‬Private ‫ ﺗﺤﺖ ﺍﻟﻘﺴﻢ‬،‫ﺍﻟﺮﺋﻴﺴﻲ‬

private
{ private declarations }
ContactID: Integer;
ContactName: String;
ContactPhones: String;
ContactEmail: String;

‫ ﻭﻧﻨﺘﻘﻞ ﺇﻟﻰ ﻧﺎﻓﺬﺓ‬،‫ ﻧﺨﺘﺎﺭﻫﺎ ﻓﻲ ﻭﺿﻊ ﺍﻟﺘﺼﻤﻴﻢ‬،dgvContacts‫ﻧﺒﺮﻣﺞ ﺣﺪﺙ ﺍﻟﻨﻘﺮ ﺍﻟﻤﺰﺩﻭﺝ ﻟﻠـ‬
:‫ ﻓﻨﻜﺘﺐ ﺍﻟﻜﻮﺩ ﺍﻟﺘﺎﻟﻲ‬،‫ ﻧﺨﺘﺎﺭ ﺣﺪﺙ ﺍﻟﻨﻘﺮ ﺍﻟﻤﺰﺩﻭﺝ‬Events ‫ ﻓﻲ ﺍﻟﺘﺒﻮﻳﺐ‬،‫ﺍﻟﺨﺼﺎﺋﺺ‬

procedure TfrmMain.dgvContactsDblClick(Sender: TObject);


begin
if dgvContacts.DataSource.DataSet.FieldByName('id').AsInteger > 0 then
begin
pnlSelectedContact.Caption:=
dgvContacts.DataSource.DataSet.FieldByName('contactName').AsString;

ContactID:=
dgvContacts.DataSource.DataSet.FieldByName('id').AsInteger;

ContactName:=
dgvContacts.DataSource.DataSet.FieldByName('contactName').AsString;

ContactPhones:=
dgvContacts.DataSource.DataSet.FieldByName('phoneNumbers').AsString;

ContactEmail:=
dgvContacts.DataSource.DataSet.FieldByName('emailAddress').AsString;
btnEdit.Enabled:=true;
end

47 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬


‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫‪else begin‬‬
‫;''=‪pnlSelectedContact.Caption:‬‬
‫;‪ContactID:= 0‬‬
‫;'' =‪ContactName:‬‬
‫;'' =‪ContactPhones:‬‬
‫;'' =‪ContactEmail:‬‬
‫;‪btnEdit.Enabled:=false‬‬
‫;‪end‬‬
‫;‪end‬‬
‫ﻭﻓﻲ ﺍﻟﻜﻮﺩ ﺍﻟﺴﺎﺑﻖ‪:‬‬

‫ﺗﻢ ﻓﺤﺺ ﻗﻴﻤﺔ ﺣﻘﻞ ﺍﻟـ‪ id‬ﻟﻠﺼﻒ ﺍﻟﻤﺤﺪﺩ ﻓﻲ ﺍﻟـ‪ ،dgvContacts‬ﻓﺈﻥ ﻛﺎﻧﺖ ﻗﻴﻤﺘﻪ ﺃﻛﺒﺮ ﻣﻦ‬ ‫‪‬‬
‫ﺍﻟﺼﻔﺮ‪ ،‬ﻳﻌﻨﻲ ﺗﻢ ﺍﺧﺘﻴﺎﺭ ﺳﺠﻞ ﺣﻘﻴﻘﻲ‪ ،‬ﻭﺑﺎﻟﺘﺎﻟﻲ ﻧﻘﻮﻡ ﺑﺘﺨﺼﻴﺺ ﻗﻴﻢ ﺍﻟﺤﻘﻮﻝ ﺇﻟﻰ ﻣﺎ ﻳﻘﺎﺑﻠﻬﺎ‬
‫ﻣﻦ ﻣﺘﻐﻴﺮﺍﺕ‪.‬‬
‫ﻃﺒﺎﻋﺔ ﺍﺳﻢ ﺟﻬﺔ ﺍﻻﺗﺼﺎﻝ ﻋﻠﻰ ﺍﻟﻌﻨﺼﺮ ‪ pnlSelectedContact‬ﻛﻲ ﻳﺮﺍﻩ ﺍﻟﻤﺴﺘﺨﺪﻡ ﻭﻳﺘﺄﻛﺪ‬ ‫‪‬‬
‫ﺑﺄﻧﻪ ﺍﺧﺘﺎﺭ ﺍﻟﺴﺠﻞ ﺍﻟﻤﻄﻠﻮﺏ‪.‬‬
‫ﺗﻔﻌﻴﻞ ﺍﻟﺰﺭ )ﺗﻌﺪﻳﻞ( ﻹﺗﺎﺣﺔ ﺍﻟﻔﺮﺻﺔ ﻟﻠﻤﺴﺘﺨﺪﻡ ﺑﺎﻟﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻟﺘﻌﺪﻳﻞ ﺃﻭ ﺍﻟﺤﺬﻑ‪.‬‬ ‫‪‬‬
‫ﺃﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪﻡ ﺍﺧﺘﻴﺎﺭ ﺳﺠﻞ‪ ،‬ﻓﻴﺘﻢ ﺗﺼﻔﻴﺮ ﺭﻗﻢ ﺍﻟـ‪ id‬ﻭﻣﺴﺢ ﻗﻴﻢ ﺑﻘﻴﺔ ﺍﻟﻤﺘﻐﻴﺮﺍﺕ‪ ،‬ﺛﻢ ﺇﺑﻄﺎﻝ‬ ‫‪‬‬
‫ﻋﻤﻞ ﺍﻟﺰﺭ )ﺗﻌﺪﻳﻞ(‪.‬‬

‫ﻧﺄﺗﻲ ﺍﻵﻥ ﻟﺒﺮﻣﺠﺔ ﺍﻟﺰﺭ )ﺗﻌﺪﻳﻞ( ﻭﺍﻟﺬﻱ ﻳﻌﻤﻞ ﻓﻘﻂ ﻓﻲ ﺣﺎﻝ ﺍﺧﺘﻴﺎﺭ ﺳﺠﻞ ﻣﻦ ﺍﻟـ‪: dgvContacts‬‬

‫;)‪procedure TfrmMain.btnEditClick(Sender: TObject‬‬


‫‪begin‬‬
‫;‪frmEditDelete.ContactID:=ContactID‬‬
‫;‪frmEditDelete.ContactName:=ContactName‬‬
‫;‪frmEditDelete.ContactPhones:=ContactPhones‬‬
‫;‪frmEditDelete.ContactEmail:=ContactEmail‬‬
‫;‪frmEditDelete.ShowModal‬‬

‫;''=‪pnlSelectedContact.Caption:‬‬
‫;‪ContactID:= 0‬‬
‫;'' =‪ContactName:‬‬
‫;'' =‪ContactPhones:‬‬
‫;'' =‪ContactEmail:‬‬
‫;‪btnEdit.Enabled:=false‬‬
‫;‪end‬‬
‫ﺣﻴﺚ ﺗﻢ‪:‬‬

‫ﺇﺭﺳﺎﻝ ﻗﻴﻤﺔ ﺍﻟﻤﺘﻐﻴﺮ ‪ ContactID‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﻔﻮﺭﻡ ‪.frmEditDelete‬‬ ‫‪‬‬


‫ﺇﺭﺳﺎﻝ ﻗﻴﻤﺔ ﺍﻟﻤﺘﻐﻴﺮ ‪ ContactName‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﻔﻮﺭﻡ ‪.frmEditDelete‬‬ ‫‪‬‬
‫ﺇﺭﺳﺎﻝ ﻗﻴﻤﺔ ﺍﻟﻤﺘﻐﻴﺮ ‪ ContactPhones‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﻔﻮﺭﻡ ‪.frmEditDelete‬‬ ‫‪‬‬
‫ﺇﺭﺳﺎﻝ ﻗﻴﻤﺔ ﺍﻟﻤﺘﻐﻴﺮ ‪ ContactEmail‬ﺍﻟﺨﺎﺹ ﺑﺎﻟﻔﻮﺭﻡ ‪.frmEditDelete‬‬ ‫‪‬‬
‫ﺛﻢ ﺇﻇﻬﺎﺭ ﺍﻟﻔﻮﺭﻡ ‪. frmEditDelete‬‬ ‫‪‬‬

‫ﺻﻔﺤﺔ ‪48‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻭﺑﻌﺪ ﺍﻟﻘﻴﺎﻡ ﺑﻤﺎ ﻫﻮ ﻣﻄﻠﻮﺏ ﻭﺇﻏﻼﻕ ﺍﻟﻔﻮﺭﻡ ‪ ،frmEditDelete‬ﻧﻘﻮﻡ ﺑﺘﺼﻔﻴﺮ ﺍﻟﻤﺘﻐﻴﺮﺍﺕ ﻋﻠﻰ‬ ‫‪‬‬
‫ﺍﻟﻔﻮﺭﻡ ‪.frmMain‬‬

‫ﺯﺭ ﺍﻟﺘﺤﺪﻳﺚ‬

‫ﻭﻇﻴﻔﺔ ﻫﺬﺍ ﺍﻟﺰﺭ ﻫﻮ ﺇﻟﻐﺎﺀ ﻋﻤﻠﻴﺔ ﺍﺧﺘﻴﺎﺭ ﺳﺠﻞ ﻣﻌﻴﻦ‪ ،‬ﻭﺗﺼﻔﻴﺮ ﺍﻟﻤﺘﻐﻴﺮﺍﺕ‪ ،‬ﻭﻣﺴﺢ ﺻﻨﺎﺩﻳﻖ ﻧﺼﻮﺹ‬
‫ﺍﻟﺒﺤﺚ‪ ،‬ﻭﺇﺑﻄﺎﻝ ﻋﻤﻞ ﺍﻟﺰﺭ )ﺗﻌﺪﻳﻞ(‪ ،‬ﻭﺃﺧﻴﺮﺍً ﻋﺮﺽ ﺳﺠﻼﺕ ﺍﻟﺠﺪﻭﻝ ‪:Contacts‬‬

‫;)‪procedure TfrmMain.btnRefreshClick(Sender: TObject‬‬


‫‪begin‬‬
‫;‪txtSearchInNames.Clear‬‬
‫;‪txtSearchInNumbers.Clear‬‬
‫;''=‪pnlSelectedContact.Caption:‬‬
‫;‪ContactID:= 0‬‬
‫;'' =‪ContactName:‬‬
‫;'' =‪ContactPhones:‬‬
‫;'' =‪ContactEmail:‬‬
‫;‪btnEdit.Enabled:=false‬‬
‫;‪Update_Grid‬‬
‫;‪end‬‬

‫ﻧﺸﻐﻞ ﻭﻧﺠﺮﺏ ‪.‬‬

‫ﺻﻔﺤﺔ ‪49‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺇﻧﺸﺎﺀ ﺍﻟﺘﻘﺮﻳﺮ‬
‫ﺳﺄﻓﺘﺮﺽ– ﻋﺰﻳﺰﻱ – ﺃﻥ ﻭﺣﺪﺓ ﺗﻘﺎﺭﻳﺮ ‪ LazReports‬ﻣﺜﺒﺘﺔ ﻣﻊ ﻧﺴﺨﺔ ﻻﺯﺍﺭﻭﺱ ﺧﺎﺻﺘﻚ‪.‬‬

‫ﻋﻠﻰ ﺍﻟﻔﻮﺭﻡ ﺍﻟﺮﺋﻴﺴﻲ ‪ ،frmMain‬ﻧﻨﻘﺮ ﻓﻮﻕ ﺍﻟﻌﻨﺼﺮ ‪ TheReport‬ﻧﻘﺮﺗﻴﻦ ﺳﺮﻳﻌﺘﻴﻦ )ﺃﻭ ﻧﻘﺮﺓ ﻳﻤﻴﻦ‬
‫ﻭﺍﺧﺘﻴﺎﺭ ‪ (Design report‬ﻟﻔﺘﺢ ﻣﺼﻤﻢ ﺍﻟﺘﻘﺎﺭﻳﺮ ﻭﺍﻟﺬﻱ ﺳﻴﻜﻮﻥ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﺗﺘﻜﻮﻥ ﻧﺎﻓﺬﺓ ﻣﺼﻤﻢ ﺍﻟﺘﻘﺎﺭﻳﺮ ﻣﻦ ﺷﺮﻳﻂ ﺍﻟﻘﻮﺍﺋﻢ‪ ،‬ﻭﺃﺷﺮﻃﺔ ﺍﻷﺩﻭﺍﺕ ﺍﻷﻓﻘﻴﺔ ﻟﻠﺘﺤﺮﻳﺮ‪ ،‬ﻭﺷﺮﻳﻂ ﺟﺎﻧﺒﻲ‬
‫ﻟﻤﻜﻮﻧﺎﺕ ﺍﻟﺘﻘﺮﻳﺮ‪.‬‬

‫ﻗﺒﻞ ﺍﻟﺒﺪﺀ ﻓﻲ ﺗﺼﻤﻴﻢ ﺍﻟﺘﻘﺮﻳﺮ ﻳﺘﻮﺟﺐ ﺗﻌﺪﻳﻞ ﺧﺼﺎﺋﺺ ﺻﻔﺤﺔ ﺍﻟﺘﻘﺮﻳﺮ‪ ،‬ﻭﺗﺤﺪﻳﺪ ﺣﺠﻢ ﺍﻟﻮﺭﻕ‪ ،‬ﻣﻦ ﺧﻼﻝ‬
‫ﻓﺘﺢ ﺍﻟﻘﺎﺋﻤﺔ ‪ File‬ﺛﻢ ‪.Page Options‬‬

‫ﺻﻔﺤﺔ ‪50‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻳﺘﻢ ﺗﻘﺴﻴﻢ ﺻﻔﺤﺔ ﺍﻟﺘﻘﺮﻳﺮ ﺇﻟﻰ ‪ ،Bands‬ﻭﻛﻞ ‪ Band‬ﻳﺨﺘﺺ ﺑﺠﺰﺋﻴﺔ ﻣﻌﻴﻨﺔ ‪.‬‬

‫ﻓـ ‪ Report title‬ﻣﺜﻼً ﻳﺨﺘﺺ ﺑﻌﻨﻮﺍﻥ ﺍﻟﺘﻘﺮﻳﺮ‪ ،‬ﺑﻴﻨﻤﺎ ‪ Page Header‬ﻟﺮﺃﺱ ﺍﻟﺼﻔﺤﺔ‪ ..‬ﻭﻫﻜﺬﺍ‪.‬‬

‫ﻭﻟﻜﻦ ﺃﻫﻢ ﺍﻟـ‪ Bands‬ﺍﻟﺘﻲ ﻧﺴﺘﻌﻤﻠﻬﺎ ﻫﻲ‪:‬‬

‫ﺍﻟﻮﺻﻒ‬ ‫ﻧﻮﻉ ﺍﻟـ‪Band‬‬


‫ﻟﺮﺃﺱ ﺍﻟﺼﻔﺤﺔ‬ ‫‪Page Header‬‬
‫ﻣﻌﻠﻮﻣﺎﺕ ﺭﺃﺱ ﺍﻟﻔﺎﺗﻮﺭﺓ ﻣﺜﻼً‪ ،‬ﻳﻤﻜﻦ ﺟﻠﺒﻬﺎ ﻣﻦ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬ ‫‪Master Data‬‬
‫ﺍﻟﻤﻜﺎﻥ ﺍﻟﻤﻨﺎﺳﺐ ﻟﺘﺼﻤﻴﻢ ﺭﺃﺱ ﺟﺪﻭﻝ ﺍﻟﻔﺎﺗﻮﺭﺓ ﻣﺜﻼً‪.‬‬ ‫‪Detail Header‬‬
‫ﺑﻴﺎﻧﺎﺕ ﺍﻟﺠﺪﻭﻝ ﺍﻟﻤﻜﺮﺭﺓ‪ ،‬ﻳﻤﻜﻦ ﺟﻠﺒﻬﺎ ﻣﻦ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬ ‫‪Detail Data‬‬
‫ﺇﺣﺼﺎﺋﻴﺎﺕ ﺗﺤﺖ ﺍﻟﺠﺪﻭﻝ ﻏﻴﺮ ﻣﻜﺮﺭﺓ ﻛﺎﻟﻤﺒﻠﻎ ﺍﻹﺟﻤﺎﻟﻲ ﺗﺤﺖ ﺍﻟﻔﺎﺗﻮﺭﺓ ﻣﺜﻼً‪،‬‬
‫‪Detail Footer‬‬
‫ﻳﻤﻜﻦ ﺟﻠﺒﻬﺎ ﻣﻦ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫ﺗﺬﻳﻴﻞ ﺍﻟﺼﻔﺤﺔ‬ ‫‪Page Footer‬‬

‫ﻹﺩﺭﺍﺝ ﺣﻘﻞ ﻓﻲ ﺃﻱ ‪ Band‬ﻧﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﺼﺮ ‪ rectangle‬ﻭﺑﺪﺍﺧﻠﻪ ﻧﻜﺘﺐ ﺍﺳﻢ ﺍﻟﺤﻘﻞ ﺑﻴﻦ ﻗﻮﺳﻴﻦ‬
‫ﻣﺮﺑﻌﻴﻦ ‪.‬‬

‫]‪[contactName‬‬
‫ﻣﺜﻼً‪.‬‬

‫ﺻﻔﺤﺔ ‪51‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﺍﻟﺒﺪﺀ ﻓﻲ ﺍﻟﻌﻤﻞ‬

‫ﻓﻲ ﺣﺪﺙ ﺍﻟﻨﻘﺮ ﻋﻠﻰ ﺍﻟﺰﺭ )ﻋﺮﺽ ﺍﻟﺘﻘﺮﻳﺮ( ﻧﻜﺘﺐ ‪:‬‬

‫;‪UpdateQuery.Close‬‬
‫;‪UpdateQuery.DataBase:=conn‬‬
‫;'‪UpdateQuery.SQL.Text:='SELECT * FROM Contacts‬‬
‫;‪UpdateQuery.open‬‬

‫;‪UpdateDataSource.DataSet:=UpdateQuery‬‬

‫ﻭﻫﺬﺍ ﻛﻮﺩ ﺟﻠﺐ ﺍﻟﺴﺠﻼﺕ ﻣﻦ ﺍﻟﺠﺪﻭﻝ ‪ Contacts‬ﻭﻭﺿﻊ ﺍﻟـ‪ Dataset‬ﺍﻟﻤﺴﺘﺮﺟﻌﺔ ﻓﻲ‬


‫ﺍﻟـ‪.UpdateDataSource‬‬

‫ﺑﻌﺪ ﺫﻟﻚ ﻧﺮﺑﻂ ﺑﻴﻦ ﺍﻟـ‪ RepDataSet‬ﻭﻫﻲ ‪ Dataset‬ﺧﺎﺻﺔ ﺑﺎﻟﺘﻘﺎﺭﻳﺮ‪ ،‬ﻣﻊ ﺍﻟـ‪UpdateDataSource‬‬
‫ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫;‪RepDataset.DataSource:=UpdateDataSource‬‬

‫ﺗﺒﻘﻰ ﺟﺰﺋﻴﺔ ﻋﺮﺽ ﺍﻟﺘﻘﺮﻳﺮ‪ ،‬ﻟﻜﻨﻨﺎ ﺳﻨﺮﺟﻊ ﻭﻧﻜﺘﺐ ﻛﻮﺩﻫﺎ ﺑﻌﺪ ﺗﺠﻬﻴﺰ ﺍﻟﺘﻘﺮﻳﺮ ﺃﻭﻻً‪.‬‬

‫ﻧﺨﺘﺎﺭ ﺍﻟـ‪ Band‬ﻣﻦ ﺷﺮﻳﻂ ﺍﻷﺩﻭﺍﺕ ﺍﻟﻌﻤﻮﺩﻱ‪ ،‬ﻭﻧﻀﻌﻪ ﻋﻠﻰ ﺍﻟﺼﻔﺤﺔ‪ ،‬ﻓﺘﻈﻬﺮ ﻧﺎﻓﺬﺓ ﺗﺤﺪﻳﺪ ﺍﻟـ‪Band‬‬
‫ﺍﻟﻤﻄﻠﻮﺏ‪:‬‬

‫ﺻﻔﺤﺔ ‪52‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻓﻨﺨﺘﺎﺭ ‪ .Page Header‬ﻓﻴﺘﻢ ﻭﺿﻊ ﺍﻟـ‪ Band‬ﻋﻠﻰ ﺍﻟﺼﻔﺤﺔ ﻛﻤﺎ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﺍﻵﻥ ﻧﻀﻊ ﻣﺮﺑﻊ ﻧﺼﻲ ﻋﻠﻰ ﻫﺬﺍ ﺍﻟﺒﺎﻧﺪ‪ ،‬ﻓﺘﻈﻬﺮ ﻧﺎﻓﺬﺓ ﻟﻠﻜﺘﺎﺑﺔ ﻓﻴﻪ ﻛﻤﺎ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻓﻨﻜﺘﺐ ﻓﻴﻬﺎ ﻣﺜﻼً‪ :‬ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‪ ،‬ﺛﻢ ﻧﻨﻘﺮ ﺍﻟﺰﺭ ‪ .Ok‬ﻧﻌﺪﻝ ﻧﻮﻉ ﻭﺣﺠﻢ ﺧﻂ ﺍﻟﻤﺮﺑﻊ ﺍﻟﻨﺼﻲ‬
‫ﺣﺘﻰ ﻳﻈﻬﺮ ﺑﺸﻜﻞ ﻣﻨﺎﺳﺐ‪.‬‬

‫ﻧﺨﺰﻥ ﺍﻟﺘﻘﺮﻳﺮ ﺑﺎﺳﻢ ‪ ContactsReport.lrf‬ﻓﻲ ﻧﻔﺲ ﻣﺠﻠﺪ ﺍﻟﻤﺸﺮﻭﻉ ‪.‬‬

‫ﺻﻔﺤﺔ ‪53‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻧﻌﻮﺩ ﻟﻤﺼﻤﻢ ﺍﻟﺘﻘﺮﻳﺮ‪ ،‬ﻧﻀﻊ ﺑﺎﻧﺪ ﺟﺪﻳﺪ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ ،Master Data‬ﻓﺘﻈﻬﺮ ﻧﺎﻓﺬﺓ ﻻﺧﺘﻴﺎﺭ ﻣﺼﺪﺭ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫ﺍﻟﺘﻲ ﺳﻨﻌﺮﺿﻬﺎ ﻓﻲ ﻫﺬﺍ ﺍﻟﺒﺎﻧﺪ‪ ،‬ﻛﻤﺎ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻓﻨﺨﺘﺎﺭ ﺍﻷﺧﻴﺮﺓ ‪ repDataSet‬ﺛﻢ ‪. OK‬‬

‫ﻟﻦ ﻧﻌﺮﺽ ﺃﻱ ﺷﻲﺀ ﻋﻠﻰ ﻫﺬﺍ ﺍﻟﺒﺎﻧﺪ‪ ،‬ﻭﻟﻜﻦ ﻭﺟﻮﺩﻩ ﺿﺮﻭﺭﻱ ﺣﺘﻰ ﺗﻈﻬﺮ ﺑﻘﻴﺔ ﺃﺟﺰﺍﺀ ﺍﻟﺘﻘﺮﻳﺮ ﻋﻨﺪ ﺍﻟﺘﻨﻔﻴﺬ ‪.‬‬

‫ﻧﻀﻊ ﺑﺎﻧﺪ ﺟﺪﻳﺪ ﻣﻦ ﻧﻮﻉ ‪ Detail Header‬ﻋﻠﻰ ﺻﻔﺤﺔ ﺍﻟﺘﻘﺮﻳﺮ‪ ،‬ﻧﻨﻘﺮ ﻋﻠﻴﻪ ﻳﻤﻴﻦ ﺛﻢ ﻧﺨﺘﺎﺭ ‪Show on‬‬
‫‪ .all pages‬ﻧﻀﻊ ﺛﻼﺛﺔ ﻣﺮﺑﻌﺎﺕ ﻧﺼﻴﺔ ﻭﻧﺴﻘﻬﺎ ﻛﻤﺎ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﺻﻔﺤﺔ ‪54‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ SQLITE3‬ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬
‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ[‬

‫ﻧﻀﻊ ﺑﺎﻧﺪ ﺟﺪﻳﺪ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ ،Detail Data‬ﻓﺘﻈﻬﺮ ﻧﺎﻓﺬﺓ ﻻﺧﺘﻴﺎﺭ ﻣﺼﺪﺭ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﻲ ﺳﻨﻌﺮﺿﻬﺎ ﻓﻲ ﻫﺬﺍ‬
‫ﺍﻟﺒﺎﻧﺪ‪ ،‬ﻛﻤﺎ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻓﻨﺨﺘﺎﺭ ﺍﻷﺧﻴﺮﺓ ‪ repDataSet‬ﺛﻢ ‪. OK‬‬

‫ﻧﻀﻊ ﺛﻼﺛﺔ ﻣﺮﺑﻌﺎﺕ ﻧﺼﻮﺹ‪ ،‬ﻭﻧﻨﺴﻘﻬﺎ ﺑﺤﻴﺚ ﺗﻈﻬﺮ ﻛﻤﺎ ﻓﻲ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻧﺤﻔﻆ ﺍﻟﺘﻘﺮﻳﺮ‪ ،‬ﻭﻧﻐﻠﻖ ﻣﺼﻤﻢ ﺍﻟﺘﻘﺎﺭﻳﺮ ‪.‬‬

‫ﻧﻌﻮﺩ ﻟﺒﺮﻣﺠﺔ ﺍﻟﺰﺭ ) ﻋﺮﺽ ﺍﻟﺘﻘﺮﻳﺮ(‪ ،‬ﻭﺗﺤﺖ ﺁﺧﺮ ﺳﻄﺮ ﻓﻴﻪ ﻧﻜﺘﺐ‪:‬‬

‫;)'‪TheReport.LoadFromFile('ContactsReport.lrf‬‬
‫;‪TheReport.ShowReport‬‬

‫ﺍﻟﺴﻄﺮ ﺍﻷﻭﻝ ﻟﺘﺤﺪﻳﺪ ﺍﺳﻢ ﻣﻠﻒ ﺍﻟﺘﻘﺮﻳﺮ‪ ،‬ﻭﺍﻟﺜﺎﻧﻲ ﻟﻠﺒﺪﺀ ﻓﻲ ﻋﺮﺽ ﺍﻟﺘﻘﺮﻳﺮ ﺃﻣﺎﻡ ﺍﻟﻤﺴﺘﺨﺪﻡ‪.‬‬

‫ﺑﻌﺪ ﺫﻟﻚ‪ ،‬ﻧﻘﻮﻡ ﺑﺘﺤﺪﻳﺚ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻠﻰ ﺍﻟﻔﻮﺭﻡ ﺍﻟﺮﺋﻴﺴﻲ‪:‬‬

‫;‪Update_Grid‬‬

‫ﺻﻔﺤﺔ ‪55‬‬ ‫ﺇﻋﺪﺍﺩ ‪ /‬ﻡ‪ .‬ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ ‪ -‬ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬
‫ ﻓﻲ ﻻﺯﺍﺭﻭﺱ‬SQLITE3 ‫ﺑﺮﻣﺠﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
[‫]ﺍﻟﺠﺰﺀ ﺍﻟﻌﻤﻠﻲ – ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ ﺟﻬﺎﺕ ﺍﻻﺗﺼﺎﻝ‬

:ً‫ﻭﻫﺬﺍ ﻫﻮ ﺍﻟﻜﻮﺩ ﻛﺎﻣﻼ‬

procedure TfrmMain.btnShowReportClick(Sender: TObject);


begin
UpdateQuery.Close;
UpdateQuery.DataBase:=conn;
UpdateQuery.SQL.Text:='SELECT * FROM Contacts';
UpdateQuery.open;

UpdateDataSource.DataSet:=UpdateQuery;

RepDataset.DataSource:=UpdateDataSource;

TheReport.LoadFromFile('ContactsReport.lrf');
TheReport.ShowReport;
Update_Grid;
end;

:‫ﻭﻫﺬﻩ ﻟﻘﻄﺔ ﻣﻦ ﺍﻟﺘﻘﺮﻳﺮ ﺃﺛﻨﺎﺀ ﺍﻟﺘﺸﻐﻴﻞ‬

56 ‫ﺻﻔﺤﺔ‬ ‫ ﻭﻗﻒ ﷲ ﺗﻌﺎﻟﻰ‬- ‫ ﺃﺑﻮﺑﻜﺮ ﺷﺮﻑ ﺍﻟﺪﻳﻦ ﺳﻮﻳﺪﺍﻥ‬.‫ ﻡ‬/ ‫ﺇﻋﺪﺍﺩ‬

You might also like