ورود

View Full Version : بازیابی ودیدن فیلد از نوع ایمیج



tik_tak
شنبه 06 مهر 1387, 17:17 عصر
باسلام
من واسه ذخیره عکس تو دیتا بیس (sql) یه جدول دارم به اسم picsample با فیلدای:
id=اتو نامبر
pic=ازنوع ایمیج

رو فرمم این آبجکتارو آوردم :
1-Adoconnection
2-Adotable
3-Adocommand
4-openDialog
5-datasource
6-dbgrid
7-edit
8-2 تا باتون

واسه آدرس دهی وانتخاب عکس از هرجای سیستم از این دستور:



procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit1.Text:= OpenDialog1.FileName;
end;


واسه ذخیره عکس این کد :



procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOCommand1 do
begin
Parameters.ParamByName('pic').LoadFromFile(Edit1.T ext,ftBlob);
CommandText := 'insert into picsample(pic)values(:pic)';
Prepared:=True;
Execute;
end;
ADOTable1.Requery();
end;





procedure TForm1.FormShow(Sender: TObject);
begin
ADOConnection1.Connected:= True;
ADOTable1.Open;
ADOCommand1.Parameters.CreateParameter('pic',ftBlo b,pdInputOutput,0,Unassigned);
end;


الان عکسمون تو بانک ذخیره شده !
ولی من نمیدونم با چه شیئ ی و با چه کدی عکس رو نمایش بدم ...
منظورم همون بازیابی ، با انتخاب هر id عکس نشون داده بشه؟
راستی من این مثال رو از این تایپیک برداشتم :
http://barnamenevis.org/forum/showthread.php?t=53711&highlight=blob

shervin farzin
شنبه 06 مهر 1387, 18:55 عصر
سلام
ميتونين از كد زير استفاده كنين :


var
pic:TJPEGImage;
stream:Tstream;
begin
With ADOQuery1 do
begin
sql.text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
if stream.Size<>0 then
begin
if copy(ADOQuery1.FieldByName('pic').AsString,1,1)='B ' then
image1.Picture.Bitmap.LoadFromStream(x)
else
begin
pic:=TJPEGImage.Create;
pic.LoadFromStream(x);
image1.Picture.Assign(pic);
pic.Free;
end;
end
else image1.Picture.Graphic:=nil;
stream.Free;


يه نكته اي كه بايد توجه كنين اينه كه كلاس JPEG رو حتما در بالاي فرمتون در قسمت Uses بنويسيد . براي مواقعي كه عكستون از نوع JPG باشه.
موفق باشيد

tik_tak
شنبه 06 مهر 1387, 20:53 عصر
يه نكته اي كه بايد توجه كنين اينه كه كلاس JPEG رو حتما در بالاي فرمتون در قسمت Uses بنويسيد .

میشه بگید چه جوری؟ باید چی بنویسم
مرسی

tik_tak
شنبه 06 مهر 1387, 20:59 عصر
یه سوال دیگه م داشتم
اگه من یه جدول دارم تو برنامه شامل این فیلداست :
آی دی
نام
فامیلی
.
.
عکس


اینجوریم اینزرت میکنم :


procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.adotable1.Insert;
if Edit1.Text<>'' then
DataModule2.adotable1.FieldByName('name').Value:=E dit1.Text
else
DataModule2.adotable1.FieldByName('name').Value:='-';
.
.
.

DataModule2.adotable.Post;
ShowMessage('ثبت شد');
end;


من نمیدونم چه جوری کد اینزرت عکس رو که اون بالا گذاشتم بین این دستورات قراربدم !
ممنون میشم راهنمایی کنید

shervin farzin
شنبه 06 مهر 1387, 22:31 عصر
سلام
راستشو بخواي من هيچ وقت با دستورات Append يا Post كار نكردم ، هميشه كد SQL رو
نوشتم . اينه كه اگه در مورد كد مثال خودت چيزي بگم ممكنه سوتي بدم !
برات يه Unit كامل مينويسم كه سه تا تابع داره . تابع Save كه نام ، نام خانوادگي و عكس رو
به ترتيب از Edit1 ، Edit2 و Image1 ميخونه و داخل Database ذخيره ميكنه . تابع Update كه
يه مقدار Integer رو به عنوان ورودي ميگيره ( در واقع Id همون ركوردي كه ميخواي Edit كنيش )
و نام ، نام خانوادگي و عكس رو مثل Save از فرم ميخونه . تابع Load كه اطلاعات جدول رو
داخل فرم بازيابي ميكنه . در ضمن Jpeg رو هم توي قسمت Uses نوشتم .

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, JPEG, DB, ADODB;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
ADOQuery1: TADOQuery;
Edit1: TEdit;
Edit2: TEdit;
DataSource1: TDataSource;
private
{ Private declarations }
public
Procedure Save;
Procedure update(selected_id : integer);
Procedure Load;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Save;
var
stream:tstream;
begin
with ADOQuery1 do
begin
sql.Text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
image1.Picture.Graphic.SaveToStream(stream);
With ADOQuery1 do
begin
SQL.Text:='insert into picsample (name,family,pic) VALUES (:p0,:p1,:p2)';
Parameters.ParamByName('p0').Value:=edit1.Text;
Parameters.ParamByName('p1').Value:=edit2.Text;
Parameters.ParamByName('p2').LoadFromStream(stream ,ftBlob);
ExecSQL;
end;
end;

procedure TForm1.update(selected_id : integer);
var
Stream:TStream;
begin
with ADOQuery1 do
begin
sql.Text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
image1.Picture.Graphic.SaveToStream(stream);
With ADOQuery1 do
begin
SQL.Text:='update picsample set name = :p0,family = :p1,pic = :p2 where id = :p3';
Parameters.ParamByName('p0').Value:=edit1.Text;
Parameters.ParamByName('p1').Value:=edit2.Text;
Parameters.ParamByName('p2').LoadFromStream(stream ,ftBlob);
Parameters.ParamByName('p3').Value:=selected_id;
ExecSQL;
end;
end;

procedure TForm1.Load;
var
stream:TStream;
pic:TJPEGImage;
begin
With ADOQuery1 do
begin
sql.text:='select * from picsample';
Open;
end;
edit1.Text:=ADOQuery1.FieldByName('name').AsString ;
edit2.Text:=ADOQuery1.FieldByName('family').AsStri ng;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
if stream.Size<>0 then
begin
if copy(ADOQuery1.FieldByName('pic').AsString,1,1)='B ' then
image1.Picture.Bitmap.LoadFromStream(stream)
else
begin
pic:=TJPEGImage.Create;
pic.LoadFromStream(stream);
image1.Picture.Assign(pic);
pic.Free;
end;
end
else
image1.Picture.Graphic:=nil;
stream.Free;
end;

end.


موفق باشيد .

tik_tak
یک شنبه 07 مهر 1387, 01:04 صبح
خطا.......
parameter object is improrely defined.inconsistent or incomplete informatoin was provided;

و اصلاً اینزرت نمیکنه
قسمتی از کدی که تو قسمت ان کلیک باتون اینزرت نوشتم:


SQL.Text:='insert into Tcustomer (sex,fname,lname'+
' ,fathers_name,meli_no,sh_no,date_birth,exported,st ate,date_member,kind,credit,from_date,to_date,tel, mob,address,ax,comment) VALUES (:p0,:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8,:p9,:p10,:p11 ,:p12,:p13,:p14,:p15,:p16,:p17,:p18,:p19)';



فیلد کلید اصلی رو تو این کد ننوشتم ، آخه اتو نامبر ه ، من فک میکنم شایداین علته خطاست !؟
و اگه هست من باید چه جوری بنویسم



if ComboBox1.Text<>'' then
Parameters.ParamByName('p0').Value:=combobox1.item index
else
Parameters.ParamByName('p0').Value:=-1;
و
.
.
.
.
.
.
.
ExecSQL;

shervin farzin
یک شنبه 07 مهر 1387, 12:44 عصر
سلام
اول بگم مشكل از Id نيست .
در مورد كدي كه نوشته بودين يه مورد به نظرم اومد ، اين كه تعداد فيلدهاي جدولتون
19 تاست پس چون پارامترهاي كد SQL از شماره 0 ( يعني از p0: ) شروع شده پس آخريش
بايد با P18: تموم بشه كه ميتونه باعث رفع مشكلتون بشه . من چون نميدونستم نوع هر
كدوم از فيلدهاي جدول شما چيه . يه Table ساختم كه همين فيلدهاي شما رو داشت ولي
همش از نوع Char بود البته غير از فيلد AX . كدي كه براي دكمه توي دلفي نوشتم اين بود :

procedure TForm1.Button1Click(Sender: TObject);
var
stream:tstream;
begin
with ADOQuery1 do
begin
sql.Text:='select * from Tcustomer';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('ax'),bmRead);
image1.Picture.Graphic.SaveToStream(stream);
With ADOQuery1 do
begin
SQL.Text:='insert into Tcustomer (sex,fname,lname,fathers_name,meli_no,sh_no,date_b irth,exported,state,date_member,kind,credit,from_d ate,to_date,tel,mob,address,ax,comment) VALUES (:p0,:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8,:p9,:p10,:p11 ,:p12,:p13,:p14,:p15,:p16,:p17,:p18)';
Parameters.ParamByName('p0').Value:=edit1.Text;
Parameters.ParamByName('p1').Value:=edit1.Text;
Parameters.ParamByName('p2').Value:=edit1.Text;
Parameters.ParamByName('p3').Value:=edit1.Text;
Parameters.ParamByName('p4').Value:=edit1.Text;
Parameters.ParamByName('p5').Value:=edit1.Text;
Parameters.ParamByName('p6').Value:=edit1.Text;
Parameters.ParamByName('p7').Value:=edit1.Text;
Parameters.ParamByName('p8').Value:=edit1.Text;
Parameters.ParamByName('p9').Value:=edit1.Text;
Parameters.ParamByName('p10').Value:=edit1.Text;
Parameters.ParamByName('p11').Value:=edit1.Text;
Parameters.ParamByName('p12').Value:=edit1.Text;
Parameters.ParamByName('p13').Value:=edit1.Text;
Parameters.ParamByName('p14').Value:=edit1.Text;
Parameters.ParamByName('p15').Value:=edit1.Text;
Parameters.ParamByName('p16').Value:=edit1.Text;
Parameters.ParamByName('p17').LoadFromStream(strea m,ftBlob);
Parameters.ParamByName('p18').Value:=edit1.Text;
ExecSQL;
end;
end;


كدي هم كه براي Load كردن اطلاعات نوشتم اين بود :

procedure TForm1.Button2Click(Sender: TObject);
var
stream:TStream;
pic:TJPEGImage;
begin
With ADOQuery1 do
begin
sql.text:='select * from Tcustomer';
Open;
end;
edit1.Text:=ADOQuery1.FieldByName('sex').AsString;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('ax'),bmRead);
if stream.Size<>0 then
begin
if copy(ADOQuery1.FieldByName('ax').AsString,1,1)='B' then
image1.Picture.Bitmap.LoadFromStream(stream)
else
begin
pic:=TJPEGImage.Create;
pic.LoadFromStream(stream);
image1.Picture.Assign(pic);
pic.Free;
end;
end
else
image1.Picture.Graphic:=nil;
stream.Free;
end;


هر دوي اين كد ها رو تست كردم و بدون هيچ مشكلي كار ميكنن .
موفق باشيد .

ma_zaree33
شنبه 05 اردیبهشت 1388, 15:16 عصر
سلام
ميتونين از كد زير استفاده كنين :


var
pic:TJPEGImage;
stream:Tstream;
begin
With ADOQuery1 do
begin
sql.text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
if stream.Size<>0 then
begin
if copy(ADOQuery1.FieldByName('pic').AsString,1,1)='B ' then
image1.Picture.Bitmap.LoadFromStream(x)
else
begin
pic:=TJPEGImage.Create;
pic.LoadFromStream(x);
image1.Picture.Assign(pic);
pic.Free;
end;
end
else image1.Picture.Graphic:=nil;
stream.Free;


يه نكته اي كه بايد توجه كنين اينه كه كلاس JPEG رو حتما در بالاي فرمتون در قسمت Uses بنويسيد . براي مواقعي كه عكستون از نوع JPG باشه.
موفق باشيد
اگه در مورد نحوه ذخیره و بازیابی عکس در دیتابیس پارادوکس خود دلفی هم کد داری آنرا هم بگذار که با شی Query این کا را انجا م بده
ممنون میشم

shervin farzin
یک شنبه 06 اردیبهشت 1388, 13:27 عصر
سلام
نوع داده اي به نام OLE در Paradox هست كه قابليت ذخيره اطلاعاتي مثل عكس ها رو داره .
كد ذخيره و بازيابي هم هيچ فرقي با مثالهاي بالا نداره فقط هرجا كه در كدهاي بالا نوشته شده
ADOQuery شما بايد تبديلش كنيد به Query .
موفق باشيد .

robodanial
یک شنبه 07 شهریور 1389, 11:35 صبح
مطالب نوشته شده در پست شماره 7 در sql و با فیلدی با نوع Image هیچ مشکلی ندارد ولی در access با فیلد نوع ole object خطا می دهد :
Syntax Error In Insert Into Statment
لطفا در صورت امکان برای دیتابیس access یک مثال قرار دهید.

shervin farzin
سه شنبه 09 شهریور 1389, 10:25 صبح
سلام
خطا احتمالا مربوط به جای دیگه ای هست. به هر حال فایل زیر یک مثال برای Access هست.
در ضمن من این برنامه رو با Delphi 2010 آماده کردم. اگه نتونستید Compile کنیدش فایل Unit1.pas
رو داخل NotePad باز کنید.
موفق باشید.

robodanial
سه شنبه 09 شهریور 1389, 12:58 عصر
از زحماتتون متشکرم

MOJTABAATEFEH
یک شنبه 29 اسفند 1389, 11:06 صبح
سلام
راستشو بخواي من هيچ وقت با دستورات Append يا Post كار نكردم ، هميشه كد SQL رو
نوشتم . اينه كه اگه در مورد كد مثال خودت چيزي بگم ممكنه سوتي بدم !
برات يه Unit كامل مينويسم كه سه تا تابع داره . تابع Save كه نام ، نام خانوادگي و عكس رو
به ترتيب از Edit1 ، Edit2 و Image1 ميخونه و داخل Database ذخيره ميكنه . تابع Update كه
يه مقدار Integer رو به عنوان ورودي ميگيره ( در واقع Id همون ركوردي كه ميخواي Edit كنيش )
و نام ، نام خانوادگي و عكس رو مثل Save از فرم ميخونه . تابع Load كه اطلاعات جدول رو
داخل فرم بازيابي ميكنه . در ضمن Jpeg رو هم توي قسمت Uses نوشتم .

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, JPEG, DB, ADODB;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
ADOQuery1: TADOQuery;
Edit1: TEdit;
Edit2: TEdit;
DataSource1: TDataSource;
private
{ Private declarations }
public
Procedure Save;
Procedure update(selected_id : integer);
Procedure Load;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Save;
var
stream:tstream;
begin
with ADOQuery1 do
begin
sql.Text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
image1.Picture.Graphic.SaveToStream(stream);
With ADOQuery1 do
begin
SQL.Text:='insert into picsample (name,family,pic) VALUES (:p0,:p1,:p2)';
Parameters.ParamByName('p0').Value:=edit1.Text;
Parameters.ParamByName('p1').Value:=edit2.Text;
Parameters.ParamByName('p2').LoadFromStream(stream ,ftBlob);
ExecSQL;
end;
end;

procedure TForm1.update(selected_id : integer);
var
Stream:TStream;
begin
with ADOQuery1 do
begin
sql.Text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
image1.Picture.Graphic.SaveToStream(stream);
With ADOQuery1 do
begin
SQL.Text:='update picsample set name = :p0,family = :p1,pic = :p2 where id = :p3';
Parameters.ParamByName('p0').Value:=edit1.Text;
Parameters.ParamByName('p1').Value:=edit2.Text;
Parameters.ParamByName('p2').LoadFromStream(stream ,ftBlob);
Parameters.ParamByName('p3').Value:=selected_id;
ExecSQL;
end;
end;

procedure TForm1.Load;
var
stream:TStream;
pic:TJPEGImage;
begin
With ADOQuery1 do
begin
sql.text:='select * from picsample';
Open;
end;
edit1.Text:=ADOQuery1.FieldByName('name').AsString ;
edit2.Text:=ADOQuery1.FieldByName('family').AsStri ng;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
if stream.Size<>0 then
begin
if copy(ADOQuery1.FieldByName('pic').AsString,1,1)='B ' then
image1.Picture.Bitmap.LoadFromStream(stream)
else
begin
pic:=TJPEGImage.Create;
pic.LoadFromStream(stream);
image1.Picture.Assign(pic);
pic.Free;
end;
end
else
image1.Picture.Graphic:=nil;
stream.Free;
end;

end.


موفق باشيد .

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

با تشکر

MOJTABAATEFEH
دوشنبه 01 فروردین 1390, 22:08 عصر
سلام دوستان عزیز مشکل کد زیر رو چطور میشه حل کرد؟
تا وقتی که تصویری در Pic(TImage) هست به درستی ذخیره میشه میخواستم کاربر بتونه بدون عکس هم مابقی اطلاعات رو ذخیره کنه که یکسری تغییرات دادم ولی موقع ذخیره بدون عکس خطای ضمیمه رو میگیره

var
stream1 : Tstream
......
with ADOQuery1 do
begin
SQL.Clear;
sql.Add('select Picperson');
sql.Add(' from Table1');
Open;
end;

stream1:=ADOQuery1.CreateBlobStream(ADOQuery1.Fiel dByName('PicPerson'),bmRead);
IF pic1.Picture.Graphic <> nil
THEN pic1.Picture.Graphic.SaveToStream(stream1);
with ADOQuery1 do
begin
Sql.clear;
SQL.Add('insert into Table1 (PicPerson) values (:p1)');

if pic1.Picture.Graphic <> nil then
Parameters.ParamByName('p1').LoadFromStream(stream 1 ,ftBlob)
else parameters.ParamByName('p1').Value := NULL;
Execsql;
end;

با تشکر

MOJTABAATEFEH
چهارشنبه 03 فروردین 1390, 01:36 صبح
از دوستان کسی تابحال اینجور کاری انجام نداده!؟

YkA1363
پنج شنبه 26 مرداد 1391, 23:56 عصر
سلام
راستشو بخواي من هيچ وقت با دستورات Append يا Post كار نكردم ، هميشه كد SQL رو
نوشتم . اينه كه اگه در مورد كد مثال خودت چيزي بگم ممكنه سوتي بدم !
برات يه Unit كامل مينويسم كه سه تا تابع داره . تابع Save كه نام ، نام خانوادگي و عكس رو
به ترتيب از Edit1 ، Edit2 و Image1 ميخونه و داخل Database ذخيره ميكنه . تابع Update كه
يه مقدار Integer رو به عنوان ورودي ميگيره ( در واقع Id همون ركوردي كه ميخواي Edit كنيش )
و نام ، نام خانوادگي و عكس رو مثل Save از فرم ميخونه . تابع Load كه اطلاعات جدول رو
داخل فرم بازيابي ميكنه . در ضمن Jpeg رو هم توي قسمت Uses نوشتم .

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, JPEG, DB, ADODB;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
ADOQuery1: TADOQuery;
Edit1: TEdit;
Edit2: TEdit;
DataSource1: TDataSource;
private
{ Private declarations }
public
Procedure Save;
Procedure update(selected_id : integer);
Procedure Load;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Save;
var
stream:tstream;
begin
with ADOQuery1 do
begin
sql.Text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
image1.Picture.Graphic.SaveToStream(stream);
With ADOQuery1 do
begin
SQL.Text:='insert into picsample (name,family,pic) VALUES (:p0,:p1,:p2)';
Parameters.ParamByName('p0').Value:=edit1.Text;
Parameters.ParamByName('p1').Value:=edit2.Text;
Parameters.ParamByName('p2').LoadFromStream(stream ,ftBlob);
ExecSQL;
end;
end;

procedure TForm1.update(selected_id : integer);
var
Stream:TStream;
begin
with ADOQuery1 do
begin
sql.Text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
image1.Picture.Graphic.SaveToStream(stream);
With ADOQuery1 do
begin
SQL.Text:='update picsample set name = :p0,family = :p1,pic = :p2 where id = :p3';
Parameters.ParamByName('p0').Value:=edit1.Text;
Parameters.ParamByName('p1').Value:=edit2.Text;
Parameters.ParamByName('p2').LoadFromStream(stream ,ftBlob);
Parameters.ParamByName('p3').Value:=selected_id;
ExecSQL;
end;
end;

procedure TForm1.Load;
var
stream:TStream;
pic:TJPEGImage;
begin
With ADOQuery1 do
begin
sql.text:='select * from picsample';
Open;
end;
edit1.Text:=ADOQuery1.FieldByName('name').AsString ;
edit2.Text:=ADOQuery1.FieldByName('family').AsStri ng;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
if stream.Size<>0 then
begin
if copy(ADOQuery1.FieldByName('pic').AsString,1,1)='B ' then
image1.Picture.Bitmap.LoadFromStream(stream)
else
begin
pic:=TJPEGImage.Create;
pic.LoadFromStream(stream);
image1.Picture.Assign(pic);
pic.Free;
end;
end
else
image1.Picture.Graphic:=nil;
stream.Free;
end;

end.


موفق باشيد .
سلام این کد رو توی برنامم گذاشتم. فقط یک مشکل دارم اینکه برنامه من روی شبکه نصب می شه و فکر می کنم برای هر رکورد که بخوام ثبت کنم این کد کل بانک رو فراخوانی می کنه و قطعاً در آینده برنامه دچار مشکل خواهد شد. چطور می تونم با تغییر توی این کدها مشکلم رو حل کنم.