顯示具有 Delphi 標籤的文章。 顯示所有文章
顯示具有 Delphi 標籤的文章。 顯示所有文章

2015-04-15

[Delphi] 檔案處理相關

公司開發的ERP中有一個功能是品項主檔查詢時可以順便顯示該品項的照片,
但是圖檔可能在轉換的過程中編碼方式不一樣,Win7用內建瀏覽器看是正常的,
但Delphi在瀏覽時有些圖檔會出現格式錯誤的訊息( JPEG errpr #53 )

一開始很消極對使用者提示"檔案格式錯誤,請負責人員重新轉檔"的訊息,
但想想也不是辦法,所以花了點時間寫一個小程式,
讓我自己可批次列出讀取會發生錯誤的圖檔,自己重新加工過在放回系統中!

Delphi寫這麼久了,其實很少用到檔案處理這一塊,所以用這篇順便記錄一下用到的部分!

2015-04-01

[Delphi] 抓取使用者指定資料夾路徑

在Delphi中常用TOpenDialog讓使用者指定存檔或抓取指定的檔案,
但是如果只是要單純的取得使用者指定的資料夾路徑呢?
透過下列方法即可取得,但是我使用起來在顯示瀏覽視窗時速度有點慢!!

procedure TForm1.SButton1Click(Sender: TObject);
var xDir: WideString;
begin
  if SelectDirectory('請選擇目錄', '', xDir) then
  begin
    //ShowMessage(xDir);
    Edit_SrcRoot.text := xDir;
  end;
end;


參考自 Delphi 下讓使用者選擇目錄方式

2014-10-21

[Delphi][MS SQL] HOST_NAME()抓取主機名稱錯誤

前幾天寫了一個當登入失敗時,紀錄登入者的IP、主機名稱、時間...等,
今天去看LOG檔才發現,怎麼主機名稱都一樣 ,
明明在MS SQL Server Management Studio執行時都可以正常抓取,
後來才發現在Delphi內的ADO Connection設定連線時,
會將連線主機的名稱寫在Connection內的Workstation中,
而當我們使用T-SQL執行HOST_NAME()時,
反而直接抓取此參數資料,而非透過Server查詢,

2014-10-16

[Delphi] 設定Windows作業系統預設印表機

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;

參考自-Solnone 螺旋旅人-Delphi 設定預設印表機

2014-10-07

[Delphi XE7]TListView MultiDetailItem 安裝

TListView預設只能顯示一筆Detail,
如果想要顯示多筆資訊,需要自己手動Install Package,即可達到需求。

1. 預設文件中即包含安裝檔,按照下列路徑尋找
C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\Mobile Samples\User Interface\ListView

2. 查詢 *.dpk檔,打開檔案
SampleListViewRatingsAppearancePackage.dpk
SampleListViewMultiDetailAppearancePackage.dpk

2014-05-16

[Delphi] 刪除Reopen file 紀錄

於命令提示字元輸入regedit修改登陸檔,
依據下圖路徑,將Closed file下的資料刪除即可!

參考自:爱点Delphi

2014-03-27

Delphi-抓取指定路徑檔案名稱

//******************************************************************************
//**  抓取指定路徑檔案名稱 _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;

2013-07-24

Delphi透過RS232讀取資料-安裝MSComm元件

在Delphi中若欲透過RS232讀取機器發送的數值,
可透過VB的MSComm控制項抓取,
依照下列步驟,可將MSComm安裝於Delphi中,供編寫程式使用。

2012-02-16

Delphi 中SQL Decimal資料型態小數位數進位問題

利用ADOQuery抓取資料,做數值運算時,
若SQL資料庫的資料型態為decimal(18,2)--2表示精準至小數2位,
小數進位方式為五捨六入,並非我們一般使用的四捨五入,
不知是否算為Delphi bug !

如35*1.777= 62.195
Delphi運算結果為62.19
正確應為62.20
var xDSubtot : Double
xDSubtot :=  Query_D.FieldByName('Qty').AsFloat * Query_D.FieldByName('UnitP').AsFloat;
Query_D.FieldByName('SubTot').AsVariant := FloatToStrF(xDSubtot,ffFixed,18,2);

Delphi 7連線SQLite資料庫

最近在研究於Delphi7中利用ODBC連線SQLite DB檔案,
將實做成功方法做個記錄。

先安裝SQLite ODBC Driver
//**在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;


參考自 网语飘飘.Net/Delphi攻坚战

2011-12-07

QuickReport 群組頁次

在Delphi彙整資料以QuickReport輸出時,
針對頁次與總頁數可以很簡單的列印上去,
在使用GroupBand時若要依據群組顯示頁次,如
1/1
------
1/2
2/2
------
可使用下面的方式來達到需求!
//**宣告全域變數
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;

2011-12-03

Delphi 7 在 Win7 無法使用 help

因Win7預設無法開啟.hlp的檔案,
故在Delphi中要開啟help檔案查詢資料會出現錯誤的行況,
只要安裝官方WinHlp32.exe的更新檔即可!
適用於 Windows 7 的 Windows 說明程式 (WinHlp32.exe)

2011-10-25

控制 Hint 顯示時間

在Delphi中若想要讓原件的Hint顯示久一點的話,
可以透過參數設定修改!

Application.HintHidePause := 5000;//**顯示時間 單位為毫秒,即5秒

其他參數
Application.HintPause//**延遲時間
Application.HintColor//**顏色

以上可在Form Create時設定即可!

2011-10-21

Win7下使用Delphi7

當在Win7下面安裝完Delphi執行時會出現檔案無法異動的錯誤訊息,
這是因為資料夾檔案權限問題,修改下述目錄權限即可!

1.修改 C:\Program Files\Borland\Delphi7\Bin 目錄權限,安全性中新增users有modify權限
2.修改 C:\Program Files\Borland\Delphi7\Projects 目錄權限,安全性中新增users有modify權限

2011-08-11

Delphi利用ADOQuery直接讀取Excel內容

在ADOQuery的ConnectionString設定
Provider=Microsoft.Jet.OLEDB.4.0;Data Source='檔案路徑';
Extended Properties=Excel 8.0;Persist Security Info=False';

SQL輸入 select * from [Sheet1$]
<分頁名稱一定要用[]包起來>

ADOQuery Open後Excel的第一欄會變成FieldName,
下面的開始才是明細資料

使用完畢記得將ADOQuery Free掉,避免Excel檔案被鎖定無法正常開啟

2011-01-06

InputBox 缺字

在Delphi中使用inputbox時,
若欲顯示的字串為中文時,會發生掉字的問題,
這是因為inputbox上預設的字型為英文字,
遇到中文字會有長度判斷上面錯誤的問題,
有兩種方式解決這樣的問題,

一、利用Delphi內建變數DefFontData.Name修改預設字型
DefFontData.Name := 'MingLiU';//**細明體

二、在字串後方加上兩個空白字元

2010-10-12

Delphi7 安裝 QuickReport

Delphi 7 安裝完畢後,
預設並不會將QuickReport的Package裝進去,
安裝方式如下:
Component-->Install Packages-->ADD
檔案路徑選擇如下:
C:\Program Files\Borland\Delphi7\Bin\dclqrt70.bpl

2009-12-10

StringReplace 取代特定字串

MS SQL裡有Replace函式可以查詢字串中特定的字元,並取代,
Delphi中也有內建的函式-StringReplace 可以使用,
StringReplace(字串,預備替換的字串,欲替換成的字串,[rfReplaceAll])

StringReplace('Dean Ma',' ','',[rfReplaceAll])
Result:DeanMa

2009-11-20

ADO Query Filter 含中文字解決方案

為了針對查詢出來的Query再做進一步的資料篩選,
常常用會用到Filter的功能,但目前發現若Filter的條件中,
包含了時間、中文字串,程式皆會死當,可以用下列方式解決此情況
//**在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;
以上即可將上述的問題解套,但缺點是此事件會逐筆核對每列記錄,
若當資料量龐大的時候,會耗費不少時間,效益不佳!

參考自:Delphi.ktop