오늘만 3번째 질문입다.. 고수님들 질문만 한다고 넘 욕하지 마시고, 제발 답변좀 해주세요....
앞서 찾은 김영대님의 소스는 어케 실행을 못시켰슴다.. 그래서, 도움말에서 예제로
제공되는 소스로 test중인데..
uses 절에 DbiProcs, DbiTypes, DbiErrs, ExtCtrls, DBCtrls 과 같이 추가 시키는까
컴파일은 됩니다.. 근데.. "Table must be opened exclusively to pack" 에러가 납니다.
이건 소스에서 생성된 에러더군요.. 그래서 table컴포넌트의 exclusively 속성을 true로 만들었습니다. 그러자.. Table lock에러가 뜹니다..
이거 어쩌란 말인지..
이제부터 질문입다..
첫번째. exclusively속성이 뭡니까...
두번째. 소스중에 raise라는게 있는데 이건 또 뭡니까?
세번재. 또 소스중에서 파라메터로 @가 나오는데.. 이건 또 뭐죠...
누구 이거 속시원하게 분석 좀 해줄 님 안계십니까 ㅠㅠ
다음은 소스입니다.. 그냥 통째로 올립니다...
============================================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables
, DbiProcs, DbiTypes, DbiErrs, ExtCtrls, DBCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Table: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// Make sure the table is open exclusively so we can get the db handle...
if not Table.Active then
raise EDatabaseError.Create('Table must be opened to pack');
if not Table.Exclusive then
raise EDatabaseError.Create('Table must be opened exclusively to pack');
//문제가 되는 부분.... 헐~~
// Get the table properties to determine table type...
Check(DbiGetCursorProps(Table.Handle, Props));
// If the table is a Paradox table, you must call DbiDoRestructure...
if (Props.szTableType = szPARADOX) then begin
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table's cursor handle...
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE...
TableDesc.bPack := True;
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
end //이거 ^^ 도데체 뭔지..
else
// If the table is a dBASE table, simply call DbiPackTable...
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
// Pack only works on PAradox or dBASE; nothing else...
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' + 'type to pack');
Table.Open;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PackTable(table);
end;
end.
====================================================================
끝까지 읽어주셔서 감사합니다.... 머리가 나쁘면, 손발이 고생한다고,,
내공이 깊은신 고수님들의 자비로운 도움을 부탁드립니다..
이 은혜는 잊지 않게습니다.......
그리고 델파이 화면에서 TABLE1 ACTIVE속성을 False속성으로 변환해 주세요.
(꼭 Table1의 Active 속성을 False 설정하세요. Active속성을 True로 변환하면
프로그램 실행시 델파이 자체에서 Table1의 DB화일을 잡고 있고 응용 프로그램에서
Table1을 잡고 있으므로 packing시 pack을 할 수 없습니다. 항상 pack을 시킬려면
오로지 한쪽 프로그램에서만 DB화일을 사용해야합니다.).
Table1의 Exclusive 속성을 False 설정하세요.
그리고 pack을 처리하는 과정입니다.
Table1.Active:=False;
Table1.Exclusive:=True;
Table1.Active:=True;
PackTable(Table1);
Table1.Active:=False;
Table1.Exclusive:=False;
Table1.Active:=True;
밑에서 제가 사용한 예제 소스입니다.
그리고 db는 지우더라도 물리적으로는 존재하므로 용량사이즈는 줄어들지 않습니다.
그래서 pack을 시켜야 용량 사이즈가 줄어듭니다.
그럼.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, bde;
type
TForm1 = class(TForm)
Table1: TTable;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// Make sure the table is open exclusively so we can get the db handle...
if not Table.Active then
raise EDatabaseError.Create('Table must be opened to pack');
if not Table.Exclusive then
raise EDatabaseError.Create('Table must be opened exclusively to pack');
//문제가 되는 부분.... 헐~~
// Get the table properties to determine table type...
Check(DbiGetCursorProps(Table.Handle, Props));
// If the table is a Paradox table, you must call DbiDoRestructure...
if (Props.szTableType = szPARADOX) then begin
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table's cursor handle...
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE...
TableDesc.bPack := True;
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
end //이거 ^^ 도데체 뭔지..
else
// If the table is a dBASE table, simply call DbiPackTable...
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
// Pack only works on PAradox or dBASE; nothing else...
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' + 'type to pack');
Table.Open;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.Active:=False;
Table1.Exclusive:=True;
Table1.Active:=True;
PackTable(Table1);
Table1.Active:=False;
Table1.Exclusive:=False;
Table1.Active:=True;
end;
coolling wrote:
> 오늘만 3번째 질문입다.. 고수님들 질문만 한다고 넘 욕하지 마시고, 제발 답변좀 해주세요....
>
> 앞서 찾은 김영대님의 소스는 어케 실행을 못시켰슴다.. 그래서, 도움말에서 예제로
> 제공되는 소스로 test중인데..
> uses 절에 DbiProcs, DbiTypes, DbiErrs, ExtCtrls, DBCtrls 과 같이 추가 시키는까
> 컴파일은 됩니다.. 근데.. "Table must be opened exclusively to pack" 에러가 납니다.
> 이건 소스에서 생성된 에러더군요.. 그래서 table컴포넌트의 exclusively 속성을 true로 만들었습니다. 그러자.. Table lock에러가 뜹니다..
> 이거 어쩌란 말인지..
> 이제부터 질문입다..
> 첫번째. exclusively속성이 뭡니까...
> 두번째. 소스중에 raise라는게 있는데 이건 또 뭡니까?
> 세번재. 또 소스중에서 파라메터로 @가 나오는데.. 이건 또 뭐죠...
> 누구 이거 속시원하게 분석 좀 해줄 님 안계십니까 ㅠㅠ
>
> 다음은 소스입니다.. 그냥 통째로 올립니다...
> ============================================================
> unit Unit1;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> StdCtrls, Grids, DBGrids, Db, DBTables
> , DbiProcs, DbiTypes, DbiErrs, ExtCtrls, DBCtrls;
>
> type
> TForm1 = class(TForm)
> Button1: TButton;
> Table: TTable;
> DataSource1: TDataSource;
> DBGrid1: TDBGrid;
> DBNavigator1: TDBNavigator;
> procedure Button1Click(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> end;
>
> var
> Form1: TForm1;
>
> implementation
>
> {$R *.DFM}
> procedure PackTable(Table: TTable);
> var
> Props: CURProps;
> hDb: hDBIDb;
> TableDesc: CRTblDesc;
> begin
> // Make sure the table is open exclusively so we can get the db handle...
> if not Table.Active then
> raise EDatabaseError.Create('Table must be opened to pack');
> if not Table.Exclusive then
>
> raise EDatabaseError.Create('Table must be opened exclusively to pack');
> //문제가 되는 부분.... 헐~~
>
> // Get the table properties to determine table type...
> Check(DbiGetCursorProps(Table.Handle, Props));
>
> // If the table is a Paradox table, you must call DbiDoRestructure...
> if (Props.szTableType = szPARADOX) then begin
> // Blank out the structure...
> FillChar(TableDesc, sizeof(TableDesc), 0);
> // Get the database handle from the table's cursor handle...
>
> Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
> // Put the table name in the table descriptor...
> StrPCopy(TableDesc.szTblName, Table.TableName);
> // Put the table type in the table descriptor...
> StrPCopy(TableDesc.szTblType, Props.szTableType);
> // Set the Pack option in the table descriptor to TRUE...
> TableDesc.bPack := True;
> // Close the table so the restructure can complete...
> Table.Close;
> // Call DbiDoRestructure...
>
> Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
> end //이거 ^^ 도데체 뭔지..
> else
> // If the table is a dBASE table, simply call DbiPackTable...
> if (Props.szTableType = szDBASE) then
> Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
> else
> // Pack only works on PAradox or dBASE; nothing else...
> raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' + 'type to pack');
>
> Table.Open;
>
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> PackTable(table);
> end;
> end.
> ====================================================================
> 끝까지 읽어주셔서 감사합니다.... 머리가 나쁘면, 손발이 고생한다고,,
> 내공이 깊은신 고수님들의 자비로운 도움을 부탁드립니다..
> 이 은혜는 잊지 않게습니다.......