PDA

View Full Version : مشکلاتی واسه به یاد سپاری مناسبت ها



Developer Programmer
شنبه 06 خرداد 1385, 11:15 صبح
از اونجا که حافظه بسیار قوی در مورد به خاطر سپردن تاریخ تولدها دارم، خواستم یه برنامه بنویسم که هر بار ویندوز بالا اومد، این برنامه هم اجرا بشه و توی TrayIcon بیوفته؛ هربار که ماوس رو بردم روش ، برنامه باید تمامی مناسبت هایی رو که کمتر یا مساوی 15 روز به وقعشون مونده رو در غالب Hint نشون بده
(دوهفته به تولد فلانی مونده و سه روز به تولد فلان فلان شده... و الی اخر)
---
از سالارسافت عزیز کامپوننتی گرفتم که بتونم TrayIcon رو بسازم
به چند تا مشکل عجیب برخوردم که خودم تعجب میکنم :گیج:
از بانک اکسس استفاده میکنم و دوتا فیلد مهم BirthDay و BirthMonth واسه نگه داری روز و ماه تولد(به شمسی) تعریف کردم.

با کد زیر میخوام آیکون رو بسازم و برنامه رو hide کنم


procedure TfrmMain.FormCreate(Sender: TObject);
begin
SysIcon1.AlowActive:=True;

StatusBar1.SimpleText:= TFarDate.farFormatDateTime('dddd dd mmmm سال yyyy', TFarDate.MiladyToShamsi(now));

// Hide into Tray
with frmMain do
begin
Visible:=False;
Hide;
end;
end;
عجیبه که فرم برنامه بسته نمیشه و همیشه visible می مونه

با کد زیر دارم سعی می کنم مناسبت های امروز رو بیرون بکشم.
واسه اینکار اول یه Select میزنم و بعد عنوان مناسبت رو داخل Hint میریزم


procedure TfrmMain.SysIcon1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
M , D , I : Byte;
S: String;
begin
Try //Try to connect to the DBMS
ADOConnection1.Connected:=True;
Except
Raise exception.Create('اتصال به پایگاه داده ها مقدور نمی باشد');
Application.Terminate;
end;

SysIcon1.ToolTip:='';

If ADOConnection1.Connected Then
begin
m:= TFarDate.farMonthOf( TFardate.MiladyToShamsi(Date) ); //current month
d:= TFarDate.farDayOf ( TFardate.MiladyToShamsi(Date) );// current day
AqReminder.Active:=False;
AqReminder.SQL.Text:='Select * from tblReminder where BirthMonth=' + IntToStr(m) + ' and BirthDay=' + IntToStr(d) ;
Try
AqReminder.Active:=True;
Except
raise Exception.Create('خطا در فعال سازی پایگاه داده ها');
Application.Terminate;
end;

If AqReminder.Recordset.RecordCount > 0 Then //if we found some matches
begin
aqReminder.First;
For i:=1 to (AqReminder.Recordset.RecordCount) do
begin
S:=S + AqReminder.Fields.DataSet .FieldByName('Subject').AsString + #13;
aqReminder.Next;
end;
Self.SysIcon1.ToolTip:=Trim(s);
end;
end;
end;
فعلا که درست کار میکنه. اما از اونجایی که مرتبا" رکوردها رو پیمایش میکنم ، DBNavigator موجود روی فرم، Blink میکنه :اشتباه:
راهی هم به فکرم نمی رسه که بگم : حاجی هر بار که ماوس رو کرد توی چشمت، فقط یکبار این کارها رو انجام بده و صبر کن تا ماوس رو ببره اونور.

Yalda2005
شنبه 06 خرداد 1385, 17:10 عصر
دست شما درد نکنه من یه چیزی تو همین مایه ها می خواستم اما هنوز روش فکر نکرده بودم

babak869
شنبه 06 خرداد 1385, 20:47 عصر
من برای بیرون کشیدن رکوردهایی که به تاریخ امروز هستند روش دیگه ای دارم که شاید برای شما جالب باشه.
در یک Editbox تازیخ جاری رو میریزم و دیتابیس رو بر اساس مقدار داخل اون جستجو میکنم (در یک کوئری).سپس از کد زیر برای اضافه کردن تمامی رکوردها مثلا به یک لیست باکس استفاده می کنم


for i:=1 to ADOQuery1.RecordCount do begin
ListBox1.Items.Add(DataSource2.DataSet.Fieldbyname ('date').Value);
ADOquery1.Next;
end;

امیدوارم که مفید واقع شده باشه

Hamid_PaK
شنبه 06 خرداد 1385, 20:58 عصر
افشین جان با CoolTrayIcon کار کن چند تایی Event برای مواردی که ذکر کردی داره و مشکل Hide فرم رو هم حل کرده ...

یا حق !!!

vcldeveloper
یک شنبه 07 خرداد 1385, 06:37 صبح
اما از اونجایی که مرتبا" رکوردها رو پیمایش میکنم ، DBNavigator موجود روی فرم، Blink میکنه


AqReminder.DisableControls;
try
if AqReminder.RecordCount > 0 then
for i := 0 to AqReminder.RecordCount-1 do
begin
//Write your code.
AqReminder.Next;
end;
finally
AqReminder.EnableControls;
end;

Developer Programmer
یک شنبه 07 خرداد 1385, 08:54 صبح
از همه دوستان و سروران متشکرم

افشین جان با CoolTrayIcon کار کن خیلی جالب بود ، کلی حال داد...!
علی جان زحمت کشیدی ممنون
راستی برنامه تمام شده، اگه از دوستان بخوان میتونه خیلی بدرد بخوره...

Mohammad_Mnt
یک شنبه 07 خرداد 1385, 09:37 صبح
اگه بذارین که خیلی ممنون میشم :)

Yalda2005
یک شنبه 07 خرداد 1385, 18:01 عصر
آقای زوار بذارین خوب می شه ...

Developer Programmer
یک شنبه 07 خرداد 1385, 19:22 عصر
سلام ،
منتظر نظرات و پیشنهادات سازنده تون هستم:بوس:

Yalda2005
دوشنبه 08 خرداد 1385, 13:01 عصر
آقای زوار یه مشکلی که هست اینه که هرچی فارسی بوده علامت ؟ خورده

Hamid_PaK
دوشنبه 08 خرداد 1385, 13:16 عصر
هرچی فارسی بوده علامت ؟ خورده

non-Unicode Language بر روی فارسی انتخاب نشده ...

افشین جان بسیار عالی بود ولی بهتره یکم UserFriendly تر بشه :
- دابل کلیک بر روی TrayIcon رو متونی نمایش فرم اصلی و یا یاداوری بگذاری.
- ویرایش DBNavigate رو غیر فعال کن و برای دریافت و ویرایش از یک فرم جداگانه استفاده کن.
- یک روال برای غیر فعال کردن (نمایش روزهای باقی مانده تا) اضافه کن.
- خسته نباشی ...

یا حق !!!

Developer Programmer
دوشنبه 08 خرداد 1385, 16:25 عصر
افشین جان بسیار عالی بود فدات شم، لطف داری مرسی

دابل کلیک بر روی TrayIcon رو متونی نمایش فرم اصلی و یا یاداوری بگذاری. چشم، اضافه می کنم

ویرایش DBNavigate رو غیر فعال کن و برای دریافت و ویرایش از یک فرم جداگانه استفاده کن چرا؟

یک روال برای غیر فعال کردن (نمایش روزهای باقی مانده تا) اضافه کن. وقتی که ادیت ها رو خالی بذاری و روی دگمه کتارش کلیک کنی تغییرات اعمال شده از بین می ره(یعنی تمام رکوردها رو بی هیچ شرطی میخونه)
-----
در مورد جستجوی مناسبت ها به یه مشکلی برخوردم ، ظاهرا برنامه نمیتونه مناسبت ها رو جستجو کنه ، اما همون Query رو که در اکسس کپی میکنم ، بی هیچ مشکلی اجرا میشه !! :اشتباه:
------
خیلی دوست داشتم که Grid رو یک در میان رنگی کنم ،ولی کامپاننت به کار رفته چنین امکانی رو از Grid می گیره :چشمک:

babak869
دوشنبه 08 خرداد 1385, 18:28 عصر
شمادر رویداد InDrawColumnCell این کد رو بنویس تا جدول یک درمیان رنگی شه


procedure TForm2.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
iValue:Byte;
begin
iValue :=DBGrid1.DataSource.DataSet.RecNo mod 2;
If (gdFocused in State) or (gdSelected in State) then
dbgrid1.canvas.brush.color :=$00A3E0DF
else
case iValue of
1: DBGrid1.Canvas.Brush.Color :=$00F9D1AE;
0: DBGrid1.Canvas.Brush.Color :=$00FEF3E9;
end;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

موفق باشید

Hamid_PaK
دوشنبه 08 خرداد 1385, 21:59 عصر
- در مورد DBNavigate : حتما لازم به ساخت یک فرم در این مورد نیست ولی بهتر که Editing رو فعال و غیر فعال کنید چرا که کاربر (شخصا من اینطوری هستم) هنگام انتخاب رکوردها با کلیک و فعال شدن خودکار ویرایش حال خوشی نخواهد داشت.
- در مورد غیر فعال کردن فیلترها : یک هینت به ادیتها اضافه کن و این قابلیت رو به کاربر اطلاع بده ...
- کد بابک هم جالب بود حتما استفاده کن ...

کد جستجو رو هم پست کن ببینیم کجاش اشکال داره (من که بیسوادم دوستان دیگه هستند).

یا حق !!!

Developer Programmer
سه شنبه 09 خرداد 1385, 08:54 صبح
شمادر رویداد InDrawColumnCell این کد رو بنویس تا جدول یک درمیان رنگی شه

قربونت برم ، نوشتم، کامپوننت اجازه رنگی شدنش رو گرفته

کد جستجو رو هم پست کن ببینیم کجاش اشکال داره (من که بیسوادم دوستان دیگه هستند).
چشم در اولین فرصت پست میکنم
ممنون از زحمات دوستان

Developer Programmer
چهارشنبه 17 خرداد 1385, 12:52 عصر
سلام
به خاطر وجود چند باگ نرم افزاری (!) لطفا فایل ضمیمه شده رو روی فایل قبلی Overwrite کنید
شاد و سبز باشین

babak869
چهارشنبه 17 خرداد 1385, 13:46 عصر
افشین جان من برنامه شما رو چک کردم.اگه موارد زیر رو رعایت کنید برنامه کاملی خواهد شد.
برای رفتن به ادیت بعدی با زدن کلید اینتر از کد زیر در رویداد OnKeyPress هر DbEdit استفاده نمایید


If Key = #13 Then Begin
If HiWord(GetKeyState(VK_SHIFT)) <> 0 then
SelectNext(Sender as TWinControl,False,True)
else
SelectNext(Sender as TWinControl,True,True);
Key := #0
end;

زمانی که کاربر عددی رو جهت مشاهده روزهای باقیمانده به مناسبتی خاص میزنه DbGrid فقط اون اطلاعات جستجو شده رو نشون میده و راه برگشتی برای نمایش کل رکوردها نداره.به نظر من در رویداد OnCellClick مجددا ارتباط DbGrid رو با جدول اصلی برقرار کن یا اگه از دستور فیلتر استفاده کردی اونو کنسل کن تا تمام اطلاعات نمایش داده بشه.
میتونی از کد های رجیستری استفاده کنی تا برنامه خودشو در استارت آپ قرار بده و با هر بار اجرا شدن ویندوز عمل کنه.
بجای DbEdit میتونی از 2 تا دگمه به عنوان (جدید) و (ذخیره ) استفاده کنی(نظر شخصی).
برنامه شما خوب و قابل تقدیره ولی به نظر من هر برنامه نویس قبل از چهره زیبای برنامه باید به کاربری آسان و درون برنامه محکم و بی نقص بپردازه و زیبایی برنامه در درجه دوم کار قرار داره.
برای این که با اجرای برنامه صفحه کلید بصورت اتوماتیک روی فارسی سویچ کنه در رویداد OnShow فرم از کد زیر استفاده کن :


loadkeyboardlayout('00000429', KLF_Activate);

موفق و پیروز باشید

Developer Programmer
پنج شنبه 18 خرداد 1385, 09:19 صبح
ممنون از راهنمایی هاتون
حقیقت این بود که برنامه در کمتر از 2 روز نوشته شد وچون برای خودم نوشتم نمی خواستم زیاد به امنیت گیر بدم


راه برگشتی برای نمایش کل رکوردها نداره
در Help نوشته بودم که اگه Edit خالی باشه ؛ تغییرات جستجو از بین میره


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


If edtSubject.Text='' Then FetchAllRecord
Else
with aqReminder do
begin
Active:=False;
SQL.Text:= 'Select * From tblReminder Where Subject Like ' + QuotedStr('*' + Trim(edtSubject.Text) +'*') ;
Active:=True;
end;
edtSubject.Text:='';


برای رفتن به ادیت بعدی با زدن کلید اینتر از کد زیر در رویداد OnKeyPress هر DbEdit استفاده نمای
کدتون چیزهای جالبی یادم داد ولی تصورم این بود که وقتی میشه با Tab حرکت کرد؛ Enter زدن اضافه کاریه


میتونی از کد های رجیستری استفاده کنی تا برنامه خودشو در استارت آپ قرار بده و با هر بار اجرا شدن ویندوز عمل کنه.
توی Help نوشته بودم که اگه میخواین این اتفاق بیوفته چی کار کنید



برای این که با اجرای برنامه صفحه کلید بصورت اتوماتیک روی فارسی سویچ کن
چطوری دوباره به انگلیسی برگردم؟
--
یه مشکلی هم دارم، از اونجایی که برنامه DB رو باز نگه داشته؛ وقتی Reset میکنی؛ اجازه ریست داده نمیشه ؛ سوالم اینه که ویندوز چه Message رو به پنچره ها میفرسته تا close بشن؟ من wm_close رو نوشته فایده نداشت...

mzjahromi
پنج شنبه 18 خرداد 1385, 10:35 صبح
کدتون چیزهای جالبی یادم داد ولی تصورم این بود که وقتی میشه با Tab حرکت کرد؛ Enter زدن اضافه کاریه

با اجازه دوستان.
معمولا کاربرای ما باEnter راحت ترن.

babak869
پنج شنبه 18 خرداد 1385, 20:18 عصر
برای این که با اجرای برنامه صفحه کلید بصورت اتوماتیک روی فارسی سویچ کن

یه کامپوننت در این تاپیک هست میتونی از اون استفاده کنی
http://www.barnamenevis.org/forum/showthread.php?t=31022