关于数据导出的问题,请尽快帮我回答!多谢了!(50分)

  • 主题发起人 主题发起人 fstao
  • 开始时间 开始时间
F

fstao

Unregistered / Unconfirmed
GUEST, unregistred user!
1、有一完整的程序,是用来示范把数据库的表导出到其它路径。
组件如下:
CBAlias是TComboBox,作用是BDE的别名。
Table1是TTable,是表。
CBTable是TComboBox,作用是选择表。
EditDirAlias是TEdit,作用是显示路径。
BitBtn1,作用是导出数据
EditFic是TEdit,作用是需要导出数据的新名称。
可以到http://delphi.nease.net/DELPHI/D32SAMPL/COPYSO30.ZIP下载,如果下载
COPYSO30.ZIP,运行时,在菜单“Copy”的“Tables with Index to .dbf”,就是
以下的功能了。

unit Unit1;

interface

uses
Windows, BDE,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,LibCs, FileCtrl, ExtCtrls, Grids, Buttons,DB, DBTables, ComCtrls, Menus;

type
TCopia_Dbf = class(TForm)
EditDirAlias: TEdit;
Table1: TTable;
CBAlias: TComboBox;
CBTable: TComboBox;
EditFic: TEdit;
BitBtn1: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure CBTableChange(Sender: TObject);
procedure CBAliasChange(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
public
iCount,NTablas,k : Integer;
Dir,Alias_S,Table_S,Index_S,Directory_T,Table_T,sAlias,Path : String;
TableType_T : TTableType;
function CopyTableFull(Alias_S, Table_S, Table_T: String; var sReturn :String): Boolean;
procedure ChangeDataBaseName;
end;

var
Copia_Dbf: TCopia_Dbf;

implementation

{$R *.DFM}

procedure TCopia_Dbf.ChangeDataBaseName;
var
i : Integer;
s : String;
List : TStringList;
begin
try
Session.GetTableNames(sAlias,'',True,False,CbTable.Items);
CbTable.Items.Insert(0, '< All Tables >');
CbTable.ItemIndex := 0;

// To obtain the path of the alias
if sALias[Length(sAlias)] = '/' then begin
EditDirAlias.Text := sAlias;
Exit;
end;
List := TStringList.Create;
Session.GetAliasParams(sAlias, List);

if Pos('PATH',List[0]) > 0 // .db; .dbf
then EditDirAlias.Text := Copy(List[0],6,Length(List[0]) - 5) + '/'
else if Pos('DATABASE',List[0]) > 0 // other tables
then begin
s := Copy(List[0],15,Length(List[0]) - 14);
i := Length(s);
while i > 0 do begin
if s = '/' then begin
EditDirAlias.Text := Copy(s,1,i);
Break;
end;
Dec(i);
end;
end;
finally
Screen.Cursor := CrDefault;
List.Free
end;
EditDirAlias.Hint := EditDirAlias.Text;
end;

function TCopia_Dbf.CopyTableFull(Alias_S, Table_S, Table_T: String; var sReturn :String): Boolean;
var
pTable_S, pTable_T : array[0..80] of char;
ResultCopy : DBIResult;
begin
{# Table_T it must contain the full Path of D.O.S. of the file}
Result := False;
{# To convert of String to Pchar the Destination table}
StrPCopy(pTable_T, Table_T);
Alias_S:='GZGL';
{# Config and copy the table}
with Table1 do begin
try
Close;
DataBaseName := Alias_S;
TableName := Table_S;
TableType := ttDefault;
StrPCopy(pTable_S, TableName);
Open;
ResultCopy := DbiCopyTable(DBHandle, True, pTable_S, nil, pTable_T);
Result := not (ResultCopy <> DBIERR_NONE);
if Result then sReturn := 'Table - ' + Table_S + ' - it has been successfully copied'
else sReturn := 'Error produced upon copying table';
except
on E: EDBEngineError do sReturn := E.Message;
on E: Exception do sReturn := E.Message;
end;
end;
end;

procedure TCopia_Dbf.FormCreate(Sender: TObject);
begin
Screen.Cursor := CrHourGlass;
try
Session.GetAliasNames(CbAlias.Items);
CbAlias.ItemIndex := 0;
finally
Screen.Cursor := CrDefault;
end;
{To launch the procedures of data update}
CbAliasChange(nil);
end;

procedure TCopia_Dbf.CBTableChange(Sender: TObject);
begin
sAlias:='GZGL';
with Table1 do begin
DisableControls;
Close;
DatabaseName :=sAlias ;
TableName :='DaoChu_Data.dbf';
Open;
Close;
EnableControls;
end;
end;

procedure TCopia_Dbf.CBAliasChange(Sender: TObject);
begin
sAlias :='GZGL';
ChangeDataBaseName;
end;

procedure TCopia_Dbf.BitBtn1Click(Sender: TObject);
var
iCount : Integer;
begin
{To Copy complete Tables. dbf + mdx}
Path:='D:/';
if CbTable.ItemIndex > 0 then
begin
{Copy an table}
if not CopyTableFull(CbAlias.Items[CbAlias.ItemIndex], {Alias Source}
CbTable.Items[CbTable.ItemIndex], {Table Source}
Path + AllTrim(EditFic.Text),{Alias + Table Target}
sReturn) {Message of result}
then
MessageDlg('Unable to Copy ' + CbTable.Items[ CbTable.ItemIndex ] +
'. Motive: ' + '. ' + #10 + #10 + sReturn, mtError, [mbOK], 0);
end
else
ShowMessage('The destination Directory must be indicated.');
end;
end.

我有一个问题是这样的:运行时,一定要选择CBTable,比如选择“DaoChu_Data.dbf”时,在EditFic.text
填定“ABC”,则D盘出现“ABC.dbf”。如果我只要直接导出别名为“GZGL”和表“DaoChu_Data.dbf”,不要
选择CBTable,在EditFic.text填定“ABC”,D盘出现“ABC.dbf”,那该如何改上面的程序呢?
 
直接赋值给cbo
 
最好把问题简化一下。
 
多谢各位,问题已经解决。但我想问一下MDI的问题:

假如有form1、form2、form3、form4和form5,form1作用是splash,也就是封面。
form2和form3的作用分别是
验证用户名和日期验证。Form4和Form5的FormStyle分别为fsMDIForm和
fsMDIChild。Form4是MainForm(即主程序),
我想这样,运行程序时先运行form1,完闭后运行Form2,验证用户名后,然后运行
Form3,验证日期后运行Form4,
然后运行Form5。
在form2添加一个Button2,在form2的Button2的OnClick事件为:
form3.show;

在form3添加一个Button3,在form3的Button3的OnClick事件为:
form4.show;

在Form4的Button4的onclick事件为:
if not assigned(Form5) then
Form5 := TForm5.Create(Self);
Form5.Show;

Form5的Onclose事件为:
Action:=cafree;
Form5:=Nil;

这样运行时,先出现form1,当出现form4,按Form4的Button4则出现错误:
‘Cannot create form.No MDI forms are currently active.’

请问如何解决,有没有另外的方法呢?有些人建议我把form2和form3也做成Splash,
但我不知如何做?我只解决Form1做
成Splash,程序如下:
begin
form1 := Tform1.Create(Application);
form1.Show;
form1.Update;
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm4, Form4);
Application.CreateForm(TForm3, Form3);
form1.Hide;
form1.Free;
Application.Run;
end;
但form2和form3又如何做呢?但有一点,那就是form4和form5的FormStyle分别必需是fsMDIForm和fsMDIChild。
 
你这样用Application.CreateForm会将Form2变成主窗口。
而且,按你的逻辑,
Form2 := TForm2.Create(Application);
应该是在Form1中调用的;

Form3 := TForm3.Create(Application);
应该是在Form2中调用的。

我觉得应该这样写:
begin
Form1 := TForm1.Create(Application);
Form1.Show;
Form1.Update;
Form2 := TForm2.Create(Application);
Form3 := TForm3.Create(Application);
Form1.Hide;
Form1.Free;//如果在Form1的OnClose中写了CaFree := true;这句就可以省了。

//在Form2的按钮事件做判断,如果符合条件,ModalResult := mrOK;
//否则ModalResult := mrCancel;
if(Form2.ShowModal = mrCancel) then
begin
Form2.Free;
Form3.Free;
Application.Terminate;
end;

Form2.Free;
//在Form3的按钮事件做判断,如果符合条件,ModalResult := mrOK;
//否则ModalResult := mrCancel;
if(Form3.ShowModal = mrCancel) then
begin
Form3.Free;
Application.Terminate;
end;

Application.CreateForm(TForm4, Form4);
Application.Run;
end;

 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部