1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

یه سری آموزش های فوق العاده جالب برای دوستان عزیز

شروع موضوع توسط hector2141 ‏10/9/12 در انجمن Visual Basic

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    روش تغییر پسورد پایگاه داده Access از طریق VB :
    این بار قرار است روشی رو به شما عزیزان آموزش بدم که با استفاده از آن می توانید کلمه عبوری را که روی پایگاه داده Access خودتان قرار داده اید از طریق کد نویسی در ویژوال بیسیک تغییر دهید . برای انجام این عمل باید مراحل زیر را انجام دهید .


    1. ابتدا یک پروژه را در VB باز کنید . سپس از منوی Project گزینه References را انتخاب کنید تا دیالوگی نمایش داده شود . از لیستی که مشاهده می کنید گزینه ( Microsoft DAO 3.51 Object library ) را علامت بزنید . البته این در صورتی است که پایگاه داده شما پایین تر از فرمت Office 2003 باشد . ( مثلا Office 2000 ) . در غیر این صورت باید گزینه ( MicroSoft DAO 3.6 Object Library )علامت بزنید . تا احیانا با خطایی مواجه نشوید . ( نسخه 3.6 میتواند بهترین انتخاب باشد ).


    2. سپس مثلا یک دکمه روی فرم خود گذاشته و نام آن را به Cmd_PassChange و عنوان آن را به PassChange تغییر دهید . حال کدهای زیر را داخل آن بنویسید یا کپی کنید :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    [/TD]
    [TD="class: code"]Dim db As DAO.Database

    ("Set db = DBEngine.OpenDatabase(App.Path & "\Test.mdb", True, False, ";pwd=media

    "db.NewPassword "media", "ali

    db.Close

    [/TD]
    [/TR]
    [/TABLE]



    در این مثال ابتدا ما یک متغیر ( db ) را از نوع کتابخانه DAO تعریف می کنیم . در دستور Set کردن پایگاه داده Access توجه داشته باشید که چون پایگاه داده ما از قبل دارای کلمه عبور است ، ما مجبوریم برای ورود به آن از کلمه عبور ( در این مثال media ) استفاده کنیم . همچنین دقت داشته باشید که در این دستور حتما باید مقدار ورودی Option ( مقدار دوم که تعیین می کند ما به تنظیمات پایگاه داده دسترسی داشته باشیم یا نه) مقدار True باشد . درغیر این صورت از تغییر کلمه عبور جلوگیری خواهد شد . در دستور سوم هم که مشاهدی می کنید ، اولین پارامتر ورودی کلمه عبور قبلی و دومین پارامتر ورودی کلمه عبور جدید شما خواهد بود . خط آخر هم در اصطلاح برای بستن پایگاه داده به کار می رود .
     
  2. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    اعمال مشخصه RightToLeft به کنترلهایی که فاقد این مشخصه اند :
    در این روش شما میتونید به هر کنترلی این مشخصه رو اعمال کنید، حتی کنترلهایی که فاقد این مشخصه هستند مثل DirListBox به صورت از راست به چپ در میان. درضمن اگه با فرمتون اینکارو بکنید میبینید که واقعاً به صورت از راست به چپ درمیاد یعنی دکمه Close، Minimize و Maximize از سمت راست فرم به سمت چپ فرم انتقال پیدا میکنن.

    یک پروژه جدید باز کنید و یک DirListBox به فرمتون اضافه کنید و کد زیر رو تو قسمت جنرال فرمتون کپی کنید :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    [/TD]
    [TD="class: code"]Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

    Private Sub Form_Load()
    SetWindowLong Me.hWnd, -20, GetWindowLong(Me.hWnd, -20) Or &H400000
    SetWindowLong Dir1.hWnd, -20, GetWindowLong(Dir1.hWnd, -20) Or &H400000
    End Sub

    [/TD]
    [/TR]
    [/TABLE]




    حالا برنامه رو اجرا کنید و شاهد تغییراتی که در حالت معمولی غیر ممکن بودن باشید.

    این کد رو اگه خواستین تغییر بدین فقط یه شرط داره اونم اینه که کنترلی که میخواین تغییرات روش اعمال بشه باید خاصیت hWnd رو داشته باشه.
     
  3. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    تنظیم ساعت سیستم با ویژوال بیسیک :
    یه تایمر و فرمتون بذارین و اینتروال اون رو روی 1000 تنظیم کنید و کد زیررو توی قسمت جنرال فرمتون قرار بدین
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [/TD]
    [TD="class: code"]Dim TimeStop

    Private Sub Form_Load()
    TimeStop = Time
    End Sub

    Private Sub Timer1_Timer()
    Time = TimeStop
    End Sub

    [/TD]
    [/TR]
    [/TABLE]



    توی این کد وقتی فرم اجرا میشه زمان وارد TimeStop میشه بعدش توسط تایمر زمان به TimeStop تنظیم میشه که به عبارتی زمان رو نگه میداره

    حالا میخوایم زمان رو تنظیم کنیم:
    یهCommand رو فرمتون بذارین بعد از این کد استفاده کنید
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    [/TD]
    [TD="class: code"]Private Sub Command1_Click()
    Dim H, Min, Sec, AMorPM
    H = InputBox("Type Hour...")
    Min = InputBox("Type Minute...")
    Sec = InputBox("Type Second...")
    AMorPM = InputBox("AM time or PM time")
    Time = H & ":" & Min & ":" & Sec & AMorPM
    End Sub

    [/TD]
    [/TR]
    [/TABLE]
     
  4. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    ثبت تنظیمات و اطّلاعات برنامه در رجیستری :
    خب اوّل یک مثال میزنم و بعد میرم سره آموزش تا بهتر یاد بگیرید.



    یک پروژه جدید باز کنید و یک Command Button و یک TextBox بذارید تو فرمتون و کد زیر رو تو قسمت جنرال فرمتون کپی کنید :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [/TD]
    [TD="class: code"]Private Sub Command1_Click()



    SaveSetting App.Title, "Setting", "Value", Text1.Text



    End Sub



    Private Sub Form_Load()



    Text1.Text = GetSetting(App.Title, "Setting", "Value", "Hello")



    End Sub

    [/TD]
    [/TR]
    [/TABLE]



    برنامه رو اجرا کنید و هر چی دلتون میخواد تو TextBox وارد کنید و بعد کلید Command1 رو بزنید و از برنامه خارج بشید. حالا اگه دوباره برنامه رو اجرا کنید میبینید متنی که دفعه قبل وارد کرده بودید سره جاشه و پاک نشده.
    به نظرم جالبه
     
  5. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    تريگرها درSQL Server در ويژوال بيسيك6 :
    تريگر نوع خاصي از روال ذخيره شده است و در هنگام تغيير داده اي كه براي حفاظت از آن طراحي شده است فعال مي گردد. تريگرها با جلوگيري از تغييرات غير معتبر يا ناسازگار در داده ها به حفظ يكپارچگي داده اي كمك مي كنند. فرض كنيد دو جدول customer و orders در اختيار داريد بنابراين مي توانيد تريگري ايجاد كنيد كه با ايجاد هر سفارش جديد، اعتبار شماره مشتري آن را كنترل كند. همچنين مي توانيد تريگري ديگري ايجاد كنيد كه در صورت حذف يك مشتري جدول orders‌ را كنترل كرده و در صورت وجود سفارش براي آن مشتري فرآيند حذف مشتري را متوقف سازد.
    تريگرها مي توانند قواعد كاري پيچيده تري را نسبت به قيود اعمال كنند. براي مثال يك تريگر insert مي تواند در هنگام درج ركورد جديد به سفارشات فعال شود و وضعيت پرداخت مشتري را بررسي و نوع پرداخت مناسب وي را تعيين كند.
    تريگرها پارامتر ندارند و صريحا فعال نمي شوند و براي فعال سازي آنها تغييرات داده اي لازم است.
    تريگرها را مي توان تا 32 سطح تودرتو تعريف كرد. اين تريگرها به شكل زير عمل مي كنند:
    براي مثال تريگر جدول orders يك ورودي به جدول حسابهاي دريافتي اضافه مي كند و اين ورودي به نوبه خود تريگر ديگري را براي بررسي وضعيت مشتري فعال مي نمايد. يك تريگر به روز رساني جدول را انجام مي ده و همين امر تريگر ديگري را فعال مي كند.
    بطور پيش فرض تمامي تريگرها (UPDATE,DELETE,INSERT)پس از تغييرات داده اي فعال مي شوند و به تريگر AFTER‌ معروف مي باشند. در ويرايش هاي قبلي SQL Server‌ تنها اين نوع تريگر موجود بوده است. در SQL Server 2000‌ نوع ديگري به نام INSTEAD OF ‌ معرفي شده است كه بجاي تغييرات داده اي موردنظر فعال مي شود.
    از نقطه نظر كارائي، تريگرها سربار زيادي ندارند. بيشتر زمان اجراي يك تريگر براي ارجاع به ساير جدول بكار مي رود. اين ارجاع در صورت وجود جداول در حافظه سريع و در صورت نيار به خواندن از ديسك كمي كندتر خواهد بود.
    تريگرها بخشي از يك تراكنش (transaction) محسوب مي شوند. اگر تريگر يا هر بخشي از تراكنش با شكست مواجه شود كل تراكنش عقبگرد مي شود.

    درك جدول Deleted و Inserted

    تريگرها از دو جدول inserted و deleted استفاده مي كنند. اين جداول ساختار مشابهي با جدول پايه يا جدول trigger‌ كه تريگر در آن ايجاد مي شود دارند. اين دو جدول در حافظه RAMقرار مي گيرند و جداول منطقي هستند . اگر ركورد جديدي را به جدول پايه اضافه كنيد اين ركورد هم در جدول پايه و هم در جدول inserted ثبت مي شود. وجود مقادير در دسترس در جدول inserted‌به شما امكان مي دهد كه نيازي به ايجاد متغير براي نگهداري اطلاعات نداشته باشيد و به اطلاعات دلخواه دسترسي بيابيد. هنگام حذف يك ركورد، ركورد حذف شده در جدول deleted قرار مي گيرد. به روز رساني نيز يك حذف و درج متوالي است. اگر ركوردي را به روز رساني كنيد، ركورد اصلي در جدول deleted و ركورد تغيير يافته در جدول پايه و جدول inserted ذخيره مي شود.
    نكته : شما نمي توايند محتواي جداول inserted و Deleted را ببينيد.
    اما براي اينكار مي توانيد با استفاده از تريگري محتواي اين جداول را ببينيد.كه در قسمتهاي بعدي شرح داده ميشود.

    ايجاد تريگرها با دستور CREATE TRIGGER
    نگارش ايجاد تريگرها به شرح زير است :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    [/TD]
    [TD="class: code"]CREATE TRIGGER [owner.]trigger_name
    ON [owner.]table_name | view_name
    {FOR..AFTER | INSTEAD OF] {INSERT | UPDATE | DELETE}
    [WITH ENCRYPTION]
    AS sql.statements

    [/TD]
    [/TR]
    [/TABLE]



    يك جدول مي تواند هر تعداد تريگر از انواع DELETE, UPDATE ,INNSERT داشته باشد. هر عمل را مي توان در يك يا چند تريگر ذخيره كرد. اگر عملي در چند تريگر ذخيره شود بايد نام تريگرها منحصر بفرد و يكتا باشد. براي مثال مي توانيد تريگري به نام trInsupAuthors را بر روي جدول authors براي عمل حذف بر روي همين جدول ايجاد كنيد. براي تغيير تريگر كافيست از محيط enterprise روي جدول موردنظرراست كليك كرده گرينه ي Manage Trigger را بزنيد و از ليست كشويي تريگر موردنظر خود را انتخاب كرده و آنرا ويرايش نماييد. و از محيط كوئري آناليز هم توسط دستور ALTER TRIGGER تريگر را ويرايش كنيد يا ابتدا آنرا حذف نموده و دوباره ايجاد كنيد.
    توجه : تغيير تريگر با دستور ALTER TRIGGER، سبب جايگزيني كامل تريگر قديم با تريگر جديد مي شود. با حذف يك جدول، تريگرها موجود آن نيز به شكل خودكار حذف مي شوند.
    قوانين حاكم بر تريگرها:
    · تريگر را نمي‌توان براي جداول موقت ايجاد كرد اما مي‌تواند به ديدها و يا جداول موقت ارجاع داشته باشد.
    · تريگر مجموعه‌ جواب (resultest) باز نمي‌گرداند بنابراين هنگام استفاده از دستورات select احتياط كنيد. بكارگيري عبارت if exists‌ به عنوان بخشي از دستور select در كد تريگر متداول است.
    · تريگر براي حفظ يكپارچگي داده‌اي، ارجاعي و كپسوله كردن قوانين كاري بكار ميرود.
    · بكارگيري گزينه with encryption‌ سبب مي‌شود تريگرها در جدول syscomments‌ به شكل رمز شده نگهداري شوند.
    · دستورات writetext‌ تريگرها را فعال نمي‌كنند. اين دستورات براي تغييرات داده‌اي متني (text)‌ و تصوير (image) بكار مي‌رود و در فايل گزارش تراكنشها ثبت نمي‌شود.
    · دستورات SQL‌ زير را نمي‌توان در تريگرها بكار برد: همه انواع دستورات CREATE‌، همه دستورات DROP و دستورات ALTER TABLE, ALTER DATABASE ,TRUNCATE TABLE, GRANT, TRANSACTION, LOAD DATABASE, ROCONFIGURE REVOKE, STATISTICS, UPDATE STATISTICS , SELECT INFO, و كليه دستورات DISK
    · دستورات عقبگرد شده تراكنشها در تريگرها مي تواند نتايج غير منتظره‌اي را در برنامه ها ايجاد كند.

    تريگرهاي Insert و UpdateوDelete
    حال به يك نمونه تريگر براي دستورات INSERT و UPDATE جدول توجه كنيد:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    [/TD]
    [TD="class: code"]CREATE TRIGGER trAddAuther
    ON authors
    FOR INSERT, UPDATE
    AS raiserror (“%d rows have been modified”, 0,1, @@rowcount)
    RETURN

    [/TD]
    [/TR]
    [/TABLE]



    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    [/TD]
    [TD="class: code"]CREATE TRIGGER trDelAuthors
    ON authors
    FOR DELETE AS
    raiserror(“%d rows are going to be deleted from this table!”,0 , 1 , @@rowcount)

    [/TD]
    [/TR]
    [/TABLE]



    توجه كنيد كه پيام را در صورتي مشاهده مي كنيد كه عمل حذف را در محيط كوئري آناليز انجام دهيد.
    تريگري براي ديدن محتواي جداولinserted و Deleted
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [/TD]
    [TD="class: code"]CREATE TRIGGER tr24 ON Teacher


    FOR DELETE ,update,insert


    AS


    select * into del from deleted


    select * into insl from inserted

    [/TD]
    [/TR]
    [/TABLE]



    نام تريگر بالا tr24 است. كه بر روي جدول teacher ساخته شده است. خط دوم يعني وقتي عمليات اضافه يا حذف يا ويرايش بر روي جدول teacher اتفاق افتاد اين تريگر فراخواني شود..خط چهارم ركوردهاي موجود در جدول Deleted را در جدول del مي ريزد و خط پنج هم محتواي جدولinserted را در جدولins مي ريزد.
    توجه كنيد كه جدولهايinsو del نبايد وجود داشته باشند وگرنه پيام خطا ميدهد.

    اعمال يكپارچگي داده‌اي با تريگرها


    تريگرها براي اعمال يكپارچگي داده‌اي در پايگاه داده بكار مي‌روند. در گذشته يكپارچگي ارجاعي صرفا از طريق تريگرها تامين مي‌شد. در ويرايشهاي اخير SQL Server اينكار را مي‌توان با قيد يكپارچگي ارجاعي انجام داد اما تريگرها كماكان براي كپسوله كردن قواعد كاري و تغييرات پله‌اي پايگاه داده مفيدند. يك تغيير پله‌اي مي‌تواند با تريگر ايجاد شود. فرض كنيد يك فروشگاه ديگر فعاليت نمي‌كند. شما مي‌توانيد تريگري ايجاد كنيد كه ابتدا اين فروشگاه را از جدول stores حذف كند و سپس كليه فروشهاي مربوط به آن را از جدول sales حذف نمايد


    اعمال يكپارچگي ارجاعي

    تريگرها براي اعمال يكپارچگي ارجاعي نيز بكار مي‌روند. اين كار هدف اصلي آنها در پايگاه داده است. بخصوص براي حذفها و به روز رساني پله‌اي مفيدند. تريگرها در پايان تغييرات داده‌اي كنترل مي‌شوند در حاليكه قيود در ابتدا كنترل مي‌شوند. اگر قيدي نقض شود. هيچ تريگري فعال نمي‌شود. تريگر زير يكپارچگي داده‌اي را اعمال مي‌كند. از طريق اين تريگر مطمئن مي‌شويم كه در صورت درج يك ركورد جديد در جدول Sales حتما كد فروشگاه معتبر آن در جدول stores وجود دارد.
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [/TD]
    [TD="class: code"]CRETAE TRIGGER trInsUpdSales
    On tblSales
    FOR INSERT, UPDATE AS
    IF(SELECT COINT(*) FROM tblStores , inserted
    WHERE tblStores.stor_id = inserted.stor_id) =0
    BEGIN
    PRINT ‘The stor_id you have entered does not exist’
    PRINT ‘in the stores table’
    ROLLBACK TRANSACTION
    END

    [/TD]
    [/TR]
    [/TABLE]



    اين تريگر براي هر دستور مجزاي INSERT يا UPDATE‌ بر روي جدول tblSales بخوبي كار مي‌كند. اما اگر دستور SELECT INTO را اجرا كنيد، تريگر ممكن است كاملا درست فعال نشود. وقتي با چندين سطر سروكار داريد بايد مطمئن شويد تعداد سطرهاي درج شده stor_id‌ با تعداد فروش‌هايي كه اضافه كرده‌ايد برابر باشد. حال تريگر را به شكل زير تغيير مي‌دهيم:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [/TD]
    [TD="class: code"]DROP TRIGGER trInsUpdSales
    GO
    CRETAE TRIGGER trInsUpdSales
    On tblSales
    FOR INSERT, UPDATE AS
    DECLARE @rc int
    SELECT @rc = @@rowcount
    IF(SELECT COINT(*) FROM tblStores , inserted
    WHERE tblStores.stor_id = inserted.stor_id) =0
    BEGIN
    PRINT ‘The stor_id you have entered does not exist’
    PRINT ‘in the stores table’
    ROLLBACK TRANSACTION
    END
    IF(SELECT COINT(*) FROM tblStores , inserted
    WHERE tblStores.stor_id = inserted.stor_id) <>@rc
    BEGIN
    PRINT ‘Not all sales have a valid stor_id’
    PRINT ‘in the stores table’
    ROLLBACK t TRANSACTION
    END

    [/TD]
    [/TR]
    [/TABLE]



    بكار گيري تريگرهاي INSTEAD OF
    هنگام استفاده از تريگرهاي INSTEAD OF كد اصلي ايجاد تغييرات در جدول اجرا نمي شود بلكه كد تريگر اجرا مي‌شود. براي مثال شما مي‌توانيد تريگري را براي جدول authors ايجاد كنيد كه به كاربران اطلاع دهد مولفين را نمي‌توان حذف كرد. اين كار با تريگر معمول FOR،AFTER نيز قابل انجام است. اما مستلزم آن است كه تغييرات واقعي در ابتدا اعمال شوند سپس در كد تريگر عقبگرد شوند. اگر كد تريگر INSTEAD OF را بكار بريد، عمل به روز رساني انجام نمي‌شود و طبيعي است اين تريگر كاراتر است. به مثال زير توجه كنيد.
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    [/TD]
    [TD="class: code"]USE pubs
    GO
    CREATE TRIGGER trlO_DelAuthors
    ON authors INSTEAD OF DELETE AS
    PRINT ‘you can not delete authors from the authors table!’

    [/TD]
    [/TR]
    [/TABLE]



    براي تست تريگر سعي كند مولفي با نام خانوادگي white را حذف كنيد:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    [/TD]
    [TD="class: code"]USE pubes
    GO
    DELETE authors WHERE au_lname = ‘white’

    [/TD]
    [/TR]
    [/TABLE]



    جمع آوري اطلاعات تريگرها

    با اجراي روال ذخيره شده sp_helptext مي‌توانيد متن دستور تريگر را مشاهده كنيد. البته تريگرهاي رمز شده ركوردي در جدول Syscomments ندارند. در حالت كلي نبايد هيچ شيئي را رمزنگاري كنيد. مگر آنكه واقعا مجبور باشيد. هنگام ارتقا پايگاه داده كليه اشياء رمزنگاري شده بايد حذف و مجددا ايجاد شوند. اما اشياء رمزنشده بطور خودكار به ويرايش جديد ارتقاء داده مي‌شوند.
     
  6. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    تشخیص ادمین بودن کاربر جاری در ویندوز

    اگه زمانی خواستید این موضوع رو بفهمید کافیه که از تابع API ی که در shell32 تعریف شده استفاده کنید. صورت کلی این تابع چنین است:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    [/TD]
    [TD="class: code"]Private Declare Function IsUserAnAdmin Lib "shell32" () As Long

    [/TD]
    [/TR]
    [/TABLE]



    تحت ویندوز 2000 ممکنه که شما خطای با عنوان Can't find DLL entry point دریافت کنید که بهتر است که معرفی تابع را بدین گونه انجام دهید:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    [/TD]
    [TD="class: code"]Private Declare Function IsUserAnAdmin Lib "shell32" Alias "#680" () As Long

    [/TD]
    [/TR]
    [/TABLE]
     
  7. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    فیلتر کردن بعضی از کلید های صفحه کلید :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    [/TD]
    [TD="class: code"]Private Sub Form_KeyPress(KeyAscii As Integer)
    Dim svalid As String
    svalid = "0123456789"
    If InStr(svalid, Chr(KeyAscii)) = 0 Then
    KeyAscii = 0
    MsgBox "Not valid Keys.please Press 0-9 keys"
    End If
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    MsgBox "The form cannot be close.farzad dh."
    Dim leftI As Long
    Dim rightI As Long
    leftI = Form1.Left + 1000
    rightI = Form1.Top + 1000
    Dim a As New Form1
    a.Width = Me.Width
    a.Height = Me.Height
    a.Left = leftI
    a.Top = rightI
    a.Show
    End Sub

    [/TD]
    [/TR]
    [/TABLE]
     
  8. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    ساختن جدول در بانک اطلاعاتی :
    از منوی project گزینه refrences رو انتخاب کنید - بعد اونجا گزینه Microsoft ActiveX Data Objects 2.0 library پيدا کنيدو تيک بزنيد - Adodc مورد نظرتون رو هم با دیتابیس set کنید - بعد :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [/TD]
    [TD="class: code"]Dim db_file As String
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim NumRec As Integer

    Set conn = New ADODB.Connection
    conn.ConnectionString = Adodc1.ConnectionString
    conn.Open

    On Error Resume Next
    conn.Execute "DROP TABLE Jadid"
    On Error GoTo 0

    conn.Execute "CREATE TABLE Jadid(" & "One INTEGER NOT NULL," & "Two VARCHAR(40) NOT NULL," & "Three VARCHAR(40) NOT NULL)"

    conn.Execute "INSERT INTO Jadid VALUES (1,'4','7')"
    conn.Execute "INSERT INTO Jadid VALUES (2,'5','8')"
    conn.Execute "INSERT INTO Jadid VALUES (3,'6','9')"

    Set rs = conn.Execute("SELECT COUNT (*) FROM Jadid")
    NumRec = rs.Fields(0)

    conn.Close

    MsgBox "Created ... "

    [/TD]
    [/TR]
    [/TABLE]
     
  9. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    نحوه تولید DLL با ویژوال بیسیک

    بعنوان یک زبان برنامه‌نویسی با توسعه سریع، ویژوال بیسیک نظر خیلی از برنامه‌نویسان را از جهت سادگی به خود معطوف کرد. برنامه‌نویسی با ویژوال بیسیک در کمترین زمان صورت می‌گیرد حال آنکه در مقابل زبانهایی چون C و ++C اغلب اوقات به روزها کار مفید نیاز است.
    اما بیشترین انتقادی که برنامه‌نویسان از ویژوال بیسیک دارند در این است که قادر به تولید کتابخانه‌های پویا (DLL) نیست. حقیقتا این نظر مورد قبول است که نمی‌توان این نوع فایلها را در کنار فایلهای اجرایی(Exe) یا ActiveX Exe تولید کرد.
    در این مقاله ما قصد داریم که نگاه دقیقی به نحوه تولید فایلهای اجرایی در ویژوال بیسیک یندازیم و بعد با طی مراحل ساده‌ای موفق به ایجاد فایلهای DLL بشویم تا از زیر بار این انتقاد نیز رهایی یابیم.
    قبلا به این موضوع اشاره شد که فایهای DLL آن دست از برنامه‌هایی هستند که یکبار نوشته می‌شوند و در پروژه‌های بعدی بکرات می‌تواند از آنها استفاده برد. چیزی که هسته ویندور را تشکیل می‌دهد اینگونه فایلها هستند. علاوه بر آن تکنیک‌هایی وجود دارد که شما را قادر می‌سازد تا برنامه‌هایی بنویسید که قادرند خود را بروز برسانند و یا خود ترمیم باشند. بهتر از آن اینکه برنامه‌ای بنویسید که با الحاق اینگونه فایلها بدان قدرت و امکانات جدید بدان افزود. همانند نرم‌افزارهای رایج از جمله Winamp.

    کتابخانه‌های پویای قابل اتصال (DLL) چه هستند؟

    یک DLL مجموعه‌ای از توابع و پروسه‌هایی است که می‌تواند از برنامه یا DLLهای نظیر خود فراخوانده شود.

    استفاده از اینگونه کتابخانه‌های دو مزیت اصلی دارد:
    1- امکان به اشتراک گذاری از کد را فراهم می‌سازند. یک DLL می‌تواند مورد استفاده خیلی از برنامه‌های قرار گیرد. بعنوان مثال کتابخانه Win32 API نمونه‌ای از این سری فایلها است. بعلاوه از زمانی که پروسه‌های گوناگون قادر به فراخوانی یک DLL واحد هستند امکان به اشتراک گذاری کد‌ها و روتین‌ها فراهم آمده است. یک فایل DLL تنها یکبار به درون حافظه لود می‌شود و بارها توسط پروسه‌های گوناگونی مورد استفاده قرار می‌گیرد و این یعنی مدیریت حافظه بهتر.

    2- مزیت دیگر امکان نوشتن برنامه‌ها بصورت اجزای منفصل است که این اجزا خود قابل تعویض با نگارش‌های جدیدتر جهت توسعه نرم‌افزار خواهند بود بدون اینکه خطی از کد برنامه اصلی دگرگون شود.

    با این توصیف فایلهای کتابخانه‌ای درونی که در پروژه‌های مورد استفاده قرار می‌گیرد در صورت تغییر نیاز هست تا پروژه اصلی دوباره کمپایل شود تا بتوان با آن ارتباط بر قرار کرد. اما در DLL ها چون بصورت پویا و قابل انعطاف نوشته شده‌اند این اتصال در بیرون از بدنه اصلی و درست در زمان فراخوانی آن قبیل از متدها و توابع شکل می‌گیرد و این خود تفاوت آشکار از مزیت این گونه از فایلها می‌باشد.همچنین یک فایل DLL می‌تواند حاوی توابعی باشد که فقط مورد استفاده خود هست و از درون به آن دسترسی نخواهیم داشت و آندسته از تابعی را که نیاز هست معرفی می‌کنیم تا از بیرون بدان دسترسی داشته باشیم. در این مرحله نیاز به معرفی در فایلهای Def هست که در پروژه‌های C و C++‎ مورد استفاده قرار می‌گیرد.

    و اما ساختار DLL
    فایلهای DLL حاوی یک مدخل شروع انتخابی (optional entry point) و پایانی هستند که در زمانی که توسط برنامه‌های دیگر به درون حافظه لود یا آنلود می‌شوند قابل اجرا است. ویندوز این پروسه را در زمانی که یک برنامه DLLها را بدرون حافظه لود یا آنلود می‌کند اجرا می‌کند.
    این دو نوع پروسه به DLL این امکان را می‌دهد که یک سری از مقدمات را پیش از استفاده مهیا کند یا بعد از استفاده پاکسازی نماید. در ویژال بیسیک این تابع بدین گونه تعریف می‌شود:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    [/TD]
    [TD="class: code"]Public Function DllMain(hinstDLL As Long, fdwReason As Long , lpwReserved As Long) As Boolean

    [/TD]
    [/TR]
    [/TABLE]



    که پارامترهای آن بدین قرارند:
    hInstDLL که حاوی یک مقدار یکتا بعنوان دستگیره فایل DLL است.
    fdwReason مشخص کننده دلیل فراخوانی این پروسه توسط سیستم‌عامل است که یکی از چهار مقدار زیر را به خود منتصب می‌کند:
    DLL_PROCESS_ATTACH (1): یک پروسه در حال لود DLL به دورن حافظه است. هر پیش‌نیاز باید در اینجا شکل گیرد.
    DLL_THREAD_ATTACH (2): یک ریسمان (Thread) برای این DLL در حال تولید است. هر پیش‌نیاز برای ایجاد ریسمان در این مرحله می‌تواند شکل بگیرد.
    DLL_THREAD_DETACH (3) ریسمان در حال پایان یافتن است. به منظور پاک‌سازی DLL از حافظه.
    DLL_PROCESS_DETACH (0) فایل DLL در حال خروح از حافظه است. بمنظور پاک‌سازی سایر کارها توسط برنامه‌نویس امکان انجام در این مرحله فراهم آمده است.

    lpvReserved: حاوی مقدار اضافی در استفاده از DLL_PROCESS_ATTACH یا DLL_PROCESS_DETACH می‌باشد.
    مقدار برگشتی تابع DllMain در هنگام صدا زدن بصورت DLL_PROCESS_ATTACH مقدار TRUE را باید به خود بگیرد.

    در تلاش برای تولید و توسعه یک DLL نمونه قصد این را داریم که یک کتابخانه ریاضی تشکیل دهیم. کد زیر در ماژولی بنام MathLib.Bas قرار می‌گیرد:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    [/TD]
    [TD="class: code"]Option Explicit
    Public Const DLL_PROCESS_DETACH = 0
    Public Const DLL_PROCESS_ATTACH = 1
    Public Const DLL_THREAD_ATTACH = 2
    Public Const DLL_THREAD_DETACH = 3


    Public Function DllMain(hInst As Long, fdwReason As Long, lpvReserved As Long) As Boolean
    Select Case fdwReason
    Case DLL_PROCESS_DETACH
    ' No per-process cleanup needed
    Case DLL_PROCESS_ATTACH
    DllMain = True
    Case DLL_THREAD_ATTACH
    ' No per-thread initialization needed
    Case DLL_THREAD_DETACH
    ' No per-thread cleanup needed
    End Select
    End Function


    Public Function Increment(var As Integer) As Integer
    If Not IsNumeric(var) Then Err.Raise 5

    Increment = var + 1
    End Function


    Public Function Decrement(var As Integer) As Integer
    If Not IsNumeric(var) Then Err.Raise 5

    Decrement = var - 1
    End Function


    Public Function Square(var As Long) As Long
    If Not IsNumeric(var) Then Err.Raise 5

    Square = var ^ 2
    End Function

    [/TD]
    [/TR]
    [/TABLE]
     
  10. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پاسخ : یه سری آموزش های فوق العاده جالب برای دوستان عزیز

    به نظر شما از چه دستوری استفاده کنیم که يک کلمه را توی يک فيلد بانک اطلاعاتي جستجو کنم نه اينکه اون کلمه اول نوشته باشه . اين کلمه ممکنه وسط هم نوشته شده باشه :
    برای کاری که می خوای انجام بدی باید از دستورات SQL استفاده کنی.

    اگر از کامپونت ADO استفاده می کنی دستور جستجوش به این شرحه :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    [/TD]
    [TD="class: code"]Ado1.RecordSource= "Select * From [your table] Where [your field] Like ('%متن مورد نظر برای جستجو%')"

    [/TD]
    [/TR]
    [/TABLE]



    ولی اگر از کامپونت Data استفاده می کنی دستورش اینطوری می شه :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    [/TD]
    [TD="class: code"]Data1.RecordSource= "Select * From [your table] Where [your field] Like ('*متن مورد نظر برای جستجو*')"

    [/TD]
    [/TR]
    [/TABLE]



    مثال : مثلا من یک Table با نام Table1 و یک فیلد به نام Address دارم و می خوام تمام آدرسهایی که توشون ( شیراز) داره پیدا کنم ، حالا این کلمه می خواد هرجایی از فیلد باشه :
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    [/TD]
    [TD="class: code"]Ado1.CommandType = adCmdText

    Ado1.RecordSource= "Select * From Table1 Where Address Like ('%شیراز%')"

    Ado1.Refresh

    [/TD]
    [/TR]
    [/TABLE]



    این آموزش واقعاً کاربردیه