제가 시디관리용 프로그램을 만들었는데 인스톨익스프레스로 만들어도 ebde에러가
나서 4일동안 여러가지 방법을 해본결과 실패하여 결국에는 이렇게 올려봅니다.
제 컴에서 실행되는데 다른곳에서는 실행이 안됩니다.
테이블은 동적으로 생성을 합니다. 알리아스도 없으면 동적으로 생성하게 되어있습니다.
무엇이 문제인지 도저히 모르겠습니다.
소스에 문제가 있는것인지 제가 익스프레스에서 잘못설정을 한것인지 잘모르겠습니다.
익스프레스에서는 알리아스명에 vcd라고 넣었고(하나만), 패스는 Data
디라이버는 파라독스를 선택하였습니다.
밑에는 제 소스입니다. 전제 소스화일을 같이 동봉합니다.
================================================================================
unit uMainF;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables, ExtCtrls, Buttons, ComCtrls, Registry,
FileCtrl, Menus, DBCtrls, Mask, Qrctrls;
const AliasName = 'Vcd';
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Panel3: TPanel;
CodeEd: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ComboBox1: TComboBox;
NameEd: TEdit;
ActEd: TEdit;
ContryEd: TEdit;
Panel4: TPanel;
BitBtn3: TBitBtn;
BitBtn2: TBitBtn;
BitBtn1: TBitBtn;
Panel5: TPanel;
DBGrid1: TDBGrid;
Ds_Vcd: TDataSource;
Qr_Vcd: TQuery;
Label6: TLabel;
MemoEd: TEdit;
TabSheet2: TTabSheet;
Panel6: TPanel;
Panel7: TPanel;
BitBtn4: TBitBtn;
Panel8: TPanel;
DBGrid2: TDBGrid;
GroupBox1: TGroupBox;
Rbtn1: TRadioButton;
Rbtn2: TRadioButton;
Rbtn3: TRadioButton;
Panel9: TPanel;
Label7: TLabel;
Edit2: TEdit;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
Ds_Serch: TDataSource;
Qr_Serch: TQuery;
BitBtn7: TBitBtn;
Panel10: TPanel;
SpeedButton1: TSpeedButton;
Rbtn4: TRadioButton;
procedure BitBtn4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure CodeEdEnter(Sender: TObject);
procedure CodeEdExit(Sender: TObject);
procedure CodeEdKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BitBtn7Click(Sender: TObject);
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure BitBtn6Click(Sender: TObject);
procedure CodeEdChange(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure SpeedButton1Click(Sender: TObject);
private
procedure Get_Code_Data(sCustomCode:String);
procedure ComPonentClear;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var SList:TStringList;
nLoop:Word; // For Loop 에서 사용.
bValue:Boolean; // 참,거짓을 저장한 후 필요시 사용.
ExecDir:String; // 현재 PathName
begin
Initialize(SList); //초기화
// ---------------------------------------------------------------------------
// Alias 이름이 있는지를 검색한다.
// ---------------------------------------------------------------------------
bValue := False; // Alias가 없는 것으로 초기화...
ExecDir := ExtractFilePath(Application.ExeName);
{$I-} //File I/O Checking OFF
// 앞으로 Table을 생성할 장소
if Not DirectoryExists('Data') then MkDir('DATA');
// Session을 쓰기 위해서는 Uses 문에 DBTables을 포함해야 한다.
try
SList := TStringList.Create;
Session.GetAliasNames(SList); //현재 PC의 모든 Alias Name 을 가져오기
if SList.Count < 1 then bValue := False // Alias가 없을시
else
begin
for nLoop := 0 to SList.Count - 1 do // Loop를 수행하면서 'Vcd' Alias 이름 검색.
if Trim(SList.Strings[nLoop]) = AliasName then
begin
bValue := True;
break; // For Loop 탈출
end;
end;
finally
SList.Free; // 메모리 해제...
end; // Alias 이름 검색 완료...
// ---------------------------------------------------------------------------
// bValue 가 False 이면 Alias 이름을 생성한다.
// ---------------------------------------------------------------------------
if Not bValue then
begin
try
SList := TStringList.Create;
SList.Add('TYPE=STANDARD');
SList.Add('PATH='+EXECDIR+'DATA');
SList.Add('ENABLE BCD=FALSE');
SList.Add('DEFAULT DRIVER=PARADOX');
Session.AddAlias(AliasName,'PARADOX',SList); // Alias 추가
Session.SaveConfigFile; // Alias 저장.
finally
SList.Free; // 메모리 해제
end; // Try End
end; // Not bValue End
end; //End Procedure
procedure TForm1.FormShow(Sender: TObject);
var FIniFile:TRegIniFile;
Regist:TRegistry;
Section,Key,sPName:string;
a,b:Dword;
sRSV:TStrings;
Q1 : TQuery;
begin
//Registry 읽고 쓰기
sRSV := TStringList.Create;
Key := ''; sRSV.Clear;
Regist := TRegistry.Create;
Regist.RootKey := HKEY_CURRENT_USER;
FiniFile := TRegIniFile.Create('Tapeguy');
Section := 'DELPHI';
//Registry에 Vcd,DELPHI를 읽는다.
FiniFile.ReadSectionValues(Section,sRSV);
if sRSV.Count = 0 then // 없으면 프로그램이름을 입력받아 Registry에 저장한다.
begin
sPName := 'VCD 관리프로그램';
FiniFile.WriteString(Section,Section,sPName);
Caption := sPName;
end
else // 있으면 Form의 Caption을 저장된것으로 한다.
Begin
//ShowMessage(sRSV[0]);
a := Pos('=',sRSV[0]); b := Length(sRSV[0]);
Caption := Copy(sRSV[0],a+1,b-a);
end;
Key := FiniFile.FileName;
sRSV.Free;
FiniFile.Free;
Regist.Free;
//////////////////////////////////////////////////////////
// 테이블 및 인덱스 생성
///////////////////////////////////////////////////////////
// Primary Index File 및 관련 Index File 삭제하기
If FileExists(extractFilePath(Application.ExeName) + 'DataVcd.DB' ) then exit
else
begin
if FileExists(ExtractFilePath(Application.ExeName)+'DataVcd.PX') then
begin
DeleteFile(ExtractFilePath(Application.ExeName)+'DataVcd.PX');
DeleteFile(ExtractFilePath(Application.ExeName)+'DataVcd.XG0');
DeleteFile(ExtractFilePath(Application.ExeName)+'DataVcd.YG0');
end; // Custom Table Create 하기
Q1 := TQuery.Create(Self);
Q1.DataBaseName := AliasName;
Q1.Sql.Clear;
Q1.Sql.Add('Create Table "Vcd.DB" ');
Q1.Sql.Add(' ( ');
Q1.Sql.Add(' Id AutoInc, '); // 자동증가
Q1.Sql.Add(' Code VarChar(4), '); // 비디오 코드
Q1.Sql.Add(' Name VarChar(40), '); // 비디오 이름
Q1.Sql.Add(' Act VarChar(20), '); // 배우이름
Q1.Sql.Add(' Contry VarChar(10), '); // 국가
Q1.Sql.Add(' Taste VarChar(20), '); // 성향분류
Q1.Sql.Add(' Memo VarChar(60), '); // 메모
Q1.Sql.Add(' Primary Key(Id)');
Q1.Sql.Add(' ) ');
try
Q1.ExecSql;
Except
Application.MessageBox('Table 생성도중 Error 발생!!!',
'알림',mb_ok+mb_IconInformation);
Q1.Close;Q1.Free;Exit;
end;
Q1.Close;
// Index File Create 하기
Q1.Sql.Clear;
Q1.Sql.Add(' create Index VcdX1 On "VCD.DB"(Code,Name)') ;
try
Q1.ExecSql;
except
DeleteFile(ExtractFilePath(Application.ExeName)+'DataVcd.DB');
DeleteFile(ExtractFilePath(Application.ExeName)+'DataVcd.PX');
Application.MessageBox('Table Index 생성도중 Error 발생!!!',
'알림',mb_ok+mb_IconInformation);
Q1.Close;Q1.Free;Exit;
end; //try end
end; // if begin
ActiveControl := CodeEd;
end;
procedure TForm1.ComPonentClear;
var wCc : word;
begin
for wCc := 1 to ComponentCount -1 do
if Components[wCc] is TEdit then TEdit(Components[wCc]).Text := ''
else if Components[wCc] is TComboBox then TComboBox(Components[wCc]).Text := '선택하세요';
end;
procedure TForm1.Get_Code_Data(sCustomCode:String);
var
Q1 : TQuery;
begin
Q1 := TQuery.Create(Self);
Q1.DataBaseName := AliasName;
Q1.Sql.Clear;
Q1.Sql.Add('Select * From Vcd Where Code = '''+sCustomCode+'''');
Q1.Open;
NameEd.Text := Q1.FieldByName('Name').AsString; //비디오 명
ActEd.Text := Q1.FieldByName('Act').AsString; //주연배우
ContryEd.Text := Q1.FieldByName('Contry').AsString; //국가
ComBobox1.Text := Q1.FieldByName('Taste').AsString; //성향분류
MemoEd.Text := Q1.FieldByName('Memo').AsString; //메모
Q1.Close;
Q1.Free;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
begin // 페이지 컨트롤2 종료번튼
Close;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var ////// 페이지 컨트롤1 의 저장버튼 /////
Q1 : TQuery;
sSql : String;
begin
sSql := ' Insert into Vcd (Code,Name,Act,Contry,Taste,Memo)'+
' Values ('+
Format('''%s''', [Trim(CodeEd.Text)]) +
Format(',''%s''',[Trim(NameEd.Text)]) +
Format(',''%s''',[Trim(ActEd.Text)]) +
Format(',''%s''',[Trim(ContryEd.Text)]) +
Format(',''%s''',[Trim(ComboBox1.Items[ComboBox1.ItemIndex])]) +
Format(',''%s''',[Trim(MemoEd.Text)]) +
')';
Q1 := TQuery.Create(Self);
Q1.DatabaseName := AliasName;
Q1.Sql.Clear;
try
Q1.sql.Add(sSql);
Q1.ExecSql;
except
Q1.Close;
Application.MessageBox('저장도중에러발생',
'알림', mb_ok+Mb_IconInformation);
Q1.Free; Exit;
end; // try
Q1.Close;
Q1.Free;
Qr_Vcd.Close;
Qr_Vcd.Open;
Qr_Serch.Close;
Qr_Serch.Open;
ComponentClear;
ActiveControl := CodeEd;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var ////////// 페이지컨트롤1 삭제버튼 클릭시//////////
Q1 : TQuery;
sSql : String;
begin
Q1 := TQuery.Create(Self);
Q1.DatabaseName := AliasName;
Q1.Sql.Clear;
if Application.MessageBox('정말 삭제 하시겠습니까?',
'삭제확인',Mb_YesNo+Mb_IconQuestion) <> idYes then Exit;
sSql:=' Delete From Vcd '+
Format(' Where Code = ''%s''',[Trim(CodeEd.Text)]);
Q1.Sql.Add(sSql);
try
Q1.ExecSql;
except
Q1.Close; Q1.Free;
Application.MessageBox('삭제 도중에러발생!!',
'알림', mb_ok+Mb_IconInformation);
Exit;
end;
Q1.Close;
Q1.Free;
Qr_Vcd.Close;
Qr_Vcd.Open;
Qr_Serch.Close;
Qr_Serch.Open;
ComponentClear;
ActiveControl := CodeEd;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1 := Nil;
end;
procedure TForm1.CodeEdEnter(Sender: TObject);
begin
if Sender is TEdit then TEdit(Sender).Color := clYellow;
end;
procedure TForm1.CodeEdExit(Sender: TObject);
var
Q1 : TQuery;
sSql : String;
begin
if Sender is TEdit then TEdit(Sender).Color := clwindow;
{ Q1 := TQuery.Create(Self);
Q1.Databasename := AliasName;
Q1.Sql.Clear;
sSql := 'Select Code From Vcd';
Q1.Sql.Add(sSql);
Q1.Close;
Q1.Open;
with Q1 do
begin
While not EOF do
Q1.First;
if Q1.Locate( 'Code', CodeEd.Text, [LocaseInsenSitive] ) = True then
begin
MessageDlg('중복된 Vcd코드입니다. 다시 입력하세요.',mtWarning,[mbok],0);
CodeEd.Clear;
CodeEd.SetFocus;
end;
end;
Q1.Close;
Q1.Free; }
end;
procedure TForm1.CodeEdKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = vk_Return then SelectNext(TwinControl(Sender),True,True);
end;
procedure TForm1.BitBtn7Click(Sender: TObject);
var // 수정버튼 클릭시
Q1 : TQuery;
sSql : String;
begin
Q1 := TQuery.Create(Self);
Q1.DatabaseName := AliasName;
Q1.Close;
Q1.Sql.Clear;
sSql := ' Update Vcd set ' +
Format(' Code = ''%s''', [Trim(CodeEd.Text)]) +
Format(',Name = ''%s''', [Trim(NameEd.Text)]) +
Format(',Act = ''%s''', [Trim(ActEd.Text)]) +
Format(',Contry = ''%s''', [Trim(ContryEd.Text)]) +
Format(',Taste = ''%s''', [Trim(ComboBox1.Items[ComboBox1.ItemIndex])]) +
Format(',Memo = ''%s''', [Trim(MemoEd.Text)]) +
Format(' Where Code = ''%s''',[Trim(CodeEd.Text)]);
try
Q1.Sql.Add(sSql);
Q1.ExecSql;
except
Q1.Close;
Application.MessageBox('Table 수정도중 Error 발생!!!','오류',
mb_ok+mb_IconInformation);
Q1.Free; exit;
end;
Q1.Close;
Q1.Free;
Qr_Vcd.Close;//등록된 자료 Refresh
Qr_Vcd.Open;
Qr_Serch.Close;
Qr_Serch.Open;
ComponentClear;
ActiveControl := CodeEd;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
//색상제어
Case (DataCol Mod 4) of
0: Column.Color := $80000018; // clInfobk
1: Column.Color := $00FFFBF0; // clSkyblue
2: Column.Color := $00A6CAF0; // clCream
3: Column.Color := $00C0DCC0; // clMoneyGreen
end;
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
var // 페이지 컨트롤2의 조회버튼 클릭시
sSql : String;
Q1 : TQuery;
begin
Q1 := TQuery.Create(Self);
Q1.DatabaseName := AliasName;
Q1.Sql.Clear;
if (Rbtn1.Checked = False) and (Rbtn2.Checked = False) and (Rbtn3.Checked = False) and (Rbtn4.Checked = False) then
begin
ShowMessage(' 검색조건을 선택하세요! ');
exit;
end
else if Rbtn1.Checked then
sSql := 'select * from Vcd where Name = '''+Edit2.Text+''''
else if Rbtn2.Checked then
sSql := 'select * from Vcd where Act = '''+Edit2.Text+''''
else if Rbtn3.Checked then
sSql := 'select * from Vcd where Taste = '''+Edit2.Text+''''
else if Rbtn4.Checked then
sSql := 'select * from Vcd where Contry = '''+Edit2.Text+'''';
Qr_Serch.Sql.Clear;
Qr_Serch.Sql.Add(sSql);
Qr_Serch.Open;
ComponentClear;
ActiveControl := Edit2;
end;
procedure TForm1.CodeEdChange(Sender: TObject);
begin
if Sender = CodeEd then
Get_Code_Data(Trim(CodeEd.Text));
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
var
t1, t2: tTable; {t1 = PW table; t2 = ASCII version}
begin
t1 := tTable.create(self);
with t1 do begin
DataBaseName := AliasName;
tableName := 'Vcd.db';
open;
end;
t2 := tTable.create(self);
with t2 do begin
if not DirectoryExists('SaveTxt') then MkDir('SaveTxt');
DataBaseName := 'C:';;
tableName := 'Vcd_Index.txt';
TableType := ttASCII;
createTable;
open;
edit;
BatchMove(t1, batCopy);
close;
end;
t1.close;
end;
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if Qr_Vcd.FieldByName('Code').AsString <> '' then
CodeEd.Text := Qr_Vcd.FieldByName('Code').AsString;
if Qr_Vcd.FieldByName('Name').AsString <> '' then
NameEd.Text := Qr_Vcd.FieldByName('Name').AsString;
if Qr_Vcd.FieldByName('Act').AsString <> '' then
ActEd.Text := Qr_Vcd.FieldByName('Contry').AsString;
if Qr_Vcd.FieldByName('Contry').AsString <> '' then
ContryEd.Text := Qr_Vcd.FieldByName('Contry').AsString;
if Qr_Vcd.FieldByName('Taste').AsString <> '' then
ComboBox1.Text := Qr_Vcd.FieldByName('Taste').AsString;
if Qr_Vcd.FieldByName('Memo').AsString <> '' then
MemoEd.Text := Qr_Vcd.FieldByName('Memo').AsString;
ActiveControl := CodeEd;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
Var
A : String;
begin
A := InputBox('항목추가','추가할 항목을 써주세요','');
if a = '' then Exit
else
ComboBox1.Items.Add(A);
end;
end.
수고스럽겠지만 알려 주시겠습니까?