但是圖檔可能在轉換的過程中編碼方式不一樣,Win7用內建瀏覽器看是正常的,
但Delphi在瀏覽時有些圖檔會出現格式錯誤的訊息( JPEG errpr #53 )
一開始很消極對使用者提示"檔案格式錯誤,請負責人員重新轉檔"的訊息,
但想想也不是辦法,所以花了點時間寫一個小程式,
讓我自己可批次列出讀取會發生錯誤的圖檔,自己重新加工過在放回系統中!
Delphi寫這麼久了,其實很少用到檔案處理這一塊,所以用這篇順便記錄一下用到的部分!
procedure TForm1.SButton1Click(Sender: TObject);
var xDir: WideString;
begin
if SelectDirectory('請選擇目錄', '', xDir) then
begin
//ShowMessage(xDir);
Edit_SrcRoot.text := xDir;
end;
end;
Procedure SetDefaultPrinter(xPrintName: string);
var
buffer: array[0..255] of Char;
name: string;
begin
name := xPrintName;
if AnsiPos(',', name) = 0 then begin
name := name + ',';
end;
StrPCopy(buffer, name);
WriteProfileString('windows', 'device', buffer);
StrCopy(buffer, 'windows');
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@buffer));
end;
//******************************************************************************
//** 抓取指定路徑檔案名稱 _GetAllFiles--<自訂函數>
//**
//******************************************************************************
procedure _GetAllFiles(mask :String; isRecursiveSearch_ :Boolean; lst :TStrings);
var sr :TSearchRec;
tExt :String;
tDir :String;
begin
tExt := ExtractFileName(mask);
tDir := ExtractFilePath(mask);
if tDir[Length(tDir)] <> '\' then tDir := tDir+'\';
if FindFirst(mask, faAnyFile, sr) = 0 then
begin
repeat
lst.Add(Format('%s%s', [tDir, sr.Name]));
until FindNext(sr) <> 0;
SysUtils.FindClose(sr);
end;
if isRecursiveSearch_ then
begin
if FindFirst(tDir + '*.*', faDirectory, sr) = 0 then
repeat
if ((sr.Attr and faDirectory) = faDirectory) and (sr.name[1] <> '.') then
_GetAllFiles(Format('%s%s\%s', [tDir, sr.Name, tExt]), true, lst);
until FindNext(sr)<>0;
SysUtils.FindClose(sr);
end;
end;
var xDSubtot : Double
xDSubtot := Query_D.FieldByName('Qty').AsFloat * Query_D.FieldByName('UnitP').AsFloat;
Query_D.FieldByName('SubTot').AsVariant := FloatToStrF(xDSubtot,ffFixed,18,2);
//**在ADO內的ConnectionString直接帶入,不用連線精靈
procedure _SetSQLiteDBConnection;
var OD : TOpenDialog;
ADOConn : TADOConnection;
xDatabase : String;
begin
OD := TOpenDialog.Create(NIL);
OD.FileName := 'x:\mymoney';//**預設資料庫路徑
OD.DefaultExt := '*.db';//**預設存檔格式
OD.Filter := 'DB files (*.db)|*.DB';//**過濾顯示的檔案格式
if Not OD.Execute then
begin
showmessage('選擇資料庫檔案失敗!');
Abort;
end;
xDatabase := ';Database='+OD.FileName;
ADOConn := TADOConnection.Create(NIL);
ADOConn.LoginPrompt := False;
ADOConn.ConnectionString := 'Driver={SQLite3 ODBC Driver}'+xDatabase;
while Not ADOConn.Connected do
ADOConn.Open;
end;
//**宣告全域變數
private
xPage : Integer;
xIONo : String;
xRecIONo : String;
//**在PageHeader的BeforePrint寫入計算規則
procedure TQR.PageHeaderBandBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
var xPos,xLen : Integer;
xStr : String;
begin
//**Query_Item 為QR的DataSet
if xIONo <> Query_Item.fieldbyname('IONo').AsString then
begin
//**"單號-總頁數" 兩群組記錄間以","分開
if xIONo <> '' then
xRecIONo := xRecIONo+','+xIONo+'-'+IntToStr(xPage);
xPage := 0;//**頁次歸0
xIONo := Query_Item.fieldbyname('IONo').AsString;
end;
INC(xPage);//**累加頁次
QRL_SubPage.Caption := IntToStr(xPage);//**群組頁次
if AnsiContainsStr(xRecIONo,xIONo) then//**產生preview前不需判斷
begin
//**"單號-總頁數"
xStr := xRecIONo;
xPos := Pos(xIONo,xStr);
xLen := Length(xStr);
//**拆單號-群祖頁數
xStr := Copy(xStr,xPos+1,xLen-xPos);
xPos := Pos(',',xStr);
xStr := Copy(xStr,0,xPos-1);
//**拆頁數
xPos := Pos('-',xStr);
xLen := Length(xStr);
xStr := Copy(xStr,xPos+1,xLen);
QRL_GroupPage.Caption := xStr;//**群組頁數
end;
end;
//**在DataSet的EndOfRecordset寫入資料行結尾處理
procedure TQR.Query_ItemEndOfRecordset(DataSet: TCustomADODataSet;
var MoreData: WordBool; var EventStatus: TEventStatus);
begin
//**
//**"單號-總頁數" 兩群組記錄間以","分開
if xIONo <> '' then
xRecIONo := xRecIONo+','+xIONo+'-'+IntToStr(xPage);
xPage := 0;//**頁次歸0
xIONo := '';
end;
Application.HintHidePause := 5000;//**顯示時間 單位為毫秒,即5秒DefFontData.Name := 'MingLiU';//**細明體
StringReplace('Dean Ma',' ','',[rfReplaceAll])
Result:DeanMa
//**在Query的onFilterRecord中寫入下列程式碼
if Trim(Edit_CusName.Text) <> '' then
Accept := AnsiContainsStr(xQuery.fieldbyname('CusName').AsString,Edit_CusName.Text)
else
Accept := True;
//**並於要觸發過濾的地方寫入
xQuery.Filtered := False;
xQuery.Filtered := True;
以上即可將上述的問題解套,但缺點是此事件會逐筆核對每列記錄,