ورود

View Full Version : سوال: اضافه کردن مقادیر رکوردهای یک فیلد ADOQuery به یک ComboBox



hadisalahi2
سه شنبه 24 آذر 1388, 21:58 عصر
با سلام با همگی دوستان.
من مواقعی لازم دارم که مقادیر رکوردهای یک فیلد از AdoQuery خودم رو داخل آیتم های یک کومبو باکس قرار بدم.
من برای این کار از یک حلقه For یا While استفاده میکنم مثل کد زیر:



For i:=1 to Adoquery1.RecordCount do begin
combobox1.items.add(adoquery1['FName']);
Adoquery1.next
end;


حالا دنبال راهی هستم که این کار یک دفعه انجام بشه. یعنی با یک دستور کلیه رکوردهای یک فیلد از ADoquery رو داخل کومبو باکس قرار بدم.

merced
سه شنبه 24 آذر 1388, 22:46 عصر
يه تابع بنويس


procedure FillCombo(var Combo : TComboBox ; QueryStr, txtField ,KeyFild : String ) ;
var
obj: TObject;
qry : TADOQuery ;
begin
qry := TADOQuery.Create(nil) ;
try
qry.Connection := DM.Connection ;
qry.Close ;
qry.SQL.Clear ;
qry.SQL.Text := QueryStr ;
qry.Open ;
Combo.Items.BeginUpdate ;
Combo.Items.Clear ;
Combo.Text := '' ;
while not qry.Eof do begin
integer(obj) := qry.Fields[0].AsInteger ;
Combo.AddItem(qry.Fields[1].AsString , obj);
qry.Next ;
end ;

finally
qry.Free ;
Combo.Items.EndUpdate ;
end ;
end ;
///******************************

FillCombo(combo1 , 'select * from table', 'FieldStr', 'ID')

masood samadi
چهارشنبه 25 آذر 1388, 09:54 صبح
سلام دوست عزیز

اگه در تاپیک ها جستجو می کردی قبلا هم وجود داشت


while not ADOQuery1.Eof do
begin
combobox1.items.add(Adoquery1.fieldbyname('field') .asstring)
Adoquery1.next
end

pezhvakco
چهارشنبه 25 آذر 1388, 17:54 عصر
برای راحتی و سرعت عمل بیشتر بهتره از DBComboBox و یا DBLookupComboBox استفاده کنی و آن را ADOQuery و فیلد مربوط وصل کنی .

hadisalahi2
چهارشنبه 25 آذر 1388, 22:17 عصر
همگی دوستان خسته نباشند.
خوب همه جوابهای شما رو که خودم در متن سوال گفته بودم.

جناب Merced ، حلقه سه خطی خیلی بهتر عمل میکنه تا این همه کد.

جناب مسعود صمدی، دیگه اونقدر یاد گرفتم که بدونم اول جستجو باید بکنم و بعد تاپیک ایجاد کنم.
در ضمن جوابی که شما دادید دقیقا د رمتن سوال خودم هست. فکر کنم اصلا شما متن سوال رو نخوندید.

جناب pezhvakco (http://barnamenevis.org/forum/member.php?u=59994)
استفاده از این روش باعث میشه که Query همیشه در ارتباط باشه و باعث کند شدن عملیات میشه.

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

یا علی

vcldeveloper
چهارشنبه 25 آذر 1388, 22:55 عصر
حالا دنبال راهی هستم که این کار یک دفعه انجام بشه. یعنی با یک دستور کلیه رکوردهای یک فیلد از ADoquery رو داخل کومبو باکس قرار بدم.
به فرض یک دستور این کار را انجام بده، اون دستور که معجزه نمیکنه! اون هم نهایتا روی رکوردهای دیتاست حرکت میکنه، و آنها را تک تک میخوانه و به ComboBox اضافه میکنه.

می خواید سرعت پیمایش بیشتر باشه:
1- استفاده از دیتاست های Unidirectional (تک جهته) سرعت بیشتری از دیتاست های دو جهته داره، البته به شرطی که در اون دیتاست نیاز به حرکت به عقب بین رکوردها نداشته باشید.

2- استفاده از DisableControls و EnableControls قبل و بعد از پیمایش میتونه سرعت پیمایش روی رکوردها رو افزایش بده.

هر دو مورد قبلا در سایت بحث شدند.

hadisalahi2
پنج شنبه 26 آذر 1388, 08:49 صبح
به فرض یک دستور این کار را انجام بده، اون دستور که معجزه نمیکنه!

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



2- استفاده از DisableControls و EnableControls قبل و بعد از پیمایش میتونه سرعت پیمایش روی رکوردها رو افزایش بده.

منظور فعال یا غیر فعال کردن کنترلهای روی فرم است یا کنترلهای خاصی؟

farhad110
پنج شنبه 26 آذر 1388, 14:21 عصر
منظور فعال یا غیر فعال کردن کنترلهای روی فرم است یا کنترلهای خاصی؟
سلام. منظور کنترل های data-aware هستند که برای نمایش داده ها به کار میروند مانند DBGrid

alinikaein
شنبه 28 آذر 1388, 11:24 صبح
سلام؛

منظور آقاي كشاورز استفاده از دستور DisableControls قبل از واكشي ركوردها و EnableControls بعد از واكشي ركوردها هست كه به صورت زير استفاده مي‌شه:

DataSource1.DataSet.DisableControls

و

DataSource1.DataSet.EnableControls

اين دو دستور باعث مي‌شه كه كنترل‌هاي روي فرم كه به اين DataSource1 اتصال دارند، در هنگام واكشي غيرفعال و بعد از واكشي فعال شوند، در نتيجه باعث افزايش سرعت مي‌شه.

ضمن اين كه در DBLookupها هم دقيقاً از حلقه‌ها و همين دو دستور استفاده شده و هيچ عمل خارق‌العادي انجام نداده، پس احتمالاً روشي وجود نداره كه بشه سريع‌تر از اين روش ركوردها را واكشي كرد.
بد نيست به سورس DBLookupها يه نگاهي بندازي، شايد چيزهاي بهتري دستگيرت بشه.


يا علي... موفق باشيد...