PDA

View Full Version : سوال: ذخیره تنظیمات بعد از بستن برنامه



Mohsen0025
شنبه 23 مرداد 1395, 16:45 عصر
با سلام
قبلا راجع به این صحبت شده و تایپکم ایجاد شده .
سوال من اینه که چرا من بعد از بستن برنامه که تنظیماتو میگم تو فایل ini ذخیره کنه برنامم هنگ میکنه:ناراحت: از کد های توابع api به نامهای GetPrivateProfileString و WritePrivateProfileString استفاده میکنم.لیبل و shap هستن که left,top رو ذخیره باید بکنه که هنگ میکنه بعد از دستور ذخیره.
لطفا راهنمایی بفرمایید.

www.pc3enter.tk
یک شنبه 24 مرداد 1395, 18:30 عصر
می تونی اون برنامه ات را بگذاری تا ببینم مشکلت چیه یا نه


تا برات حلش کنم

محسن واژدی
دوشنبه 25 مرداد 1395, 11:09 صبح
سلام
سورس کد مشکل را هم ضمیمه کنید

پست زیر را هم بررسی کنید:گزینه ذخیره در برنامه (http://barnamenevis.org/showthread.php?333494-%DA%AF%D8%B2%DB%8C%D9%86%D9%87-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87&p=1470854&viewfull=1#post1470854)

موفق باشید

nerset
شنبه 10 مهر 1395, 22:44 عصر
با سلام
این مورد که میگم یک حدس و احتمال است یعنی ممکن است که برنامه شما حتی تا لحظه ای که می خواهد کار ذخیره کردن تنظیمات را انجام دهد همچنان از اطلاعات این فایل استفاده می کند و یا اینکه ممکن است برنامه زمان کافی برای ذخیره تنظیمات را نداشته باشد که در این صورت باید توسط یک تایمر چند ثانیه بعد از دادن دستور ذخیره تنظیمات از برنامه خارج شوید
البته من چندان در مورد چنین روشی برای ذخیره تنظیمات برنامه نمی دانم و پیشنهاد می کنم که در صورت عدم رفع شدن مشکل ، تنظیمات برنامه را در صورت زیاد نبودن تعداد آن در چند فایل تکست به طور جداگانه ذخیره کنید.
به هر حال امیدوارم که موفق شوید.

vbhamed
سه شنبه 13 مهر 1395, 11:17 صبح
سلام

کاربر گرامی nerset

دستورات ویژوال بیسیک به صورت پیش فرض در یک Thread انجام میشه پس وقتی دستور ذخیره دیتا رو دادید تا زمانی که کار اون دستور انجام نشده سراغ دستور بعدی نمیره بنابراین گذاشتن تایمر در این مورد مشکلی رو حل نمیکنه

Mohsen0025
شنبه 17 مهر 1395, 19:23 عصر
سلام و مرسی
من از تایمر استفاده نکردم!!!!واسه ذخیره از دستور WritePrivateProfileString استفاده میکنم مثلا: WritePrivateProfileString label1.top و WritePrivateProfileString shape1.top و WritePrivateProfileString label1.left و..... وقتی این دستوراتو مینویسم هنگ میکنه

nerset
شنبه 17 مهر 1395, 21:42 عصر
با سلام
من در برخی از نرم افزارهایی که نوشته ام فقط از یک فایل اجرایی استفاده نکرده ام و همچنین فایل های اجرایی نوشته شده در آنها همزمان با هم اجرا می شوند و در عین حال به یکدیگر وابسته هستند و با یک تایمر فاصله درخواست یک فایل اجرایی تا تامین آن نیاز توسط فایل اجرایی دیگر را به تعویق انداختم تا تداخلی برای کار نرم افزار پیش نیاید اگر چه کمتر کسی از چنین روشی استفاده می کند ولی به هر حال من هم به دلایلی از این روش استفاده کردم و برای همین هم با حدس و احتمال استفاده از تایمر را پیشنهاد دادم چون ممکن بود که در نرم افزار شما هم به نوعی گردش کار نرم افزاری شباهت هایی به این روش داشته باشد.
به هر حال من از دستورات ویژوال بیسیک 6 با وجود اینکه می توان با استفاده از توابع خاص و منحصر به فرد و بسیار زیاد آن هر کاری را به راحتی انجام داد چندان اطلاعی ندارم و همواره سعی می کنم که اگر تابعی و یا روشی جواب نداد و یا به سراغ دیگر روش های ساده تر بروم چون با ترکیب روش ها و توابع ساده تر می توان جایگزینی برای بسیاری از توابع پیدا کرد و البته نه همه توابع و چون بیشتر به راهکارهای جدید و ابتکاری در برنامه نویسی علاقه مندم چنین روش هایی را پیشنهاد دادم.
البته باز هم پیشنهاد می کنم که اگر برای حل مشکل تابع یاد شده نتوانستید راه حلی پیدا کنید و دیگران هم نتوانستند راه حل بهتری پیشنهاد بدهند از ساده ترین و ابتدایی ترین دستورات مانند ذخیره اطلاعات تنظیمات نرم افزاری در یک یا چند فایل تکست و یا کمی جالب تر در یک فایل غیر تکست و به صورت باینری استفاده کنید.
قصد من از پاسخگویی به کامنت ها انگیزه دادن به کاربران برای بالا بردن خلاقیت و ابتکار آنها است تا خود آنها با تحلیل بتوانند راه حل مناسب را پیدا کنند.
به هر حال امیدوارم که با تحلیل و ابتکار و همت ، خودتان سرانجام به پاسخ مناسب برای حل این مشکل برسید.
با آرزوی موفقیت برای شما

vbhamed
یک شنبه 18 مهر 1395, 09:37 صبح
سلام و مرسی
من از تایمر استفاده نکردم!!!!

سلام
اون پست در جواب کاربر عزیز nerset بود

اما شما باید اون قسمت برنامتون رو به صورت یک پروژه بزارید تا بررسی بیشتر انجام بشه

www.pc3enter.tk
پنج شنبه 13 آبان 1395, 04:53 صبح
شما می تونید به سادگی از تابع savesetting و getsetting به راحتی استفاده کنید

m.4.r.m
پنج شنبه 13 آبان 1395, 19:59 عصر
شما می تونید به سادگی از تابع savesetting و getsetting به راحتی استفاده کنید

بله می تونین از توابع کار با ریجیستری این کارو بکنید و یا با فایل کار کنید . مثل این کار


خب اوّل یک مثال میزنم و بعد میرم سره آموزش تا بهتر یاد بگیرید.
یک پروژه جدید باز کنید و یک Command Button و یک TextBox بذارید تو فرمتون و کد زیر رو تو قسمت جنرال فرمتون کپی کنید :
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
برنامه رو اجرا کنید و هر چی دلتون میخواد تو TextBox وارد کنید و بعد کلید Command1 رو بزنید و از برنامه خارج بشید. حالا اگه دوباره برنامه رو اجرا کنید میبینید متنی که دفعه قبل وارد کرده بودید سره جاشه و پاک نشده !
حالا بریم سره آموزش :
دستوات SeveSetting ، GetSetting ، DeleteSetting و GetAllSettings از توابع خود ویژوال بیسیک هستند و نیازی به فراخوانی اونا نیست. طرز کار این دستورات خیلی ساده ست، این دستورات فقط برای ثبت و بازیابی تنظیمات استفاده میشن و هیچ کار دیگه ای انجام نمیدن، در واقع محدوده عملیات این دستورات در رجیستری محدود به این آدرس است :

HKEY_CURRENT_USER\Software\VB and VBA Program Settings\PROGRAM NAME\SECTION\DATA
یعنی شما با این دستوات نمیتونید به بخشهای دیگه رجیستری دسترسی داشته باشید. شکل کلّی این دستورات به صورت زیره :
Sub SaveSetting(AppName As String, Section As String, Key As String, Setting As String)
Function GetSetting(AppName As String, Section As String, Key As String, [Default]) As String
Function GetAllSettings(AppName As String, Section As String)
Sub DeleteSetting(AppName As String, [Section], [Key])
SevaSetting : این دستور بسیار ساده ست فکر کنم با توضیحات بالا دیگه نیازی به آموزش نیست، ببینید در واقع این دستور اولین کاری که میکنه، یک پوشه که بیانگر نام برنامه ست (AppName) در آدرسی که گفتم میسازه. بعدش میره سراغ پوشه بعدی (Section) یعنی عملیاتی که قراره انجام بدیم مثلاً اگر قراره که موقعیّت فرم رو ذخیره کنیم بهترین نامی که میتونیم برای این عملیات بذاریم Position است و بعد از اون هم کلید یا همون مقداری که باید ذخیره بشه مثل Top. به دستور زیر توجّه کنید :
SaveSetting "Project1", "Position", "Top", Me.Top
دستور فوق باعث ساخته شدن آدرس زیر میشه (قسمت پر رنگ) :
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Project1\Position\
که در اون آدرس هم، کلید یا همون فایل Top قرار داره که حاوی یک عدد است (موقعیّت بالای فرم). به این ترتیب ما تونستیم با این دستور اطّلاعاتی (موقعیّت قرم) رو در رجیستری ذخیره کنیم. حالا برای بدست آودرن این اطّلاعات باید از دستور GetSetting استفاده کنیم.

GetSetting : این دستور هم خیلی ساده ست. شما باید آدرس و کلید مورد نظرتون رو تعیین کنید تا این تابع مقدار کلید رو برگردونه. به دستور زیر توجّه کنید :
x = GetSetting("Project1", "Position", "Top", "2000")
دستور فوق اطلاعات داخله فایله Top رو برمیگردونه و به فرم انتصاب میده. امّا اون عدد 2000 چیه؟ خب باید بگم که اون مقدار پیش فرضه تا اگه کلید Top در مسیر داده شده وجود نداشت و نتونست مقداری رو برگردونه، از مقدار پیش فرض استفاده کنه .

DeleteSetting : این دستور برای پاک کردنه یک کلید (فایل) یا پوشه از مسیر داده شده ست. به عنوان مثال اگه شما بخواید کلید Top رو پاک کنید باید از دستور زیر استفاده کنید :
DeleteSetting "Project1", "Position", "Top"
در دستور بالا کلید Top حذف میشه و اگه کلید Top رو تعیین نکنیم (DeleteSetting "Project1", "Position") پوشه Position پاک میشه و اگه پوشه Position رو هم تعیین نکنیم (DeleteSetting "Project1") پوشه Project1 حذف میشه. و مسلّماً در صورتی که فایل یا پوشه یافت نشه با پیغام خطا مواجه میشید. تا اینجا که خیلی ساده امّا تابع GetAllSettings کمی فرق میکنه.

GetAllSettings : این دستور کمی با دستورات قبلی تفاوت داره. اول با یک مثال شروع میکنم :
Private Sub Form_Load()
Me.AutoRedraw = True
Dim MySettings As Variant, intSettings As Integer

SaveSetting "MyApp", "Startup", "Number1", 50
SaveSetting "MyApp", "Startup", "Number2", 22
SaveSetting "MyApp", "Startup", "Number3", 36
SaveSetting "MyApp", "Startup", "Number4", 197
SaveSetting "MyApp", "Startup", "FName", "Amir"
SaveSetting "MyApp", "Startup", "LName", "Amiri"
SaveSetting "MyApp", "Startup", "Message", "Hello My Friend"

MySettings = GetAllSettings(appname:="MyApp", section:="Startup")

For intSettings = LBound(MySettings, 1) To UBound(MySettings, 1)
Print MySettings(intSettings, 0) & " = " & MySettings(intSettings, 1)
Next intSettings

DeleteSetting "MyApp"
End Sub
خب این مثال میتونه کمک خیلی خوبی باشه. در واقع تابع GetAllSetting همون کاری رو میکنه که تابع GetSetting میکرد، با این تفاوت که در GetAllSettings کلید تعیین نمیشه بلکه پوشه ای که کلیدها در اون قرار دارن تعیین میشه و همچنین مقدار برگشتی هم یک مقدار از نوع متنی نیست بلکه آرایه ای دو بعدی از داده های موجود در پوشه ست که نام کلید در ستون 0 و مقدار کلید در ستون 1 قرار میکیره. میبینید که در ابتدا مقادیری رو با نامهای متفاوت در رجیستی ذخیره کردیم و بعد تمام اطّلاعات ذخیه شده رو با یک دستور درون متغیّر MySettings ذخیره کردیم، امّا دسترسی به این اطّلاعات چطور امکان پذیره؟




ستون 0
ستون 1


سطر 0
Number1
50


سطر 1
Number2
22


سطر 2
Number3
36


سطر 3
Number4
197


سطر 4
FName
Amir


سطر 5
LName
Amiri


سطر 6
Message
Hello…




شکل بالا ساختار متغیّر MySettings رو نشون میده :
متغیّر MySettings که از نوع Variant تعریف شده، بوسیله تابع GetAllSettings به شکلی که میبینید مقدار دهی شده. حالا اگه به نام کلید نیازی ندارید میتونید فقط از ستون 1 که مقدارها درونش هستن استفاده کنید.
در این مرحله اگه با آرایه ها آشنا باشید کار کردن با این تابع براتون آسونه. موفق باشید.

vbhamed
جمعه 14 آبان 1395, 09:06 صبح
سلام

البته روش SaveSetting و GetSetting هم روش ساده و خوبیه ولی چون این دو تابع از رجیستری ویندوز برای ثبت دیتا استفاده می‌کنن و طبق تجربه خیلی اوقات نیاز به تعویض ویندوز احساس میشه و یا کاربر قراره برنامش رو روی دستگاهی دیگه نصب کنه، در اینصورت همه تنظیمات برنامه از بین میره ولی در روش فایلهای ini چون این فایلها کنار برنامه هستن به راحتی میشه ازشون کپی گرفت

از تنظیمات رجیستری هم میشه کپی گرفت ولی نه به سادگی فایلهای ini و باید امکانش تو برنامه پیش بینی بشه چون از طریق خود برنامه Registry Editor ویندوز انجام این کار برای کاربر دردسر سازه

m.4.r.m
جمعه 14 آبان 1395, 12:19 عصر
سلام

البته روش SaveSetting و GetSetting هم روش ساده و خوبیه ولی چون این دو تابع از رجیستری ویندوز برای ثبت دیتا استفاده می‌کنن و طبق تجربه خیلی اوقات نیاز به تعویض ویندوز احساس میشه و یا کاربر قراره برنامش رو روی دستگاهی دیگه نصب کنه، در اینصورت همه تنظیمات برنامه از بین میره ولی در روش فایلهای ini چون این فایلها کنار برنامه هستن به راحتی میشه ازشون کپی گرفت

از تنظیمات رجیستری هم میشه کپی گرفت ولی نه به سادگی فایلهای ini و باید امکانش تو برنامه پیش بینی بشه چون از طریق خود برنامه Registry Editor ویندوز انجام این کار برای کاربر دردسر سازه

بله این روش هم مهندسی هستش

armeshi
شنبه 13 آذر 1395, 18:12 عصر
سلام
این چرا میاد؟
چطور برطرفش کنم
ممنون
143663

isaac23
شنبه 13 آذر 1395, 18:21 عصر
فکر کنم از قبل یه سری تنظیمات داخل اون فایله ذخیره شده بوده حالا شما اومدی تغییر دادی خب بهت هشدار داره که میخای تغییرات اپدیدت بشه یا نه. چیز خاصی نیست

armeshi
یک شنبه 14 آذر 1395, 20:49 عصر
درسته ولی
چرا هر بار میاد
چرا یه بار که اصلاش کرد دوباره ذخیرش نمیکنه و دفه بعدم میاد!!!

به نظرم موضوع " و ' اینه

isaac23
دوشنبه 15 آذر 1395, 09:39 صبح
من تست کردم هر کاری کردم اون پیغامه نیومد. ویندوزت چیه ؟

isaac23
چهارشنبه 29 دی 1395, 18:03 عصر
سلام

البته روش SaveSetting و GetSetting هم روش ساده و خوبیه ولی چون این دو تابع از رجیستری ویندوز برای ثبت دیتا استفاده می‌کنن و طبق تجربه خیلی اوقات نیاز به تعویض ویندوز احساس میشه و یا کاربر قراره برنامش رو روی دستگاهی دیگه نصب کنه، در اینصورت همه تنظیمات برنامه از بین میره ولی در روش فایلهای ini چون این فایلها کنار برنامه هستن به راحتی میشه ازشون کپی گرفت

از تنظیمات رجیستری هم میشه کپی گرفت ولی نه به سادگی فایلهای ini و باید امکانش تو برنامه پیش بینی بشه چون از طریق خود برنامه Registry Editor ویندوز انجام این کار برای کاربر دردسر سازه


به این روش میشه تنظیماتی رو که داخل ریجستری ذخیره کردهی خروجی بگیری مثل اکسپورت خود ریجستری فرقی نداره . من کل اطلاعات رو توی رجستری ذخیره میکنم و بعد با استفاده از این دستور خروجی و بعدا وارد رجستری میکنم ... اگه منظورت رو درست متوجه شده باشم.


Sub RegeditExport(sKey As String, sFilename As String)
Shell "regedit.exe /s /e " & Chr(34) & sFilename & Chr(34) & " " & Chr(34) & sKey & Chr(34), vbHide
End Sub


Private Sub Command1_Click()
RegeditExport "HKEY_CURRENT_USER\Software\VB and VBA Program Settings\bazar", CommonDialog1.FileName + ".reg"

End Sub


تمام زیر شاخه های کلید bazar رو کپی می کنه

vbhamed
چهارشنبه 29 دی 1395, 18:42 عصر
سلام

حالا فرض کنید ویندوز یهویی خراب شد و دیگه بالا نیومد، اونوقت تنظیماتی که کپی نگرفتین از بین میره و دسترسی دوباره بهش میشه کلی دردسر !

ضمنا وقتی قرار باشه با این دستورات از تنظیمات برنامه در یک فایل کپی بگیریم خب دیگه چه کاریه، از همون اول از فایل خارجی استفاده می‌کنیم

isaac23
چهارشنبه 29 دی 1395, 18:55 عصر
خب نه آقا حامد خب زمانی که کاربر داره برنامه خارج میشه توی فرم بکاپ زمانیکه از اطلاعات بکاپ میگیره اینم اتوماتیک خودش میاد همون مسیر فایل بکاپ ذخیره میکنه و یه فایل regخروجی میده و در زمان بازیابی هم با یه دستور دیگه میاد اطلاعات ذخیره شده رو میفرسته به رجستری مثل همون Import خودش عمل میکنه..


نمی دونم اما فرقی با فایل Ini نداره همون شکل هست فقط این فایل reg هست . من اینجوری استفاده کردم . به هر حال جواب کار منو می ده .

vbhamed
چهارشنبه 29 دی 1395, 19:21 عصر
سلام

ببینید، وقتی کاری انجام میشه باید دید چه مزیتی برای شما ایجاد میکنه، شما داخل رجیستری ذخیره کنید، بعد حتما بکاپ باید بگیرید بعدش خروجی یا Export هم بگیرید و موقع ورود دوباره Import کنید
خب اصلا هدف از این کارا چیه
ممکنه موقع استفاده از توابع رجیستری بعضی آنتی ویروسها هم به برنامتون گیر بدن

جواب کار شما رو میده اگر این وسط تو دیتابیس هم ذخیره کنید و چند تا کار دیگه هم انجام بدید بالاخره کار شما رو جواب میده ولی برای چی لقمه رو دور سرتون می‌چرخونید ؟