PDA

View Full Version : سوال: درخواست کامپوننت



Reza798
یک شنبه 23 خرداد 1389, 10:50 صبح
با سلام

کامپوننتی وجود دارد که با وارد کردن متن یا مقداری داخل یک Tedit یک دی بی گرید در زیر Tedit نشان دهد که حاوی نتایج جستجوی آن مقدار در بانک باشد. البته این کار را می شود با یک دی بی گری و یک edit انجام داد ولی مشکلاتی بوجود می آید مثلا اگر در onExit کامپوننت edit دستور مخفی کردن دی بی گرید را بنویسیم دیگر با موس نمی شود روی گزینه های دی بی گرید رفت و انتخاب کرد چون دی بی گرید مخفی می شود.

جواد ملاولی
یک شنبه 23 خرداد 1389, 11:58 صبح
سلام.
دقیقا نفهمیدم مشکلت چیه؟
بالاخره شما می خوای با بیرون رفتن کنترل از edit، دی بی گرید مخفی بشه یا نشه؟
اگه می خوای مخفی نشه که هیچی.
اگه می خوای مخفی بشه، با همون روشی که خودت گفتی مخفیش کن و در رویداد OnEnter و یا OnChange مربوط به edit، دوباره ظاهرش کن.

alinikaein
یک شنبه 23 خرداد 1389, 17:23 عصر
يكي از راه‌هاش اينه كه شما دنبال عمل كليك كردن باشيد.
در صورتي كه جايي كليك شد، مي‌فهميد كه خارج شده، حالا در صورتي كه گريد در حال نمايش بود و محل كليك كردن جايي خارج از گريد بود، گريد را پنهان مي‌كنيد.

يا علي... موفق باشيد...

Reza798
یک شنبه 23 خرداد 1389, 18:34 عصر
با تشكر

مشكل من اينه چون در onExit مربوط به edit دستور مخفي كردن dbgrid را مي نويسم ديگر كاربر با موس نمي تواند محتويات دي بي گريد را انتخاب كند و به به محض خروج از edit و انتقال موس به دي بي گريد - دي بي گريد مخفي مي شود و كاربر فقط با كليد enter مي تواند گزين هاي دي بي گريد را انتخاب كند و با موس نمي شود

hamedsadry3000
یک شنبه 23 خرداد 1389, 21:43 عصر
شما باید از خاصیت فیلتر استفاده کنید

try

ADODSmember.Filtered := False;
if Edisearch.Text <> '' then
begin
case (list.Itemindex + 1) of
1: fild := 'name';
2: fild := 'family';
3: fild := 'tel';
4: fild := 'send';
end;
if (list.Itemindex + 1) = 4 then //نام فيلد مورد جستجو
ADODSmember.Filter := 'grop LIKE (' + QuotedStr('*' + DBLUCombo1.Text + '*') + ') and ' + fild + '=' + Edisearch.Text
else
ADODSmember.Filter := 'grop LIKE (' + QuotedStr('*' + DBLUCombo1.Text + '*') + ') and ' + fild + ' LIKE (' + QuotedStr('*' + Edisearch.Text + '*') + ')';
end else begin
ADODSmember.Filter := 'grop LIKE (' + QuotedStr('*' + DBLUCombo1.Items.Strings[DBLUCombo1.ItemIndex] + '*') + ')';
end;

ADODSmember.Filtered := true;
except
end;

Reza798
دوشنبه 24 خرداد 1389, 07:31 صبح
شما باید از خاصیت فیلتر استفاده کنید

try

ADODSmember.Filtered := False;
if Edisearch.Text <> '' then
begin
case (list.Itemindex + 1) of
1: fild := 'name';
2: fild := 'family';
3: fild := 'tel';
4: fild := 'send';
end;
if (list.Itemindex + 1) = 4 then //نام فيلد مورد جستجو
ADODSmember.Filter := 'grop LIKE (' + QuotedStr('*' + DBLUCombo1.Text + '*') + ') and ' + fild + '=' + Edisearch.Text
else
ADODSmember.Filter := 'grop LIKE (' + QuotedStr('*' + DBLUCombo1.Text + '*') + ') and ' + fild + ' LIKE (' + QuotedStr('*' + Edisearch.Text + '*') + ')';
end else begin
ADODSmember.Filter := 'grop LIKE (' + QuotedStr('*' + DBLUCombo1.Items.Strings[DBLUCombo1.ItemIndex] + '*') + ')';
end;

ADODSmember.Filtered := true;
except
end;


با تشکر

مشکل من فیلتر کردن رکورد های dataset نیست . مشکل اینجاست که می خواهم کاربر بتواند هم از طریق موس و هم از طریق دکمه های بالا و پایین بین رکوردهای فیلتر شده حرکت نماید و با موس یا کلید enter رکورد مورد نظر را انتخاب کرده و نتیجه در edit نمایش داده شود. دی بی گرید در زیر edit نمایش داده شود.

hamedsadry3000
دوشنبه 24 خرداد 1389, 08:31 صبح
از
DBAdvGlowNavigator
از کامپوننت tms استفاده کنید

Reza798
یک شنبه 06 تیر 1389, 13:55 عصر
با سلام

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

Felony
یک شنبه 06 تیر 1389, 14:13 عصر
با سلام

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

قبلا همچین چیزی دیده بودم ، فکر کنم تو سری کامپوننت های Dev Express بود شایدم نه ، در هر صورت خودتون هم میتونید تو برنامتون به راحتی پیاده سازی کنیدش .

bootshow
دوشنبه 07 تیر 1389, 23:43 عصر
باید dbgrid را توی یک فرم دیگه بزاری.وقتی وارد edit شدی فرم را ظاهر کنی.;کنترل بسته شدنش یکم سخته.
از کامپوننتهای TMS میتونی استفاده کنی.
از TAdvControlDropDown و TDBAdvGrid استفاده کن.خاصیت control شی AdvControlDropDown را به dbadvgrid تغییر بده.در رویداد onchange شی AdvControlDropDown میتونی جدولتو فیلتر کنی.و در رویداد OnDropUp میتونی رکورد فعلی انتخاب شده را نشون بدی.

Reza798
سه شنبه 08 تیر 1389, 07:56 صبح
باید dbgrid را توی یک فرم دیگه بزاری.وقتی وارد edit شدی فرم را ظاهر کنی.;کنترل بسته شدنش یکم سخته.
از کامپوننتهای TMS میتونی استفاده کنی.
از TAdvControlDropDown و TDBAdvGrid استفاده کن.خاصیت control شی AdvControlDropDown را به dbadvgrid تغییر بده.در رویداد onchange شی AdvControlDropDown میتونی جدولتو فیلتر کنی.و در رویداد OnDropUp میتونی رکورد فعلی انتخاب شده را نشون بدی.

با تشکر از شما

هنوز دو تا مشکل هست .

1- کامپوننت advDBgrid وقتی زیرمجموعه کامپوننت AdvControlDropDown میشه خاصیت راست به چپ خودش را از دست میدهد. که مشکل بزرگی است

2-وقتی با دکمه های UP و DOWN صفحه کلید روی advDBgrid حرکت می کنیم . advDBgrid بسته می شود.

Felony
سه شنبه 08 تیر 1389, 09:41 صبح
نیازی به استفاده از کامپوننت نیست ، یک نمونه براتون نوشتم ، فایل ضمیمه رو نگاه کنید .

Reza798
سه شنبه 08 تیر 1389, 10:19 صبح
نیازی به استفاده از کامپوننت نیست ، یک نمونه براتون نوشتم ، فایل ضمیمه رو نگاه کنید .

با تشکر از برنامه شما ولی این برنامه دو مشکل دارد :

1- اگر کاربر از edit1 خارج شد و به edit2 رفت دی بی گرید مخفی نمی شود و اگر آن را در رویداد onExit مربوط به edit1 مخفی کنی - وقتی با موس روی دی بی گرید می روی تا گزینه ای را با دو بار کلیک انتخاب کنی دی بی گرید مخفی می شود.

2- با کلیدهای up و down نمی شود روی آیتم های دی بی گرید حرکت کرد.

Felony
سه شنبه 08 تیر 1389, 10:49 صبح
من ایده کلی رو بهتون دادم ، کمی هم خودتون تلاش میکردید ...

برنامه رو اصلاح کردم ، از ضمیمه دریافت کنید .

Reza798
سه شنبه 08 تیر 1389, 11:05 صبح
من ایده کلی رو بهتون دادم ، کمی هم خودتون تلاش میکردید ...

برنامه رو اصلاح کردم ، از ضمیمه دریافت کنید .

آقای تاجیک من قبلا تلاشم را کردم - اما هر مشکلی را حل کردم بازهم مشکل دیگری وجود داشته است مثلا یک نمونه آن را در برنامه خود ببینید(طبق تصویر) من از edit1 خارج شده ام ولی دی ی گرید مخفی نشده و نظم فرم را به هم میزند.

Felony
سه شنبه 08 تیر 1389, 11:38 صبح
من فقط برای رفع مشکل کد رو تغیر دادم ولی از لحاظ فنی میتونید یک Message Handler بنویسید و وقتی DBGrid فکوس رو از دست داد مخفیش کنید .

Reza798
چهارشنبه 09 تیر 1389, 08:27 صبح
با تشکر

آقای تاجیک مجموعه edit و DBGrid را می شود در قالب یک کامپوننت در آورد تا در برنامه های دیگر بتوان براحتی از آن استفاده کرد

Felony
چهارشنبه 09 تیر 1389, 09:02 صبح
میشه ولی دردسرش زیاده ، میتونید یک کلاس بنویسید براش و از اون کلاس استفاده کنید .

Felony
چهارشنبه 09 تیر 1389, 10:09 صبح
براتون به یک کلاس واحد تبدیلش کردم ، البته وقت زیاد نداشتم روش کار کنم ولی در کل به خوبی کار میکنه ، اگر هم مشکلی داشت با توجه به کد قبلی که بهتون دادم تصحیحش کنید .

یونیت ضمیمه رو دریافت کنید و کنار فایل های پروژه قرار بدید و EditGrid رو به Uses برنامتون اضافه کنید و برای استفاده مثلا در رویداد ساخته شدن فرم برنامتون ( OnCreate ) کد زیر رو بنویسید :
var
SampleEditGrid: TEditGrid;
EDPos, GridPos: TRect;
begin
with EDPos do
begin
Top:= 10;
Left:= 10;
Bottom:= 21;
Right:= 120
end;

with GridPos do
begin
Bottom:= 111;
Right:= 168
end;

SampleEditGrid:= TEditGrid.Create;
with SampleEditGrid do
begin
DS:= DataSource1;
Query:= ADOQuery1;
SetData(Self, EDPos, GridPos);
end;

Reza798
پنج شنبه 10 تیر 1389, 07:48 صبح
با سلام

آقای تاجیک یه مشکل دیگه که تازه متوجه آن شدم این است که شما در رویداد onEnter مربوط به edit2 دی بی گرید را مخفی می کنید ولی اگر در فرم چندین کنترل دیگر باشد و کاربر روی کنترل دیگری روی فرم برود grid مخفی نمی شود(تست شده) و کار زیبایی نیست که برای همگی دستور مخفی کردن grid را بنویسیم.

Felony
پنج شنبه 10 تیر 1389, 09:27 صبح
من که بهتون گفتم میتونید یک Message Handler بنویسید یا از روش های دیگه استفاده کنید ، سورس کتابخانه EditGrid رو که براتون نوشتم به کد زیر تغییر بدید :

unit EditGrid;

interface

uses
Windows, SysUtils, Classes, Controls, DB, ADODB, DBGrids, StdCtrls;

type
TEditGrid= class
public
DS: TDataSource;
Query: TADOQuery;
Procedure SetData(Parent: TWinControl; EditPos,GridPos : TRect);
protected
MyGrid: TDBGrid;
MyEdit: TEdit;
Procedure MyEditChnage(Sender: TObject);
Procedure MyEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
Procedure MyEditEnter(Sender: TObject);
Procedure MyEditExit(Sender: TObject);
Procedure MyGridDblClick(Sender: TObject);
Procedure MyGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
end;

implementation

Procedure TEditGrid.MyGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
// Check if press Return (Enter) key then select current row
if Key= VK_RETURN then
begin
MyEdit.Text:= Query.FieldByName('Number').AsString;
MyEdit.OnExit:= MyEditExit;
MyGrid.Hide;
MyEdit.SetFocus;
end;
end;

Procedure TEditGrid.MyGridDblClick(Sender: TObject);
begin
// Accept double clicked filed to edit
MyEdit.Text:= Query.FieldByName('Number').AsString;
MyEdit.OnExit:= MyEditExit;
MyGrid.Hide;
MyEdit.SetFocus;
end;

procedure TEditGrid.MyEditEnter(Sender: TObject);
begin
// Set OnExit event
MyEdit.OnExit:= MyEditExit;
end;

procedure TEditGrid.MyEditExit(Sender: TObject);
begin
// Hide grid on exit
MyGrid.Hide;
end;

Procedure TEditGrid.MyEditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// Chek , if pressed Arrow keys then set focus to DBGrid1
if (Key= VK_UP) or (Key= VK_DOWN) or (Key= VK_LEFT) or (Key= VK_RIGHT) then
begin
MyEdit.OnExit:= nil;
MyGrid.SetFocus;
end;
end;

Procedure TEditGrid.MyEditChnage(Sender: TObject);
var
Pos: TPoint;
begin
if MyGrid.Visible= False then MyGrid.Show;

// Check if Edit1.Text= '' then hode DBGrdi1
if Length(MyEdit.Text)= 0 then MyGrid.Hide;

// Get current cursor pos
GetCaretPos(Pos);
MyGrid.Top:= Pos.Y+ MyEdit.Top+ 15;
MyGrid.Left:= Pos.X+ MyEdit.Left+ 5;

// Filter by entered text int Edit1
Query.SQL.Clear;
Query.SQL.Text:= 'Select * From TBL_Sample where ID Like '+QuotedStr(MyEdit.Text+'%');
Query.Open;
end;

Procedure TEditGrid.SetData(Parent: TWinControl; EditPos,GridPos : TRect);
begin
Parent.DoubleBuffered:= True;

// Create Edit
MyEdit:= TEdit.Create(Parent);
MyEdit.Parent:= Parent;
with MyEdit do
begin
Text:= 'EditGrid';
Top:= EditPos.Top;
Left:= EditPos.Left;
Height:= EditPos.Bottom;
Width:= EditPos.Right;
OnChange:= MyEditChnage;
OnKeyDown:= MyEditKeyDown;
OnEnter:= MyEditEnter;
OnExit:= MyEditExit;
Show;
end;

// Create DBGrid
MyGrid:= TDBGrid.Create(Parent);
MyGrid.Parent:= Parent;
with MyGrid do
begin
DataSource:= DS;
Height:= GridPos.Bottom;
Width:= GridPos.Right;
Options:=[dgTitles]+[dgRowSelect]+[dgIndicator]+[dgColLines]+[dgRowLines];
OnDblClick:= MyGridDblClick;
OnKeyDown:= MyGridKeyDown;
TabStop:= False;
Hide;
end;
end;

end.