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

星期五, 6月 03, 2016

XE8 msbuild error F2613: Unit 'SysUtils' not found!

把舊有專案更新成到 XE8後,當然是使用Msbuild來做全目錄的打包!

但一直出錯 "error F2613: Unit 'XXXX' not found!"

後來發現他的dproj格式有改過,只要使用XE8開啟專案後.不做任何情再做儲存即可排除

星期三, 2月 15, 2012

XE2 教學課程 (RAD Studio XE2 Tutorial Series)

大半是STEP BY STEP的VIDEO,看完後相信會功力大增!

包含

  • 64-bit Windows applications
  • LiveBindings
  • mobile application development for iOS and Android
  • Windows and Mac development with one code base
  • FireMonkey styles


包含的產品有

  • Delphi XE2
  • C++Builder XE2
  • FireMonkey
  • RadPHP XE2
  • Embarcadero Prism XE2

Videos included in this Series

以上原始網頁資訊在

http://www.embarcadero.com/31-days-of-december

星期一, 2月 13, 2012

舊程式升級DELPHI XE2遇到的第一個問題

使用XE2開啟舊的程式(Delphi 2009)建立的專案,開啟時非常的順利,連提示轉換都沒有就直接開啟(不過儲存後他會很自動的變更DPROJ裡頭的編譯資訊)!

心想這麼聰明,一定編譯起來是非常的順利,不過在實際編譯後卻發生找不到"單元"的問題,例如程式中原來使用USE Jpeg卻提示找不到,查看後才發覺需變更為vcl.imaging.Jpeg


在XE2中也導入了像.NET中的SCOPE做法,詳細可以參考這二個連結

所以只要程式升級XE2後發生單元不存在的情況,都可以先來這裡查閱應加入什麼SCOPE NAME! 不過並不明白為什麼開啟時不自動轉換

 

以下列出常見的單元異動後的名稱

vcl.Graphics
vcl.Controls
vcl.Forms
vcl.Dialogs
vcl.Buttons
vcl.ExtCtrls
vcl.StdCtrls
vcl.Controls
vcl.ComCtrls
vcl.Grids

vcl.imaging.Jpeg   
vcl.imaging.pngimage
vcl.imaging.GIFImg


System.SysUtils
System.Classes

星期四, 1月 05, 2012

以最簡單的方式自動同步電腦時間

CMD : w32tm /resync





CODE: ShellExecuteW(Handle,'OPEN',pchar('w32tm'),PChar('/resync'),'',SW_HIDE);

星期三, 3月 24, 2010

捉出程式中的Memory Leaks(物件未被釋放)

在Delphi的環境中.因為沒有全面的gc系統,所以讓系統不穩定的一個潛在原因為”物件建立後未被釋放”! 程式可能一開始都很正常,但經過反覆操作,久了後常因為記憶體(heap)爆了,而發生錯誤,此種未被正常釋放的物件行為可以稱為 MemoryLeaks

要排除這樣子的狀況,首先要有良好的寫作習慣,使用try finally 來釋放物件,例如


with TStringlist.create do

try

finally

  free;

end

 

但在一個複雜的系統中,若要找出像這樣子的潛在問題,不可能拿出所有的code一行一行程式去review‧此時就需要用程式或工具的協助

  • 導入要需要付費的 Eureka exception log
  • 使用Delphi 內建的debug功能

使用delphi內建的debug功能,是個簡單又實惠的做法,只需要將 MemoryLeaksOnShutdown 變數設成true即可(在system)

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TStringList.Create do
  begin
    AddObject('1',TLabel.Create(nil));
    AddObject('2',TLabel.Create(nil));
    AddObject('3',TLabel.Create(nil));
  end;
  with TButton.Create(nil) do
  begin
    Parent := Self;
    Visible := True;
  end;
end;

 

 

當button1被click過後.結束程式時即會彈出如下的訊息

Delphi.ReportMemoryLeaksOnShutdown

星期一, 8月 31, 2009

Embarcadero RAD Studio 2010 (Delphi 2010) 開跑了

官網提供下載  Embarcadero RAD Studio 2010 Architect - 30 day trial  註冊後即會收到官網寄出的試用key,讓你全功能試用,也省去花時間找keygen

版本異動說明  Embarcadero RAD Studio 2010 What’s New

影片功能介紹  http://etnaweb04.embarcadero.com/rad-studio-2010/


Delphi 2010 產品發表會
-Windows 7 浪潮來襲,
觸控應用軟體商機 一「觸」即發 !領先全球業界首先支援 Windows 7 開發的原生Win32開發工具

星期五, 5月 29, 2009

CodeGear 釋出 Delphi and C++Builder 2009 Update 4(DataBase Pack Update)

今天看到CODEGEAR同時釋出了UPDATE3跟UPDATE4(DB),看了一下FIXED的清單應是有包含CDS.LOCATE無法正確找到中文資料的問題!


但試了一下真的是很失望..因為問題依然存在! 照這樣子的速度不知道何時才能購買且升級到2009!

星期三, 5月 27, 2009

Fixed Delphi 2009 TClientDataSet locate method (filter) at widestring problem

I have fixed "Clientdataset can't locate TWideStringField" problem!

I find then problem at TExprParser! You solve the problem Step by Step .

  • Add a new class inheritance from TClienDataSet

  • override Locate Method!

function TBearClientDataSet.Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
begin
 DoBeforeScroll;
 Result := LocateRecord2(KeyFields, KeyValues, Options, True);
 if Result then
 begin
  Resync([rmExact, rmCenter]);
  DoAfterScroll;
 end;
end;

  • Add private LocateRecord2--Copy From LocateRecord and Change TExprParser to TExprParser2
  • Write TExprParser2

Some Code..

function TFilterExpr2.PutConstant(Node: PExprNode): Integer;
begin
 Result := 0;
 case Node^.FDataType of
  ftString, ftFixedChar, ftGuid: Result := PutConstAnsiStr(AnsiString(Node^.FData));
  ftWideString, ftFixedWideChar: Result := PutConstUnicodeStr(UnicodeString(Node^.FData));
..
end.


function TFilterExpr2.PutConstAnsiStr(const Value: AnsiString): Integer;
var
Str: AnsiString;
Buffer: array[0..255] of Byte;
begin
 if Length(Value) >= SizeOf(Buffer) then Str := Copy(Value, 1, SizeOf(Buffer) - 1)
 else Str := Value;
 FDataSet.Translate(PAnsiChar(Str), PAnsiChar(@Buffer), True);
 Result := PutConstNode(ftString, @Buffer, Length(Str) + 1);
end;

function TFilterExpr2.PutConstUnicodeStr(const Value: UnicodeString): Integer;
var buffer: array of word; Len : Integer;
begin
  Len := Length(Value);
 SetLength(buffer, Len + 1);
 buffer[0] := Len * 2;
 if Value <> '' then Move(Value[1], Buffer[1], Len*2);
 Result := PutConstNode(TFieldType(ftUnknown), @buffer[0], (Len+1)*2);
 SetNodeOp(Result, 0, $1007);
end;

星期三, 5月 20, 2009

ADO的Persist Security Info與MaxRecord

記錄最近遇到的二件事情
1.某段程式在xp上運行都正常.但在vista上使用到一半時會突然發生"資料庫"登入發生錯誤
2.程式中取出資料均只有1筆(改變DATASET的MaxRecord為0也沒作用)


發生的經過為
事件1.
追查後發現程式中有一段程式會將connection物件中斷再重連,而重連時並沒有再改變connectionstring的內容!在檢查原有的connectionstring時發現並沒有加上Persist Security Info的設定值,導致在vista環境下password在connect中斷後,會自動從連接字串中去除,將Persist Security Info設成ture再加入connectionstring即排除。
ado的環境下,當沒有指定此值預設應都為true,也就是本來應就會保留一些有關安全性的資訊!但不知道為什麼vista上的行為跟xp不同,也由此可證vista真的比較安全! 安全到搞死人啦!!

可以參考微軟msdn中ado.net中相關的說明

事件2.
程式莫名奇妙查詢後的資料均只有一筆,追查後原來是MaxRecord在執行過像 select top 1後,此值會被寫入1,導致後續的查詢只有一筆,試著在改變commandtext時也順便吧maxrecord設成0,那是否能改善上述的問題呢? 答案是否定的@@(在debug環境修改此值結果也是一樣),最後的解法為(dataset):CLOSE; MaxRecord = 0; Connection = nil; Connection = 原有的連結; 即排除問題!

星期二, 5月 12, 2009

受不了Delphi 2009 的 TClientDataSet

在初接觸到程式設計時,那時對於Delphi 5的Midas架構覺得很驚奇,3-Tier、離線模式、Load Balance等功能,都讓我在中歷資策會學習期間,每一天,每一晚都過得很充實!當時的生活真的是累了就睡,起床就學,寫到這就想起好多美好時光,也要感謝很多老師,尤其是教Delphi的DoDo(miss 黃)、連sir,還有一位用課外自己時間教java的王Sir!

在出了社會接觸的幾個產品,多多少少都會用到CDS,尤其是拿來當一些資料的暫存特別好用,可以用資料庫的方式進行一些必要的操作。但一直以來都覺得它的速度實在不快,以往嚐試著用fastmm或是試著自行pack data等方式來改善,但成效總是有限!


在經歷近二年.NET的洗禮,最近又重新接觸MIDAS後,終於有了新的結果!首先以本機進行測試,從PROVIDER餵資料給CDS,這段時間花了9成五以上的時間,有了這樣子的體認,即可以有個初步的方向,即丟掉笨重的data結構。在重新檢視了專案中CDS的用法,發覺有大半的程式只是用來捉取資料(查詢,觀看)取回來的資料並不需要進行編修後再更新,也就是不用保有原cds的資料結構,只要想辦法手動"序列化(serialization)"這段不需要編修的Data資料,讓他到CLINET時可以正確還原到能夠檢視即可!經由這樣子的調整與改變,在有較大量資料的查詢下,速度至少快了將近一半!


寫到好像問題都解決了,沒有什麼受不了的!但試用了d2009後,又發覺cds二個問題

  1. Locate中文會不正常
  2. aggregates中 使用像 min(field1) 此時若field1是widestring會不正常.但string是正常的
說起來這二點應都是改成unicode後才改壞的,爬了一下文發覺也有蠻多人反應這樣子的問題! 而在 ktop上看到一則很久前的帖子發覺或許這個問題己經存在很久.只是之前都沒遇過而己!真希望update4(or 10)能快出來,此二點就先不管了,日後需要正面衝突使用時再來傷腦子了

星期日, 4月 19, 2009

以ADO連結有設定資料庫密碼的ACCESS MDB檔

此方法是通用的.不論在C#或DELPHI均可以!!

只需要在原設定的連線字串上加上如下的設定值即可

Jet OLEDB:Database Password=密碼

星期五, 2月 20, 2009

Delphi 2009 使用MSBUILD 編譯目錄中所有專案

可以一次編譯目錄中(含次目錄)所有的專案檔

BAT檔放在 熊的留言版 檔案名稱為 BUILD.7Z (要申請加入)

Auto compile all the project files (including sub-directories)
Bat(dos mode script) file on the 熊的留言版 the name of the file BUILD.7Z

星期二, 2月 10, 2009

msbuild fails to compile delphi 2009 project

I have problem compiling a project from command line using msbuild.
how can i solve it??


D:\Test>msbuild Test.dproj
Microsoft (R) Build Engine Version 2.0.50727.3053
[Microsoft .NET Framework, Version 2.0.50727.3082]
Copyright (C) Microsoft Corporation 2005. All rights reserved.
已經開始建置於 2009/2/9 上午 10:00:00。
__________________________________________________
專案 "D:\Test\Test.dproj" (預設目標):
D:\Test\Test.dproj : error MSB4040: 專案中沒有目標。 ( There is no target in
the project.)
專案 "Test.dproj" 建置完成 -- 失敗。 (fail)
建置失敗。
D:\Test\Test.dproj : error MSB4040: 專案中沒有目標。
0 個警告
1 個錯誤 (one error)
經過時間 00:00:00


I found the problem!
Set BDS=c:\program files\codegear\rad studio\6.0 before call msbuild!