[BCB/Delphi] 再描画に関するメソッド
再描画に関連するメソッド
・Invalidate
再描画が必要であることを宣言します。実際の再描画は適当なタイミングで実施されます。
・Update
Invalidateなどで保留中の再描画を強制的に実施します。
・Repaint
Invalidateを呼び出した後、Updateを呼び出します。強制的に再描画します。
・Refresh
Repaintと同じです。
| 固定リンク
再描画に関連するメソッド
・Invalidate
再描画が必要であることを宣言します。実際の再描画は適当なタイミングで実施されます。
・Update
Invalidateなどで保留中の再描画を強制的に実施します。
・Repaint
Invalidateを呼び出した後、Updateを呼び出します。強制的に再描画します。
・Refresh
Repaintと同じです。
| 固定リンク
#include <GraphUtil.hpp>
void __fastcall ColorRGBToHLS(unsigned clrRGB, Word &Hue, Word &Luminance, Word &Saturation);
unsigned __fastcall ColorHLSToRGB(Word Hue, Word Luminance, Word Saturation);
| 固定リンク
「デスクトップの表示」や「Windows+D」でも最小化されないウインドウの作り方
constructor TForm1.Create(AOwner: TComponent);
var
ProgmanHwnd: THandle;
begin
inherited;
ProgmanHwnd:=FindWindow('Progman','Program Manager');
if ProgmanHwnd<>0 then
begin
ParentWindow:= ProgmanHwnd;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
//前面に表示する
SetZOrder( True);
end;
| 固定リンク
rcファイルを使ってアイコンリソースをEXEファイルに埋め込んだときに、アプリケーションのメインアイコンが変わってしまうことがあります。これは、Delphi,BCBはリソース名でリソースを並び替えてしまうためにおきる問題です。
解決策としては、Delphi,BCBではメインアイコンをMAINICONの名前で保持していますので、ソートした時に、これよりも後に来るような名前を付けます。例えば、
OREICON ICON "aaa.ico"
のような感じです。MよりもOの方がアルファベット順が後になります。
| 固定リンク
type
TForm1 = class(TForm)
private
procedure WMMousewheel(var Msg: TMessage); message WM_MOUSEWHEEL;
:
implemetation
procedure TForm1.WMMousewheel(var Msg: TMessage);
begin
if (Msg.WParam > 0) then begin
//奥の方向にホイール
Sendmessage(○○.Handle, WM_VSCROLL, SB_LINEUP, 0); //or SB_PAGEUP
end
else
begin
//手前の方向にホイール
Sendmessage(○○.Handle, WM_VSCROLL, SB_LINEDOWN, 0); //or SB_PAGEDOWN
end;
end;
| 固定リンク
StrToIntは文字列を数字に変換するための関数ですが、引数に数字として不正な文字列(例えば「125a」とか)を渡すと例外が発生してしまいます。これをきちんと処理するのが面倒だったり、単純に不正な文字列が渡された場合は-1を返してほしいと思う場合があったりします。そういう時に便利なのがStrToIntDefという関数です。
i:=StrToIntDef(Edit1.Text,-1);
というようにデフォルト値を指定して変換ができます。変換に失敗した場合はデフォルト値が返される仕組みです。例外は発生しません。場合によっては非常に便利な関数です。
| 固定リンク
manifestファイルの書き方はこちらを参照してください。
作成したmanifestファイルをexeファイルにリソースとして埋め込む方法です。
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define CONTROL_PANEL_RESOURCE_ID 123
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "○○.exe.manifest"
これをmanifest.rcというようなファイル名で保存します。なお上記の○○の部分には実行ファイルの名前を書きます。「プロジェクト」-「プロジェクトに追加」で作成したrcファイルをプロジェクトに追加します。
これでコンパイルすればOKです。
| 固定リンク
リソースをテキストエディタなど作成して「tmp.rc」というような名前で保存します。そのファイルをプロジェクトに追加してコンパイルします。rcファイルをBRCC32でコンパイルしてresファイルに変換しなくてもOKです。
リソースファイル(*.rc)の中身は
リソース名 リソースタイプ "ファイル名"
のように書きます。例えば、
MYICON ICON "MyIcon.ico"
MYBMP BITMAP "MyBmp.bmp"
のようです。
procedure TScreenSaverForm.FormCreate(Sender: TObject);
var
dc:hdc;
begin
//キャプチャ
Image1.Picture.Bitmap.width:=screen.Width;
Image1.Picture.Bitmap.height:=screen.Height;
dc:=GetDC(0);
BitBlt(Image1.Picture.Bitmap.Canvas.Handle,0,0,
Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height,
dc,0,0,SRCCOPY);
ReleaseDC(0,dc);
end;
manifestファイルを使うと、アプリケーションの外観を簡単にWindowsXPのスタイルにすることができます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="CompanyName.ProductName.YourApp"
type="win32" />
<description>Description</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*" />
</dependentAssembly>
</dependency>
</assembly>
これを、○○.exe.manifestという名前のファイルに保存します。このとき文字コードはUTF-8にします。○○の部分は実行ファイルの名前を入れます。このファイルを実行ファイルと同じ場所においておけばOKです。
Delphi5の場合は、PageControlなど一部のコンポーネントは、うまくスタイルが変更されません。これらに対応したコンポーネントを作られている方もいるようです。
var
TempIcon:TIcon;
begin
TempIcon:=TIcon.Create;
ImageList1.GetIcon(2,TempIcon);//インデクスが2の画像を取り出す
//TempIconにアイコンが格納されている
//何か処理をする
//使い終わったらフリー
TempIcon.Free;
end;
動的にHTMLを生成して表示したい場合は以下のようにします。WebBrowser1.Documentがnilの場合はWebBrowser1.Navigate('about:blank')を呼び出すとWebBrowser1.Documentが作成されます。
uses mshtml;
OLEVariant(WebBrowser1.Document as IHTMLDocument2).Write('<html>aaaa</html>');
WebBrowserに表示されている内容を消したい場合は以下のようにします。
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('about:blank');
end;
水平方向x、垂直方向yが指定できます。yを0にすると一番上までスクロールされます。
uses mshtml;
OLEVariant(WebBrowser1.Document as IHTMLDocument2).parentWindow.scroll(x, y);
「次へ」のリンクをプログラム内からクリックする場合などに使える方法です。クリックする座標は、WebBrowserの左上を(0,0)としたときの座標で指定します。
uses mshtml;
procedure TForm1.Button1Click(Sender: TObject);
var
hWB:HWND;
begin
hWB := FindWindowEx(WebBrowser1.Handle,0,'Shell DocObject View',nil);
hWB := FindWindowEx(hWB,0,'Internet Explorer_Server',nil);
if hWB <> 0 then begin
//指定した座標をクリック
SendMessage(hWB,WM_LBUTTONDOWN,0,MakeLParam(570,70));
SendMessage(hWB,WM_LBUTTONUP,0,MakeLParam(570,70));
end;
end;
uses mshtml;
Memo1.Text:= OLEVariant(WebBrowser1.Document as IHTMLDocument2).Body.InnerHTML;
通常、FormやLabelのフォントを変えるときは、コンポーネントをマウスで選択してフォントを変更します。変更するものが少ないときはこれでいいのですが、アプリで使用しているフォントを全部、まとめて変更したいと言うときは、この方法だと、時間がかかりますし、変更もれが出る場合もあります。こういうときは、「*.dfm」ファイルを直接、編集してしまうと楽です。
dfmファイルはただのテキストファイルですのでメモ帳などで開くことができます。やり方です。
(1) 変更したいフォームの.dfmファイルをメモ帳などで開きます。(例:Unit.dfm)
(2) Font.Name = 'MS Pゴシック'といった行がフォントを指定している場所ですので、これを変更したいフォント名に置換してやります。(例:Font.Name = 'MS ゴシック')
正規検索の置換がつかえるエディタを使用してFont.Name = '*'に該当する箇所をすべて変換するようにすれば、もれなく変換することが可能です。
この方法は、海外製のソフトを日本語対応に変換したりするときにも使える方法です。
GetSystemPowerStatus関数を使います。この関数はWindows NTでは使用できません。
procedure TForm1.Button1Click(Sender: TObject);
var
SystemPowerStatus: TSystemPowerStatus;
begin
GetSystemPowerStatus(SystemPowerStatus);
end;
関数を実行するとTSystemPowerStatus構造体に結果が格納されます。構造体のメンバは以下のとおりです。
| ACLineStatus | AC電源の状態 |
| BatteryFlag | バッテリの充電状態 |
| BatteryLifePercent | バッテリの残り(%) |
| Reserved1 | 未使用(常に0) |
| BatteryLifeTime | バッテリの残り時間(秒) |
| BatteryFullLifeTime | フル充電状態での残り時間(秒) |
値の意味は以下のとおりです。
ACLineStatus
| 0 | オフライン |
| 1 | オンライン |
| 255 | 不明 |
BatteryFlag
| 1 | 残り66%以上 |
| 2 | 残り33%以下 |
| 4 | 残り5%以下 |
| 8 | 充電中 |
| 128 | バッテリはない |
| 255 | 不明 |
Frac関数、およびInt関数を使用します。
uses System,Math;
var
J:Extended;
I:Integer;
S:Extended;
begin
J:=1.23;
I:=Int(J); //整数部分 1
S:=Frac(J); //小数部分 0.23
end;
画面のサイズを取得するにはTScreenのプロパティを使います。
W:=Screen.Width; //画面の幅
H:=Screen.Height; //画面の高
| 固定リンク
procedure TForm1.ReadFromInifile(IniFilename: String);
var
ini:TInifile;
FStyle:TFontStyles;
Fs :Byte absolute FStyle;
FPitch:TFontPitch;
Fp :Byte absolute FPitch;
begin
ini:=TInifile.Create(IniFilename);
try
Fs:= ini.ReadInteger('Option','FontStyle',0);
Fp:= ini.ReadInteger('Option','FontPitch',0);
if Fs<>0 then FFont.Style:= FStyle;
if Fp<>0 then FFont.Pitch:= FPitch;
FFont.Color:= StringToColor(Ini.ReadString('Option','FontColor','clBlack'));
FFont.Name := ini.ReadString('Option','FontName','MS ゴシック');
FFont.Size := ini.ReadInteger('Option','FontSize',13);
FFont.Charset:=ini.ReadInteger('Option','FontCharset',SHIFTJIS_CHARSET);
finally
ini.Free;
end;
end;
procedure TForm1.WriteToInifile(IniFilename: String);
var
ini:TInifile;
FStyle:TFontStyles;
Fs :Byte absolute FStyle;
FPitch:TFontPitch;
Fp :Byte absolute FPitch;
begin
ini:=TInifile.Create(IniFilename);
try
FStyle:=FFont.Style;
FPitch:=FFont.Pitch;
ini.WriteInteger('Option','FontStyle',Fs);
ini.WriteInteger('Option','FontPitch',Fp);
ini.ReadString('Option','FontColor',ColorToString(FFont.Color));
ini.WriteString('Option','FontName',FFont.Name);
ini.WriteInteger('Option','FontSize',FFont.Size);
ini.WriteInteger('Option','FontCharset',FFont.Charset);
finally
ini.Free;
end;
end;
Ord関数を使います。
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=Ord('K') then begin
//Kが押されたときの処理
end;
end;
Parentプロパティを設定することでStatusBar上に別のコンポーネントを配置することができます。
Parentプロパティを設定した後は、Top、Leftプロパティを親コンポーネントの左上を(0,0)とした座標系で設定し直す必要があります。
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Parent:=StatusBar1;
Button1.Top:=0;
Button1.Left:=0;
end;
以下の例では左に10ドット、右に20ドットのマージンを設定します。
Memo1.Perform(EM_SETMARGINS,
EC_LEFTMARGIN or EC_RIGHTMARGIN,
MAKELONG(10, 20));
マウスカーソルの位置にある文字の位置(先頭からのバイト数)と行番号を表示する例です。
procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
Res:DWORD;
begin
//座標から文字位置を取得
Res := Memo1.Perform(EM_CHARFROMPOS, 0, MAKELONG(X, Y));
//先頭からのバイト数を表示
Label1.Caption := IntToStr(LOWORD(Res));
//行数を表示
Label2.Caption := IntToStr(HIWORD(Res));
end;
入力できるバイト数を制限する方法です。以下の例では32Kバイトに制限しています。
Memo1.Perform(EM_SETLIMITTEXT, 32*1024, 0);
プログラムからMemoやRichEditをスクロールさせるには EM_SCROLL を使用します。
//1ページ上へ
Memo1.Perform(EM_SCROLL, SB_PAGEUP, 0);
//1ページ下へ
Memo1.Perform(EM_SCROLL, SB_PAGEDOWN, 0);
//1行上へ
Memo1.Perform(EM_SCROLL, _SB_LINEUP, 0);
//1行下へ
Memo1.Perform(EM_SCROLL, SB_LINEDOWN, 0);
EM_LINESCROLLを使用することもできます。
//水平方向に3文字、垂直方向に2行スクロール
Memo1.Perform(EM_LINESCROLL, 3, 2);
Labelに複数行の文字列を表示する方法です。
Label1.Caption:='1行目'+#13#10+'2行目';
#13、#10はそれぞれCRコード、LFコードを表します。
Caps LockがOnになっているかを調べる例です。
begin
if (GetKeyState(VK_CAPITAL) and $1 <> 0) then begin
//Caps LockがOnになっている
end else begin
//Caps LockがOffになっている
end;
end;
VK_CAPITALの代わりにVK_NUMLOCKとすればNum Lockの状態を取得できます。
| VK_LBUTTON | VK_RBUTTON | VK_CANCEL |
| VK_MBUTTON | VK_BACK | VK_TAB |
| VK_CLEAR | VK_RETURN | VK_SHIFT |
| VK_CONTROL | CtrlVK_MENU | AltVK_PAUSE |
| VK_CAPITAL | VK_KANA | VK_HANGUL |
| VK_JUNJA | VK_FINAL | VK_HANJA |
| VK_KANJI | VK_CONVERT | VK_NONCONVERT |
| VK_ACCEPT | VK_MODECHANGE | VK_ESCAPE |
| VK_SPACE | VK_PRIOR | VK_NEXT |
| VK_END | VK_HOME | VK_LEFT |
| VK_UP | VK_RIGHT | VK_DOWN |
| VK_SELECT | VK_PRINT | VK_EXECUTE |
| VK_SNAPSHOT | VK_INSERT | VK_DELETE |
| VK_HELP | '0'($30) ~ '9'($39) | 'A'($41) ~ 'Z'($5A) |
| VK_LWIN | VK_RWIN | VK_APPS |
| VK_NUMPAD0~VK_NUMPAD9 | VK_MULTIPLY | VK_ADD |
| VK_SEPARATOR | VK_SUBTRACT | VK_DECIMAL |
| VK_DIVIDE | VK_F1~VK_F24 | VK_NUMLOCK |
| VK_SCROLL | VK_PROCESSKEY | VK_ATTN |
| VK_CRSEL | VK_EXSEL | VK_EREOF |
| VK_PLAY | VK_ZOOM | VK_NONAME |
| VK_PA1 | VK_OEM_CLEAR |
以下はGetAsyncKeyState() と GetKeyState()で使用するためのキーコード。右と左が区別できる。
| VK_LSHIFT | VK_RSHIFT |
| VK_LCONTROL | VK_RCONTROL |
| VK_LMENU | VK_RMENU |
球面三角法を利用した方位の計算です。
uses Math;
// 引数
// Lon1 地点1の経度(度)
// Lat1 地点1の緯度(度)
// Lon2 地点2の経度(度)
// Lat2 地点2の緯度(度)
//
// 北緯は0~90度、南緯は-90~0度
// 東経は0~180度、西経は-180~0度
//
// 戻り値
// 地点1から見た地点2の方位(度)
function GetDirection(Lon1:Double; Lat1:Double; Lon2:Double; Lat2:Double):Double;
var
Lon1Rad, Lat1Rad, Lon2Rad, Lat2Rad:Double;
LonDiff:Double;
X,Y:Double;
Direction:Double;
begin
//ラジアンに変換
Lon1Rad := Lon1 * PI / 180;
Lat1Rad := Lat1 * PI / 180;
Lon2Rad := Lon2 * PI / 180;
Lat2Rad := Lat2 * PI / 180;
LonDiff := Lon2Rad - Lon1Rad;
Y := Cos(Lat2Rad)*Sin(LonDiff);
X := Cos(Lat1Rad)*Sin(Lat2Rad) - Sin(Lat1Rad)*Cos(Lat2Rad)*Cos(LonDiff);
Direction := ArcTan2(Y, X);
Direction:=Direction*180/PI;
if Direction < 0 then Direction:=Direction+360;
Result:=Direction;
end;
Hubenyの簡易式を使用した方法です。
uses Math;
// 引数
// Lon1 地点1の経度(度)
// Lat1 地点1の緯度(度)
// Lon2 地点2の経度(度)
// Lat2 地点2の緯度(度)
//
// 北緯は0~90度、南緯は-90~0度
// 東経は0~180度、西経は-180~0度
//
// 戻り値
// 2地点間の距離(km)
function GetHubenyDistance(Lon1:Double; Lat1:Double; Lon2:Double; Lat2:Double):Double;
var
Lon1Rad, Lat1Rad, Lon2Rad, Lat2Rad:Double;
LatAveRad, LatDiff, LonDiff:Double;
Meridian, PrimeVertical:Double;
X,Y:Double;
begin
//ラジアンに変換
Lon1Rad := Lon1 * PI / 180;
Lat1Rad := Lat1 * PI / 180;
Lon2Rad := Lon2 * PI / 180;
Lat2Rad := Lat2 * PI / 180;
LatAveRad := (Lat1Rad + Lat2Rad) / 2;
LatDiff := Lat1Rad - Lat2Rad;
LonDiff := Lon1Rad - Lon2Rad;
//子午線曲率半径
Meridian := 6334834 / Sqrt(Power(1 - 0.006674*Sin(LatAveRad)*Sin(LatAveRad),3));
//卯酉線曲率半径
PrimeVertical := 6377397 / Sqrt(1 - 0.006674*Sin(LatAveRad)*Sin(LatAveRad));
//ヒュベニの公式
X := Meridian*LatDiff;
Y := PrimeVertical*Cos(LatAveRad)*LonDiff;
Result := Sqrt(X*X + Y*Y);
end;
uses Math;
//年月日から修正ユリウス通日へ
function YMD2MJD(y,m,d:Integer):Integer;
begin
if (m = 1) or (m = 2) then begin
y:=y-1;
m:=m+12;
end;
//フリーゲルの公式
Result:=Floor(365.25*y) + (y div 400) - (y div 100) + Floor(30.59*(m-2)) + d -678912;
end;
//修正ユリウス通日から年月日へ
procedure MJD2YMD(mjd:Integer; var y,m,d:Integer);
var
k:Integer;
begin
y := Floor( (mjd - 15078.2) / 365.25 );
m := Floor((mjd - 14956.1 - Floor(y*365.25)) / 30.6001 );
d := mjd - 14956 - Floor(y*365.25) - Floor(m*30.6001);
If (m = 14) or (m = 15) then k := 1
else k := 0;
y := y + k + 1900;
m := m - 1 - k*12;
end;
ユリウス通日は紀元前4713年1月1日からの経過日数を表します。修正ユリウス通日はユリウス通日から2400000.5引いたものでMJD(Modified Julian Day)と略されます。ユリウス通日は2つの日付間の日数を計算したりするの使えます。とはいっても、標準で用意されている関数があるのでわざわざ実装することはないと思いますが。ご参考まで。
起動引数をListBoxに一覧表示する例です。
var
i:Integer;
begin
for i:=1 to ParamCount do begin
ListBox1.Items.Add(ParamStr(i));
end;
end;
ParamCountは引数の数で、ParamStr(i) で実際の引数が取得できます。ParamStr(0) はアプリケーション自身のファイル名で、ParamStr(1) が1つ目の引数になります。
あるキーが押されているかどうかは GetKeyState 関数を使います。引数には仮想キーコードを渡します。キーが押されている場合は戻り値の最上位1ビットが1にセットされます。 Caps Lockなどトグルするキーの状態は最下位の1ビットを調べます。
begin
if (GetKeyState(VK_F1) < 0) then begin
//キーが押されているときの処理
end;
end;
まさにそのとき、キーが押されているかを取得するにはGetAsyncKeyStateを使ったほうがよいかもしれません。
コントロールパネルを表示するには以下のようにします。
WinExec('control.exe', SW_SHOW);
さらに、コントロールパネル内の「マウスのプロパティ」を表示したいときは、
WinExec('control.exe main.cpl',SW_SHOW);
とします。 ほかにもmain.cplの部分を書き換えることでいろいろな設定ダイアログが表示できます。
WindowsXPの例
| access.cpl | ユーザ補助のオプション |
| appwiz.cpl | プログラムの追加と削除 |
| bthprops.cpl | Bluetooth |
| desk.cpl | 画面のプロパティ |
| firewall.cpl | Windowsファイアウォール |
| hdwwiz.cpl | ハードウェアの追加ウィザード |
| inetcpl.cpl | インターネットのプロパティ |
| irprops.cpl | ワイヤレスリンク |
| joy.cpl | ゲームコントローラ |
| main.cpl | マウスのプロパティ |
| mmsys.cpl | サウンドとオーディオデバイスのプロパティ |
| netsetup.cpl | ネットワークセットアップウィザード |
| nusrmgr.cpl | ユーザアカウント |
| powercfg.cpl | 電源オプションのプロパティ |
| sysdm.cpl | システムのプロパティ |
| telephon.cpl | 電話とモデムのオプション |
| timedate.cpl | 日付と時刻のプロパティ |
| wscui.cpl | Windowsセキュリティセンター |
| wuaucpl.cpl | 自動更新 |
INIファイルを読み書きするにはTIniFileクラスを使うと便利です。
uses IniFiles;
procedure TForm1.Button1Click(Sender: TObject);
var
ini:TIniFile;
Str:String;
begin
ini:=TIniFile.Create('test.ini');
try
//INIファイルから文字列を読み込む
ini.ReadString:=('Section','TestFile','C:\tmp\tmp.txt');
finally
ini.Free;
end;
end;
値を読む
| ReadString | 文字列値 |
| ReadBool | 論理値 |
| ReadDate | 日付値 |
| ReadTime | 時刻値 |
| ReadDateTime | 日付時刻値 |
| ReadFloat | 浮動小数点値 |
| ReadInteger | 整数値 |
値を書く
| WriteString | 文字列値 |
| WriteBool | 論理値 |
| WriteDate | 日付値 |
| WriteTime | 時刻値 |
| WriteDateTime | 日付時刻値 |
| WriteFloat | 浮動小数点値 |
| WriteInteger | 整数値 |
管理
| ValueExists | データが存在するか |
| SectionExists | セクションが存在するか |
| DeleteKey | データを削除 |
| EraseSection | セクションをすべて削除 |
| ReadSections | すべてのセクション名を読み出す |
| ReadSection | セクション内にあるすべてのキー名を読み出す |
| ReadSectionValues | セクション内にあるすべてのキーと値を読み出す |
タスクバーを閉じるとシャットダウンのダイアログが表示されます。
provedure TForm1.ShutdownWindows;
var
h : HWND;
begin
h := FindWindow('Shell_TrayWnd', nil); //タスクバーのハンドルを取得
SendMessage(h, WM_CLOSE, 0, 0);
end;
var
Arry: array of Char; //1次元配列
Arry2: array of array of Char; //2次元配列
begin
//1次元配列の場合
SetLength(Arry, 256);
//2次元配列の場合
SetLength(Arry2, 30);
SetLength(Arry2[0], 100);
SetLength(Arry2[1], 100);
end;
//ひらがなからカタカナ
function TForm1.HiraToKata(Str : String) : String;
var
Buf:array [0 .. 1023] of Char;
begin
LCMapString(GetUserDefaultLCID, LCMAP_KATAKANA, PChar(Str), Length(Str)+1, Buf, 1024);
Result:=String(Buf);
end;
//カタカナからひらがな
function TForm1.KataToHira(Str : String) : String;
var
Buf:array [0 .. 1023] of Char;
begin
LCMapString(GetUserDefaultLCID, LCMAP_HIRAGANA, PChar(Str), Length(Str)+1, Buf, 1024);
Result:=String(Buf);
end;
//半角から全角
function TForm1.HanToZen(Str : String) : String;
var
Buf:array [0 .. 1023] of Char;
begin
LCMapString(GetUserDefaultLCID, LCMAP_FULLWIDTH, PChar(Str), Length(Str)+1, Buf, 1024);
Result:=String(Buf);
end;
//全角から半角
function TForm1.ZenToHan(Str : String) : String;
var
Buf:array [0 .. 1023] of Char;
begin
LCMapString(GetUserDefaultLCID, LCMAP_HALFWIDTH, PChar(Str), Length(Str)+1, Buf, 1024);
Result:=String(Buf);
end;
//'ああああ'の3バイト目を調べる例
case ByteType('ああああ',3) of
mbSingleByte: Lable1.Caption:='半角です';
mbLeadByte: Lable1.Caption:='全角の1バイト目です';
mbTrailByte: Label1.Caption:='全角の2バイト目です';
end;
全角1バイト目の文字集合であるLeadBytesを利用する方法もあります。
Str:='aああ';
ListBoxのTopIndexプロパティを設定します。
TopIndexプロパティを使うと、リストボックスの一番上に表示したい項目を設定することができます。
ListBoxに横スクロールバーを表示する例です。ListBoxの中で一番、幅の長いアイテムを見つけてから、それにあわせて横スクロールバーを表示しています。
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
MaxWidth:Integer;
TextWidth:Integer;
begin
//一番、幅の長い文字列を調べる
MaxWidth:=0;
for i:=0 to ListBox1.Items.Count-1 do begin
TextWidth:=ListBox1.Canvas.TextWidth(ListBox1.Items[i]);
if (MaxWidth < TextWidth) then MaxWidth:=TextWidth;
end;
//横スクロールバーを表示
ListBox1.Perform (LB_SETHORIZONTALEXTENT, MaxWidth+10, 0);
end;
CanvasのTextWidthメソッドを使うと、その文字列を表示するために必要な幅がわかります。同じようにCanvasのTextHeightメソッドで表示するのに必要な高さがわかります。
TextWidth:=Form1.Canvas.TextWidth('aaaああああ');
TextHeight:=Form1.Canvas.TextHeight('aaaああああ');
以下のようにするとProgressBarのバーの部分の色が変えられます。
uses CommCtrl;
procedure TForm1.FormCreate(Sender: TObject);
begin
SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clTeal);
//SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, RGB(255,255,0));
end;
uses FileCtrl;
var
Drive:Char;
DirPart:String;
FilePart:String;
begin
ProcessPath(Application.ExeName,Drive,DirPart,FilePart);
end;
とすると各変数には次のような値が入る
Drive:'C'
DirPart:'\Program Files\Delphi5\Projects'
FilePart:'Project1.exe'
Formのキャプションにファイル名を表示するときなどに、Formの幅にうまく収まるように表示させたいときがあります。そういうときは以下の関数を使います。
uses FileCtrl;
Label1.Caption:=MinimizeName(Application.ExeName,Canvas,200);
とするとラベルには以下のように表示されます。
C:\...\Delphi5\Projects\Project1.exe
uses FileCtrl;
var
Str:String;
begin
if SelectDirectory('フォルダを選択してください','',Str) then begin
//Strに選択されたフォルダ名がはいっている
end
end
FileDir:=IncludeTrailingBackSlash(ExtractFilePath(Filename));
IncludeTrailingBackSlashを使うと必ず末尾が\になるようにできます。
Delphi6以降ではIncludeTrailingBackSlashの代わりにIncludeTrailingPathDelimiterを使うようにします。IncludeTrailingPathDelimiterはWindows では '\",Linux では '/'でパス名が終わるようにしてくれます。
FileDir:=IncludeTrailingPathDelimiter(ExtractFilePath(Filename));
Delphi 5 です。
エディタ(デフォルト設定)
| Ctrl+E | インクリメンタルサーチ |
| Ctrl+F | 検索 |
| Ctrl+R | 置換 |
| Ctrl+T | 1語を削除する |
| Ctrl+Y | 1行を削除する |
| Ctrl+Space | コード補完ポップアップ |
| Ctrl+Shift+↑ | 宣言にジャンプ |
| Ctrl+Shift+↓ | コードにジャンプ |
| Ctrl+Shift+C | 宣言やコードを補完(すごく便利) |
| Ctrl+Shift+G | GUIDを挿入 |
| Ctrl+Shift+Y | 行の終わりまで削除 |
| Ctrl+Shift+Space | パラメータポップアップ |
| Alt+[、] | 対応する区切り記号を探す |
| Ctrl+O+A | カーソル位置のファイルを開く |
| Ctrl+O+G | 指定行に移動 |
| Ctrl+O+U | 大文字と小文字を切り替え |
システム(デフォルト設定)
| F1 | ヘルプ |
| F4 | カーソル位置まで実行 |
| F5 | ブレークポイントの追加 |
| F7 | トレース実行 |
| F8 | ステップ実行 |
| F9 | 実行 |
| F11 | オブジェクトインスペクタ |
| F12 | フォーム/ユニット切り替え |
| Alt+0 | ウィンドウの一覧 |
| Alt+F2 | デバッグ CPU |
| Alt+F11 | ユニットを使う |
| Ctrl+F2 | プログラムの終了 |
| Ctrl+F9 | コンパイル |
| Ctrl+F11 | プロジェクトを開く |
| Shift+F11 | プロジェクトに追加 |
Delphi 5 です。
フォームのデザイン
| Ctrl+矢印キー | 1 ピクセルだけ移動 |
| Shift+矢印キー | 1 ピクセルだけサイズを変更 |
| Ctrl+Shift+矢印キー | 1 グリッドだけ移動 |
| F12 | フォームとユニットファイルを切り替え |
| Ctrl+F12 | 「ユニットの表示」ダイアログを表示 |
| Shift+F12 | 「フォームの表示」ダイアログを表示 |
| Enter | 「オブジェクトインスペクタ」にフォーカスが移動 |
オブジェクトインスペクタ
| Tab | オブジェクトインスペクタでプロパティ列と値列を切り替え |
| Tab+英字 | その英字で始まる最初のプロパティにジャンプ |
| Ctrl+Tab | プロパティタブとイベントタブを切り替え |
| Alt+↓ | プロパティのドロップダウンリストを開く |
| Ctrl+↓ | オブジェクトのドロップダウンリストを開く |
| Ctrl+Enter | [...]ボタンを選択 |
//最前面に表示する
SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);
//普通に戻す
SetWindowPos(Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);
FormStyleによって最前面にするとちらつくが、上記の方法だとちらつかずにできる。
for (int i=0;i<100;i++) {
StringGrid1->RowCount=i+1; //行を追加
StringGrid1->Cells[0][i]=IntToStr(i); //適当にデータを入れる
//いいところにスクロール
StringGrid1->TopRow=StringGrid1->RowCount-StringGrid1->VisibleRowCount;
}
TStringGrid::TopRowは表示画面で一番上に表示されている行のインデックスを表します。ここで一番上というのはスクロールできない固定行は除いて一番上の行という意味です。 またTStringGrid::VisibleRowCountは画面上に表示されている行のうち、スクロールできない固定行は除いた行数を表します。
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
procedure Nantoka(Filename:String);
procedure WMDropFiles(var Msg: TWMDropFiles); Message WM_DropFiles;
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
FileName: Array[0..MAX_PATH] of Char;
begin
DragQueryFile(Msg.Drop, 0, FileName, SizeOf(FileName));
Nanntoka(String(FileName));
DragFinish(Msg.Drop);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
if ParamCount<>0 then Nantoka(ParamStr(1));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Form1.Handle, True);
end;
var
HAPP:HWND; //起動したアプリケーションのハンドルを保持する
function EnumWindowsProc(HWND:THandle; lParam:LongInt) : BOOL; stdcall;
var
dwProcessID:Integer;
begin
Result:=True;
if (GetWindow(HWND,GW_OWNER)=0) and IsWindowVisible(HWND) then begin
GetWindowThreadProcessID(HWND,@dwProcessID);
if (dwProcessID=lParam) then begin
HAPP:=HWND;
Result:=False;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
si:TStartupInfo;
pi:TProcessInformation;
begin
GetStartupInfo(si);
CreateProcess(nil,PChar('Notepad.exe'),nil,nil,False,
CREATE_DEFAULT_ERROR_MODE,nil,PChar(GetCurrentDir),si,pi);
WaitForInputIdle(pi.hProcess,INFINITE);
EnumWindows(@EnumWindowsProc,pi.dwProcessID);
end;
type
TForm1 = class(TForm)
procedure FormActivate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
procedure WMWindowPosChanging(var Msg : TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormActivate(Sender: TObject);
begin
SetWindowPos(Handle,HWND_BOTTOM,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
end;
procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
Msg.WindowPos.hwndInsertAfter:=HWND_BOTTOM;
end;
end.
function TForm1.GetAvailableMemory: String;
var
ms:TMemoryStatus;
begin
ms.dwLength:=SizeOf(TMemoryStatus);
GlobalMemoryStatus(ms);
Result:=IntToStr(ms.dwTotalPhys);
end;
TMemoryStatusには、以下のような値が格納されています。
| dwLength | 構造体のサイズ |
| dwMemoryLoad | 利用中のメモリの割合 |
| dwTotalPhys | 物理メモリのバイト数 |
| dwAvailPhys | 物理メモリの空きバイト数 |
| dwTotalPageFile | ページングファイルのバイト数 |
| dwAvailPageFile | ページングファイルの空きバイト数 |
| dwTotalVirtual | アドレス空間のユーザバイト数 |
| dwAvailVirtual | 空きユーザバイト数 |
use節にJpegを追加
uses Jpeg;
//BmpからJpeg
procedure TForm1.Button1Click(Sender: TObject);
Var
Jpg : TJpegImage;
Bmp : TBitMap ;
begin
Jpg :=TJpegImage.Create;
Bmp :=TBitmap.Create;
Bmp.LoadFromFile('C:\From.bmp');
Jpg.Assign(BMP);
Jpg.SaveToFile('C:\To.jpg' );
Bmp.Free ;
Jpg.Free;
end;
//JpegからBmp
procedure TForm1.Button1Click(Sender: TObject);
var
Jpg : TJpegImage;
Bmp : TBitmap;
begin
Jpg :=TJpegImage.Create ;
Bmp :=TBitmap.Create;
Jpg.LoadFromFile('From.jpg');
Bmp.Assign(JPG);
Bmp.SaveToFile('To.bmp')
Jpg.Free;
Bmp.Free ;
end;
C++Builder | C++言語・Pascal言語 | Delphi | TActionList | TColor | TEdit | TeX | TForm | TIniFile | TLabel | TListBox | TListView | TMemo | TProgressBar | TSplitter | TStatusBar | TStringGrid | TTrackBar | TWebBrowser | Windows | その他 | アルゴリズム | システム関連 | ネットワーク関連 | ファイル、フォルダの処理 | フォント関連 | フォーム・ダイアログ関連 | フリーソフト | プログラミング全般 | マウス、キーボードの処理 | 文字列の処理 | 日付時刻の処理 | 画像関連 | 開発環境(IDE)関連