المشاركات : 421
المواضيع 77
:
: 195
الإنتساب : Dec 2008
03-03-2020, 09:34 PM
(آخر تعديل لهذه المشاركة: 04-03-2020, 08:27 AM بواسطة S.FATEH.)
السلام عليكم
أريد التحكم في عناصر جملة الـ SQL يدويا بمعنى عندي جملة Select Name,BirthDay,Mark from Table order by Name,BirthDay,Mark
أريد مثلا وضع في الفورم عدة CheckBox بهم عناصر الـ (order( Name,BirthDay,Mark أنا الذي يتحكم على أي أساس يتم الترتيب على حساب الإسم أولا أو على حساب تاريخ الميلاد ثانيا وعند إزالة التحديد وإعادة التحديد يصبح العنصر المختار هو الأخير في قائمة الـ order
المشاركات : 55
المواضيع 0
:
: 17
الإنتساب : Mar 2008
وعليكم السلام ورحمة الله وبركاته
إليك الكود التالي قم بتجريبه
ملاحظة : عليك إعطاء كل checkbox.tag قيمة حسب الجدول aFieldName
كود : unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.Grids,
Vcl.DBGrids, Vcl.ExtCtrls, Data.Win.ADODB, Vcl.Mask, Vcl.DBCtrls;
type
TForm2 = class(TForm)
Query: TADOQuery;
NameCheckBox: TCheckBox;
BirthDayCheckBox: TCheckBox;
MarkCheckBox: TCheckBox;
procedure NameCheckBoxClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
aOrder: array of string;
function GenerateSQL: string;
procedure AddFieldToOrder(FieldName: string);
procedure RemoveFieldFromOrder(FieldName: string);
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.NameCheckBoxClick(Sender: TObject);
const
aFieldName: array[1..3] of string = ('Name', 'BirthDay', 'Mark');
var
Order: string;
begin
Query.Active:= False;
if TCheckBox(Sender).Checked then
AddFieldToOrder(aFieldName[TCheckBox(Sender).Tag])
else RemoveFieldFromOrder(aFieldName[TCheckBox(Sender).Tag]);
Query.SQL.Text:= GenerateSQL;
Query.Active:= True;
end;
function TForm2.GenerateSQL: string;
var
Order: string;
I: Integer;
begin
Result:= 'SELECT * FROM Table ';
if Length(aOrder) > 0 then
begin
Result:= Result + 'ORDER BY ' + aOrder[0];
for I:= 1 to High(aOrder) do
Result:= Result + ', ' + aOrder[I];
end;
end;
procedure TForm2.AddFieldToOrder(FieldName: string);
var
I: Integer;
begin
I:= 0;
begin
while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do
I:= I + 1;
end;
if I >= Length(aOrder) then
begin
SetLength(aOrder, I + 1);
aOrder[I]:= FieldName;
end;
end;
procedure TForm2.RemoveFieldFromOrder(FieldName: string);
var
I: Integer;
begin
I:= 0;
while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do
I:= I + 1;
if I <= High(aOrder) then
Delete(aOrder, I, 1);
end;
end.
المشاركات : 421
المواضيع 77
:
: 195
الإنتساب : Dec 2008
04-03-2020, 09:36 PM
(آخر تعديل لهذه المشاركة: 05-03-2020, 07:07 PM بواسطة S.FATEH.)
(04-03-2020, 12:38 PM)ghostdz كتب : وعليكم السلام ورحمة الله وبركاته
إليك الكود التالي قم بتجريبه
ملاحظة : عليك إعطاء كل checkbox.tag قيمة حسب الجدول aFieldName
كود : unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.Grids,
Vcl.DBGrids, Vcl.ExtCtrls, Data.Win.ADODB, Vcl.Mask, Vcl.DBCtrls;
type
TForm2 = class(TForm)
Query: TADOQuery;
NameCheckBox: TCheckBox;
BirthDayCheckBox: TCheckBox;
MarkCheckBox: TCheckBox;
procedure NameCheckBoxClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
aOrder: array of string;
function GenerateSQL: string;
procedure AddFieldToOrder(FieldName: string);
procedure RemoveFieldFromOrder(FieldName: string);
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.NameCheckBoxClick(Sender: TObject);
const
aFieldName: array[1..3] of string = ('Name', 'BirthDay', 'Mark');
var
Order: string;
begin
Query.Active:= False;
if TCheckBox(Sender).Checked then
AddFieldToOrder(aFieldName[TCheckBox(Sender).Tag])
else RemoveFieldFromOrder(aFieldName[TCheckBox(Sender).Tag]);
Query.SQL.Text:= GenerateSQL;
Query.Active:= True;
end;
function TForm2.GenerateSQL: string;
var
Order: string;
I: Integer;
begin
Result:= 'SELECT * FROM Table ';
if Length(aOrder) > 0 then
begin
Result:= Result + 'ORDER BY ' + aOrder[0];
for I:= 1 to High(aOrder) do
Result:= Result + ', ' + aOrder[I];
end;
end;
procedure TForm2.AddFieldToOrder(FieldName: string);
var
I: Integer;
begin
I:= 0;
begin
while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do
I:= I + 1;
end;
if I >= Length(aOrder) then
begin
SetLength(aOrder, I + 1);
aOrder[I]:= FieldName;
end;
end;
procedure TForm2.RemoveFieldFromOrder(FieldName: string);
var
I: Integer;
begin
I:= 0;
while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do
I:= I + 1;
if I <= High(aOrder) then
Delete(aOrder, I, 1);
end;
end.
جزاك الله خير ولكن عمل معي في الترتيب بالإسم فقط ولم يعمل مع تاريخ الميلاد و العلامه لا أدري أين الخلل
وهل ممكن معرفة الترتيب على أي checkbox أولا ؟هل يمكن إضافة Label على الفورم بجانب كل checkbox ليبين ترتيبه ،هل تم الترتيب به في المرتبة الأولى أو المرتبة الثانية أو الثالثة؟
هل لك قناة تعليمية أخي الكريم؟
المشاركات : 421
المواضيع 77
:
: 195
الإنتساب : Dec 2008
05-03-2020, 12:42 AM
(آخر تعديل لهذه المشاركة: 05-03-2020, 07:13 PM بواسطة S.FATEH.)
أعذرني البرنامج يعمل بكل كفاءة جزاك الله خيرا
هل ممكن معرفة الترتيب على أي checkbox أولا ؟هل يمكن إضافة Label على الفورم بجانب كل checkbox ليبين ترتيبه ،هل تم الترتيب به في المرتبة الأولى أو المرتبة الثانية أو الثالثة؟
هل لك قناة تعليمية أخي الكريم؟
المشاركات : 55
المواضيع 0
:
: 17
الإنتساب : Mar 2008
(05-03-2020, 12:42 AM)ALG2009 كتب : أعذرني البرنامج يعمل بكل كفاءة جزاك الله خيرا هل ممكن معرفة الترتيب على أي checkbox أولا ؟هل يمكن إضافة Label على الفورم بجانب كل checkbox ليبين ترتيبه ،هل تم الترتيب به في المرتبة الأولى أو المرتبة الثانية أو الثالثة؟
هل لك قناة تعليمية أخي الكريم؟
إليك الكود التالي حيث قمت ببعض التغييرات على الكود السابق وأضفت فيه عرض الترتيب
لا أملك قناة تعليمية
كود : unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.Grids,
Vcl.DBGrids, Vcl.ExtCtrls, Data.Win.ADODB, Vcl.Mask, Vcl.DBCtrls;
const
aFieldName: array[1..3] of string = ('Name', 'BirthDay', 'Mark');
type
TForm2 = class(TForm)
Query: TADOQuery;
NameCheckBox: TCheckBox;
BirthDayCheckBox: TCheckBox;
MarkCheckBox: TCheckBox;
NameLabel: TLabel;
BirthdayLabel: TLabel;
MarkLabel: TLabel;
procedure NameCheckBoxClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
aOrder: array of string;
function GenerateSQL: string;
procedure AddFieldToOrder(FieldName: string);
procedure RemoveFieldFromOrder(FieldName: string);
function GetFieldOrderPos(FieldName: string): Integer;
procedure ShowFieldOrder;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.NameCheckBoxClick(Sender: TObject);
var
Order: string;
begin
Query.Active:= False;
if TCheckBox(Sender).Checked then
AddFieldToOrder(aFieldName[TCheckBox(Sender).Tag])
else RemoveFieldFromOrder(aFieldName[TCheckBox(Sender).Tag]);
Query.SQL.Text:= GenerateSQL;
Query.Active:= True;
ShowFieldOrder;
end;
function TForm2.GenerateSQL: string;
var
Order: string;
I: Integer;
begin
Result:= 'SELECT * FROM Table ';
if Length(aOrder) > 0 then
begin
Result:= Result + 'ORDER BY ' + aOrder[0];
for I:= 1 to High(aOrder) do
Result:= Result + ', ' + aOrder[I];
end;
end;
procedure TForm2.AddFieldToOrder(FieldName: string);
var
I: Integer;
begin
I:= 0;
begin
while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do
I:= I + 1;
end;
if I >= Length(aOrder) then
begin
SetLength(aOrder, I + 1);
aOrder[I]:= FieldName;
end;
end;
procedure TForm2.RemoveFieldFromOrder(FieldName: string);
var
I: Integer;
begin
I:= 0;
while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do
I:= I + 1;
if I <= High(aOrder) then
Delete(aOrder, I, 1);
end;
function TForm2.GetFieldOrderPos(FieldName: string): Integer;
var
I: Integer;
begin
Result:= 0;
for I := 0 to High(aOrder) do
if UpperCase(aOrder[I]) = UpperCase(FieldName) then
Result:= I + 1;
end;
procedure TForm2.ShowFieldOrder;
begin
NameLabel.Caption:= IntToStr(GetFieldOrderPos(aFieldName[1]));
BirthdayLabel.Caption:= IntToStr(GetFieldOrderPos(aFieldName[2]));
MarkLabel.Caption:= IntToStr(GetFieldOrderPos(aFieldName[3]));
end;
end.
كل من 1 user says قال شكرا ل ghostdz على المشاركة المفيدة1 user says Thank You to ghostdz for this post
• Delphi4Us
المشاركات : 421
المواضيع 77
:
: 195
الإنتساب : Dec 2008
05-03-2020, 06:01 PM
(آخر تعديل لهذه المشاركة: 05-03-2020, 07:10 PM بواسطة S.FATEH.)
الله يرضى عليك ويزيدك من علمه
(05-03-2020, 11:01 AM)ghostdz كتب : لا أملك قناة تعليمية
عليك بوضع بعض الدروس كأفكار برمجية
أو البدء في دورة على كتابة برنامج من الصفر حتى النهاية لنستفيد من علمك أخي الكريم طبعا إن كان لديك الوقت
بالمناسبة
PHP كود : (aFieldName[TCheckBox(Sender).Tag
ماذا يقصد بالسندر Sender يمرر كباراميتر دائما في الاجراءات هل من أمثله لفهمه
المشاركات : 975
المواضيع 50
:
: 218
الإنتساب : Feb 2008
05-03-2020, 06:18 PM
(آخر تعديل لهذه المشاركة: 05-03-2020, 07:02 PM بواسطة S.FATEH.)
السلام عليكم
بالنسبة للـ Sender
Parent, Sender,Owner, ControlCount, ComponentCount
هذا حل اخر باستخدام TStringList لم اجرب كثيرا عليه يمكنك تعديله بما يناسبك
PHP كود : unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; Button1: TButton; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure Button1Click(Sender: TObject); private OrderByClause: TStringList; S: string; function BuildSql(ASQl: string): string; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.BuildSql(ASQl: string): string; var I: Integer; begin if OrderByClause.Count = 0 then begin Exit; S := ''; end; S := 'order by '; I := 0; while OrderByClause.Count - 1 <> I do begin S := S + OrderByClause[I] + ', '; Inc(I); end; S := S + OrderByClause[OrderByClause.Count - 1]; Result := ASQl + ' ' + S; end;
procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := BuildSql('select from table'); end;
procedure TForm1.CheckBox1Click(Sender: TObject); var CheckBoxComponent: TCheckBox; begin CheckBoxComponent := TCheckBox(Sender); if CheckBoxComponent.Checked then OrderByClause.Add(CheckBoxComponent.Caption) else OrderByClause.Delete(OrderByClause.IndexOf(CheckBoxComponent.Caption)); end;
procedure TForm1.FormCreate(Sender: TObject); begin OrderByClause := TStringList.Create; end;
procedure TForm1.FormDestroy(Sender: TObject); begin OrderByClause.Free; end;
end.
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
المشاركات : 421
المواضيع 77
:
: 195
الإنتساب : Dec 2008
(05-03-2020, 06:18 PM)S.FATEH كتب : السلام عليكم
بالنسبة للـ Sender
Parent, Sender,Owner, ControlCount, ComponentCount
هذا حل اخر باستخدام TStringList لم اجرب كثيرا عليه يمكنك تعديله بما يناسبك
PHP كود : unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; Button1: TButton; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure Button1Click(Sender: TObject); private OrderByClause: TStringList; S: string; function BuildSql(ASQl: string): string; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.BuildSql(ASQl: string): string; var I: Integer; begin if OrderByClause.Count = 0 then begin Exit; S := ''; end; S := 'order by '; I := 0; while OrderByClause.Count - 1 <> I do begin S := S + OrderByClause[I] + ', '; Inc(I); end; S := S + OrderByClause[OrderByClause.Count - 1]; Result := ASQl + ' ' + S; end;
procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := BuildSql('select from table'); end;
procedure TForm1.CheckBox1Click(Sender: TObject); var CheckBoxComponent: TCheckBox; begin CheckBoxComponent := TCheckBox(Sender); if CheckBoxComponent.Checked then OrderByClause.Add(CheckBoxComponent.Caption) else OrderByClause.Delete(OrderByClause.IndexOf(CheckBoxComponent.Caption)); end;
procedure TForm1.FormCreate(Sender: TObject); begin OrderByClause := TStringList.Create; end;
procedure TForm1.FormDestroy(Sender: TObject); begin OrderByClause.Free; end;
end.
جزاك الله خير
جاري التجربه
كل من 1 user says قال شكرا ل ALG2009 على المشاركة المفيدة1 user says Thank You to ALG2009 for this post
• S.FATEH
|