PDA

View Full Version : سوال: همشکل نبودن مقادیر چند کمبو باکس



Mask
چهارشنبه 26 آبان 1389, 21:48 عصر
با سلام
من رویه فرمم حدود 20 تا کمبو باکس هست.
میخام در یه دکمه چک کنم که مقادیر text هیچکدوم از این کمبو ها شکل هم نباشه.
آقای تاجیک زحمت کشیدند و کد زیر رو بهم دادند. اما کار نمیده و در همه حال مقدار true رو برمیگردونه.

function CheckCombo: Boolean;
var
I,J: Byte;
begin
Result:= True;
for I:= 0 to Form1.ComponentCount - 1 do
if Form1.Components[i] is TComboBox then
for J:= 0 to Form1.ComponentCount - 1 do
if Form1.Components[j] is TComboBox then
if Form1.Components[i]<> Form1.Components[j] then
if TComboBox(Form1.Components[i]).Text= TComboBox(Form1.Components[j]).Text then
Exit
end;
نمونه استفاده

procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckCombo then
ShowMessage('True')
else
ShowMessage('False');
end;

Felony
چهارشنبه 26 آبان 1389, 22:06 عصر
خط آخر کدی که در بالا قرار دادید مشکل داره و باید هم اون مشکل پیش بیاد ، کدی که من تو پیغام خصوصی دادم این بود و درست هم کار میکنه :


function CheckCombo: Boolean;
var
I,J: Byte;
begin
Result:= True;
for I:= 0 to Form1.ComponentCount - 1 do
if Form1.Components[i] is TComboBox then
for J:= I to Form1.ComponentCount - 1 do
if Form1.Components[j] is TComboBox then
if Form1.Components[i]<> Form1.Components[j] then
if TComboBox(Form1.Components[i]).Text= TComboBox(Form1.Components[j]).Text then
Exit(False);
end;

تو کدی که شما دادید فقط از تابع خارج میشید و اول کد هم که مقدار بازگشتی با True مقدار دهی شده پس در هر صورت مقدار بازگشتی True هست ولی در خط آخر کد من ( Exit(False باعث میشه در صورت مساوی بودن مقدار Text دو شئ ComboBox مقدار False برگشت داده شه .

Mahmood_M
چهارشنبه 26 آبان 1389, 22:39 عصر
البته اگر از دلفی 7 استفاده میکنید به جای " (Exit(Flase " از Result := False استفاده کنید ...

Mask
چهارشنبه 26 آبان 1389, 23:24 عصر
ممنون از دو دویت خوبم.
آقا مجتبی چون از دلفی 7 استفاده میکردم به خط آخر گیر میداد.
اما با تغییر کد توسط آقا محمود مشکل حل شد.
ممنون از شما دو عزیز

Felony
پنج شنبه 27 آبان 1389, 06:16 صبح
البته اگر از دلفی 7 استفاده میکنید به جای " (Exit(Flase " از Result := False استفاده کنید ...
این دو کد ( Result:= False و (Exit(False ) عملکرد مشابهی ندارن ؛ Result:= False فقط مقدار برگشتی تابع رو با False مقدار دهی میکنه ولی از تابع خارج نمیشه در صورتی که وقتی خروجی تابع False شد پس شرط مورد نظر ما نقض شده و از این پس موندن تو تابع و بررسی بقیه مقادیر تو حلقه معنایی نداره ، ولی کد اول بهنیه تر بود چون بعد از پیدا کردن اولین نقض شرط از تابع خارج میشه و از دور زدن بی مورد حلقه جلوگیری میکرد ، تو دلفی 7 میشه اینطور پیاده سازیش کرد :

function CheckCombo: Boolean;
var
I,J: Byte;
begin
Result:= True;
for I:= 0 to Form1.ComponentCount - 1 do
if Form1.Components[i] is TComboBox then
for J:= I to Form1.ComponentCount - 1 do
if Form1.Components[j] is TComboBox then
if Form1.Components[i]<> Form1.Components[j] then
if TComboBox(Form1.Components[i]).Text= TComboBox(Form1.Components[j]).Text then
begin
Result:= False;
Exit;
end;
end;

مقاله ای که در لینک زیر نوشتم پیرامون همون توضیحات بالا هست :
http://barnamenevis.org/forum/showthread.php?t=256564

@ برای بهینه تر شدن کد بهتره حلقه دوم از I شروع بشه تا در مقایسه ها تکرار به وجود نیاد ( کد رو تغییر دادم ) .

Mahmood_M
پنج شنبه 27 آبان 1389, 10:44 صبح
Wow ! ، حواسم به حلقه ی for نبود !! ، شرمنده ...