bestlong 怕失憶筆記

當健忘由隨機逐漸趨向常態時,作筆記是非常必要的

Entries Tagged ‘Delphi’

Delphi 碰到 DesignIntf.dcu not found

若是要將由 Delphi 5 開發元件移轉到Delphi 6 或 7 大概都會碰到這個問題。

若只是程式當然可以將全部的 uses 替換成新的就好。但是若是自行開發的元件可就需要同時支援多個版本,總不能一個版本維護一套程式碼。只要利用 Compiler 的指令來加強一下就可以解決問題了:

1
2
3
4
5
6
7
8
9
10
11
{$UNDEF DEL345}
{$IFDEF VER100} {$DEFINE DEL345} {$ENDIF}
{$IFDEF VER120} {$DEFINE DEL345} {$ENDIF}
{$IFDEF VER130} {$DEFINE DEL345} {$ENDIF}

uses
{$IFDEF DEL345}
DsgnIntf
{$ELSE}
DesignIntf, DesignEditors, VCLEditors, RTLConsts
{$ENDIF};

參考資料:
http://www.chillibear.org/blog1.php/delphi/
http://www.mustangpeak.net/ota_publishedprop_forms.htm

Leave a Comment

Delphi 的 ExtractFileDir 與 ExtractFilePath 函數有何差異?

ExtractFileDir() 與 ExtractFilePath() 是有差異的,直接用程式來看差異結果

1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.Add(ExtractFileDir('C:\a.exe'));
  Memo1.Lines.Add(ExtractFilePath('C:\a.exe'));
  Memo1.Lines.Add(ExtractFileDir('C:\Program Files\a.exe'));
  Memo1.Lines.Add(ExtractFilePath('C:\Program Files\a.exe'));
end;

得到的執行結果是
C:\
C:\
C:\Program Files
C:\Program Files\

得知 ExtractFilePath() 的結果都會在路徑後保留 \

Leave a Comment

控制 Windows 音效管理員作靜音切換

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
uses
  MMSystem;

function GetMasterMute(Mixer: hMixerObj; var Control: TMixerControl): MMResult;
  // Returns True on success
var
  Line: TMixerLine;
  Controls: TMixerLineControls;
begin
  ZeroMemory(@Line, SizeOf(Line));
  Line.cbStruct := SizeOf(Line);
  Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  Result := mixerGetLineInfo(Mixer, @Line, MIXER_GETLINEINFOF_COMPONENTTYPE);
  if Result = MMSYSERR_NOERROR then
  begin
    ZeroMemory(@Controls, SizeOf(Controls));
    Controls.cbStruct := SizeOf(Controls);
    Controls.dwLineID := Line.dwLineID;
    Controls.cControls := 1;
    Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
    Controls.cbmxctrl := SizeOf(Control);
    Controls.pamxctrl := @Control;
    Result := mixerGetLineControls(Mixer, @Controls,
      MIXER_GETLINECONTROLSF_ONEBYTYPE);
  end;
end;

procedure SetMasterMuteValue(Mixer: hMixerObj; Value: Boolean);
var
  MasterMute: TMixerControl;
  Details: TMixerControlDetails;
  BoolDetails: TMixerControlDetailsBoolean;
  Code: MMResult;
begin
  Code := GetMasterMute(0, MasterMute);
  if Code = MMSYSERR_NOERROR then
  begin
    with Details do
    begin
      cbStruct := SizeOf(Details);
      dwControlID := MasterMute.dwControlID;
      cChannels := 1;
      cMultipleItems := 0;
      cbDetails := SizeOf(BoolDetails);
      paDetails := @BoolDetails;
    end;
    LongBool(BoolDetails.fValue) := Value;
    Code := mixerSetControlDetails(0, @Details,MIXER_SETCONTROLDETAILSF_VALUE);
  end;
  if Code <> MMSYSERR_NOERROR then
    raise Exception.CreateFmt('SetMasterMuteValue failure, ' + 'multimedia system error #%d', [Code]);
end;

// Example:

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetMasterMuteValue(0, CheckBox1.Checked); // Mixer device #0 mute on/off
end;

Leave a Comment

Delphi 7 Access violation at address 4085E2C4 in module ‘bdertl70.bpl’

於 Delphi 7 的環境下的專案程式中的 TQuery 元件的 Fields Editor 中要增加欄位出現了下列錯誤訊息

Access violation at address 4085E2C4 in module ‘bdertl70.bpl’. Read of address 00000000.

增加一個新的 TQuery 元件要指定 DatabaseName 屬性也會出現同樣的錯誤
原本是很正常的專案不確定為何會這樣
不過新建一個專案做同樣的處理就不會有同樣錯誤
所以歸納為專案本身的環境問題
才想到前一段時間為了減少 IDE 介面 Palette 上的元件
就去將 Project Options 中將一些沒用到的 Packages 給關掉
不然設計時找元件要點來點去很麻煩
說不定就是元件之間的關連性所導致的問題
趕快把原本關掉的都給弄回來,果然錯誤訊息就不再出現了。

Leave a Comment

  • 工商服務

    廣告讀取中...
  • 近期留言

  • 標籤

  • 彙整