먼저 지난번에 답장 주신 임형호님, 안재현님 대단히 고맙습니다.
데이타베이스 연결된 DBGrid 의 컬럼헤드 기준으로 정렬이 필요합니다.
TTable 정렬을 위해서는 먼저 인덱스 가 필요하다는 결론이 얻어지는군요.
IndexFieldNames 를 사용할때 사전에 무슨 조치를 취하지 않아도 되는지요?
전에 한번 하니까 에러가 나던데요.
인덱스 파일이 필요하면 만드는 방법 부터 필요합니다.
완전초보 이므로 상세하게 설명 부탁 드립니다.
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
Table1.IndexFieldNames := DBGrid1.ColumeHeader;
{? 좀 이상하군요. 여기서 어떻게 하나요?
그러니까 정렬 기준이 컬럼헤드의 필드명이 되게 하는 것이지요}
end;
또하나 [질문]
Table 정렬 은 되는데,
DataSource 를 이용하여 정렬도 될 수 있을까요 ?
되면 같은 결과가 나오겠지요. 어떤것이 더 효율적인가요 ?
> 먼저 지난번에 답장 주신 임형호님, 안재현님 대단히 고맙습니다.
> 데이타베이스 연결된 DBGrid 의 컬럼헤드 기준으로 정렬이 필요합니다.
>
> TTable 정렬을 위해서는 먼저 인덱스 가 필요하다는 결론이 얻어지는군요.
> IndexFieldNames 를 사용할때 사전에 무슨 조치를 취하지 않아도 되는지요?
> 전에 한번 하니까 에러가 나던데요.
> 인덱스 파일이 필요하면 만드는 방법 부터 필요합니다.
> 완전초보 이므로 상세하게 설명 부탁 드립니다.
>
> procedure TForm1.DBGrid1TitleClick(Column: TColumn);
> begin
> Table1.IndexFieldNames := DBGrid1.ColumeHeader;
> {? 좀 이상하군요. 여기서 어떻게 하나요?
> 그러니까 정렬 기준이 컬럼헤드의 필드명이 되게 하는 것이지요}
> end;
>
> 또하나 [질문]
> Table 정렬 은 되는데,
> DataSource 를 이용하여 정렬도 될 수 있을까요 ?
> 되면 같은 결과가 나오겠지요. 어떤것이 더 효율적인가요 ?
아래 예제는 테스트한 예제입니다
테스트는 DBDEMOS 로 했습니다
동작은 DBGrid의 Title를 클릭하면 그 Title 의 필드로
내림차순 sort를 합니다
동작원리는 폼 생성시 그 테이블에 동적으로 index를 만드는 것입니다
주의할것은 지정한 Table에 있는 모든 필드에 대해 각각 하나씩
index가 생성되므로 table space를 낭비할 수 있으므로
아래 소르를 보시고 특정 필드만 AddIndex하도록 고처서 사용하세요
SQL-based 서버는 테스트 안해봐서 잘 될 지 모르겠습니다...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables;
type
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure DBGrid1TitleClick(Column: TColumn);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
Table1.Exclusive := True; // Paradox or dBASE table 인 경우만 해당
Table1.Active := True;
for i := 1 to DBGrid1.Columns.Count do
begin
try
// table의 인덱스를 동적으로 만든다
Table1.AddIndex(DBGrid1.Columns[i].FieldName, // index name
DBGrid1.Columns[i].FieldName, // index field names
[ixDescending]); // 내림차순 순서를 준다
except // Blob 필드는 except 발생되어 인덱스생성 안됨
;
end;
end;
Table1.Active := False;
Table1.Exclusive := False;
Table1.Active := True;
end;
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
Table1.IndexName := Column.FieldName;
end;
end.