ازادسازی حافظه از فرمهای ایجاد شده
var str_:tstringlist;
i:integer;
begin
str_:=tstringlist.Create;
str_.Clear;
for i:=0 to screen .FormCount-1 do
begin
if (Screen.Forms[i].Name ='fmain') then Continue;
Str_.add(screen .forms[i].Name) ;
end;
for i:=0 to str_.Count-1 do
(Application.FindComponent(str_.Strings[i])).free;
str_.Free;
ShowMessage' ok free ');
برای کار با tcpclient دستورات زیر را وارد میکنیم
procedure TForm1.btnSendClick(Sender: TObject);
var
I: Integer;
begin
TcpClient1.RemoteHost := edtRemoteHost.Text;
TcpClient1.RemotePort := edtRemotePort.Text;
if not TcpClient1.Connected then
TcpClient1.Connect ;
i:= TcpClient1.Sendln(Trim(statement.Text));
TcpClient1.Receiveln;
end;
procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
var DataLen: Integer);
var s:string;
begin
SetLength (s, DataLen);
move (Buf ^, s [1], DataLen);
s:= StringReplace (s, #$0,#$13, [rfReplaceAll]);
memRecv.Lines. Add( s);
TcpClient1.Active:=False;
end;
همچنین از این دستور برای ارسال رشته به صورت استریم
Function StringToStream(const AString: string): TStream;
begin
Result := TStringStream.Create(AString);
end;
--------------------------
procedure TForm1.btnSendClick(Sender: TObject);
begin
TcpClient1.RemoteHost :='192.168.1.168';
TcpClient1.RemotePort :='23768';
if not TcpClient1.Connected then
TcpClient1.Connect ;
TcpClient1.SendStream( StringToStream('readl'));
TcpClient1.Receiveln;
end;
برای ارسال و دریافت اطلاعات از طریق indytcpclient به صورت زیر عمل میکنیم . port , host را تنظیم میکنیم و من دستور مورد نظر را در ادیت وارد کردم و ارسال میکنم و پاسخ را با دستور readchar دریافت کردم
var ch:char;
str:string;
begin
IdTCPClient1.host:='192.168.1.25';
IdTCPClient1.port:=8080;
IdTCPClient1.Connect(300);
IdTCPClient1.WriteLn(edt1.Text);
ch:=IdTCPClient1.ReadChar;
while ch<>'$' do
begin
str:=str+ch;
ch:=IdTCPClient1.ReadChar;
end;
mmo1.Lines.Add(str);
IdTCPClient1.Disconnect();
و یا از کد زیر استفاده شود
var
str:string;
begin
IdTCPClient1.host:='192.168.1.168';
IdTCPClient1.port:=23768;
IdTCPClient1.Connect(300);
IdTCPClient1.Write(edit1.Text);
Sleep(1000);
str:=IdTCPClient1.CurrentReadBuffer() ;
Memo1.Lines.Add(str);
IdTCPClient1.Disconnect();
end;
هندل کردن خطاهای رخ داده شده در برنامه دلفی در زمان try except
{
In addition to displaying the exception message, which
happens by default, the following code shuts down the
application when an exception is not caught and handled.
AppException should be declared a method of TForm1.
}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := AppException;
end;
procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
Application.ShowException(E);
Application.Terminate;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
raise EPasswordInvalid.Create('Incorrect password entered');
end;
برای به دست آوردن نام فرم ها در دلفی از کد زیر می توان استفاده کرد
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
for I:= 0 to Screen.CustomFormCount - 1 do
Memo1.Lines.Add(Screen.Forms[I].Caption);
end;
و برای نمایش ابجکتهای هر فرم از کد زیر :
var
i:integer;
begin
with Application do
for i:=0 to componentcount-1 do
if components[i] is TForm
then showmessage(components[i].Name);
end;
ابتدا System.TypInfo را uses تعریف میکنیم به خاطر استفاده از GetObjectProp
حالا تابع زیر را تعریف میکنیم
procedure SetFontProperties(Control: TControl; Name: TFontName; Size: Integer; Styles: TFontStyles);
// Set font properties
var
Index: Integer;
Font: TFont;
AnObject: TObject;
ChildControl: TControl;
begin
// Set font properties
AnObject := GetObjectProp(Control, 'Font', nil);
if AnObject is TFont then
begin
// Set properties
Font := TFont(AnObject);
Font.Name := Name;
Font.Size := Size;
Font.Style := Styles;
end;
// Set child font properties
if Control is TWinControl then
begin
// Set
for Index := 0 to TWinControl(Control).ControlCount - 1 do
begin
// Child control
ChildControl := TWinControl(Control).Controls[Index];
// Set font properties
SetFontProperties(ChildControl, Name, Size, Styles);
end;
end;
end;
و با کد زیر فراخوانی میکنیم
SetFontProperties(Self, 'Courier', 14, []);
برای ارسال پارامتر دو روش زیر وجود دارد
WinExec( 'C:\prog.exe param1 param2' , SW_SHOW);
یا
|
برای خواندن پارامترها از دستور زیر میتوان استفاده کرد
var
i:
integer
;
begin
for
i :=
0
to
ParamCount
do
ShowMessage(ParamStr(i));
end
;
یا
// execute with "MyProgram.exe param1 /param2" if FindCmdLineSwitch( 'param1' ) then ShowMessage( 'param1' ); // will not be displayed if FindCmdLineSwitch( 'param2' ) then ShowMessage( 'param2' ); // will be displayed if FindCmdLineSwitch( 'param3' ) then ShowMessage( 'param3' ); // will not be displayed |
uses ComObj; ..
procdure startExcel;
var
oE:Variant;
begin
try
oE := GetActiveOleObject('Excel.Application');
except
oE := CreateOleObject('Excel.Application');
end;
oE.Workbooks.Open(filename, false, false);
oE.Visible := True;
end;
کاربرد این دستور در زمان کامپایل است که مشخص میکند کدام بخش از کد باید کامپایل شود تا خروجی بسازد
یک فایل با پسوند inc ایجاد کنید و در هر خط یک define مورد نیاز بگذارید مثلا {DIFINE Symbol$} و به صورت زیر در دلفی استفاده کنید
interface
{$I Predefines.inc}
uses ...
// Check you defines
{$IFDEF Symbol}
...
{$ENDIF}
or
{$IFDEF Symbol}
...
{$Else}
...
{$ENDIF}
or
{$IFNDEF Symbol}
...
{$ENDIF}
begin
if dbgrid1.SelectedRows.Curre
begin
ShowMessage('This Record was selected');
dbgrid1.SelectedRows.Curre
end
else
begin
ShowMessage('This Record was not selected');
dbgrid1.SelectedRows.Curre
end;
end;
procedure TForm1.Button4Click(Sender
var I : Integer;
begin
for i := 0 to dbgrid1.SelectedRows.Count
begin
dbgrid1.DataSource.Dataset
//Do Something
ShowMessage(dbgrid1.DataSo
end;
end;
برای انتخاب چندین رکورد از کد زیر میشود استفاده کرد
با ید انتخاب ردیف و انتخاب چندین ردیف فعال باشد
DBGrid1.Options:=DBGrid1.Options + [dgMultiSelect,dgRowSelect]
if (Shift = []) then
begin
case Key of
VK_UP: begin
Key := 0;
TDBGrid(Sender).DataSource.DataSet.Prior;
end;
VK_Down: begin
Key := 0;
TDBGrid(Sender).DataSource.DataSet.Next;
end;
VK_Space: begin
Key := 0;
TDBGrid(Sender).SelectedRows.CurrentRowSelected :=
NOT(TDBGrid(Sender).SelectedRows.CurrentRowSelected);
end;
end;
end;
از قابلیتهای Delphi XE2 پوسته میباشد یعنی شما بدون نصب کامپوننتهای skin مثل vcl skin , alpha control , busines skin و ... به راحتی میتونین به برنامتون skin بدین برای این امر به ادرس در منو بروید Project/oprion و در پنجره جدید Application/Appearance را انتخاب کنید. حالا لیستی از skin پیش فرض که به همراه دلفی نصب میشود داریم برای اعمال skin مورد نظر کافی است تیک skin مورد نظر را زده تا در کمبوباکس پایین Default Style اسکین مورد نظر شما اضافه شود سپس کمبو باکس را روی skin مورد نظر خود قرار دهید و روی دکمه ok کلیک کنید حالا با اجرا برنامه skin شما اعمال خواهد شد . به همین راحتی .
شما میتوانید استایلهای دیگری را نیز از اینترنت دانلود و استفاده کنید
برای این کار بعد از دانلود فایلهای .vsf را در ادرس پوشه Style به ادرس
زیر کپی کنید
C:\Users\Public\Documents\RAD Studio\9.0\Styles
تا به لیست استایلها اضافه شود
شما میتوانید استایلها را به سلیقه خود تغییر و مورد استفاده قرار دهید به
همراه مجموعه دلفی یک Vcl Style Designer نصب میشود که از منو
Tools/Vcl Style Designer میتوانید از ان استفاده نموده و استایل مورد نظر خود را تغییر دهید
برای تغییر skin در زمان اجرا هم اول یونیهای Vcl.Themes,Vcl.Styles رو uses میکنید و از کد زیر استفاده کنید
procedure TForm1.btn1Click(Sender: TObject);
begin
if TStyleManager.IsValidStyle(getCurrentdir + '\Auric.vsf') then
TStyleManager.SetStyle(TStyleManager.LoadFromFile(getCurrentdir + '\Auric.vsf'));
end;
یا از کدهای زیر برای پر کردن یک کامبوباکس و ست کردن استایل با انتخاب هر کدام از انها استفاده کنید
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
TStyleManager.TrySetStyle(ComboBox1.Items[ComboBox1.ItemIndex]);
end;
procedure TForm1.FormShow(Sender: TObject);
var
s: String;
begin
ComboBox1.Items.BeginUpdate;
try
ComboBox1.Items.Clear;
for s in TStyleManager.StyleNames do
begin
memo1.Lines.Add(s);
ComboBox1.Items.Add(s);
end;
ComboBox1.Sorted := True;
// Select the style that's currently in use in the combobox
ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(TStyleManager.ActiveStyle.Name);
finally
ComboBox1.Items.EndUpdate;
end;
end;
میخواهم برنامه ای بنویسم که با هر رویداد جدید قرار است ما را با خبر کند یکی از روش ها استفاده از trayicon است.
1- برای این کار یک tray icon بر روی فرم میگذاریم و تایمر ان را تنظیم میکنیم
2- در رویداد onanimate دستوراتی را مینویسیم که قرار است چک کند رویداد جدید وجود دارد یا خیر و در انتها کد زیر برای باز شدن بالون استفاده میشود .
TrayIcon1.ShowBalloonHint ;
3- در کد پروژه که از قسمت project-> view source باز میشود در خط اول کد زیر را قرار میدهیم
Application.MainFormOnTaskbar := False;
4- از application event استفاده میکنیم و کد زیر را اضافه میکنیم
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
Hide;
end;
کد زیر را در فرم اصلی قرار دهید
procedure TMain.FormCreate(Sender: TObject);
begin
LoadKeyboardLayout('00000429', KLF_ACTIVATE);
end;