سلام
1- می خواهیم با کلیک بر روی هر ستون DBGRID اطلاعات بر اساس آن ستون مرتب شود
2- بر ای ساخت ایندکس از داخل برنامه باید چکار کرد در ضمن فایل از نوع DBF است
سلام
1- می خواهیم با کلیک بر روی هر ستون DBGRID اطلاعات بر اساس آن ستون مرتب شود
2- بر ای ساخت ایندکس از داخل برنامه باید چکار کرد در ضمن فایل از نوع DBF است
سلام
در مورد سوال 1 :
باید در رویداد OnTitleClick از DBGrid کد زیر را بنویسید.
به صورت صعودی :
Table1.Sort := Column.FieldName +' ASC'
به صورت نزولی :
Table1.Sort := Column.FieldName +' DESC'
سلام
دوست عزیز دستور بالا را انجام دادم پیغام خطا می دهد
Undeclared identifier: 'SORT'
سلام
ممکنه این راه حل نهایی نباشه!
شما میتونید از یکی از این دو راه حل استفاده کنید:
1- یک table داشته باشید که در قسمت OnTitleClick بنویسید:
table1.indexfieldname:=Column.FieldName
2- با استفاده از query اینکارو انجام بدید ( در همون رویداد ontitleclick)
سلام
برای سوال دوم باید چکار کرد
در این کد
Table1.Sort := Column.FieldName +' ASC'
منظور از Table1 نامی است که شما به Dataset یا جدول خود می دهید.
شما احتمالا این نام را به DBGrid خود داده اید که تولید خطا می کند.
سلام
دوست عزیز TABLE چیزی به نام SORT نداره ویا اینکه من اونا پیدا نکردم می توانی بیشتر توضیح دهی ویا یک نمونه برنامه برایم ارسال کنی خیلی ممنون
من یکبار این سوال رو کرده بودم البته من از ADO استفاده می کردم
حالا هم یه سری به آدرس زیر بزن :!:
http://delphi.about.com/b/a/027886.htm?PM=ss15_delphi
هر چی درباره DBGrid در دلفی بخوای داره
شما درست میگید.من منظورم ADOTable یا ADODataset بود.نه TTable.نوشته شده توسط شفیعی
در link ای که Afshin_Zavar هم فرستاده از ADO استفاده شده.
سلام
در مورد ایندکس کسی از دوستان نظری ندارد
سلام
برای ساختن Index از داخل برنامه می توانید از دستورات SQL استفاده کنید.
این هم Syntax دستور CREATE INDEX
http://www.simple-sw.com/sql-crndx.htm
برای اجرای دستورات SQL هم از ADOCommand استفاده کنید.
سلام
من دستور بالا را به روش زیر انجام دادم پیغام خطا می دهد
procedure TFreport.DBGrid1TitleClick(Column: TColumn);
VAR S:STRING;
begin
S:='CREATE INDEX N ON "N_NAGHSH.DBF" N_naghsh ('+Column.FieldName+')';
Freport.Caption :=S;
Query1.Active:=FALSE;
Query1.SQL.Clear;
Query1.SQL.Add(S);
Query1.Active:=TRUE;
end;
invalid use keyword token (Column.FieldName)
برای اجرای دستورات SQL بجای استفاده از ADOCommand می خواهم از QUERY استفاده کنم
سلام
خسته نباشید
برای سورت کردن از ADO استفاده کردم فقط 2 تا مشکل دارم
اول اینکه چگونه در ADO از ALIAS استفاده می کنند
دوم اینکه وقتی با ADO کار می کنیم اول برنامه یک USERNAME و پسورد می خواهد چگونه می توان این پنجره را غیر فعال نمود
برای غیر فعال کردن اون پنجره Prompt.. ( پرومپت نمیدونم چی چی ) رو False کن . :mrgreen:
سلام
همونطور که Gladiator اشاره کرد در ADOConnection (در صورت وجود) خاصیت Loginprompt رو False کن.
سلام
خیلی ممنون
در مورد سوال اول باید چکار کرد :?:
سلام
از وقتی به جای TABLE از ADO استفاده کرده ام اطلاعات فارسی فایل قابل خواندن نمی باشد
یعنی اطلاعات فارسی را درست نمایش نمی دهد :?:
سلام
منتظر جواب دوستان هستم
سلام
شفیعی جان ADO که کاری نداره Sort داره
اگه هنوز با BDE کار میکنی از Query استفاده کنی بهتره
اگه نمیخوای باید جدولت رو بگی برای همه فیلدها Index بسازه و از اونا استفاده کنی
تو خود طراحی جدول باید بگی
بای
باسلام
با کد نویسی هم خیلی راحت میشه index گذاری کرد.من این کار رو انجام دادم و بدون هیچ مشکلی کارکرد.متاسفانه نتونستم نمونه کدم را پیدا کنم .ولی میدونم از متد Addindex جدول استفاده کردم.
سلام
ببخشید همه دوستان می گویند راحت می توان این کار انجام داد من انجام دادم شد ولی کسی نمونه برنامه ای ارائه نمی کندبنده خیلی بیسواد هستم با این عبارات چیزی حالیم نمی شه
اگر لحنه بندکمی تند است دوستان به بزرگوار خودشان بنده را عفو نمایند زیرا از دست این مشکل دیگر کلافه شده ام
سلام فکر کنماین کد که توی SwissDelphiCenter.ch پیدا کردم بدردت بخوره. من اون را تست کردم و جواب گرفتم
type
TMoveSG = class(TCustomGrid); // reveals protected MoveRow procedure
{...}
procedure SortGridByCols(Grid: TStringGrid; ColOrder: array of Integer);
var
i, j: Integer;
Sorted: Boolean;
function Sort(Row1, Row2: Integer): Integer;
var
C: Integer;
begin
C := 0;
Result := AnsiCompareStr(Grid.Cols[ColOrder[C	 3;][Row1], Grid.Cols[ColOrder[C]][Row2	 3;);
if Result = 0 then
begin
Inc(C);
while (C <= High(ColOrder)) and (Result = 0) do
begin
Result := AnsiCompareStr(Grid.Cols[ColOrder[C	 3;][Row1],
Grid.Cols[ColOrder[C]][Row2	 3;);
Inc(C);
end;
end;
end;
begin
if SizeOf(ColOrder) div SizeOf(i) <> Grid.ColCount then Exit;
for i := 0 to High(ColOrder) do
if (ColOrder[i] < 0) or (ColOrder[i] >= Grid.ColCount) then Exit;
j := 0;
Sorted := False;
repeat
Inc(j);
with Grid do
for i := 0 to RowCount - 2 do
if Sort(i, i + 1) > 0 then
begin
TMoveSG(Grid).MoveRow(i + 1, i);
Sorted := False;
end;
until Sorted or (j = 1000);
Grid.Repaint;
end;
به عنوان مثال :
procedure TForm1.Button1Click(Sender: TObject);
begin
{ Sort rows based on the contents of two or more columns.
Sorts first by column 1. If there are duplicate values
in column 1, the next sort column is column 2 and so on...}
SortGridByCols(StringGrid1, [1, 2, 0, 3, 4]);
end;
امیدوارم بدردت بخوره :wink:
یه راه دیگه هم هست مخصوص DBGrid با استفاده از SQL به شرح زیر:
توی رویداد ONCreate فرم میتونی خطوط زیر را بنویسی:
QuerySql:='Select * From Custom.DB';
Query1.Sql.add(querySql);
query1.Open;
حالا توی رویداد OnTitleClick مربوط به DBGrid کد زیر را بنویس:
with query1 do
begin
disablecontrols;
close;
sql.clear;
sql.add(querysql);
sql.add('order by'+column.fieldname);
open;
dbgrid1.columns.restoredefaults;
column.title.font.color:=clblue;
enablecontrols;
end;
یک راه حل ساده استفاده از کامپوننت tms هست که با استفاده از html می تونی مرتب سازی انجام بدی
سلام شفیعی جان
قبول دارم که با پیغامها ادم سخت به نتیجه میرسه - حالا مشکلت حل شد یا نه؟
اگه نه پایم که مشکلت رو حل کنم.
پیشنهادم اینه که اصلا ایندکس نسازی تو برنامه . استفاده از adoquery بهترین گزینه هست ( بنظر من ) .
اگه از ado connection داری استفاده میکنی - از ado table , ado query استفاده کن
و اینکه برای کنجکاوی خودم میپرسم!!!!:
اطلاعاتتو چطوری فارسی ذخیره میکنی؟ unicode ؟ arabic ؟ خرچنگ غورباغه ؟
:kaf:
در رویداد title click گرید کد زیر را قرار بده
(Column.Field.DataSet as TADOTable).IndexFieldNames:=Column.FieldName;
در ضمن نیازی به هیچ کامپوننت دیگری نداری
سلام
اگر بخواهیم بعد از سورت کردن یک ICO و یا یک تصویر روی TITEL DBGRID نمایش دهیم باید چکار کرد که مشخص شود اطلاعات داخل DBGRID بر اساس این فیلد مرتب شده است باید چکار کرد
سلام
هندلش رو میگیری روش میکشی !
نخواستی با Canvas میکشی
نخواستی یک Image میذاری و جاش رو میذاری روی اون Title مورد نظر
بازم نخواستی Title رو عوض میکنی و کاراکتری بهش اضافه میکنی مثلا Name /\
راه زیاده شما میتونید از هر کدوم که میخواید استفاده کنید
بای
شما میتونین از cxgrid استفاده کنین خودش این کار رو می کنه
من یک پیشنهاد دارم: برای فایل های DBF بهتره از Table های apollo استفاده کنی این apollotable به راحتی قابلیت index گذاری را به شما میدهد و هم اطلاعات فارسی را خراب نمی کنه با این componentها به راحتی میشه روی فایل های dbf کارکرد. من نمی دونم چطوری باید این component ها رو ضمیمه کنم اگر خواستید برایتون بفرستم . موفق باشید. :)
سلام
من می خواهم با کلیک بر روی هر ستون DBGRID اطلاعات بر اساس آن ستون sort شود ، همانطور که دوستان گفته بودند از ADOTable.Sort استفاده کردم به صورت زیر
tbl_contract.Sort := column.FieldName +' ASC'
ولی موقع اجرا خطای زیر را میگرد :cry:
:Arguments are of the wrong type,are out of acceptable range, or are in conflict with one another
کسی میتونه راهنماییم کنه
نمیدونم بدردتون می خوره یا نه ولی من با ADO Table اندکس ساختم بسیار ساده بود اینم یه مسال از TTable روش همونه . . .
http://www.barnamenevis.org/viewtopic.php?t=29140
ممنون از توجه تان :flower:
tableمن هم از نوع ADO است.حالا امتحان میکنم ببینم جواب میده یا نه.