2011/07/29

令人崩潰的分頁預覽範圍…

Excel VBA中有個 RefersToRange屬性,可以正確得到可列印的最大範圍,MSDN是這樣寫的:
' RefersToRange 屬性範例
' 此範例顯示作用中工作表列印範圍中的列數和欄數。

p = Names("Print_Area").RefersToRange.Value
MsgBox "Print_Area: " & UBound(p, 1) & " rows, " & _
    UBound(p, 2) & " columns"


Delphi Excel Component要怎麼寫?

2011/07/28

[自製小軟體]SQL Server Description Editor

English content:
[SSDE Privacy]
  1. The "Description" comment on Table or Field in SQL Server. 
  2. Can be exported into Excel file for easy editing, and import after the updated the Excel file.
  3. Native mode app. Performance is high. 

=============================

使用IDE: Delphi XE
本專案包含的範圍:
dbExpress, ODBC Open Source DBX Driver, DataSnap ( DataSetProvider + ClientDataSet )

功能特色:兩可一沒有
  • 可編輯欄位中的「描述」欄位
  • 可匯出成Excel檔,方便編輯,編輯完後亦可匯入更新
  • 不需額外安裝 .Net 即可使用,非常輕薄

系統需求:
  • MS SQL Server 7, 2000, 2005, 2008 或以上
  • Office 2000 以上版本
  
比較特別的地方:
Connection Mode:
有 OleDB 和 SQL Client 兩種連結方法,只是先後順序的差別,沒有 SQL Client 時仍會切回 OleDB 連結

Demo PIC:




Download Exe version
2012/11/17補充:
在進行改版的時候發現了底下幾篇 -

下次來用這些工具試試

===========================================

SQL Server Description Editor Windows Store App - 隱私權宣告

我們在何時收集什麼樣的信息?
當您使用應用程序時,我們並不會向您收集任何信息,如您的所在位置或IP資訊等。

我們為什麼要使用你的信息呢?
當您使用應用程序時,我們並不會向您收集任何信息,故並不會有出售、交換、轉移、或未經您的同意的行為。

我們如何保護您的信息?
當您進入或使用本軟體時,我們實行的各種保安措施,會維護您的個人信息安全。

我們使用cookies?
我們不使用cookies。

我們向外界透露任何信息嗎?
我們不會出售與交易或以其他方式轉讓您的個人身份信息。

您的同意
通過使用我們的應用程式,您同意我們應用程式的隱私政策。

我們的隱私政策的更改
如果我們決定改變我們的隱私政策,我們將在此頁面上更新這些變化。

聯繫我們
如果對本隱私政策有任何疑問,您可以使用文末的留言與我們連繫。

[自製小軟體]XLS to MS SQL Server

使用IDE: Delphi 7
本專案包含的範圍:
ADO ExpressMicrosoft Office XP Sample Automation Server Wrapper Components

功能特色:
1. 簡易的 Data Pump 功能,將 Excel file 匯入到 SQL Server 內
2. 不需額外安裝 .Net 即可使用,非常輕薄

系統需求:
MS SQL Server 7 以上
Office 2000 以上

Demo PIC:















Download

2011/07/24

書評:主管私房學 自慢2--小職員出頭天

圖片來源:博客來書籍館
「自慢」:在日文中是指形容自己最拿手、最有把握、最專長的事。

這本書,真可謂道盡小職員心目中理想的好主管與壞主管,他們之間的差別。

這本書講得很多,也可以了解到這本書的作者是屬於急驚風的主管類型,我想,跟隨他的人應該都是步調很快而且很不拖泥帶水的吧。

2011/07/16

書評:Delphi in Depth: ClientDataSet

目前只大略的把這本書看過一次,如果看完第二次還有多的心得再補充一下

TClientDataSet真的是個很有潛力的元件

基本上,它就是BDE的延伸,很多語法和概念是繼承於它

它可以單打獨鬥,也可以多人合作(與Base DataSet搭配,如BDE、ADO、DBX等),相當萬用的一個元件,同時,它也是Midas / DataSnap架構的重要元件之一

要說它的缺點的話,應該就是它不支援SQL指令吧,例如像我想在已有資料的ClientDataSet裡做SQL查詢,就不能夠這樣使用

新手老手都能夠在這本書上看到很新鮮的東西
比方說:
新手可以從第一章看到第十章,進階在十一~十二章
老手可能就是看看十三~十五章,比較DataSnap新舊版本的差異和設計方針
(重點就是放在JSON啦!)
同時也能當工具書隨手翻翻

九到十二章是我相當少用的功能(好吧,我承認,我從來沒用過)
未來有機會我仍然會來挑戰這個功能,榨光ClientDataSet的極限吧!

2011/07/12

TExcelWorksheet刪除列的方式

真是見鬼的做法,Google半天居然沒有網站可以解決這問題

首先,如果我要把Excel工作表的D欄刪除,在Excel VBA是這樣寫的:

Sub Macro2()
    Columns("D:D").Select
    Selection.Delete Shift:=xlToLeft
End Sub


找找找,怎麼找都是顯示ComObj的處理,沒有人用Delphi內建的元件
剛好我偏偏使用了:

2011/07/05

Multithreaded Delphi Database Queries with dbExpress (DBX)

This article is extended the content of Multithreaded Delphi Database Queries, which is mainly dbGO(ADO) change to Dbexpress(DBX).

The same opinion is as below mentioned:
1.      Solve: “Canvas does not allow drawing”.
2.      Main TSQLConnection Cannot be used!

And the superiority of DBX is:
1.      DBX is read only and unidirectional.
2.      Device is very flexible.

Because SQLDataSet’s property always ‘string’ and need add SQLConnection, so we can modify this code:
Multithreading in Dbexpress (DBX)

Let's say you want to display orders for 3 selected customers in a Delphi list box control.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  TCalcThread = class(TThread)
  private
    procedure RefreshCount;
  protected
    procedure Execute; override;
  public
    ConnStr : string;
    SQLString : string;
    cnThread: TSQLConnection;
    ListBox : TListBox;
    Priority: TThreadPriority;
    TicksLabel : TLabel;

    Ticks : Cardinal;
  end;

Well, DBX is not support ACCESS in Delphi default setting. So we used “Open Source ODBC Dbexpress driver” in the project. And add it’s demo: dbx_access_connect.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TDbxThreadedForm.ReConnection();
begin
    //
    // MSACCESS
    //
    dbx_access_connect.AccessConnect(SQLConnection,
      // mdb_file_name:
        'C:\Program Files\Common Files\CodeGear Shared\Data\dbdemos.mdb',
      // DNS_NAME
        '',
      // DirectOdbc
        True,
      // LoginPrompt
        False,
      // UserName
        '',
      // Password
        '',
      // AdditionalOptions
        'coEnableBCD=0',
      // bUnicodeOdbcApi
        True,
      // bAnsiStringField
        False,
      // bUnicodeDriver
        True
    );
end;

When the 3 customers are selected from the drop down box, we create 3 instances of the CalcThread:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TDbxThreadedForm.Button1Click(Sender: TObject);
var
  s, sg: string;
  c1, c2, c3 : integer;
begin
  s := ' SELECT O.SaleDate, MAX(I.ItemNo) AS ItemCount  ' +
       ' FROM Customer C, Orders O,  Items I   ' +
       ' WHERE C.CustNo = O.CustNo AND I.OrderNo = O.OrderNo ' ;

  sg := ' GROUP BY O.SaleDate ';

  c1 := Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
  c2 := Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]);
  c3 := Integer(ComboBox3.Items.Objects[ComboBox3.ItemIndex]);

  Caption := '';

  ct1 := RunThread(Format('%s AND C.CustNo = %d %s',[s, c1, sg]), lbCustomer1, tpTimeCritical, lblCustomer1);

  ct2 := RunThread(Format('%s AND C.CustNo = %d %s',[s, c2, sg]), lbCustomer2, tpNormal,lblCustomer2);

  ct3 := RunThread(Format('%s AND C.CustNo = %d %s',[s, c3, sg]), lbCustomer3, tpLowest, lblCustomer3);
end;

Traps and Tricks - Multithreaded DBX Queries

The main code goes in the thread's Execute method:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure TCalcThread.Execute;
  var
    Qry : TSQLDataSet;
    i : integer;
  begin
    inherited;
 
    ticks := GetTickCount();
    //CoInitialize(nil); //CoInitialize was not called
    cnThread := DbxThreadedForm.SQLConnection.CloneConnection;
    Qry := TSQLDataSet.Create(nil);
    try
      Qry.SQLConnection := cnThread;
      Qry.CommandText := SQLString;
 
      ListBox.Clear;
      Qry.Open;
      for i:= 0 to 100 do
      begin
        while NOT Qry.Eof and NOT Terminated do
        begin
          ListBox.Items.Insert(0, Format('%s - %d', [Qry.Fields[0].asString,Qry.Fields[1].AsInteger]));
 
          //Canvas Does NOT Allow Drawing if not called through Synhronize
          Synchronize(RefreshCount);
 
          Qry.Next;
        end; //while
        if Terminated then break;
        Qry.First;
        ListBox.Items.Add('*---------*');
      end; // for
    finally
      Qry.Free;
          FreeAndNil(cnThread);
    end;
    //CoUninitialize();
    ticks := GetTickCount - ticks;
    TicksLabel.Caption := 'Ticks: ' + IntToStr(ticks);
  end; //TCalcThread.Execute;

Conclusion
DBX will auto be called CoInitialize and CoUninitialize. So we can to comment it. :P

Attention: Similarly, you cannot use the TSQLConnection object from the main thread (application). (Remember free the TSQLConnection object)

You must use the Synchronize procedure to "talk" to the main thread and access any controls on the main form.

Be sure to download the demo application to explore and learn more about multithreaded queries with DBX and Delphi.

Source: