یادداشت های برنامه نویس

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

یادداشت های برنامه نویس

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

قطع کردن امن usb

safely remove usb



function OpenVolume(ADrive: char): THandle;
var
  RootName, VolumeName: string;
  AccessFlags: DWORD;
begin
  RootName := ADrive + ':' + #134; // ADrive + ':\' kills the syntax highlighting
  case GetDriveType(PChar(RootName)) of
    DRIVE_REMOVABLE:
      AccessFlags := GENERIC_READ or GENERIC_WRITE;
    DRIVE_CDROM:
      AccessFlags := GENERIC_READ;
  else
    Result := INVALID_HANDLE_VALUE;
    exit;
  end;
  VolumeName := Format('\\.\%s:', [ADrive]);
  Result := CreateFile(PChar(VolumeName), AccessFlags,
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if Result = INVALID_HANDLE_VALUE then
    RaiseLastWin32Error;
end;

function LockVolume(AVolumeHandle: THandle): boolean;
const
  LOCK_TIMEOUT = 10 * 1000; // 10 Seconds
  LOCK_RETRIES = 20;
  LOCK_SLEEP = LOCK_TIMEOUT div LOCK_RETRIES;

// #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
  FSCTL_LOCK_VOLUME = (9 shl 16) or (0 shl 14) or (6 shl 2) or 0;
var
  Retries: integer;
  BytesReturned: Cardinal;
begin
  for Retries := 1 to LOCK_RETRIES do begin
    Result := DeviceIoControl(AVolumeHandle, FSCTL_LOCK_VOLUME, nil, 0,
      nil, 0, BytesReturned, nil);
    if Result then
      break;
    Sleep(LOCK_SLEEP);
  end;
end;

function DismountVolume(AVolumeHandle: THandle): boolean;
const
// #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
  FSCTL_DISMOUNT_VOLUME = (9 shl 16) or (0 shl 14) or (8 shl 2) or 0;
var
  BytesReturned: Cardinal;
begin
  Result := DeviceIoControl(AVolumeHandle, FSCTL_DISMOUNT_VOLUME, nil, 0,
    nil, 0, BytesReturned, nil);
  if not Result then
    RaiseLastWin32Error;
end;

function PreventRemovalOfVolume(AVolumeHandle: THandle;
  APreventRemoval: boolean): boolean;
const
// #define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
  IOCTL_STORAGE_MEDIA_REMOVAL = ($2d shl 16) or (1 shl 14) or ($201 shl 2) or 0;
type
  TPreventMediaRemoval = record
    PreventMediaRemoval: BOOL;
  end;
var
  BytesReturned: Cardinal;
  PMRBuffer: TPreventMediaRemoval;
begin
  PMRBuffer.PreventMediaRemoval := APreventRemoval;
  Result := DeviceIoControl(AVolumeHandle, IOCTL_STORAGE_MEDIA_REMOVAL,
    @PMRBuffer, SizeOf(TPreventMediaRemoval), nil, 0, BytesReturned, nil);
  if not Result then
    RaiseLastWin32Error;
end;

function AutoEjectVolume(AVolumeHandle: THandle): boolean;
const
// #define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
  IOCTL_STORAGE_EJECT_MEDIA = ($2d shl 16) or (1 shl 14) or ($202 shl 2) or 0;
var
  BytesReturned: Cardinal;
begin
  Result := DeviceIoControl(AVolumeHandle, IOCTL_STORAGE_EJECT_MEDIA, nil, 0,
    nil, 0, BytesReturned, nil);
  if not Result then
    RaiseLastWin32Error;
end;

function EjectVolume(ADrive: char): boolean;
var
  VolumeHandle: THandle;
begin
  Result := FALSE;
  // Open the volume
  VolumeHandle := OpenVolume(ADrive);
  if VolumeHandle = INVALID_HANDLE_VALUE then
    exit;
  try
    // Lock and dismount the volume
    if LockVolume(VolumeHandle) and DismountVolume(VolumeHandle) then begin
      // Set prevent removal to false and eject the volume
      if PreventRemovalOfVolume(VolumeHandle, FALSE) then
        AutoEjectVolume(VolumeHandle);
    end;
  finally


گرفتن عکس از صفحه نمایش

var
    bmp : Tbitmap;
    dc : Hdc;
begin
 bmp := Tbitmap.Create;
 bmp.Width := Screen.Width;
 bmp.Height := Screen.Height;
 image1.Width := Screen.Width;
 image1.Height := Screen.Height;

 dc := GetWindowDc(GetDesktopWindow);
 Bitblt(bmp.canvas.handle,0,0,Screen.Width,Screen.height,dc,0,0,srccopy);

 image1.Canvas.Draw(0,0,bmp);
 releasedc(getdesktopwindow,dc);
 // bmp.SaveToFile('save.bmp'); if you want to save it
 bmp.Free;
end;

اضافه کردن فایل به start menu

uses shellobj;


SHAddtorecentdocs(SHARD_PATH,pchar('adress file'));

اضافه کردن checkbox به dialogbox ها

procedure TForm1.Button1Click(Sender: TObject) ; var AMsgDialog: TForm; ACheckBox: TCheckBox; begin AMsgDialog := CreateMessageDialog ('This is a test message.', mtWarning, [mbYes, mbNo]) ; ACheckBox := TCheckBox.Create(AMsgDialog) ; with AMsgDialog do try Caption := 'Dialog Title' ; Height := 169; with ACheckBox do begin Parent := AMsgDialog; Caption := 'Don''t show me again.'; Top := 121; Left := 8; end; if (ShowModal = ID_YES) then begin if ACheckBox.Checked then begin //... do if checked end; //... do if NOT checked end; finally Free; end; end;

یک کار گرافیکی در دلفی


procedure TForm1.FormCreate(Sender: TObject);
begin
  { Set transparent background }
  Brush.Style:=bsClear;

  { Set pen color and width }
  Canvas.Pen.Color:=clBlack;
  Canvas.Pen.Width:=10;
end;

procedure TForm1.FormClick(Sender: TObject);
Var
  X, Y : Integer;
begin

   X:=Mouse.CursorPos.X;
   Y:=Mouse.CursorPos.Y;
   Canvas.MoveTo(0,Y);
   Canvas.LineTo(Form1.Width,Y);
   Canvas.MoveTo(X,0);
   Canvas.LineTo(X,Form1.Height);
end;

چگونه یک دیتابیس مناسب انتخاب کنیم؟ 2


امروزه در بیشتر نرم افزارها که تولید میکنیم نیاز داریم برای مخاطب هایمان محیطی فراهم کنیم که بتوانند داده هایشان را ذخیره و بهر برداری کنند.به همین منظور مجبور به استفاده از یتابیس ها هستیم چون دیتابیس ها چنین فضایی را با انکانات مناسب برای ما فراهم می کنند.فکر کنم از هر جایی که برنامه نویسی را شروع کرده باشیم یا اولین کتابی را که خوانده باشیم دیتابیس جزء اولین سرفصل ها است.اگر یک جستجو ساده به دنبال دیتابیس باشیم می بینیم که هزاران شرکت انواع دیتابیس را ارائه کرده اند. اگر در ابتدای شروع برنامه نویسی یک دیتابیس مناسب را انتخاب نکنیم به علت مشکل در پروژه ها بر خوردن مجبوری هر روز یک دیتابیس را امتحان کنیم به قولی از این شاخه به آن شاخه بپریم بهتر است از اول با اطلاع کامل دیتابیس مناسبی را انتخاب کنیم.

دیتابیس ها به دو گروه تقسیم می شوند:

Server

Local

 خیلی از دیتابیس ها ارائه شده دارای هر دو نسخه هستند مانند Sql Server,mysql ,… .

معمولا برای پروژه ها بدون اعتنا به تک کاربره یا تحت شبکه بودن sql server را انتخاب می کنیم. و چون تجربه و اطلاعات در موردش نداریم چند ما زحمت می کشیم و پروژه ای را انجام می دهیم گاهی در وسط راه و گاهی بعد از پایان پروژه هنگام تحویل تازه مشکلات شروع شروه میشه اگه سری به تالار برنامه نویس بزنیم پر از همچنین سوالاتی است:

تو را خدا کمکم کنید پروژ ام باید فردا تحویل بدهم  نمیدونم چگونه دیتابیسم را انتقال بدم...

.... چگونه attach کنم ...

 .... سرور پیدا نمی شود....

.... چگونه بانک را دور از دست کاربر نگه دارم...

و............ .

برای انتخاب یک دیتابیس مناسب با پروژه ابتدا به چند نکته توجه کرد:

1-      آیا برنامه تک کاربره یا تحت شبکه است ؟(local)

2-      حجم دیتا چقدر است؟

اگه برنامه ما تک کاربره است به نظر من یک اشتباه است که از sql server استفاده کنیم Microsoft یک نسخه بسیار مناسب برای این گزینه دارد SQL SERVER CE .

چند تا از مزایای این دیتابیس براتون شرح میدم:

1-      درایور(دیتا انجین) این نسخه از sql فقط 2.5 مگابایت است که نسخه رایگانش را از سایتش میتوانید دریافت کنید.برای نصب فقط دو بار کلیک کافی است!

2-      دیتابیس آن به صورت فایل بوده (مانند access) و به راحتی قابل جا به جایی است. پس خیلی از دردسرهای نسخه های server را نداره.

3-      سرعت بسیار مناسب.

4-      و....

از معایب به عدم پشتیبانی از sp و.. و همچنین نرم افزار اختصاصی برای مدیریت (ایجاد و ویرایش و...) را می توان نام برد.

اما گزینه دیگر که بسیار مناسب است برای چه سرور و چه لوکال MYSQL است.

Mysql نسخه Local تمام قابلیت های sp,fuction,view و... دارد درایورش هم نیاز به نصب نداره و فقط لازم کنار پروژه کپی بشه.

 

Mysql یک دیتابیس رایگان و بسیار سبک و دارای نسخه های 32 بیتی و 64 بیتی است اخرین نسخه آن 6.10 با حجم فقط 120 مگابایت!  است که میتوانید از سایتش دریافت کنید.

MYSQL متاسفانه همیشه پشت نام Sql Server قرار گرفته است در حالی که تمام قابلیتهایی که sql server را دارد و بسیار سبک تر و سریعتر از sql server است و خیلی از دردسرهای sql server را ندارد.و زبان هم تقریبا 90% شبیه به همان زبان T-SQL است شاید مایروسافتی بودن sql server باعث شده که زیاد سراغ mysql برنامه نویسان نیایند توصیه می کنم به دوستان اگر تا حالا از mysql استفاده نکرده اید یک بار امتحان کنید.


این مقاله را HTTP://delphiplus.ir نیز منتشر کرده ام