PDA

View Full Version : پر کردن کمبو باکس



matinebi
چهارشنبه 14 مرداد 1388, 09:09 صبح
1.چطور میتونم کمبوباکسی تعریف کنم که زمانی که کاربر نام کالایی رو در کمبو باکس وارد میکنه ابتدا چک کنم که این کالا در کمبو باکس هست یا خیر اگر نبود به لیست کمبوباکس اضافه شود

2.کمبوباکس این امکان رو داشته باشه که کالاهایی که برای آخرین بار مورد استفاده قرار میگیره به بالای کمبوباکس منتقل شود(دقیقا مانند انتخاب فونت در WORD)

با تشکر

Hsimple11
چهارشنبه 14 مرداد 1388, 14:20 عصر
این لیست کالا قاعدتا در دیتابیس ذخیره میشه. پس اون فیلدتون رو Unique Constraint کنید مثلا یک Primary Key براش بذارید و باtry/Except به کاربر پیغام بدید که نام کالا تکراری است و وجود داره. یا قبل از Insert به دیتابیس اون رو در دیتابیس Locate کنید. اگر بود Insert نکنید. این کار رو بخواین با Item های کمبو انجام بدید کار اشتباهیه. در مورد recent Items هم کمبوباکسهایی در این مورد هست ولی اگه بخوای خودت انجام بدی باید یه trick به کار ببری. مثلا یه کمبوباکس دیگه داشته باشی که مثلا 10 آیتم انتخابی مدام توی اونم وارد بشه و بعد اونا رو اول آیتمهای کمبوی اولی قرار بدی. یا توی دیتابیست یه فیلد دیگه مثلا بر اساس زمان Select داشته باشی و بعد آیتمها رو داخل کمبو باکس بر اساس اون فیلد Sort کنی...

matinebi
چهارشنبه 14 مرداد 1388, 18:08 عصر
من لیست کالاهام در دیتا بیس ذخیره نمیشه فقط برای راحتی کار کاربر یکسری کالا در کمبو باکس قرار میگیره و نیاز دارم تا اگر کاربر کالای جدیدی خواست وارد کند در لیست کمبوباکس اضافه گردد

برای سوال دوم هم اگر سمپل دارید لطفا قرار دهید

با تشکر

Hsimple11
چهارشنبه 14 مرداد 1388, 19:08 عصر
خب اینکار جالب نیست و کاربر باید هربار کالای جدید رو اضافه کنه. باید این لیست در دیتابیس ذخیره شه.

اینهم کامپوننتی که میخواستید. Font ComboBox از آقای M.Adler با قابلیت نمایش آیتمهای اخیرا انتخاب شده (Recent Items) :

میتونید با کمی تغییر بجای فونت آیتمهای خودتون رو نمایش بدید. سورسش وجود داره.

matinebi
پنج شنبه 15 مرداد 1388, 08:33 صبح
با تشکر از دوستان
ببینید یکسری کالاها هست که نمیشه ابتدا وارد دیتا بیس کرد چون کارفرما هم نمیدونه تمام کالاهایی که ممکن است در آینده مورد استفاده اش قرار گیرند چه هست بنابراین ما اون تعدادی از کالاهایی رو کارفرما میدونه و عمومیت بیشتری داره رو در آیتم های کمبو باکس ذخیره میکنیم(که نیازی هم به دیتابیس نیست) و یک شرط برای کمبوباکس میزاریم که کالای جدیدی که در کمبوباکس میخواد ثبت بشه اگر در لیست آیتم های کمبو باکس موجود بود که هیچی اما اگر در لیست آیتم های کمبوباکس نبود اون کالا رو در لیست آیتم های کمبوباکس اضافه کن

حالا همین کار رو چطور میشه در کمبوباکس اعمال کرد
با تشکر فراوان

Hsimple11
پنج شنبه 15 مرداد 1388, 12:54 عصر
ببینید دوست عزیز. من راه حل منطقی رو به شما گفتم. هنوز هم میگم که باید از یه دیتابیس استفاده کنید. اگه میخواین برنامتون استاندارد باشه. این لیست کالایی که میگید باید قابلیت ویرایش رو داشته باشه. به قول خودتون ممکنه یه کارفرما بخواد با یه سری کالاهای جدید کار کنه. اگه دیتابیسی نداشته باشید و اسامی کالاها رو ذخیره نکنید در هربار اجرا لیست کالا ها از بین میره و فقط همونایی میمونه که خودتون الان وارد میکنید. اینطوری هیچ کاربری از برنامتون احساس رضایت نمیکنه. اساسا هرچی بیشتر بتونید برنامه هاتون رو با قابلیت Customization بالا یعنی قابل تغییر به میل کاربر، بهتره.

به هرحال راه حل پیشنهادی من اونه که راهشو هم گفتم بهتون. ولی اگه میخواین همینطوری به آیتمها اضافه کنید کافیه یه حلقه For به تعداد Items.Count داشته باشید و از آیتم اول تا آخر همه رو با نام کالای جدید چک کنید، اگر برابر نبود، در نهایت Items.Add کنید.

موفق باشید.

matinebi
پنج شنبه 15 مرداد 1388, 16:00 عصر
با تشکر از شما درسته من به این دقت نکرده بودم که پس از بستن برنامه آیتم ها از بین میره خوب من کد برنامه رو به صورت زیر نوشتم ولی اگر تعداد کالاها زیاد باشد چون در هربار ثبت کالا باید تمام کالاهای کمبوباکس یک بار بررسی شود احتمالا بعد از یک مدت سرعت ثبت دچار کاهش میشود آیا راهی برای این مشکل هست

k:=false;
ADOQuery2.First;
while not ADOQuery2.Eof do
begin
if ADOQuery2['nkala']=ComboBox1.Text then
begin
k:=true;
Break;
end;
ADOQuery2.Next;
end;
if k=false then
begin
ADOQuery2.Insert;
ADOQuery2['nkala']:=ComboBox1.Text;
ADOQuery2.Post;
ComboBox1.Items.Add(ComboBox1.Text);
end;
//************************************************** ****



procedure Tmain.FormCreate(Sender: TObject);
begin
ComboBox1.Clear;
ADOQuery2.First;
while not ADOQuery2.Eof do
begin
ComboBox1.Items.Add(ADOQuery2['nkala']);
ADOQuery2.Next;
end;
end;

Hsimple11
پنج شنبه 15 مرداد 1388, 18:58 عصر
در صورتی که از دیتابیس استفاده میکنید راه حل رو در پست 2 گفتم. یه Unique Constraint مثل PK منطقی ترین راهه.

matinebi
پنج شنبه 15 مرداد 1388, 19:51 عصر
در صورتی که از دیتابیس استفاده میکنید راه حل رو در پست 2 گفتم. یه Unique Constraint مثل PK منطقی ترین راهه.

لطفا بیشتر راهنمایی نمایید

Hsimple11
پنج شنبه 15 مرداد 1388, 21:23 عصر
وقتی خود جدول رو در Access یا SQL طراحی میکنید براش یه PK قرار بدید. همین کلمات رو جستجو کنید بارها بحث شده. بعد میتونید با بلوک Try/Except وقتی رکورد تکراری میخواد وارد شه، پیغام خودتون رو بذارید که مثلا کالا تکراری است.