PDA

View Full Version : پرسش و پاسخ



JavanSoft
یک شنبه 11 اسفند 1381, 00:00 صبح
==من از SqlConnection برای ارتباط با SqlServer 2000 استفاده می کنم .اما داده ها که به زبان فارسی (unicode) می باشند بصورت ؟؟؟؟ ؟؟؟ در فرم ویا در متغییر ها نمایش داده می شوند .در صورتی که اگر برای ارتباط از Adoconnection استفاده کنم ، داده ها بطور صحیح در فرم و متغییر ها نمایش داده خواهد شد . همچنین لازم به ذکر است سرعت دستیابی به داده ها با SqlConnection چندین برابر Adoconnection می باشد .
لطفا در این زمینه مرا راهنمائی کنید

بقیه مطلب در چند خط پایین تر بخوانید .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .....................................

JavanSoft
دوشنبه 01 تیر 1383, 08:47 صبح
این تاپیک را بعدا اصلاح می کنم تا خیلی از سوالهای تکراری حذف شوند

مهدی کرامتی
دوشنبه 01 تیر 1383, 09:02 صبح
راستی استاد، خواستی ادیت کنی اون تیکه های کد رو هم سر و ته‌اش یک تگ Code‌ بگذار که خشگل دیده شه.

قربون دستت.

JavanSoft
دوشنبه 01 تیر 1383, 13:43 عصر
چشم اوسا ... :wink:

Mohammad S
سه شنبه 02 تیر 1383, 00:42 صبح
می بخشید که اینجا سوال می کنم: :oops:
کاربرد حرف N در قطعه کد زیر چیست؟ و اگر نباشد چه اتفاقی می افتد؟ (آخه من بدون این حرف استفاده کردم ،برای اولین بار، و به مشکلی برخورد نکردم) می خواستم بدونم لازمه یا اختیاری هست؟
با تشکر :shock:

BACKUP DATABASE [ِDataBaseName] TO DISK = N'E:\Backup.BAK' WITH INIT , NOUNLOAD , NAME = N'Your Backup Name', NOSKIP , STATS = 10, NOFORMAT

بمب منطقی
دوشنبه 26 بهمن 1383, 16:43 عصر
راستی استاد، خواستی ادیت کنی اون تیکه های کد رو هم سر و ته‌اش یک تگ Code‌ بگذار که خشگل دیده شه.

قربون دستت.
اینطور که معلومه ایشون این کار رو یادشون رفته. پس با اجازه من این کار رو می کنم(هر چند که خیلی وقته که از زمان آخرین پست این تاپیک میگذره ولی ارزشش رو داره)
به نقل از آقای یعقوبی
==من از SqlConnection برای ارتباط با SqlServer 2000 استفاده می کنم .اما داده ها که به زبان فارسی (unicode) می باشند بصورت ؟؟؟؟ ؟؟؟ در فرم ویا در متغییر ها نمایش داده می شوند .در صورتی که اگر برای ارتباط از Adoconnection استفاده کنم ، داده ها بطور صحیح در فرم و متغییر ها نمایش داده خواهد شد . همچنین لازم به ذکر است سرعت دستیابی به داده ها با SqlConnection چندین برابر Adoconnection می باشد .
لطفا در این زمینه مرا راهنمائی کنید

***مشکل شما ربطی به دلفی 7 ندارد
1) در ویندوز سرور خود فارسی را بصورت "پیش فرض" در اورید --->Reset
2) با کمک Script Wizard از ساختار فایلهای خود کپی بگیرید
3) Sql Sereverرا Uninstall کنید ---->Reset
4)Sql Server را دوباره نصب کنید
5) حتما در حین نصب CharSet را Arabicبگذارید
6)DataBaseمورد نظر را دوباره بسازید
6)با کمکQuery Analizer فایلها را برگردانید
== تو QuickReport چطور عمودی بنویسم؟ هم برای qrlabel وهم qrdbtext
*** یه سری به سایت آقای یعقوبی بزن. اگه نتونستی سورسشو برات نوشتم.
چیزهای مفید زیادی اونجا هست.


procedure TForm1.Button1Click(Sender: TObject);
var
MyLogFont: TLogFont;
MyFont: HFont;
begin
FillChar(MyLogFont, Sizeof(MyLogFont), 0);
with MyLogFont do
begin
lfHeight:=0;
lfWidth:=0;
lfEscapement:=StrToInt(Edit1.Text);
lfOrientation:=StrToInt(Edit1.Text);
lfWeight:=FW_NORMAL;
lfItalic:=1;
lfUnderline:=1;
lfStrikeOut:=0;
lfCharSet:=DEFAULT_CHARSET;
lfOutPrecision:=OUT_DEFAULT_PRECIS;
lfClipPrecision:=CLIP_DEFAULT_PRECIS;
lfQuality:=DEFAULT_QUALITY;
lfPitchAndFamily:=1;
end;
MyFont:=CreateFontIndirect(MyLogFont);
Form1.Canvas.Font.Handle:=MyFont;
Form1.Canvas.TextOut(100, 100, 'Hello');
end;
===اما سوال ...
من 1 برنامه ای برای اجرا روی 1 کامپیوتر نوشتم (Paradox 5.0 For windows) بعد انرا به SQL Server منتقل کردم ... تغییرات را اعمال (Pchar-->Charوغیره )و ررژن تحت شبکه این برنامه را ساختم
اما حالا 1 مشکل دارم و ان این است که چگونه این فایلهای اماده شده را به کامپیوتر دیگری انتقال دهم ... می دانم که باید در کامپیوتر مقصد DataBase را ایجاد و Importکنم ولی از کامپیوتر مبدا با چه فرمتی با ید Export کرد و در کامپیوتر مقصد با چه فرمتی باید Import کرد که کمترین مشکل وجود داشته باشد؟
دوست عزیز در SQL Server شما میتوانید از Database خود Backup گرفته و در کامپیوتر
دیگر آنرا Restore کنید.
در SQL Server توسط برنامه Enterperise Manager میتوانید این کار را انجام دهید.
حتی با دستورات خود SQL نیز میتوانید این کار را انجام دهید:

BACKUP DATABASE [ِDataBaseName] TO DISK = N'E:\Backup.BAK' WITH INIT , NOUNLOAD , NAME = N'Your Backup Name', NOSKIP , STATS = 10, NOFORMAT



==تعدادی QRDBText دارم .می خوام بدون استفاده از دستورات شرطی بتونم اونها رو عوض کنم.مثلا" متغیری مثل i دارم .حالا مقدار i هر چی شد QRDBText هم با شماره i متناظر باشه.(مثلا" اینجوری QRDBText I ).از کمکتون ممنون می شم.

procedure TForm1.Button1Click(Sender: TObject);
VAr I : Integer;
begin
For I:=0 to Form1.ControlCount-1 Do
If Form1.Controls[I] is TEdit Then
If TEdit(FindComponent('Edit'+IntToStr(I))).Text='' Then
TEdit(FindComponent('Edit'+IntToStr(I))).Text:=Int ToStr(I);
end;
اما اگه بخوای از یک فرم دیگه اینکارو بکنی کافیه کنترل فرم رو ازسال کنی مثلا

If TEdit(FindComponent('Form2.Edit'+IntToStr(I))).Tex t='' Then
===ولی از اقایون دانشمند می تونم بپرسم چطوری میشه فیلدهای عددی رو در Dbgridبا فرمت و علی الخصوص فرمت عددی (سه رقم سه رقم با کاما) جدا کرد ؟
*** روی Table دابل کلیک کن تا Fields Editor بیاد، بعد کلیک راست و Add All Fields.
حالا فیلد مورد نظرت رو انتخاب کن و خاصیت Display Format ش رو قرار بده: #, (pound و کاما). از این به بعد هر جا که مقدار این فیلد نمایش داده می شه، مثلا در dbgrid، عددها سه رقم سه رقم با کاما جدا می شن.
===لا اقل یکی از این دوتا رو جواب بدید
1) دریافت در DbEdit با فرمت مثلا 123-123-12
2) اشکال این دستو ر کجاست (Query Delphi)

Select Sum(Ma) From (Select F1*F2 As Ma From "Tabl.Db") As "Temp.Db
*** 1). Fields Editor رو بیار، فیلدها رو اضافه کن، برای فیلد موردنظر EditMask رو قرار بده: 00\-000\-000;1;_ (اینجا برعکس دیده می شه).
2) نمی دونم کجا می نویسی، خیلی هم شبیه SQL نیست ;). اگر می خواهی مجموع حاصلضرب دو تا فیلد رو داشته باشید تو SQL استاندارد می شه اینو نوشت:

SELECT SUM (F1*F2) MySum
FROM "table1.db" Table1

=== با سلام به برنامه نویسان عزیز
یکی از مشکلات برنامه نویسان مبتدی (مثل من) کار با تاریخ می باشد.
اگر برنامه شما با تاریخ زیاد سر و کار داشته باشد با این مشکلات آشنا هستید.معمولا" برای گرفتن تاریخ از maskedit استفاده می کنند که البته maskedit نیز اشکالاتی جزیی دارد مثلا" باید در این حالت نیز مقدار ورودی را خودتان چک کنید.و من از maskedit بخاطر اینکه بجای عدد مثلا" 1 باید 01 را وارد کرد بدم میآید .برای اینکار تابعی نوشته ام که لازم نیست به جای 1 بنویسیم 01 . کار مهمی نیست ولی ارزش امتحان کردن را دارد و کاربرانی که به این صورت با تاریخ کار کرده اند راضی هستند.اگر کسی راه بهتری می داند خوشحال می شوم بنویسد.

procedure Tinput1.Edit1KeyPress(Sender: TObject; var Key: Char);
var str_date:string;

begin
if key=char(13) then
begin

str_date:=edit1.text;
if (testdate(str_date)) then //testdate function calling
edit2.setfocus;
else
edit1.setfocus;

end;
end;


تابع:
function Tinput1.testdate(var str_date:string):boolean;
var
l_str,code,i,j:integer;
checkvariable:boolean;
begin
checkvariable:=true;
l_str:=length(str_date);
if (l_str<6)or(l_str>8) then
begin
// m error
messagedlg('تاریخ درست وارد نشده است',mterror,[mbok],0);
// testdate:=false;
checkvariable:=false;
end//if l_str<6 or ...
else
begin
for i:=1 to l_str do
begin
code:=ord(str_date[i]);
if (code<48)or(code>57) then
begin
if (code=47) then
begin
if ((i<>3)and(i<>5)and(i<>6))or(str_date[5]=str_date[6]) then
begin
//error
messagedlg('در تاریخ کاراکتر غیر مجاز وارد شده',mterror,[mbok],0);
// testdate:=false;
checkvariable:=false;
break;
end// if i<>3 ...
else
begin
j:=i;
end;//else if i<>3 ...
end//if code=47
else
begin
//error
messagedlg('در تاریخ کاراکتر غیر مجاز وارد شده',mterror,[mbok],0);
//testdate:=false;
checkvariable:=false;
break;
end;//else
end//if code<48 ....
end;//for
if checkvariable then
begin
i:=j-4;
if strtoint(copy(str_date,4,i))>12 then
begin
messagedlg('مقدار ماه غیر معتبر است',mterror,[mbok],0);
checkvariable:=false;
end//if mm
else
begin
i:=l_str-j;
if strtoint(copy(str_date,j+1,i))>31 then
begin
messagedlg('مقدار روزغیر معتبر است',mterror,[mbok],0);
checkvariable:=false;
end;
end;//else if mm
end;
end;//else l_str<6 ...
if checkvariable then
testdate:=true
else
testdate:=false;

end;
در ضمن تاریخ سیستم در این حالت باید yy/mm/dd باشد.
امید
****عزیز شاید این 2 تابع کمکت کند
Function TDm.CompleateDate(St:String):String;
Const
TYr ='1300';
TN ='00';
Var
Sy,Sm,Sd : String;
begin
CompleateDate:='';
If Not IsValidDate(St) Then
Exit;
SY:=Trim(Copy(St,1,Pos('/',St)-1));
Delete(St,1,Pos('/',St));
SM:=Trim(Copy(St,1,Pos('/',St)-1));
Delete(St,1,Pos('/',St));
SD:=St;
Sy:=Copy(TYr,1,4-Length(Sy))+SY;
SM:=Copy(TN,1,2-Length(SM))+SM;
SD:=Copy(TN,1,2-Length(SD))+SD;
CompleateDate:=Sy+'/'+SM+'/'+SD;
end;
function TDm.IsValidDate(St:string):Boolean;
Var I:Byte;
Sy,Sm,Sd : String;
begin
IsValidDate:=False;
Sy:=St;
I:=0;
While Pos('/',St)<>0 Do
Begin
Inc(I);
Delete(St,1,Pos('/',St));
End;
St:=Sy;
If I<>2 Then
Begin
ShowMessage('جداکننده تاریخ "/" است');
Exit;
End;
For I:=1 To Length(St) Do
If not (St[i] In ['0'..'9','/']) Then
Begin
ShowMessage('جهت تاریخ از اعداد 0 تا 9 استفاده کنید');
Exit;
End;
SY:=Trim(Copy(St,1,Pos('/',St)-1));
Delete(St,1,Pos('/',St));
SM:=Trim(Copy(St,1,Pos('/',St)-1));
Delete(St,1,Pos('/',St));
SD:=St;
If (Not (StrToInt(Sm) In [1..12])) Then
Begin
ShowMessage('ماه صحیح نیست');
Exit;
End;
If (Not (StrToInt(Sd) In [1..31])) Then
Begin
ShowMessage('روز صحیح نیست');
Exit;
End;
IsValidDate:=True;
end;

=== از عزیزانی که یک Report Builderخوب و صد البته مجانی که کار هم بکند سراغ دارند خواهشمندم ادرس DownLoad یا نحوه دریافت و یا مبلغ نرم افزارشان را برای بنده مرقوم بفرمایند ...متشکرم

****دوست عزیز اولا من کاری به مت بودنش ندارم هست یا نیست ولی شما برای استفاده
کردن از یک گزارش ساز عالی موجود میتوانید از Report Builder شرکت متا فورس
که نسخه دلفی 3و4و5و6 آن در بازار هم موجود است را استفاده کنید .

بابک یعقوبی

*****از انجایی که می دانم هنوز مشکل Report یکی از معضلات است این آدرسها را تقدیم می کنم
1) Sql Report در دلفی
http://www.fw.cz/tungli/download.htm
2) برای انهایی که کارت اعتباری دارند
http://www.scalabium.com/
3) ساخت گزارش Ms.Word( البته تا Delphi 5 ( اگر دوستان محبت کنند برای 6 امتحان و نتیجه را مرقوم فرمایند
http://www.vista.ru/1vista24.htm
4)چاپ بارکد( Trial)
http://www.imagelib.com/
5) چاپ بارکد
http://schlottke.de/barcode.htm
6)Rave (قابل توجه معلمان Rave در سایت )
http://www.nevrona.com/rave/download.html



=== گر کسی کوچکترین اطلاعی راجب به
1)"درک اتصال به اینترنت و یا قطع ارتباط از ان "
2)نحوه کار با پینهای "وصل نشده"NCدر پورت پرینتر
3)نحوه Download از ایترنت
در دلفی دارد ... زحمت کشیده برای بنده مرقوم فرماید

****1- برای چک اتصال به اینترنت ابتدا یونیت WinInet را در قسمت Uses اضافه کرده و سپس از این تابع استفاده کنید:
{==========================================}

function InternetConnected: Boolean;
var
flags: dword;
R:Boolean;
begin
R := InternetGetConnectedState(@flags, 0);
if Result then
if (flags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM then
Result:=True
Else Result:=False;
END;
{==========================================}
3- برای Download کردن ؛ UtilMind یک کامپوننت فووووووووووق العاده سودمند بنام HTTPGet دارد که Freeware و با سورس است: http://www.utilmind.com

=== چرا برخی از برنامه های بزرگ با کمبود System Reource And User Resource مواجه می شوند... یعنی پس از اجرا در Resource Meter این دو قسمت به حدود 34% می رسند و با کار در بخشهای مختلف مدام کمتر می شوند؟ ایا می توان در برنامه های دلفی مانع از این اتفاق شد؟و اصولا چه چیزی در این 2 موضوع تاثیر گذار هستند؟Ram یاHard یا ...
***دوست عزیز هنگام برنامه نویسی با دلفی سعی کنید فرم های خود را در حالت Auto Create
قرار ندهید چون اینکار باعث میشود که برنامه شما هنگام اجرا تمام حافظه ایی که برای
ایجاد فرمهای خود ( حتی فرمهایی که فعلا در حال نمایش نمیباشند ) تمامی حافظه مورد
نظر را ار ویندوز میگیرند در حالیکه نیازی به این کار نیست و میتوان هنگام نمایش حافظه
را اخذ و هنگام بستن حافظه را نیز آزاد کرد و ...

دوست عزیز فرض کنید شما فرمی بنام Form2 در Design Time ساختید .
حال در قسمت Options از منوی Project خود فرم Form2 را از حالت Auto-Create forms
خارج ساخته و به قسمت Available forms ببرید و در داخل برنامه جایی که میخواهید فرم
خود را Show کنید ابتدا مثل کد زیر آنرا ساخته و بعد نمایش دهید :

Var M : TForm2 ;

M := TForm2.Create(Self) ;
M.ShowModal ;
و برای اینکه هنگام بستن فرم حافظه مربوطه نیز آزاد شود در رویداد OnClose از Form2
کد زیر را اضافه کنید :

Action := caFree ;
بابک یعقوبی

****من با توجه به راهنمایی اول شما به این صورت نوشتم وجواب گرفتم

Procedure TForm1.Button1Click(Sender);
Begin
Application.createForm(TForm2,Form2);
Form2.ShowModal;
Form2.Free
نمی دانم ایا این روش با روش راهنمایی دوم شما متفاوت است یا خیر ... در هر صورت ممنون
===با سلام
هر کسی یک کامپوننت ریپورت مجانی داره لطفا از ما دریغ نکنه
****FreeReport هم کمپوننت خوبیه (http://www.fastreport.ru/)
در ضمن اگه بری سراغ دلفی 7 میبینی که RaveReport رو داره که واقعا قوی خیلی خیلی قوی است. چند بار هم جایزه مجله Delphi Informant رو گرفته (http://www.delphizine.com/)
البته یک کم مشکله که اگر بتونی Helpش رو بخونی کاملا راه می افتی. RaveReport دو تو Help داره. Help مربوطه به برنامه Report Designerش و Help مربوط به خود کمپوننت که Methodها، Eventها و Propertyهایش رو توضیح داده.

معموری
***اگر دوست داری یه نگاهی به
http://www.javansoft.com/
بیندازید و فایل ExpertReport را بگیرید ... البته ورژن جدید ان تا 2 هفته دیگر Upload میشود

محمد وکیلی
***یک کامپوننت تمیز و جمع و جور هست به نام preport که در سایت www.vtktools.ru هست . شاید به دردت بخوره.

ی با بی با بی با بی با بی ...
=== what is class
***اگر بخواهم ساده بگم اینجوری میگم

Label1 : TLabel
محمد :Tانسان
کلاس مجوعه ای از قواعد و خصوصیات و عملیاتی است که یک شیی را تعریف می کند

*****.. و البته اگر بنده بخواهم غیر ساده اش رو بگم :
کلاس مجموعه ای از کد ست که فعالیت تعریف شده نرم افزاری را در خود کپسوله میکند . معمولا" کلاس (مثل یک موجود جاندار ) دارای خصوصیت (Property ) وتوانائی انجام فعالیتهای نرم افزاری (Method ) ست و به نمونه های مختلفی که از یک کلاس برای اهداف مختلف ساخته میشود "شی" میگویند .به عنوان مثال وقتی کلیدی رو روی فرم قرار میدید ، شی Button1 از کلاس Tbutton ساخته میشود .

موفق باشید




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

سالار
******مثال زیر در یک فرم خالی یک Button ایجاد کرده و رویداد OnClick آنرا Override میکند.
یک Application جدید درست کردن و کل محتویات Unit1 را خالی کرده و کد زیر را در آن کپی کنید، ( در دلفی 6 نوشته شده )
اگر در دلفی 5 میخواهید تست کنید در قسمت Uses یونیت Variants, را حذف کنید :
اصل قسمتی که کار شما را انجام میدهد قسمت
myButton.OnClick := myButtonClick
میباشد :

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
myButton : TButton ;
procedure myButtonClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.myButtonClick(Sender: TObject);
begin
Caption := 'This is a test'
end;

procedure TForm1.FormShow(Sender: TObject);
begin
myButton := TButton.Create(Self) ;
myButton.Parent := Form1 ;
myButton.Caption := 'Click me !' ;
myButton.OnClick := myButtonClick ;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
myButton.Free ;
end;
end.

بابک یعقوبی
====چطور می شه تعیین کرد که به اینترنت متصل هستیم یا نه(در زمان اجرا)؟
اگر می خواهید بگیید با tcp خواهشا یه توضیح دقیق ودرست حسابی بدید
****در قسمت uses فرمتان یونیت WinInet را اضافه کرده و سپس از این تابع استفاده کنید:

function InternetConnected: Boolean;
var
flags: dword;
R:Boolean;
begin
R := InternetGetConnectedState(@flags, 0);
if Result then
if (flags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM then
Result:=True
Else Result:=False;
END;
===با سلام خدمت آقای یعقوبی
من میخواهم یک dial up بسازم که با گرفتن User Name و Password و شماره تلفن به شبکه Connect کند .لطفا" Camponent ی که مرا در این کار کمک کند را معرفی کنید .
از شما بسیار سپاسگذارم
***با اجازه برادر یعقوبی
حتما“ اساتید میان و اطلاعات خوبی بهت میدم اما نقدا“ سرچ کن ، کلاسی به اسم TMagRas که رایگان و سورس باز است برای این کار بهترین گزینه است به عقیده من .
===میخواهم رنگ یک رکورد را در دی بی گرید بر اساس مقدار یک فیلد تغییر دهم اما رنگ ستون قابل تغییر بود اما رنگ سطر دی بی گرید را نتوانستم عوض کنم لطفا در صورت امکان راهنمائی کنید
***در پروپرتی OnDrawDataCell دی بی گرید خود کد زیر را قرار دهید :

if Table1.FieldByName('CustNo').AsInteger > 1510 then
DBGrid1.Canvas.Brush.Color := clGreen ;
DBGrid1.Canvas.FillRect(Rect) ;
DBGrid1.DefaultDrawDataCell(Rect, Field, State);
بابک یعقوبی

JavanSoft
چهارشنبه 28 بهمن 1383, 16:52 عصر
آقا ممنون و متشکر ........ یکی از غصه های زندگی من کم شد

بمب منطقی
پنج شنبه 29 بهمن 1383, 00:56 صبح
قابلی نداشت :wink: