PDA

View Full Version : سوال: چه جوري چك كنم كه اگر كاربر Field1 و Field2 را از فيلدهاي جدولم نداد خطا بدهد؟



ali_abbasi22145
دوشنبه 20 آبان 1387, 16:08 عصر
سلام
من از يك فايل تكست Field1 و Field2 را مي گيرم و در يك Memo1 مي ريزم و اين دو فيلد را در OnCalcFields جدول به هم مي چسپانم مثل كدهاي زير:

procedure TMainForm.ADOTable1CalcFields(DataSet: TDataSet);
var Field1,Field2 : String;
begin
Field1 := Trim(MainForm.Memo1.Lines.Strings[10]);
Field2 := Trim(MainForm.Memo1.Lines.Strings[11]);

MainForm.ADOTable1.FieldByName('calc').AsString :=
MainForm.ADOTable1.FieldByName( Field1 ).AsString + ' ' + MainForm.ADOTable1.FieldByName( Field2 ).AsString;

end;

حال چه جوري چك كنم كه اگر كاربر Field1 و Field2 را از فيلدهاي جدولم نداد خطا بدهد؟ (البته فيلدهاي بانكم زياد است و به شكل زير نمي توان همه فيلدها را در if آورد.

if not( (Field1 = 'sicard') or (Field1 = 'id') or (Field1 = 'first_name') or (Field1 = 'last_name')
then
ShowMessage('In Line 11 of "SrvName.txt": "'+ Field2 +'" is invalid field of database.');

Ahmad Chehreghani
دوشنبه 20 آبان 1387, 16:16 عصر
سلام
منظورت اينه که فيلد هاتو پر نکر يعني MainForm.Memo1.Lines.Strings10 خالي بود؟

ali_abbasi22145
دوشنبه 20 آبان 1387, 16:26 عصر
سلام
منظورت اينه که فيلد هاتو پر نکر يعني MainForm.Memo1.Lines.Strings10 خالي بود؟

سلام
خير.
من دستوري بهتر از كدهاي زير مي خواهم كه همه فيلدهاي جدول را يكي يكي ننويسم:
if not( (Field1 = 'sicard') or (Field1 = 'id') or (Field1 = 'first_name') or (Field1 = 'last_name')
then
ShowMessage('In Line 11 of "SrvName.txt": "'+ Field2 +'" is invalid field of database.');

Ahmad Chehreghani
دوشنبه 20 آبان 1387, 16:39 عصر
فکر کنم منظورت اين باشه



if ADOQuery1.FindField('MYField')<>nil then ShowMessage('0');

حالا به جاي ADOQuery1 ميتوني Table هم بزاري
MYField هم نام فيلد رو بزار

mafazel
سه شنبه 21 آبان 1387, 08:24 صبح
سلام دوست عزیز
اگه منظورتون رو درست فهمیده باشم جواب من اینه:

سلام
من از يك فايل تكست Field1 و Field2 را مي گيرم و در يك Memo1 مي ريزم
اولا چرا از فایل متنی میخونی توی Memo میریزی بعد از Memo میخونی و استفاده میکنی؟ خوب یکباره از فایل متنی بخون و استفاده کن

و اين دو فيلد را در OnCalcFields جدول به هم مي چسپانم مثل كدهاي زير:
procedure TMainForm.ADOTable1CalcFields(DataSet: TDataSet);
var Field1,Field2 : String;
begin
Field1 := Trim(MainForm.Memo1.Lines.Strings[10]);
Field2 := Trim(MainForm.Memo1.Lines.Strings[11]);
ثانیا این دوتا دستور رو توی OnCalcField ننویس چون این رویداد برای هر رکورد فراخوانی میشه. بنابرین به تعداد رکوردهای جدولت این دستورها تکرار می شوند که الکی هست و برنامه ات رو کند میکنه. قاعدتا این دستور ها باید قبل از باز کردن جدول یا Query نوشته بشن.
ثالثا وقتی تعداد آیتم ها زیاده اگر به صرفه هست از آرایه ها استفاده کنید
من برای مثال شما کد زیر رو پیشنهاد می کنم:


const Field1Names : array [1..4] of string[20] = ('sicard','id','first_name','last_name');

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Field1Found: Boolean;
Field1: string;
begin
Field1 := Trim(MainForm.Memo1.Lines.Strings[10]);
Field1Found := False;
for i:=1 to 4 do
if Field1=Field1Names[i] then Field1Found := True;
if not Field1Found then ShowMessage('In Line 11 of "SrvName.txt": "'+ Field2 +'" is invalid field of database.');

Ahmad Chehreghani
سه شنبه 21 آبان 1387, 18:54 عصر
mafazel جان چرا اينقدر خودتو رنج و عذاب ميدي؟!!!

ali_abbasi22145
چهارشنبه 22 آبان 1387, 14:55 عصر
سلام
شما هيچ كدام منظورم را متوجه نشديد! احتمالا من خوب بيان نكردم.
من روشي مي خواهم كه ليست فيلدهاي جدول را بدهد همين! نه من فيلدها را يكي يكي خودم تايپ كنم.

دنیای دلفی
چهارشنبه 22 آبان 1387, 17:44 عصر
شايد اين كد بدرد شما بخوره :


with Table1 do
for i :=0 to FieldCount-1 do
if Fields[i].FieldKind=fkData then
if Fields[i].DataType in [ftString,ftInteger,ftFloat,
ftCurrency,ftBytes,ftAutoInc,ftLargeint] then
SelectField.Items.Append(Fields[i].FieldName);

mafazel
پنج شنبه 23 آبان 1387, 09:55 صبح
سلام دوست عزیز
پست اول شما با پست آخر تون خیلی فرق میکنه! یه بار دیگه مرور کنید...
شاید کد زیر به درد شما بخوره


begin
for i := 0 to ADOTable1.FieldCount-1 do
Memo1.Lines.Add(ADOTable1.Fields[i].FieldName);

موفق باشید.

ali_abbasi22145
پنج شنبه 23 آبان 1387, 11:40 صبح
شايد اين كد بدرد شما بخوره :


with Table1 do
for i :=0 to FieldCount-1 do
if Fields[i].FieldKind=fkData then
if Fields[i].DataType in [ftString,ftInteger,ftFloat,
ftCurrency,ftBytes,ftAutoInc,ftLargeint] then
SelectField.Items.Append(Fields[i].FieldName);

سلام و تشكر از توجه شما
كد شما خطاي زير را مي دهد:
[Error] Main_Unit.pas(2710): Undeclared identifier: 'SelectField'