برنامه نویس

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

برنامه نویس

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

نمایش ایکون برنامه در taskbar زمان hide شدن فرم اصلی دلفی

نمایش ایکون برنامه در taskbar زمان hide شدن فرم اصلی دلفی در dpr پروژه این مقدار رو به این شکل تغییر بدید.

Application.MainFormOnTaskbar := false;

نگه داری عکس با فرمت base64 در دلفی

تبدیل عکس به base 64 و ذخیره در دیتابیس به صورت رشته ای و تبدیل رشته کد شده به عکس 



uses Soap.EncdDecd


procedure DecodeToFile(const base64: AnsiString; const FileName: string);

var

  stream: TFileStream;

  bytes: TBytes;

begin

  bytes := DecodeBase64(base64);

  stream := TFileStream.Create(FileName, fmCreate);

  try

    if bytes<>nil then

      stream.Write(bytes[0], Length(Bytes));

  finally

    stream.Free;

  end;

end;


function EncodeFile(const FileName: string): AnsiString;

var

  stream: TMemoryStream;

begin

  stream := TMemoryStream.Create;

  try

    stream.LoadFromFile(Filename);

    result := EncodeBase64(stream.Memory, stream.Size);


  finally

    stream.Free;

  end;

end;


procedure TForm1.EncodeButton1Click(Sender: TObject);

begin

  str:= EncodeFile('d:\pic.jpg');

end;


procedure TForm1.DecodeClick(Sender: TObject);

begin

DecodeToFile(str,'c:\xx.jpg') ;

end;

تبدیل یک کامپوننت به کامپوننت دیگر در دلفی

برای تبدیل ، تغییر نام ، ... روی کامپوننت ها به راحتی میتوان از برنامه جانبی که روی دلفی نصب میشود با نام GExperts استفاده کرد من تا اخرین نسخه فعلی دلفی xe10.2 تست گرفتم و مشکلی نداشت

مرتب سازی dbgrid

مرتب سازی dbgrid دلفی
procedure TformResult.gridResultTitleClick(Column: TColumn);
begin
  // User can sort the grid by clicking on any column's title
  if DM.ADOSearch.Sort = Column.FieldName + ' ASC' then
    DM.ADOSearch.Sort := Column.FieldName + ' DESC'
  else
    DM.ADOSearch.Sort := Column.FieldName + ' ASC';
end;

خواندن ورژن از تنظیمات در دلفی

function GetFileVersion(exeName : string): string;

const

  c_StringInfo = 'StringFileInfo\040904E4\FileVersion';

var

  n, Len : cardinal;

  Buf, Value : PChar;

begin

  Result := '';

  n := GetFileVersionInfoSize(PChar(exeName),n);

  if n > 0 then begin

    Buf := AllocMem(n);

    try

      GetFileVersionInfo(PChar(exeName),0,n,Buf);

      if VerQueryValue(Buf,PChar(c_StringInfo),Pointer(Value),Len) then begin

        Result := Trim(Value);

      end;

    finally

      FreeMem(Buf,n);

    end;

  end;

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

  Form1.Caption := Form1.Caption + ' version ' + GetFileVersion(ExtractFileName(Application.ExeName));

end;

HorizontalAlignment property of the Range class error

برای تنظیم HorizontalAlignment و VerticalAlignment در تنظیمات خروجی اکسل دلفی اگر با xlleft , ... مشکل داشت میتوان از کدهای زیر استفاده کرد

For VerticalAlignment:

Top:    -4160
Center: -4108
Bottom: -4107

And HorizontalAlignment:

Left:    -4131
Center:  -4108
Right:   -4152
var WrkSheet : oleVariant;  
begin
WrkSheet:=CreateOleObject('Excel.Application');
  WrkSheet.displayAlerts:=false;
  WrkSheet.WorkBooks.add;
  WrkSheet.ActiveSheet.Name := 'Sheet1';
  WrkSheet.Range['A1','A1'].HorizontalAlignment:= -4108;
end

HorizontalAlignment property of the Range class error

For VerticalAlignment:

Top:    -4160
Center: -4108
Bottom: -4107

And HorizontalAlignment:

Left:    -4131
Center:  -4108
Right:   -4152

مرتب سازی memtable در دلفی روی گرید

مرتب سازی memtable در دلفی روی گرید به صورت زیر عمل میکنیم


procedure TFmTransferInfo.DBGridEh1TitleClick(Column: TColumnEh);

begin

    if not(DBGridEh1.DataSource.DataSet.Active) then

      Exit;

    if Column.Field.Calculated then

      Exit;

    case Column.Title.SortMarker of

    smNoneEh:

       begin

             Column.Title.SortMarker := smDownEh;

             MemTableEh1.SortByFields(Column.FieldName+' DESC');

       end;

    smDownEh:

       begin

            Column.Title.SortMarker := smUpEh;

            MemTableEh1.SortByFields(Column.FieldName+' ASC');

       end;

    smUpEh:

       begin

            Column.Title.SortMarker := smNoneEh;

            MemTableEh1.SortByFields('');

       end;

       end;


end;


تفاوت بین دو زمان در دلفی

برای محاسبه تفاوت بین دو زمان در دلفی   یونیت  DateUtils  ابتدا اضافه شود سپس از کد زیر استفاد ه شود 

SecondsBetween(Now, IncSecond(Now,10)) 
MinutesBetween(Now, IncMinute(Now,110))


غیر فعال کردن دکمه بستن فرم

برای غیر فعال کردن دکمه بستن فرم و فعال کردن ان از کد زیر میشود استفاده کرد :


EnableMenuItem( GetSystemMenu( handle, False ),SC_CLOSE, MF_BYCOMMAND or MF_GRAYED ); 
Enable: 
EnableMenuItem( GetSystemMenu( handle, False ), SC_CLOSE, MF_BYCOMMAND or MF_ENABLED ); 

و اگر نیاز به خاموش بودن دکمه بستن نیست از کد زیر استفاده میشود کرد :
رویداد FormClose:

Action := caNone;



کد اجرای برنامه ای دیگر در دلفی

اگر بخواهیم در برنامه نوشته شده با دلفی برنامه دیگری را فراخوانی کنیم از کد زیر استفاده میکنیم


var
  Address:string;
begin
  Address:=ExtractFilePath(Application.ExeName)+'p.exe';
  if FileExists(Address) then
    ShellExecute(Handle,'open',PChar(Address),nil,nil,SW_SHOWNORMAL)
  else
    showmessage('فایل مربوطه پیدا نشد.');


اگر بخواهیم برنامه ای مثل ماشین حساب ویندوز فراخوانی کنیم از کد زیر میشود استفاده کرد


  WinExec('calc.exe',SW_SHOWNORMAL);


حذف رکورد از stringgrid دلفی

برای حذف رکورد جاری در stringgrid دلفی ، پروسیژر زیر را تعریف و در برنامه استفاد نمایید


procedure DeleteRow(Grid: TStringGrid);

var

  i: Integer;

begin

  for i := grid.Row to Grid.RowCount - 2 do

    Grid.Rows[i].Assign(Grid.Rows[i + 1]);

  Grid.RowCount := Grid.RowCount - 1;

end;



برای رکورد خاص به پروسیژر یک ورودی دیگر که شماره رکورد میتوان استفاده کرد مانند زیر :




procedure DeleteRow(Grid: TStringGrid; ARow: Integer);

var

  i: Integer;

begin

  for i := ARow to Grid.RowCount - 2 do

    Grid.Rows[i].Assign(Grid.Rows[i + 1]);

  Grid.RowCount := Grid.RowCount - 1;

end;

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

ابتدا باید ترد تعریف شود به صورت زیر


Type

   SefareshThread = Class(TThread)

//      procedure openquery();

تمامی توابع و پروسیژرها را در اینجا تعریف کنید

    protected

      procedure Execute; override;

end;


یک تایمر روی صفحه میتوان گذاشت برای فراخوانی ترد و کدهای زیر برای انجام عملیات مورد نظر 


procedure SefareshThread.Execute;

begin

  inherited;

  KalaOrderList_FRM.Timer1.Enabled:= false;

  KalaOrderList_FRM.sql3.DisableControls;

  KalaOrderList_FRM.sql2AfterScroll(nil);

  KalaOrderList_FRM.sql3.EnableControls;

end;


procedure SefareshThread.openquery;

begin

   Synchronize(openquery);

end;


procedure TKalaOrderList_FRM.Timer1Timer(Sender: TObject);

var

 T : SefareshThread;

begin

 T := SefareshThread.Create(True);

 T.FreeOnTerminate := True;

 T.Resume;

end;


و در مکان مورد نظر تایمر را فعال کنید


  Timer1.Enabled:=true;


نمایش تایم کارهای انجام شده در دلفی

کامپوننت acDateTimeCalc در تب app controls ++  قرار دارد روی فرم بگذارید و کد زیر را برای ان بنویسید

procedure TForm1.Button1Click(Sender: TObject);

begin

  acDateTimeCalc1.BeginTime:=Time;

  ADOQuery2.Close;

  ADOQuery2.Open;

  ADOQuery1.Close;

  ADOQuery1.Open;

  acDateTimeCalc1.EndTime:=Time;

  Caption:=Caption+'  '+IntToStr(acDateTimeCalc1.MSeconds);

end;

ازادسازی حافظه از فرم ها در دلفی

ازادسازی حافظه از فرمهای ایجاد شده 


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  ');