الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تسائلات علها تفيد الجميع

مغلق
بدأه اتجاهات في 19 فبراير 2005 · 8 رد · 861 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني اعضاء هذا المنتدى الرائع وفقكم الله لكل خير ويسر لكم كل عسير لدي بعض التسائلات التي اريد منكم التركيز عليها والإجابة لتعم الفائده للجميع فضلامنكم لا امرا عليكم وفق الله الجميع لمافيه خير

اولا:- لدي شاشة تحتوي على زرين و Dbgrid لعرض البيانات يقوم الزر الأول بفتح شاشة لتسجيل البيانات بينما يقوم الزر الثاني بفتح شاشة أخرى لتعديل نفس البيانات والذي اريده هو جعل نفس شاشة التسجيل هي نفس شاشة التعديل بحيث عند ضغط زر التسجيل يمكنني فتح شاشة التسجيل و تسجيل البيانات التى اريدها وعند ضغط زر التعديل تفتح نفس الشاشة مع تغيير مسمى الشاشة (وهذا امره يسير وليس مشكلة) لكن المشكلة أن لدي زر في شاشة التسجيل يقوم بعملية append على التيبل وذلك لتسهيل العمل فلوكان عندي خمس سجلات جديدة فمن غي المنطقي أن أقوم بتسجيل السجل الأول ثم أخرج من الشاشة وأعود ثانية لكي اسجل السجل الثاني وهكذا بل بعد عملية حفظ السجل الأول اقوم بالضغط على زر(المسمى جديد مثلا) لكي يفتح لي سجلا جديدا حتى اتم جميع مالدي في تلك اللحظة لكن المشكلة أنني اريد تحويل عمل هذا الزر عند القيام بالتعديل بحيث يصبح دوره هو (edit) ويتغير مسماه من جديد إلى تعديل ( وكما قلت تغيير المسمى امره سهل وميسر) لكن المشكلة في تغيير حدث الزر من append إلى edit برمجيا.. اعذروني على الشرح الطويل ولكن لزيادة التوضيح.

ثانيا:- لو اردت أن اجعل مجموعة من الازرار تنفذ بعض الاحداث المختلفة على فورم معين لكن هذه الاجرائات او الكود البرمجي مكتوبة في Unit اخى وخصوصا تلك اليونت التي تنشىء دون فورم أي ليست مرتبطه بفورم والتي يمكن الحصول عليها من file--new--unit

بحث اخفف من تكدس الاكواد الطوية تحت بعض الاحداث داخل الفورم الواحد بل مجرد ضغط الزر المعين يتنفذ الامر مع العلم أنه في unit مستقل.

ثالثا:- عندما اضع اربعة ازرار للقيام بعملية الوصول إلى السجل الأول - السجل السابق- السجل التالي - السجل الأخير وهي(Table1.first و Table1.priorو Table1.nextو Table1.last) بدل ما اجعل تحت كل زر الامر الذي يعنيه هل من طريقة بحيث يمكن كتابة الكود في مكان معين من البرنامج واستدعاء الحدث حسب كل زر والتخلص منطريقة كل زر والامر الذي يقوم به مسجل تحت حدث Onclick هل هناك من وسيل ارقى برمجيا ولا تقلوا لي استخدم Dbnavigator فهو جيد ولكن اريد شيء غير ذلك الكمبوننت

رابعا:- وجدة كودا للاخ Delphi Team في منتدى المبرمجين العرب للنسخ الاحتياطي لقاعدة البيانات واستعادة النسخ وهو التالي(if MessageDlg('Are you Sure that you want to Continue',mtConfirmation,[mbOK,mbNo],0)

=mrok then begin

CopyFile('Cars Show.mdb','BackUpCars Show.mdb',false);

) وكود الاسترجاع هو(if MessageDlg('Are you Sure that you want to Continue',mtConfirmation,[mbOK,mbNo],0)

=mrok then begin

CopyFile('BackUpCars Show.mdb','Cars Show.mdb',false);

) لكن يا ايه الاخوة الكرام اريد نسخ قاعدة البيانات وبعد ذلك احدد المكان الذي اريد أن احفظها فيه بواسطة SaveDialogue اما في السى او الدي او حتى FloopyA

وطريقة فكها بنفس البرنامج الذي صممت ولكن على جهاز أخر غير الجهاز المنسوخة منه

وفقكم الله جميعا وعذروني فقد ثقلت العيار شوي لكن لعشمي في ابطال وعباقرة هذا المنتدي بقيادة الاستاذ عروة والاخوان Justnick و Ikoosan وابوهاني وغيرهم كثير ممن لم اذكرهم ولكن المنتدى يعرفهم اكثر

وتقبلو تحياتي ;)

اخوكم ابو محمد

#2

:rolleyes: تحية طيبة وبعد اخى اتجاهات لك منى خالص الحب

عندى ليك مفاجأة كبيرة انا لست عبقريا ولا حتى محترف دلفى الموضوع كله انى لا اذال مبتدأ فانا لا اعرف شئ عن قواعد البيانات تماما لا من قريب ولا من بعيد انا دخلت عالم الدلفى معتمد على الله وعلى نفسى لا على معلم او دكتور جامعة

وشكرا لك على تذكرنى بالخير

بالنسبة لعملية استخدام Function او procedure موجود فى يونيت اخر هذا فى قمة السهولة فقت عليك كتابة ما تشاء من دوال فى هذه اليونيت ووضعها فى نفس المجلد للمشروع ثم" فلى Uses ضع اسم اليونيت وان شاء الله تجد انك تستخدم الدوال التى بداخلها ببساطة شديدة جدا"

اما بالنسبة لوضع قاعدة البيانات فى مكان معين تختاره بالSavedialog ما عليك الا استخدام Save dailog كالاتى

1.If Savedilaog.excute then

2.تستخدم Savedialog.filename داخل الطريقة التى جئت بها من الاستاذ الكبير دلفى تييم

CopyFile('Cars Show.mdb',SaveDialog.filename

هذا والله الموفق واسف على عدم تنسيق الاجابة وشكرا

{ربى زدنى علما}

#3

اشكرك اخي Juststick على هذه السرعة في الرد لكن اخوك ضعيف في الفهم والاستيعاب وليس كمثلك فهل من مثال على ماذكرته لان بالمثال يتضح المقال ولك خالص الشكر و الامتنان

تنويه(معتمد على الله وعلى نفسى ) تصحيح للخطأ الذي وقع سهوا (معتمد على الله ثم على نفسى )

#4

اشكرك على تصحيح الخطأ وان شاء الله اجيب لك مثال للتوضيح

{ربى زدنى علما}

#5

السلام عليكم ورحمة الله وبركاته

اولا ابدأ مشروع جديد ثم اضف unit2 وضع هذا الكود به

unit Unit2; //Unit Name :)

interface
uses Dialogs; //Uses

 procedure SayHi;
implementation
 procedure SayHi;
 begin
 ShowMessage('ÇåáÇ æÓåáÇ Èß ÇÎì ÇÊÌÇåÇÊ');
 end;
end.

عودة مره اخرى الى unit1 وضع فى الuses

uses unit2;//Should Do uses to be able to use its procedures;

هذا بالنسبة باستخدام الunit اخر

اما لعملية حفظ واستعادة الداتا بيذ

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtDlgs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

 uses unit2;//Should Do uses to be able to use its procedures;

 {$R *.dfm}
 //---------use unit2 procedure------
procedure TForm1.Button1Click(Sender: TObject);
begin
SayHi;//use the procedure which located in unit2
end;
//---------------BackUP---------------
procedure TForm1.Button2Click(Sender: TObject);
begin
SaveDialog1.FileName:='BackUpMyDtaBase';
If Not SaveDialog1.Execute then exit;
Copyfile('MyDataBase',pchar(SaveDialog1.FileName),false);
end;
//--------------Restore------------
procedure TForm1.Button3Click(Sender: TObject);
begin
if Not OpenDialog1.Execute then exit;
CopyFile(pchar(OpenDialog1.FileName),'MyDataBase',False);
end;

end.
//***************************************

//By JustNick ©

//Coded By Ahmed Shoulah

// Good Luck;)
//*/*/*/*//**/*/*/*/*/*/*/

{ربى زدنى علما}

#6

هذ المثال :rolleyes:

Example.zip

{ربى زدنى علما}

#7

أهلا بالأحبة :lol: .

ساعطي مثالا لسؤالك الثاني: كيف تخفف من الكود, بحمل كل الأجرائيات للأحداث إلى وحدة أخرى ليس لها واجهة مرئية :

Fomr1 تضم زر Button1 و Label1, و يجب أن نتعامل مع مجموعة من الأحداث تهم هذين المكونين.

قمت بنقل كل إجرائيات الأحداث كيفما كان نوعها( onclick,OnMouseMove...) ,إلى وحدة ثانية Unit2, أنشات فيها Class جديد تحتوي على كل هذه الأجرائيات.

يجب ان نترك حدثا واحدا في Unit1 و هو TForm1.FormCreate, بداخلهل عرفت الأجرائيات المنقولة من Unit2.

هذا كود الوحدة الأولى unit1:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses unit2;

procedure TForm1.FormCreate(Sender: TObject);
begin
 // all my events in an other unit
 Button1.OnClick:=  MyEvents.MyButtonEvent;
 Form1.OnMouseMove:= MyEvents.FormMouseMove;
 Label1.OnMouseMove:= MyEvents.Label1MouseMove;
 Label1.OnClick:= MyEvents.Label1Click;
end;

end.

وهذا كود الوحدة الثانية Unit2:

unit Unit2;

interface

uses  Dialogs,Classes,unit1, Graphics, Controls;

type
  TMyEvents = class
    procedure MyButtonEvent(Sender: Tobject);
    procedure Label1Click(Sender: TObject);
    procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  end;

var
 MyEvents: TMyEvents;

implementation

{ TMyEvents }

procedure TMyEvents.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Form1.Label1.Font.Color:= clBlue;
Form1.Label1.Cursor:= crHandPoint;
end;

procedure TMyEvents.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
form1.Label1.Font.Color:= clBlack;
end;

procedure TMyEvents.Label1Click(Sender: TObject);
begin
ShowMessage('this is a event of a onclick for label1');
end;

procedure TMyEvents.MyButtonEvent(Sender: Tobject);
begin
 ShowMessage('hello freind'+#10#13+'This is a click evnt for the button');
end;
end.

الملف المرفق في نص الكود الكامل

(h)

EventsInUnit2.zip

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#8
اقتباس
اولا:- لدي شاشة تحتوي على زرين و Dbgrid لعرض البيانات يقوم الزر الأول بفتح شاشة لتسجيل البيانات بينما يقوم الزر الثاني بفتح شاشة أخرى لتعديل نفس البيانات والذي اريده هو جعل نفس شاشة التسجيل هي نفس شاشة التعديل بحيث عند ضغط زر التسجيل يمكنني فتح شاشة التسجيل و تسجيل البيانات التى اريدها وعند ضغط زر التعديل تفتح نفس الشاشة مع تغيير مسمى الشاشة (وهذا امره يسير وليس مشكلة) لكن المشكلة أن لدي زر في شاشة التسجيل يقوم بعملية append على التيبل وذلك لتسهيل العمل فلوكان عندي خمس سجلات جديدة فمن غي المنطقي أن أقوم بتسجيل السجل الأول ثم أخرج من الشاشة وأعود ثانية لكي اسجل السجل الثاني وهكذا بل بعد عملية حفظ السجل الأول اقوم بالضغط على زر(المسمى جديد مثلا) لكي يفتح لي سجلا جديدا حتى اتم جميع مالدي في تلك اللحظة لكن المشكلة أنني اريد تحويل عمل هذا الزر عند القيام بالتعديل بحيث يصبح دوره هو (edit) ويتغير مسماه من جديد إلى تعديل ( وكما قلت تغيير المسمى امره سهل وميسر) لكن المشكلة في تغيير حدث الزر من append إلى edit برمجيا.. اعذروني على الشرح الطويل ولكن لزيادة التوضيح.

راجع المثال المرفق ..

الطريقة بسيطة (ضع متحول بولياني Boolean يأخذ true إذا كنا نعمل في وضع التحرير و false في وضع جديد . وبإستخدام if else نكتب كل من الشفرتين . لاتنسى ضبط هذا المتحول من الفورم الأول قبل إظهار الفورم الثاني )

اقتباس
ثالثا:- عندما اضع اربعة ازرار للقيام بعملية الوصول إلى السجل الأول - السجل السابق- السجل التالي - السجل الأخير وهي(Table1.first و Table1.priorو Table1.nextو Table1.last) بدل ما اجعل تحت كل زر الامر الذي يعنيه هل من طريقة بحيث يمكن كتابة الكود في مكان معين من البرنامج واستدعاء الحدث حسب كل زر والتخلص منطريقة كل زر والامر الذي يقوم به مسجل تحت حدث Onclick هل هناك من وسيل ارقى برمجيا ولا تقلوا لي استخدم Dbnavigator فهو جيد ولكن اريد شيء غير ذلك الكمبوننت

من صفحة standard أستخدم actionlist

أنقر مرتين علية

بالزر الأيمن إختر new standard action

أنزل إلى التبويب dataset وأختر datasetfirst

ثم كرر العملية من أجل next و last و و ...

بإمكانك بعدها ضبط الخصائص مثل الصورة والكابشن وغيرها

أغلق معالج ال action List وضع زر على الفورم (يفضل bitbtn أو speedButton أو toolbar ..)

ستجد لكل منها خاصية تشمى action في أعلى ضابط الكائنات . إضبطها إلى أحد الأحداث السابقة

new_Edit.zip

تم تعديل هذه المشاركة بواسطة ORWA في 20 فبراير 2005 في 13:24

#9

انا عاجز عن شكركم ايه الاخوة الكرام Justnick و Ikossanو Orwa على إجاباتكم ولا حرمكم الله الاجر ولكم جزيل الشكر

سوف اقوم بالتجريب ولعي استوعب ماذكرتم

هذا الموضوع مغلق.

مواضيع مشابهة