PDA

View Full Version : استفاده از کمبو برای رفتن به یک رکورد



پرواز
سه شنبه 15 آبان 1386, 02:25 صبح
برای اینکه تو دیتابیس جستجو انجام بدیم و مستقیم بریم سر رکورد مورد نظر یکی از راههاش استفاده از کامپوننت DBLookupComboBox هست. ولی این کامپوننت یه بدی داره و اونم اینه که نمیشه توش تایپ کرد! من دنبال یه کامپوننت می گردم که بشه توش تایپ هم کرد.

برای این کار اومدم از یه RzCombobox (از کامپوننتهای شرکت Raize)استفاده کردم و برای عملیات حستجو کد نوشتم. خوبی ایین کامپوننت اینه که وقتی داخلش تایپ می کنی اگه اون مقدار داخل لیستش وجود نداشته باشه اجازه تایپ نمیده و مکان نما رو همونجا نگه می داره تا یه کاراکتر صحیح وارد بشه.

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

چه روش بهتری می تونه جایگزین روش من بشه که هم بشه داخل کمبو تایپ کرد و هم اینکه برای پر شدنش مثل DBLookupComboBox زمان کمی بگیره.

SYNDROME
سه شنبه 15 آبان 1386, 06:12 صبح
چه روش بهتری می تونه جایگزین روش من بشه که هم بشه داخل کمبو تایپ کرد و هم اینکه برای پر شدنش مثل DBLookupComboBox زمان کمی بگیره.
ببین این روش جواب می دهد.
1-یک ADO در صفحه قرار دهید و به بانکی که می خواهید عملیات جستجو در آن انجام شود وصل کنید.
2-یک Edit بر روی صفحه قرار دهید تا اطلاعات را در آن وارد کنید.
3-سپس در رویداد OnChange مربوط به Edit بر روی مقدار وردی در Edit مورد نظر locate زدم.


ADO.Locate(FieldName,Text,[loPartialKey]);

4-سپس اگر Locate برابر True بود مقدار را در Edit می ریزم و بقیه کلمه را تا آخر Edit مثل Combobox مارک می کنم.مثلا
اگر شما در Edit کلمه S را تایپ کنید و در بانک SYNDROME وجود داشته باشد S در Edit باقی می ماند و اگر کلمه وجود نداشت کاراکتر آخر را پاک کن.(یعنی S)
موفق باشید

Hamid_PaK
سه شنبه 15 آبان 1386, 06:48 صبح
من پیشنهاد می کنم که از کوئری استفاده کنید ، سرعت در جستجو حتی در بزرگترین بانک ها.

یا حق ...

پرواز
سه شنبه 15 آبان 1386, 06:48 صبح
ببین این روش جواب می دهد.
1-یک ADO در صفحه قرار دهید و به بانکی که می خواهید عملیات جستجو در آن انجام شود وصل کنید.
2-یک Edit بر روی صفحه قرار دهید تا اطلاعات را در آن وارد کنید.
3-سپس در رویداد OnChange مربوط به Edit بر روی مقدار وردی در Edit مورد نظر locate زدم.


ADO.Locate(FieldName,Text,[loPartialKey]);

4-سپس اگر Locate برابر True بود مقدار را در Edit می ریزم و بقیه کلمه را تا آخر Edit مثل Combobox مارک می کنم.مثلا
اگر شما در Edit کلمه S را تایپ کنید و در بانک SYNDROME وجود داشته باشد S در Edit باقی می ماند و اگر کلمه وجود نداشت کاراکتر آخر را پاک کن.(یعنی S)
موفق باشید
دوست عزیز شاید سوال منو خوب متوجه نشدی.
من با جستجو کردن که مشکلی ندارم. دوتا هدف دارم:
1- مقادیر موجود در فیلد بانک به لیست کمبو اضافه بشه که اگه کاربر خواست انتخاب کنه هم بشه
2- مقداری که جستجو میشه قابل تایپ هم باشه.

تنها مشکل من اینه که زمان زیادی برای انتقال مقادیر فیلد به کمبو تلف میشه.
وقتی که از DBLookupComboBox استفاده میشه این زمان خیلی کمه. دنبال راهی برای شبیه سازی اون می گردم. فقط شرط قابل تایپ بودن مهمه!

پرواز
سه شنبه 15 آبان 1386, 14:10 عصر
من پیشنهاد می کنم که از کوئری استفاده کنید ، سرعت در جستجو حتی در بزرگترین بانک ها.

یا حق ...
جناب Hamid_PaK اولا که ببخشید. چون من الان پست شما رو دیدم. مثل اینکه با هم آپ کردیم و من متوجه نشدم.

ثانیاً در مورد کوئری:
من دقیقاً دارم همین کارو می کنم. یعنی RzComboBox های من از یه کوئری پر میشن. مشکل سرعت پایین من تو کوئری زدن نیست. مشکل اینجاست که عملیات پر شدن کمبوها پس از گرفتن جواب از کوئری زمانبره.

به عبارت دیگه به طور مختصر و مفید بگم:
اگه مشکل من با کد نویسی قابل حل نیست دنبال یه کامپوننت شبیه DBLookupComboBox هستم که بشه داخلش تایپ هم کرد (یعنی یه کم انعطاف پذیرتر باشه).

SYNDROME
سه شنبه 15 آبان 1386, 20:23 عصر
دوست عزیز پرواز
نمی خواهد شما مقادیر را به Combobox اضافه کنید و فقط در لحظه تایپ آن را با یک Query از بانک جستجو کنید و به کاربر نمایش دهید.
با این کار شما زمان باز شدن فرم چیزی را در Combobox نمی ریزیم و زمانی از ما گرفته نمی شود.
موفق باشید

پرواز
سه شنبه 15 آبان 1386, 23:15 عصر
دوست عزیز پرواز
نمی خواهد شما مقادیر را به Combobox اضافه کنید و فقط در لحظه تایپ آن را با یک Query از بانک جستجو کنید و به کاربر نمایش دهید.
با این کار شما زمان باز شدن فرم چیزی را در Combobox نمی ریزیم و زمانی از ما گرفته نمی شود.
موفق باشید
دوست عزیز حرف شما کاملا درسته ولی وقتی که از کمبو استفاه میشه یعنی کاربر می خواد با کلیک بتونه تو بانک جستجو کنه. و بعضی وقتا هم می خواد تایپ کنه. پس نمیشه یکی از قابلیتهاشو ازش گرفت.

من هم می خوام قابلیت تایپ داشته باشه و هم کمبو باشه. (هم خدا رو می خوام و هم خرما!)

sardar_ahmadi
چهارشنبه 16 آبان 1386, 08:54 صبح
دوستان منظور دوست عزیزمان جناب پرواز این است که یک DblookupcomboBox که حاصل یک جدول است. هنگامی که یک آیتم در آن وجود ندارد و ما بخواهیم به آن اضافه کنیم. . باید با تایپ کردن در .....Dblook به جدول مذکور اضافه شود . این سوال را من قبلا مطرح کرده بودم که متاسفانه جواب نگرفتم. حالا آیا روشی هست یا نه؟

پرواز
چهارشنبه 16 آبان 1386, 20:57 عصر
دوست عزیزم جناب سردار احمدی.
نه منظورم این نبود. من DblookupcomboBox رو فقط به عنوان ابزار خروجی احتیاج دارم و نمی خوام ازش به عنوان ورودی استفاده کنم.
برای کاری که شما می خواید انجام بدید می تونید از DbComboBox استفاده کنید. به اون روشی که آقای کوشا تو یکی از تاپیکها گفتن پرش کنید. یعنی از متد AddObject استفاده کنید. احتمالاً جواب بگیرید.

afshinaghasi
پنج شنبه 17 آبان 1386, 23:14 عصر
سلام من این کدو برای برنامه خودم نوشتم اما باید یه متغیر منطقی هم تعریف کنی و هر بار که رکوردی رو اضافه یا حذف میکنی اونو یه بار true یا false کنی (من بیشتر سنتی کار می کنم بهتره) ::لبخند: اگر این کارو نکنی خیلی بده می دونی :لبخند: چون هر بار که روی comboboxکلیک کنی دوباره همه رکوردهارو میریزه توش :متعجب: متغیری که من گذاشتم اسمش combo

procedure TForm1.ComboBox1Change(Sender: TObject);

begin
if combo=false then
begin
ADOTable1.Close;
ADOTable1.Open;
ComboBox1.Items.Clear;
while not ADOTable1.Eof do
begin
ComboBox1.Items.Add(ADOTable1.FieldByName('name'). AsString);
ADOTable1.Next;
end;
combo:=true;

پرواز
جمعه 18 آبان 1386, 01:07 صبح
سلام من این کدو برای برنامه خودم نوشتم اما باید یه متغیر منطقی هم تعریف کنی و هر بار که رکوردی رو اضافه یا حذف میکنی اونو یه بار true یا false کنی (من بیشتر سنتی کار می کنم بهتره) ::لبخند: اگر این کارو نکنی خیلی بده می دونی :لبخند: چون هر بار که روی comboboxکلیک کنی دوباره همه رکوردهارو میریزه توش :متعجب: متغیری که من گذاشتم اسمش combo

procedure TForm1.ComboBox1Change(Sender: TObject);

begin
if combo=false then
begin
ADOTable1.Close;
ADOTable1.Open;
ComboBox1.Items.Clear;
while not ADOTable1.Eof do
begin
ComboBox1.Items.Add(ADOTable1.FieldByName('name'). AsString);
ADOTable1.Next;
end;
combo:=true;
افشین جان دوست عزیز
ممنون از اینکه جواب دادی. ولی این اصلاً جواب من نیست. فکر کنم تاپیک رو خوب مطالعه نکردی. یه بار دیگه بخونی خودت متوجه میشی.

در ضمن برای اینکه کدت بهینه بشه بهتره که برای پر کردن کمبو از یه Event دیگه استفاده کنی. مثلا OnFormCreate. دیگه احتیاجی به متغیر combo نداری.
اگه هدفت این بوده که با اضافه؛ حذف و یا آپدیت کردن رکورد؛ ComboBox رو آپدیت کنی می تونی کدت رو تو یه پروسیجر بنویسی و با هر بار تغییر جدول فراخوانیش کنی.
در ضمن اگه بخوای برای جستجو در بانک از این کمبو استفاده کنی باید برای عملیات جستجوت هم کد بنویسی و کد جستجو رو دقیقاً تو همین Evant که الان برا پرکردنش نوشتی باید بنویسی!

afshinaghasi
جمعه 18 آبان 1386, 12:44 عصر
اون ایونت میونتو بیخیال فعلا هرکی هر جور راحته بره جلو ولی شما همینو خواسته بودین .تمام رکوردهارو در کمبو باکس نشان میده میتونی هم با وارد کردن اسم رکورد پیداشون کنی

پرواز
جمعه 18 آبان 1386, 15:35 عصر
اون ایونت میونتو بیخیال فعلا هرکی هر جور راحته بره جلو ولی شما همینو خواسته بودین .تمام رکوردهارو در کمبو باکس نشان میده میتونی هم با وارد کردن اسم رکورد پیداشون کنی
نه اینطور نیست. من می خوام که با انتخاب هر رکورد جدول مربوطه Scrol بشه و بره سر اون رکورد. دقیقا همون کاری که DBLookupComboBox میکنه.