2019年9月23日月曜日

【MySQL】連番の振り直し

MySQL には「updte ... order by」という方言があるので、番号の振り直しがとても簡単。
@seq := 0;
  update [tablename] set SEQ=(@seq:=@seq+1)
  where [condition...]
  order by [order keys...]

こういう方言は、ありがたい。

2018年3月26日月曜日

USB音源の作り方

車を買い替えたら、マニュアルにUSB音源からの再生ができると書かれている。しかしUSB音源なるものをどのように作成するかの情報は車のマニュアルには載っていない。作業は以下のとおり。
PCの音楽プレイヤーは MusicBee を使っている。iTunes も入っているが、これでは作成できなかった。

A.USB音源の作り方
1.MusicBee を起動し、出力するアルバム、プレイリストまたは曲を選択する。
2.「メニュー→ツール→フォーマットの変換」を選択。
3.「ファイルコンバータ」画面が表示されるので、
 a)エンコード形式(AAC)を確認
 b)「新規フォルダに出力」を選択し、出力先(USBデバイス;例 E\)を選択
 c)「サブフォルダとファイル名を整理する」をチェックしておくと曲ファイル(.m4a)は「アーティスト名→アルバム名」のフォルダ構造の下に作成される。自分でフォルダーを管理することもできる。
 d)〔 進む 〕をクリック
 e)メッセージ欄に進行状況が表示され、最後に「ファイル変換が完了しました」と表示される。


B.プレイリストの作り方
「プレイリスト」を選択して出力しても音源本体が出力されるだけで、プレイリスト自体は自動的には作成されない。自分で作る必要がある。
1.USBドライブ直下にフォルダー「Playlists」を作る。
2.テキストエディタ(メモ帳でOK)を開き、1行1曲で音源へのパスを指定する。
 例)
  ..\いきものがかり\超いきものばかり Disc1\1-01 SAKURA.m4a
  ..\いきものがかり\超いきものばかり Disc1\1-04 茜色の約束.m4a
  ..\いきものがかり\超いきものばかり Disc2\2-07 YELL.m4a
3.フォルダー「Playlists」の下に任意の名前でプレイリスト・ファイルとして保存する。その際、文字コートは  UTF-8、拡張子は「.m3u」とする。
 例:「いきものがかりセレクション.m3u」

2017年10月24日火曜日

【PHP】パスワード生成

パスワードを生成する、ちょっとだけ凝った関数を作ってみた。
特徴と制限  :
1.大文字・小文字・数字と記号をバランスよく含む。
2.始めの文字を大文字または小文字に限定できる。
3.各文字は重複出現しない。
4.50桁程度まで。


  function genpass( $siz=8, $symb=True, $mode='' ) {
  //Returns random letters, numbers and symbols. Each element appears once.
  // $siz  : size of password generated; should not be bigger than element size(49 + symbols).
  // $symb : True .. symbols are included
  // $mode : A .. start with Upper alphabetic; a .. with Lower alphabetic; // '' (default) .. start with Upper or Lower alphabetic; // other .. no restriction; 
    //allowed letters and symbols
    $symbase = ['!','#','$','%','&','+','/','=','-'];
    $upper = array_merge( range('A', 'N'), range('P', 'Z'));        //omit 'O'
    $lower = array_merge( range('a', 'k'), range('m', 'z'));        //omit 'l'
    $symbs = array_merge(( $symb ? $symbase : [] ), range(1, 9));   //omit '0'
    //allot occurrence of upper, lower, and num+symbol
    $sizU = max( 2, intval( $siz * 0.3 ));    
    $sizL = max( 2, intval( $siz * 0.4 ));    
    $sizS = max( 1, $siz - ( $sizU + $sizL ));
    //get password members; can be shorter than siz when siz is big
    shuffle( $upper );  $upper = array_slice( $upper, 0, $sizU );
    shuffle( $lower );  $lower = array_slice( $lower, 0, $sizL );
    shuffle( $symbs );  $symbs = array_slice( $symbs, 0, $sizS );
    //get first letter
    switch ( $mode ) {
      case 'A' :  //start with upper
        $fch = array_shift( $upper );
        break;
      case 'a' :
        $fch = array_shift( $lower );
        break;
      default:
        $fch = '';
        break;
    }
    //merge everything and shaffle
    $pasbase = array_merge( $upper, $lower, $symbs );    shuffle( $pasbase );
    if ( ''===$mode ) {
      while( ! ((('a'<=$pasbase[ 0 ])&&($pasbase[ 0 ]<='z')) || (('A'<=$pasbase[ 0 ])&&($pasbase[ 0 ]<='Z')))) {
        $elm = array_shift( $pasbase );
        $pasbase[] = $elm;
      }
    }
    return $fch . implode( $pasbase );
  }


テスト結果 :
Z6chV9yDg-
Z7cgqtB%V8
WFc-=gv4Ny
V9j3oT%rWq
MzkqNP4f53

zM=Ff!wjL6
r!G1mRJe6x
tQv63Pi=Zh
pA8X3iPxa%
etWv9#KhU7

2017年6月21日水曜日

【 Wordpress 】the_title() で付加される公開状態を削除する

Wordpress の the_title() や get_the_title() で投稿のタイトルを取得すると、頭に「非公開: 」といった余分な情報が付加されるという不快・おせっかいな仕様になっている。
幸い、フィルターが用意されているので、これで削除することができる。
以下を functions.php に追加する :

  function remove_category_from_title( $format ) {
  /* 投稿の公開状態が protected や private であった場合、タイトルの前に公開状態が追加されるので、
   * これを表示させない。 */
    return $'%s';
  }

  add_filter( 'private_title_format', 'remove_category_from_title');

クラスでは add_filter をコンストラクタに書く :
  add_filter( 'private_title_format', [$this, 'remove_category_from_title']);


2017年4月28日金曜日

【 Wordpress】ユーザー登録の姓名の表示順をどうするか

問題点

Wordpressの標準日本語翻訳ではFrist Name = 名、Last Name = 姓 と、『意味的』に正しい翻訳になっている。このため、ユーザプロフィールの表示・編集画面では 名(Frist Name)・姓(Last Name)の順に表示され、これを日本式に逆転する機能は用意されていないので非常に違和感がある。

解決策の検討

もっとも簡単な解決策は「気にしない」である。利用者が限られている場合は我慢してもらうことを選択肢から排除する必要はないだろう。しかし一般ユーザが登録するサイトではそうもいかない。
ネット上で多く提案されている解決策は、JavaScriptによってユーザプロフィール画面の名・姓の表示順を入れ替えるものである。また、これはプラグイン「last_name_first_name」を採用することでコードを書くことなく簡単に実現できる。

使い方は簡単で、プラグインをインストールして有効化するだけ。設定等は何もない。このプラグインはWordpress本体に関しては十分に実用的な解決策だが、姓名を扱う他のプラグインを使用するサイトでは同様の問題を解決する必要がある。

2017年4月5日水曜日

【 Excel 】シートの最後のセル(xlLastCell)をリセットする

シートの行や列を削除しても使用範囲(UsedRange)は元の範囲のままとなっており、実際の使用範囲を反映するように手動で調整するのは面倒である。
これをプログラムで行う。

Sub ResetLastCell()
' シートの xlLastCell の位置を再調整する
' 削除範囲にデータがあっても確認せずに削除するので、注意。
'【 使い方 】LastCell にしたいセルを選択して呼び出す。実行後、ブックを開き直すこと。
  Dim wCell As Range, wRet As Integer
  Dim wNewRow As Long, wNewCol As Long, wCurRow As Long, wCurCol As Long
 
  Set wCell = ActiveCell
  wRet = MsgBox( _
          wCell.Address + "を LastCell にします。" + vbCrLf  + vbCrLf + _
          "他のセルを指定するには「No」を押してください。", _
          vbYesNoCancel, "LastCell の位置を再調")
  If (wRet = vbCancel) Then GoTo ResetLastCellExit
  If (wRet = vbNo) Then
    Set wCell = Application.InputBox(Prompt:="新しい LastCell を選択してください。", Type:=8)
    If (wCell Is Nothing) Then GoTo ResetLastCellExit
    On Error GoTo 0
  End If
  wCell.Parent.Activate
  wNewRow = wCell.Row + 1:    wNewCol = wCell.Column + 1
  Set wCell = wCell.SpecialCells(xlLastCell)
  wCurRow = wCell.Row:    wCurCol = wCell.Column
  ' 削除による参照先エラーを避けるため、Cells で指定する。
  If (wCurRow > wNewRow) Then           ' 行を調整
    Range(Cells(wCurRow, wCurCol), Cells(wCurRow, wCurCol)).EntireRow.Cut Destination:=Range(Cells(wNewRow, wNewCol), Cells(wNewRow, wNewCol)).EntireRow
    Range(Cells(wNewRow, wNewCol), Cells(wCurRow, wCurCol)).EntireRow.Delete Shift:=xlUp
  End If
  If (wCurCol > wNewCol) Then           ' 列を調整
    Range(Cells(wCurRow, wCurCol), Cells(wCurRow, wCurCol)).EntireColumn.Cut Destination:=Range(Cells(wNewRow, wNewCol), Cells(wNewRow, wNewCol)).EntireColumn
    Range(Cells(wCurRow, wCurCol), Cells(wNewRow, wNewCol)).EntireColumn.Delete Shift:=xlLeft
  End If
  MsgBox "ブックを保存し、開き直してください。", vbOKOnly
ResetLastCellExit:
End Sub


2017年3月13日月曜日

【Excel】 Range のサブレンジを返す

以下の関数はRange の部分範囲を返す。範囲は基準となる Range に対して「開始行、開始列、終了行、終了列」を 0 から始まるオフセット値で指定する。

Function SubRangeOf(wRng As Range, wBgnRow As Long, wBgnCol As Long, Optional wEndRow As Long = 0, Optional wEndCol As Long = 0) As Range
' wRng.Cells(wBgnRow, wBgnCol)~wRng.Cells(wEndRow, wEndCol) の範囲を返す。
' wEndRow、wEndCol を省略すると wRng の右下までを返す。

  Set SubRangeOf = Nothing
  If ((wEndRow <= 0) Or (wEndRow > wRng.Rows.Count)) Then wEndRow = wRng.Rows.Count
  If ((wEndCol <= 0) Or (wEndCol > wRng.Columns.Count)) Then wEndCol = wRng.Columns.Count

  If ((wBgnRow <= wEndRow) And (wBgnCol <= wEndCol)) Then
    Set SubRangeOf = wRng.Offset(wBgnRow - 1, wBgnCol - 1).Resize(wEndRow - wBgnRow + 1, wEndCol - wBgnCol + 1)
  End If
End Function


使い方 :
set RepoWindow = Range("C16:P25")
'RepoWindow の2行目の5列目から右下までをクリア
SubRangeOf(RepoWindow , 2, 5).ClearContents

2016年11月16日水曜日

【PHP】 「今日は今年の何日目?」と、property の readonly 属性

1) 「今日は今年の何日目?」を返す機能が見つからなかったので、作ってみた。
2) PHP の property には readonly 属性がないので、作ってみた。

class myDateTime extends DateTime {

  function __get($name) {
    //プロパティの取得
    switch ($name) {
      case 'days':
        return $this->getDays();
        break;
      default:
        throw new Exception('undefined propery : '.$name);
        break;
    };
  }

  function __set($name, $value) {
    // readonly の実装
    switch ($name) {
      case 'days':
        //これがないと __get で定義された property も値を変更できる
        throw new Exception('readonly propery : '.$name);
        break;
      default:
        //このクラスで定義されていない property はエラーとする
        throw new Exception('undefined propery : '.$name);
        break;
    };
  }

  private function getDays() {
    //基準日の元旦を 0 として、何日目かを返す
    $base = new DateTime($this->format('Y').'-1-1');
    return $this->diff($base)->days;
  }
}
?>

※※※ 使い方 ※※※

  $date = new myDateTime();
  echo '今日は今年の '.($date->days + 1).' 日目です。';
  $date = new myDateTime("2016-12-31");
  echo '2016 年は '.($date->days + 1).' 日あります。';
?>

2016年10月31日月曜日

メモ : 光合成

植物を構成するCHONのOは空気ではなく水からきている。
さらに、1941年、ルーベン(S. Ruben)とケーメン(M, D. Kamen)は、酸素の同位体18Oを用いて、光合成で生じる酸素分子が水分子の酸素原子に由来し、二酸化炭素中の酸素原子には由来しないことを証明している。 (p.42)

光合成は・・・水と二酸化炭素を原料にして、光のエネルギーで酸素とデンプンを作り出すはたらきである。この化学式は12H2O + 6CO2 → C6H12O6 + 6O2 + 6H2Oさて、植物のはき出す酸素は、光合成前の二酸化炭素分子からくるのだろうか、それとも水分子からくるのだろうか?植物は「二酸化炭素を取り入れ酸素をはき出す」ので、二酸化炭素CO2の分子から酸素原子Oが取り出されて酸素O2を発生させると考えがちであるが、そうではない。p.42で述べたルーベンとケーメンの実験により、そのことが実証されている。 (p.44)
一部表現は引用者が編集》

『「人工光合成」とは何か』(光化学協会・井上晴夫; ブルーバックス)





2016年10月4日火曜日

【wordpress】 プラグインのクラス化

ショートコードで呼べるプラグインを作るのはとても簡単 :
(以下、機能文字は全角で記載してあるので、半角に読みかえること。)

1.(site)\wp-content\plugins\ の下にフォルダーを作る。プラグイン名と同じがよい。
2.そこに「プラグイン名.php」をつくる。 例 : my_plugin_1.php
3.内容はこんな感じ :

<?php
/**
Plugin Name: my plugin 1
Plugin URI:
Description: my test plugin no_1.
Author: Author Name
Author URI:
Text Domain:
Domain Path:
Version: 0.0.0
*/
add_shortcode("show_my_plugin_1", "my_plugin_1_page");

function my_plugin_1_page() {
  return ’<p>何かのコンテンツ</p>’;
}

4.ダッシュボードのプラグイン一覧を開くと、「my plugin 1」が載っているので、有効化する。表示されている名称はコード冒頭の「Plugin Name」で指定したもの。
5.投稿中に [show_my_plugin_1  と書くと、「何かのコンテンツ」が表示される。


これをクラスにするにはこんな感じ :

class myPlugin1Class {

  public function __construct() {
    //コンストラクタで add_shortcode する。
    //以下の、配列にして $this を渡すことがミソ。
    add_shortcode("show_my_plugin_1", array($this, "my_plugin_1_page"));
  }
  public function my_plugin_1_page() {
    return ’<p>何かのコンテンツ</p>’;
  }

}
//インスタンスを生成; 変数への保存は不要
new myPlugin1Class();

6.例によって、「ミソ」を発見するのに一苦労あったので、メモ。




2016年9月5日月曜日

【PHP】 関数・メソッドのパラメタとして配列を渡した場合の処理

こういう説明は、検索してもなかなか引っかからない。明快な説明をみつけたので、メモ。

>>>>>>
関数に配列が値渡しの引数として与えられた場合、PHPはその時点ではスタック領域のポインタアドレスを渡している(配列のコピーは作られていない)が、配列に変更があった時点でその配列のヒープ領域がコピーされ別の変数として新しいスタック領域に別のポインタアドレスが保存される。

明示的に参照渡しとして関数に配列が引数として与えられた場合は、配列に変化を加えても新しいスタック領域は確保されず、参照で与えられたポインタアドレスのヒープ領域の配列が変化する。

値渡しであっても参照渡し(ポインタ渡し)であっても,最初の段階ではどちらも参照渡しの状態になるが、明示的に参照渡しをしない限り、配列が変更されたタイミングで元の配列がコピーされ、新しい配列が生成される。
<<<<<<

小さな配列なら変更後の配列を返す関数でも問題ないだろうが、大きくなる場合は注意を要する。

情報元 : http://memo.choimemo.net/?p=441

2015年7月28日火曜日

【Delphi】圧縮・解凍

Mr.X-Ray の下記のサイトに 7-zip32.dll を使用する方法が詳しく載っている。
http://mrxray.on.coocan.jp/Delphi/plSamples/732_Archiver7-ZIP32.htm#03

7-zip のコマンドはパラメタの設定がややこしい。
Mr.X-Ray のオリジナルではサブフォルダーも処理するが、サブフォルダーを無視するには「-r」パラメタを削除する。
またパスワードを付けるには「-pXXXXXXXX」を追加する。

2015年4月21日火曜日

【jQueryMobile】 select で data-native-menu="False" が表示されない

jQueryMobile では<select>に data-native-menu="False" と書くことで独自の選択窓がポップアップするのだが、これが機能しないトラブルに見舞われた。ブラウザのコンソールでソースを表示してみたら select ボタンのリンク先にゴミがついている。
原因は以下のとおり :

2013年8月20日火曜日「php と jQuery mobile の環境でリダイレクト」で書いたように、メインページには
data-url="<?php echo $_SERVER["SCRIPT_NAME"]?>"
のように書くのだが、SCRIPT_NAME ではなく PHP_SELF と書いていた。これはこれで望ましい場合があるのだけれど、select ボタンとは両立しない。

2015年3月26日木曜日

【OpenOffice】 表紙の次のページからページ番号を振るには

OpenOffice の Writer には「ページスタイル」という属性があり、ページスタイルごとにページの設定ができるのだが、この設定の仕方がわかりにくい。

※ 準備
1)「メニュー → 表示 → サイドバー」でサイドバーを表示しておく
2)サイドバーで「スタイルと書式設定」ページを表示し、「ページスタイル」ボタンをクリック

※ 表紙にページ番号を付けない => 表紙ページのページスタイルを「最初のページ」に変更する
1)表紙ページにカーソルを置く
2)「ページスタイル」で"最初のページ"をダブルクリック

※ 次ページからページ番号を振る => 2ページ目以降のページスタイルを「標準」とし、開始ページ番号を1に変更する
 1)2ページ目の本文先頭にカーソルを移動する
 2)「書式」-「段落」
 3)「段落」ダイアログで「体裁」タブをクリック
 4)"区切り"の"ページスタイル付き"をオン
 5)"ページ番号"を"1"にする
 6)「OK」ボタンをクリック

※ フッタの有無を設定する
1)「挿入 → フッター」
2)「最初のページ」はオフ、「標準」はオンに設定

 以下のサイトに説明がある : http://oooug.jp/faq/index.php?faq%2F3%2F150

2015年1月16日金曜日

jQuery Mobile で確認画面へのリンクが機能しない

PHP と jQuery Mobile によるスマホ向けサイトではポップアップ画面等、「role="page"」で定義した第2画面へのリンクが表示されないことがある。jQuery の ajax による画面遷移をサーバ(PHPのプログラム)がサポートするのが本来かもしれないが、ajax を機能停止するのが手っ取り早い。
 <HEAD> に以下のスクリプトを書く :
<script>
$(document).bind('mobileinit', function(){
$.mobile.ajaxEnabled = false; //ChromeではこれだけでOK
$.mobile.ajaxLinksEnabled = false;
$.mobile.pushStateEnabled = false; //IEではこれが必要
});
</script>

2014年12月4日木曜日

【MySQL】 SELECT した結果を直接 SELECT の対象にする例

へ~、こんなこともできるんだ!ネタ。

MySQL を使っている方には「何を今更」かもしれないが、Firebird では動かないのではないか(最新版では試していないが)。

select
  A.GRPID, A.TEAMNAME, Count(A.MEMBERID)
  /* Join して中間テーブルを作成 */
  from (
    select MEMBERID, GRPID,
      (select TEAMNAME from TEAMINFO T where T.MEMBERID=M.MEMBERID) as TEAMNAME
    from MEMBERS M
  ) A
  group by A.GRPID, A.TEAMNAME
;


SELECT が3段になっているケースで、3段目で取得した項目を1段目の GROUP BY で指定できる。

2014年11月25日火曜日

【Excel】 セルの文字データを表す「'」(シングルクォート)を削除する

複数のセルの数式を規則的に変更したくて、
1) とりあえず先頭の「=」を「'=」に置換し、
2) いろいろと置換・編集した結果を、
3) 再び数式に戻そうと、先頭の「'=」を「=」に置換しようとしたら、
・・・残念ながら先頭の「'」はデータとして認識してくれない。
ググってみたらそういう操作はできないらしい。
以下のプログラムを作って解決 :

Sub ChangeToFormula()
' 「=」で始まる文字データを式に変更する
' 操作 : 変更したい範囲を選択して、このマクロを実行

  Dim wCell As Range
 
  For Each wCell In Selection
    If (Left(wCell.Value, 1) = "=") Then
      wCell.Formula = wCell.Value
    End If
  Next wCell
End Sub

2014年11月11日火曜日

【excel vba】 UTF-8 でテキストを入出力する

1.vbaエディタで「ツール → 参照設定」を開き、「Microsoft ActiveX Data Objects 2.8 Library」にチェックが入っていることを確認。

2.クラスモジュール
1)クラスモジュールを作成し、プロパティウィンドウからモジュール名を U8Stream とする。
2)以下のコードを貼りつける。

~~~~~~~~~

Option Explicit
'UTF-8 でテキストファイルを読込み・書き出し
' 参照設定で Microsoft ActiveX Data Objects x.x Library を選択のこと(x.x はバージョン番号)。
'
'使い方 :
'1)読み込み
'Sub test_r()
'  Dim wStream As U8Stream, rx As Long
'
'  Set wStream = New U8Stream
'  wStream.U8SOpen "C:\UserFiles\U8STest.txt", Mode:="r"
'  rx = 1
'  For rx = 1 To 999
'    If (wStream.U8SEOS) Then Exit For
'    ActiveSheet.Cells(rx, 1).Value = wStream.U8SReadText
'  Next rx
'  wStream.U8SClose
'End Sub
'
'2)書き出し
'Sub test_w()
'  Dim wStream As U8Stream, endRow As Long, rx As Long
'
'  Set wStream = New U8Stream
'  endRow = ActiveCell.SpecialCells(xlLastCell).Row
'  wStream.U8SOpen "C:\UserFiles\U8STest_w.txt"
'  For rx = 1 To endRow
'    wStream.U8SWriteText ActiveSheet.Cells(rx, 1).Value
'  Next rx
'  wStream.U8SClose
'End Sub

Private pFNam As String
Private pStream As Object
Private pBOM As Boolean
Private pModeInput As Boolean

'ストリームを開く
Public Function U8SOpen(ByVal FNam As String, _
    Optional ByVal Mode As String = "w", _
    Optional ByVal BOM As Boolean = False, _
    Optional ByVal Charset As String = "UTF-8", _
    Optional ByVal LineSeparator As Integer = adCR) As Boolean
'  FNam         : ファイル名
'  Mode         : Read or Write (第一文字で判定;小文字可)
'  BOM          : True = pBOM あり、False = なし(デフォルト)
'  Charset      : 文字セットの名称
'  LineSeparator: 行区切り文字; CR .. 13, LF .. 10, CRLF .. -1
  U8SOpen = False
  pFNam = FNam:  pBOM = BOM
  pModeInput = (LCase(Left(Mode, 1)) <> "w")
  Set pStream = New ADODB.Stream
  'Initialize the stream
  With pStream
    .Open
    .Type = adTypeText
    .Position = 0
    .Charset = Charset
    .LineSeparator = LineSeparator
  End With
  If (pModeInput) Then
    pStream.LoadFromFile (pFNam)
  End If
  U8SOpen = True
End Function

'ストリームからテキストを行単位で入力
Public Function U8SReadText() As Variant
  U8SReadText = False
  If (Not (pModeInput)) Then
    Err.Raise Number:=9990, Description:="書き出しストリームとして開かれています。"
  End If
  If (Not (pStream.EOS)) Then
    U8SReadText = pStream.ReadText(adReadLine)
  End If
End Function

'ストリームの終了をチェック
Public Function U8SEOS() As Boolean
  U8SEOS = pStream.EOS
End Function

'ストリームにテキストを出力
Public Function U8SWriteText(aStr As String) As Boolean
  U8SWriteText = False
  If (pModeInput) Then
    Err.Raise Number:=9991, Description:="読み込みストリームとして開かれています。"
  End If
  pStream.WriteText aStr, adWriteLine   'supply line sep.
  U8SWriteText = True
End Function

'ストリームを解放
Public Function U8SClose() As Boolean
  '出力モードではストリームをファイルに上書きで保存する。
  U8SClose = False
  If (pModeInput) Then
    'for Read mode .. nothing to do here.
  Else
  'for Write mode ..
    'ストリームをファイルに保存し、解放する
    If (Not pBOM) Then    'delete BOM
      Dim byteData() As Byte
      With pStream
        .Position = 0
        .Type = adTypeBinary
        .Position = 3
        byteData = pStream.Read
        .Close
        .Open
        .Write byteData
      End With
    End If
    pStream.SaveToFile pFNam, adSaveCreateOverWrite
  End If
  Set pStream = Nothing
  U8SClose = True
End Function

~~~~~~~~~

2014年9月13日土曜日

【Delphi, Firebird】今さらながら、Devartのドライバでdbexpressに接続

設計時には問題なく接続できていたのに、実行したら
「不明なドライバです: DevartInterBase」
と出る。
動いているプログラムと見比べても悪い所がなかなか見つからない。

uses に DbxDevartInterbase を追加しなければいけなかったのだ。3時間ほども無駄にしてしまった。
Readme.html にはそんな記述がないが、最初に見つけたときはどうしたのだったか。

2014年7月28日月曜日

[Delphi]StringGrid の列幅を設計時の設定する

StringGrid は個々の列幅を設定するプロパティがないので、通常は実行時の OnCreate 等で
|  with StringGrid1 do begin
|    ColWidths[0] := 24;  ColWidths[1] := 64;  ・・・
|  end;
のように列幅の設定をしていると思うが、自分で書いたプログラムでは設計時にちゃんと列幅が設定されているではないか。どうやったのか思い出せなくてググってみたが適切な記事にヒットしない。出来ている StringGrid をテキスト表示してみたらわかりました。フォームをテキスト表示にしてエディタで編集するだけ。
| object StringGrid1: TStringGrid
|   Left = xxx
|   ・・・
|   ColWidths = ( 64 80 240 32 ・・・)  ← のように!
| end