برنامه نویس

به وبلاگ خودتان خوش آمدید.

برنامه نویس

به وبلاگ خودتان خوش آمدید.

ارسال دستور به سرور و دریافت پاسخ با tcpclient

برای کار با 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

برای ارسال و دریافت اطلاعات از طریق 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, []);



ارسال پارامتر برای اجرای exe در دلفی

برای ارسال پارامتر دو روش زیر وجود دارد 


WinExec('C:\prog.exe param1 param2', SW_SHOW);

یا

uses ShellApi;
var parameter: String;
 
parameter:='param1 param2';
 
ShellExecute(0, 'open', 'C:\prog.exe', PChar(parameter), nil, 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;

استفاده از define در دلفی

 کاربرد این  دستور در زمان کامپایل است که مشخص میکند کدام بخش از کد باید کامپایل شود تا خروجی بسازد 

  یک فایل با پسوند inc ایجاد کنید و در هر خط یک define  مورد نیاز بگذارید مثلا {DIFINE Symbol$} و به صورت زیر در دلفی استفاده کنید

interface

{$I Predefines.inc}

uses ...

// Check you defines

{$IFDEF Symbol}
...
{$ENDIF}
  

or 

 

{$IFDEF Symbol}
... 

{$Else} 

...
{$ENDIF}
  

or 

 

{$IFNDEF Symbol}
...
{$ENDIF}

انتخاب چندین رکورد از dbgrid در دلفی

procedure TForm1.Button3Click(Sender: TObject);

begin
  if dbgrid1.SelectedRows.CurrentRowSelected then  //check
  begin
    ShowMessage('This Record was selected');
    dbgrid1.SelectedRows.CurrentRowSelected := False; //Unselect
  end
  else
  begin
    ShowMessage('This Record was not selected');
    dbgrid1.SelectedRows.CurrentRowSelected := True;//select
  end;
end;



procedure TForm1.Button4Click(Sender: TObject);
var I : Integer;
begin
  for i := 0 to dbgrid1.SelectedRows.Count - 1 do
  begin
    dbgrid1.DataSource.Dataset.GotoBookmark(TBookmark(dbgrid1.SelectedRows[i]));
    //Do Something
    ShowMessage(dbgrid1.DataSource.Dataset.Fields[0].AsString);
  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;

استفاده از combobox با دو ستون در دلفی (بخش ابجکت combobox)


به عنوان مثال برای نگهداری یک رشته و یک ایدی از کد زیر استفاده میکنیم :
 ComboBox1.Items.AddObject(sItem, TObject(i));

برای نمایش بر اساس ایدی مورد نظر هم از کد زیر استفاده میکنیم :
 Value :=Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex])

کد دلفی حذف گروهی متون در edit ها

procedure ClearEditBoxes;
var
i : integer;
begin
for i := 0 to Form1.ComponentCount - 1 do begin
if (Form1.Components[i].InheritsFrom(TEdit)) then begin
(Form1.Components[i] as TEdit).Clear;
end;
end; // for i
end;

skin در دلفی xe2

از قابلیتهای  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 در دلفی

میخواهم برنامه ای بنویسم که با هر رویداد جدید قرار است ما را با خبر کند یکی از روش ها استفاده از 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;

5- و در اخر کد زیر را در trayicon اضافه میکنیم 



procedure TForm1.TrayIcon1Click(Sender: TObject);
begin
  if not Visible then
    begin
      Show;
      Application.Restore;
      Application.BringToFront;
    end;
end;

فارسی شدن کیبرد برای تایپ فارسی در برنامه

کد زیر را در فرم اصلی قرار دهید


procedure TMain.FormCreate(Sender: TObject);
begin
LoadKeyboardLayout('00000429', KLF_ACTIVATE);
end;

کد استفاده Enter به جای Tab در دلفی


خاصیت KeyPreview از فرم رو به True تغییر بدین و فقط کد زیر رو تو رویداد KeyPress از فرم بذارین


procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key= #13 then begin
    keybd_event(VK_TAB,1,0,0);
    keybd_event(VK_TAB,1,KEYEVENTF_KEYUP,0);
    Key:= #0;
  end;
end;
یا از این کد هم میتونید استفاده کنید.
در رویداد onkeypress :

if (key=#13) then
begin
Key := #0;
Perform (CM_DialogKey, VK_TAB, 0);
end;