Sign in Join
Wiki copytemporary

Adventures of a Newbie/ja: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-**日本語版メニュー**
2----
3-[[Main Page/ja|メインページ]] \- [[Lazarus Documentation/ja|Lazarus Documentation日本語版]] \- [[Japanese Localization Notes|翻訳ノート]] \- [[Bug Tracking/ja|日本語障害情報]]
4-
5-私は貴方と同じように初心者です(なんとか使えるようになってからまだたったの五日目)。それが、この文章を書いている理由です。初心者の私はいろんな問題にぶち当たり、これじゃあ途上で倒れてしまった人たちがいるだろうなあと思いました。別に私がみんなより天分に恵まれているとか優秀であるとかいう訳ではなく、単に現実的だったんです。碌でもないことに私は MS Windows からの移行組で、Linux の上で Lazarus を学んでいます。何より最悪なことは、これまで Delphi の経験がなかった、という点です。
6-
7-## Contents
8-
9- * 1 着手
10- * 1.1 インストール
11- * 1.2 IDE の起動
12- * 1.3 正しいメーリングリストを見つけた
13- * 1.4 表示の変更
14- * 2 SQLdbを使う
15- * 3 Add a Login Screen
1+私は貴方と同じように初心者です(なんとか使えるようになってからまだたったの五日目)。それが、この文章を書いている理由です。初心者の私はいろんな問題にぶち当たり、これじゃあ途上で倒れてしまった人たちがいるだろうなあと思いました。別に私がみんなより天分に恵まれているとか優秀であるとかいう訳ではなく、単に現実的だったんです。碌でもないことに私は MS Windows からの移行組で、Linux の上で Lazarus を学んでいます。何より最悪なことは、これまで Delphi の経験がなかった、という点です。
162
173## 着手
184
195### インストール
206
21-私は SUSE 10.0 を使っています。これは大事な点です。というのも、Novell SUSE は Gnome をサポートする開発用ライブラリをインストールしないからです。実際の所、ほとんどの Linux ディストリビューションは開発用ライブラリをデフォルトではインストールしないのではありませんか。さらにまずいことに、SUSE のデフォルトウィンドウマネジャは KDE です。ここでも問題が発生しました。KDE はグラフィックライブラリとして Qt を利用しているのです。おっと、その前に Lazarus はデフォルトでは GTK グラフィックライブラリを利用するということを書いておくべきでした。2006年3月19日現在、Lazarus 用の Qt ライブラリ(KDE は Qtを使います)を開発しようとしているプログラマもいらっしゃいますけどね。
7+私は SUSE 10.0 を使っています。これは大事な点です。というのも、Novell SUSE は Gnome をサポートする開発用ライブラリをインストールしないからです。実際の所、ほとんどの Linux ディストリビューションは開発用ライブラリをデフォルトではインストールしないのではありませんか。さらにまずいことに、SUSE のデフォルトウィンドウマネジャは KDE です。ここでも問題が発生しました。KDE はグラフィックライブラリとして Qt を利用しているのです。おっと、その前に Lazarus はデフォルトでは GTK グラフィックライブラリを利用するということを書いておくべきでした。2006年3月19日現在、Lazarus 用の Qt ライブラリ(KDE は Qtを使います)を開発しようとしているプログラマもいらっしゃいますけどね。
228
23-それで、FPC (Free Pascal Compiler) と Lazarus IDE ファイルをダウンロードする前に、開発用グラフィックライブラリをインストールしなければならないわけです。私の場合は、とても簡単でした。SUSE 10.0 には 'YAST' というユーティリティがあります。YAST を開いてソフトウェアマネジメントのアイコンをつつきます。検索ウィンドウが開き、そこに 'GTK' とタイプして検索します。利用可能な全ての GTK アイテムが表示されるので、全部にチェックを入れてやりました。何が必要なのか全然判っていませんでしたから。YAST が他のパッケージもインストールした方がいいと言ってくるので、OKを押しまくりました。GTK 世界の人なら何が必要なのか正確に分かっているのでしょうが、下手な鉄砲を撃ちまくったのです。単純ですね。
9+それで、FPC (Free Pascal Compiler) と Lazarus IDE ファイルをダウンロードする前に、開発用グラフィックライブラリをインストールしなければならないわけです。私の場合は、とても簡単でした。SUSE 10.0 には 'YAST' というユーティリティがあります。YAST を開いてソフトウェアマネジメントのアイコンをつつきます。検索ウィンドウが開き、そこに 'GTK' とタイプして検索します。利用可能な全ての GTK アイテムが表示されるので、全部にチェックを入れてやりました。何が必要なのか全然判っていませんでしたから。YAST が他のパッケージもインストールした方がいいと言ってくるので、OKを押しまくりました。GTK 世界の人なら何が必要なのか正確に分かっているのでしょうが、下手な鉄砲を撃ちまくったのです。単純ですね。
2410
25-今日、FPC には二つのヴァージョンがあります。私は SUSE 10 からインストールできた方だけしか使えませんでした。しかし Lazarus ウェブサイトでは最新版を入れる方がいいと言われました。
11+今日、FPC には二つのヴァージョンがあります。私は SUSE 10 からインストールできた方だけしか使えませんでした。しかし Lazarus ウェブサイトでは最新版を入れる方がいいと言われました。
2612
27-それで、私は FPC と Lazarus の最新のバイナリをダウンロードしました。つまり、ソースからコンパイルする必要がなかったのです。バイナリは 'RPM' というパッケージに入ってきました。ここでもまた YAST を使って両方のパッケージをインストールしました。FPC のウェブサイトに従って、FPC のソースパッケージもダウンロードしました。YAST を使って FPC と FPC ソースの二つをインストールしたのです。次に、Lazarus のパッケージをインストールしました。ここで YAST が文句を言いました。何かが変だといって、GTK+ ライブラリを探していました。それは少し異なる綴でインストールされていました。そこに気づいたら( YAST はエラーを上書きする方法を提供してくれます)、パッケージをインストールすることができ、そいつはうまく走りました。
13+それで、私は FPC と Lazarus の最新のバイナリをダウンロードしました。つまり、ソースからコンパイルする必要がなかったのです。バイナリは 'RPM' というパッケージに入ってきました。ここでもまた YAST を使って両方のパッケージをインストールしました。FPC のウェブサイトに従って、FPC のソースパッケージもダウンロードしました。YAST を使って FPC と FPC ソースの二つをインストールしたのです。次に、Lazarus のパッケージをインストールしました。ここで YAST が文句を言いました。何かが変だといって、GTK+ ライブラリを探していました。それは少し異なる綴でインストールされていました。そこに気づいたら( YAST はエラーを上書きする方法を提供してくれます)、パッケージをインストールすることができ、そいつはうまく走りました。
2814
29-最初に理解しなければならなかったのは、Lazarus の起動法でした。そう、二つの方法がありました。'startlazarus' と 'lazarus' です。どちらも動きます。'startlazarus' の方が起動が早いようですが。ターミナルウィンドウを開いてどちらかの名前をタイプすればいいのです。あるいはアプリケーションのアイコンを作ることもできます。デスクトップを右クリックしてみてください。
15+最初に理解しなければならなかったのは、Lazarus の起動法でした。そう、二つの方法がありました。'startlazarus' と 'lazarus' です。どちらも動きます。'startlazarus' の方が起動が早いようですが。ターミナルウィンドウを開いてどちらかの名前をタイプすればいいのです。あるいはアプリケーションのアイコンを作ることもできます。デスクトップを右クリックしてみてください。
3016
3117### IDE の起動
3218
33-Lazarus が開きました! もう興奮。ですが、頭が冷えてくると、デフォルトの表示が頭を殴られたくらい気持ち悪いことに気づきました。もちろん、私が比較した相手はこれまで遊んできた kmail のような KDE のプログラムです。なんとかしようと四日間からかいましたよ。後で IDE の見栄えを変える方法を説明することにしましょう。
19+Lazarus が開きました! もう興奮。ですが、頭が冷えてくると、デフォルトの表示が頭を殴られたくらい気持ち悪いことに気づきました。もちろん、私が比較した相手はこれまで遊んできた kmail のような KDE のプログラムです。なんとかしようと四日間からかいましたよ。後で IDE の見栄えを変える方法を説明することにしましょう。
3420
35-次の疑問。IDE をどう使えばいいかです。ヘルプをクリックすると、あるウェブサイトに飛ばされます。細い回線を使っているならサイトが表示されるまで少しかかるでしょう。私の場合はサイトが二日間落ちていました。私の作業も足踏みでした。私はウェブに向かって、Delphi のチュートリアルを読んで、どうすればいいかを探りました。Lazarus は Delphi に似せてありますから。これはかなり有効でしたが、私は大声で言わなければなりません。<Lazarus は Delphi ではない>と。次に私は Lazarus フォーラムと FPC フォーラムに加入しました。ですが、すぐに、どちらも大したことが起きていないことに気づきました。なんといっても、FAQ がないのです。次は Lazarus CCR メーリングリストでした。無人とはいいませんが、がらがら。しばらくの間、自分はどうも死にかけのオープンソースプロジェクトに引っかかったようだなあとおもったものです。そこで、Freenode サーバの IRC Lazarus-ide を試してみました。ここにはかなりのユーザがいました。少なくとも励ましにはなりました。
21+次の疑問。IDE をどう使えばいいかです。ヘルプをクリックすると、あるウェブサイトに飛ばされます。細い回線を使っているならサイトが表示されるまで少しかかるでしょう。私の場合はサイトが二日間落ちていました。私の作業も足踏みでした。私はウェブに向かって、Delphi のチュートリアルを読んで、どうすればいいかを探りました。Lazarus は Delphi に似せてありますから。これはかなり有効でしたが、私は大声で言わなければなりません。<Lazarus は Delphi ではない>と。次に私は Lazarus フォーラムと FPC フォーラムに加入しました。ですが、すぐに、どちらも大したことが起きていないことに気づきました。なんといっても、FAQ がないのです。次は Lazarus CCR メーリングリストでした。無人とはいいませんが、がらがら。しばらくの間、自分はどうも死にかけのオープンソースプロジェクトに引っかかったようだなあとおもったものです。そこで、Freenode サーバの IRC Lazarus-ide を試してみました。ここにはかなりのユーザがいました。少なくとも励ましにはなりました。
3622
3723### 正しいメーリングリストを見つけた
3824
39-親切な方がいて、どのメーリングリストに行けばいいか教えてもらえました。“lazarus@miraclec.com”。そこではもっと多くのトラフィックがありました。普段だと、私は腰をおちつけてメーリングリストを読み、どんな話をしているか空気を読もうとします。ですが、その時はもう Lazarus の問題に振り回されていたので、速攻で質問を始めました。本当に役に立つ返事がありました。今のうちに指摘しておきたいことがあります。確かにメーリングリストは助けになるものではありますが、質問事項に関し、最低限でも多少はググってみていることが当然だとされます。だが、賭けてもいいのですが、貴方はきっと問題にぶち当たるでしょう。それは Lazarus が Delphi とイコールではないからです。また、IRC に参加する場合はとても気を使う必要があります。そこはほとんどが FPC と Lazarus の開発者の場所です。総じて彼らのグループはフレンドリーですが、新参者にはすぐに怒りだします。
25+親切な方がいて、どのメーリングリストに行けばいいか教えてもらえました。“lazarus@miraclec.com”。そこではもっと多くのトラフィックがありました。普段だと、私は腰をおちつけてメーリングリストを読み、どんな話をしているか空気を読もうとします。ですが、その時はもう Lazarus の問題に振り回されていたので、速攻で質問を始めました。本当に役に立つ返事がありました。今のうちに指摘しておきたいことがあります。確かにメーリングリストは助けになるものではありますが、質問事項に関し、最低限でも多少はググってみていることが当然だとされます。だが、賭けてもいいのですが、貴方はきっと問題にぶち当たるでしょう。それは Lazarus が Delphi とイコールではないからです。また、IRC に参加する場合はとても気を使う必要があります。そこはほとんどが FPC と Lazarus の開発者の場所です。総じて彼らのグループはフレンドリーですが、新参者にはすぐに怒りだします。
4026
4127### 表示の変更
4228
43-さて IDE の表示をまともにする方法(あるいは gtk2 を使うように構成する方法)です。まず、その方法をどこで見つけたかを書いておきます。フォーラムで読みました。Lazarus パッケージのインストール法につしてのメッセージです(reportlivreが報告)。メッセージが示唆する所では、認証の問題で、パッケージを入れるにはユーザは「ルート」になる必要があるそうでした。そこでルートとしてログインし、tools->configure Lazarus をクリックしました(訳注: Mac OS X の初期状態では root は利用できないようになっており、sudo コマンドの利用が推奨されています。Lazarus を起動する時に sudo ./lazarus とすればいいはずです)。ダイアログボックスが現れ、グラフィックライブラリをいくつか選択できることが判りました。現在の所、必要な全機能(ほとんどあらゆる機能)を実現できるのは gtk1 と gtk2 だけであり、gtk2 を選んで保存しました。次は tools-> Build Lazarus。リビルドが終わって Lazarus を再起動すれば、まるで別の姿になった Lazzrus が現れます。直ぐに問題が発生しました。Novel SUSE 10.0 はデフォルトでは KDE を利用していることを思い出してください。ボタンとメニューの文字の多くが、下の方が切れていました。ググってみると、Utilities->Desktop->Gnome configuration tool->fonts->details and change the resolution to 93 をすればいいことがわかりました(実際にはこの項目を変更すると、gtk-qt-エンジンを再起動することになります)。で、保存です。これで文字の下切れ問題は解決しましたが、再起動毎にこの操作をする必要があります。今の所解決法はわかりません。そんなにコンピュータをシャットダウンしないので、大して問題だとは感じません。どうも GTK2 を使う Lazarus はあまり安定ではないようです。ツールバーのヘンプヒントのような機能も欠けています。結局 GTK1 に戻してしまいました。
29+さて IDE の表示をまともにする方法(あるいは gtk2 を使うように構成する方法)です。まず、その方法をどこで見つけたかを書いておきます。フォーラムで読みました。Lazarus パッケージのインストール法につしてのメッセージです(reportlivreが報告)。メッセージが示唆する所では、認証の問題で、パッケージを入れるにはユーザは「ルート」になる必要があるそうでした。そこでルートとしてログインし、tools-\>configure Lazarus をクリックしました(訳注: Mac OS X の初期状態では root は利用できないようになっており、sudo コマンドの利用が推奨されています。Lazarus を起動する時に sudo ./lazarus とすればいいはずです)。ダイアログボックスが現れ、グラフィックライブラリをいくつか選択できることが判りました。現在の所、必要な全機能(ほとんどあらゆる機能)を実現できるのは gtk1 と gtk2 だけであり、gtk2 を選んで保存しました。次は tools-\> Build Lazarus。リビルドが終わって Lazarus を再起動すれば、まるで別の姿になった Lazzrus が現れます。直ぐに問題が発生しました。Novel SUSE 10.0 はデフォルトでは KDE を利用していることを思い出してください。ボタンとメニューの文字の多くが、下の方が切れていました。ググってみると、Utilities-\>Desktop-\>Gnome configuration tool-\>fonts-\>details and change the resolution to 93 をすればいいことがわかりました(実際にはこの項目を変更すると、gtk-qt-エンジンを再起動することになります)。で、保存です。これで文字の下切れ問題は解決しましたが、再起動毎にこの操作をする必要があります。今の所解決法はわかりません。そんなにコンピュータをシャットダウンしないので、大して問題だとは感じません。どうも GTK2 を使う Lazarus はあまり安定ではないようです。ツールバーのヘンプヒントのような機能も欠けています。結局 GTK1 に戻してしまいました。
4430
45-次の投稿は、もっと情報のある、プログラミングに関係した内容にするつもりです。
31+次の投稿は、もっと情報のある、プログラミングに関係した内容にするつもりです。
4632
47-John Fabiani
33+John Fabiani
4834
4935## SQLdbを使う
5036
51-まず一番大事なことを一つ。これはチュートリアルではありません。チュートリアルの書き方なんて全然知らないのです。これは我が啓蒙の旅の記録、つまりは SQLdb ユニットの使い方をどうやって覚えたかを書いたものです。SQLdb はフォームに貼付けてデータベースアクセスを可能にするコントロールです。
37+まず一番大事なことを一つ。これはチュートリアルではありません。チュートリアルの書き方なんて全然知らないのです。これは我が啓蒙の旅の記録、つまりは SQLdb ユニットの使い方をどうやって覚えたかを書いたものです。SQLdb はフォームに貼付けてデータベースアクセスを可能にするコントロールです。
5238
53-これは新人が書いているもので、あなたのデータベースには当てはまらない情報を含んでいるかも知れないことをご理解ください。私の場合は Posgtres データベースエンジンを使っています。Posgtres はほとんどのプラットフォーム、つまり Linux と Windows で使うことができ、FPC (Free Pascal Compiler) がサポートするデータベースエンジンの一つです。さて警告はこのくらいにして、始めることにしましょう。
39+これは新人が書いているもので、あなたのデータベースには当てはまらない情報を含んでいるかも知れないことをご理解ください。私の場合は Posgtres データベースエンジンを使っています。Posgtres はほとんどのプラットフォーム、つまり Linux と Windows で使うことができ、FPC (Free Pascal Compiler) がサポートするデータベースエンジンの一つです。さて警告はこのくらいにして、始めることにしましょう。
5440
55-最初に、あなたが私のような状況にあるなら、Delphi 用に書かれたデータベースアクセスツールのコマンド説明書 line descriptions を読み始めているだろうと言わせてください。なぜ Delphi かというと、Lazarus が Delphi の様式を受けついているからです。私の場合、それらの説明書で多少ひらめくものもありましたが、なんとも混乱しまくりでした。Delphi のバージョンによって、ツールとデータアクセス法が異なっていることはすぐにわかりました。BDE、dbexpress、zeoslibのようなツールの参考書は Web のそこら中に転がっています。そのため、それらを読む時に、どのバージョンの Delphi を対象にしているのか、あるいは zeos のようなサードパーティ製の(ボーランド製ではない)ツールの話題なのかを、いつも注意深く確認する必要がありました。Kylix 用の説明にも注意しなければなりません。一番忌々しかったのは、そういった説明の中で使われているテクニカルタームでした -- 曰く clientdatasets, sqlqueries, dbexpress datasets, dataset providers, datasnap, data-aware controls。説明書を読み終えるたびに、Lazarus IDE に向かって、それらのコントロールがないものかと探しました。もちろん、ありませんでした。それで、私はこれ — 「論文」、「ハウツー」、「チュートリアル」、「雄叫び」、お好きな呼び方でどうぞ — を書こうと決心したのです。
41+最初に、あなたが私のような状況にあるなら、Delphi 用に書かれたデータベースアクセスツールのコマンド説明書 line descriptions を読み始めているだろうと言わせてください。なぜ Delphi かというと、Lazarus が Delphi の様式を受けついているからです。私の場合、それらの説明書で多少ひらめくものもありましたが、なんとも混乱しまくりでした。Delphi のバージョンによって、ツールとデータアクセス法が異なっていることはすぐにわかりました。BDE、dbexpress、zeoslibのようなツールの参考書は Web のそこら中に転がっています。そのため、それらを読む時に、どのバージョンの Delphi を対象にしているのか、あるいは zeos のようなサードパーティ製の(ボーランド製ではない)ツールの話題なのかを、いつも注意深く確認する必要がありました。Kylix 用の説明にも注意しなければなりません。一番忌々しかったのは、そういった説明の中で使われているテクニカルタームでした -- 曰く clientdatasets, sqlqueries, dbexpress datasets, dataset providers, datasnap, data-aware controls。説明書を読み終えるたびに、Lazarus IDE に向かって、それらのコントロールがないものかと探しました。もちろん、ありませんでした。それで、私はこれ — 「論文」、「ハウツー」、「チュートリアル」、「雄叫び」、お好きな呼び方でどうぞ — を書こうと決心したのです。
5642
57-では Lazarus の SQLdb はどう働くのでしょうか。いつもなら、誰か親切な人たちが理解に役立つよう Web にチュートリアルを書いていてくれているのですが、2006年3月24日の段階ではチュートリアルは見つかりませんでした。{<http://wiki.lazarus.freepascal.org/index.php/Lazarus_Database_Tutorial> があります} 実際の所、Web には SQLdb コントロールについて書かれたものはほとんどありませんでした。SQLdb のソースコードが(Free Pascal Compiler のソースの中に)ありましたが、Pascal の初心者なので(コメントは多少役立ちましたが)、コードを読むのはほとんど不可能でした。確かに FPC のソースコードフォルダに少し例はあったのです。それらの例に私が気がつかなかったので、SQLdb の作者が Lazarus メーリングリストで教えてくれる有様でした。そこでこれらの例こそ私が始めた場所だったのです。たった一つだけ私にはアドバンテージがありました。これまでのプログラミング業で、postgres データベースエンジンのことを知っていたことです。かの例と postgres ログのセットアップができることを武器に、私は戦端を開いたのです。
43+では Lazarus の SQLdb はどう働くのでしょうか。いつもなら、誰か親切な人たちが理解に役立つよう Web にチュートリアルを書いていてくれているのですが、2006年3月24日の段階ではチュートリアルは見つかりませんでした。{<http://wiki.lazarus.freepascal.org/index.php/Lazarus_Database_Tutorial> があります} 実際の所、Web には SQLdb コントロールについて書かれたものはほとんどありませんでした。SQLdb のソースコードが(Free Pascal Compiler のソースの中に)ありましたが、Pascal の初心者なので(コメントは多少役立ちましたが)、コードを読むのはほとんど不可能でした。確かに FPC のソースコードフォルダに少し例はあったのです。それらの例に私が気がつかなかったので、SQLdb の作者が Lazarus メーリングリストで教えてくれる有様でした 。そこでこれらの例こそ私が始めた場所だったのです。たった一つだけ私にはアドバンテージがありました。これまでのプログラミング業で、postgres データベースエンジンのことを知っていたことです。かの例と postgres ログのセットアップができることを武器に、私は戦端を開いたのです。
5844
59-データベースに何かをする前に、そのデータベースと必ず接続しなければなりません。ですから、最初にすることは、Lazarus エディタのツールバーにある SQLdb のタブをクリックすることです。アイコンはいくつかありますが、ここでは Postgres に接続するアイコンだけを考えることにします。象のアイコンです(象は決して忘れない — だから象なんです)。もちろん他のデータベースエンジンもサポートされていますが、前にも言ったように、私は postgres を動かすためのやり方しか知らないのです。話を戻すと、それを選択してフォームにドラッグ&ドロップします。Lazarus がコントロールに名前をつけてくれるので、それをそのまま使うことにしましょう。
45+データベースに何かをする前に、そのデータベースと必ず接続しなければなりません。ですから、最初にすることは、Lazarus エディタのツールバーにある SQLdb のタブをクリックすることです。アイコンはいくつかありますが、ここでは Postgres に接続するアイコンだけを考えることにします。象のアイコンです(象は決して忘れない — だから象なんです)。もちろん他のデータベースエンジンもサポートされていますが、前にも言ったように、私は postgres を動かすためのやり方しか知らないのです。話を戻すと、それを選択してフォームにドラッグ&ドロップします。Lazarus がコントロールに名前をつけてくれるので、それをそのまま使うことにしましょう。
6046
61-Lazarus がつけた名前は 'PQConnection1' でした。異なったデータベースコネクションを使う場合は異なった名前になるでしょう。この名前は自由に変えられます。'PQConnection' をフォームに載せると、オブジェクトインスペクタが開きます(私ならプロパティシートと呼びたい所です)。このオブジェクトインスペクタの中で、いくつかのプロパティないしフィールドを埋める必要があります。'UserName' と 'Password' フィールドを埋めてください。これは問題のデータベースにアクセスできるユーザ名です。次に 'DatabaseName' に接続したいデータベースの名前を入れます。次は 'HostName' です。これはIPアドレスでかまいません。たまたまデータベースエンジンと Lazarus を同じ計算機で走らせている場合は '127.0.0.1' あるいは 'localhost' になるでしょう。
47+Lazarus がつけた名前は 'PQConnection1' でした。異なったデータベースコネクションを使う場合は異なった名前になるでしょう。この名前は自由に変えられます。'PQConnection' をフォームに載せると、オブジェクトインスペクタが開きます(私ならプロパティシートと呼びたい所です)。このオブジェクトインスペクタの中で、いくつかのプロパティないしフィールドを埋める必要があります。'UserName' と 'Password' フィールドを埋めてください。これは問題のデータベースにアクセスできるユーザ名です。次に 'DatabaseName' に接続したいデータベースの名前を入れます。次は 'HostName' です。これはIPアドレスでかまいません。たまたまデータベースエンジンと Lazarus を同じ計算機で走らせている場合は '127.0.0.1' あるいは 'localhost' になるでしょう。
6248
63-次はなかなかイカしていると思う点です。Lazarus IDE は、接続のセットアップをしている段階でもそれをテストすることができます。'Connected' プロパティを True に変えてください。うまくいくならデータベースエンジンとの接続はオーケーです。エラーメッセージが出る場合は、それを読みましょう。大事な情報があります。ほとんどの問題は SQLdb 接続コントロールではなくデータベースのアクセスにおいて発生します。言い換えれば、データベースアクセスの利用許可 user permission の問題です。
49+次はなかなかイカしていると思う点です。Lazarus IDE は、接続のセットアップをしている段階でもそれをテストすることができます。'Connected' プロパティを True に変えてください。うまくいくならデータベースエンジンとの接続はオーケーです。エラーメッセージが出る場合は、それを読みましょう。大事な情報があります。ほとんどの問題は SQLdb 接続コントロールではなくデータベースのアクセスにおいて発生します。言い換えれば、データベースアクセスの利用許可 user permission の問題です。
6450
65-'PQConnection1' は電灯のスイッチのようなものです。'Connected' を True にすれば、接続がオンになり、'False' にすればオフになります。電灯のスイッチのように、オンになったりオフになったり。'PQConnection1.open' メソッドや ' PQConnection1.close' メソッドを使うこともできます。それぞれ PQConnection1.Connected := True、PQConnection1.Connected := False という代入と同じです。'PQConnection1' だけでも多くの他のことがあります。ほとんどの利用者は 'ExecuteDirect' を用いて DDL (Data Definition Language, データ定義言語)コマンドを発行することができます。プロパティやメソッドはもっとたくさんありますが、私にはわかりません。今の所 'OnLogin' メソッドが動かないのは判っています。
51+'PQConnection1' は電灯のスイッチのようなものです。'Connected' を True にすれば、接続がオンになり、'False' にすればオフになります。電灯のスイッチのように、オンになったりオフになったり。'PQConnection1.open' メソッドや ' PQConnection1.close' メソッドを使うこともできます。それぞれ PQConnection1.Connected := True、PQConnection1.Connected := False という代入と同じです。'PQConnection1' だけでも多くの他のことがあります。ほとんどの利用者は 'ExecuteDirect' を用いて DDL (Data Definition Language, データ定義言語)コマンドを発行することができます。プロパティやメソッドはもっとたくさんありますが、私にはわかりません。今の所 'OnLogin' メソッドが動かないのは判っています。
6652
67-次にフォームにドラッグするのは 'TSQLTransaction' アイコンです。Lazarus はこれに 'SQLTransaction1' という名前をつけます。'TSQLTransaction' に関しては、ただ名前を挙げてある文章すら見つけることができませんでした。ヒントは FPC のソースコードから得られました。コードにこんな部分がありました:
68-```
69-procedure Commit; virtual;
70- procedure CommitRetaining; virtual;
71- procedure Rollback; virtual;
72- procedure RollbackRetaining; virtual;
73- procedure StartTransaction; override;
74- constructor Create(AOwner : TComponent); override;
75- destructor Destroy; override;
76- property Handle: Pointer read GetHandle;
77- procedure EndTransaction; override;
78-```
53+次にフォームにドラッグするのは 'TSQLTransaction' アイコンです。Lazarus はこれに 'SQLTransaction1' という名前をつけます。'TSQLTransaction' に関しては、ただ名前を挙げてある文章すら見つけることができませんでした。ヒントは FPC のソースコードから得られました。コードにこんな部分がありました:
7954
80-SQL を知っているおかげで、これが何をしているかがわかりました。
55+`   procedure Commit; virtual;`\
56+`   procedure CommitRetaining; virtual;`\
57+`   procedure Rollback; virtual;`\
58+`   procedure RollbackRetaining; virtual;`\
59+`   procedure StartTransaction; override;`\
60+`   constructor Create(AOwner : TComponent); override;`\
61+`   destructor Destroy; override;`\
62+`   property Handle: Pointer read GetHandle;`\
63+`   procedure EndTransaction; override;`\
64+` `
8165
82-StartTransaction = これが「始め」ですが、どうみてもそれ以上のものがあります。というのも、 Postgres のログを見ると他のことが起こっているようですが、それで何かまずいことが起こるわけでもないので、気にしないことにします。
66+SQL を知っているおかげで、これが何をしているかがわかりました。
8367
84-EndTransaction = トランザクションを終了します。これはコミット 'COMMIT' ではなくロールバック 'Rollback' です。
68+StartTransaction = これが「始め」ですが、どうみてもそれ以上のものがあります。というのも、 Postgres のログを見ると他のことが起こっているようですが、それで何かまずいことが起こるわけでもないので、気にしないことにします。
8569
86-Commit = トランザクションをコミットします。
70+EndTransaction = トランザクションを終了します。これはコミット 'COMMIT' ではなくロールバック 'Rollback' です。
8771
88-Rollback = トランザクションをロールバックします。
72+Commit = トランザクションをコミットします。
8973
90-次のは何に使うのかはわかりません: CommitRetaining, RollbackRetaining
74+Rollback = トランザクションをロールバックします。
9175
92-これらは Delphi の BDE ツールと関係があるのでしょう。私が正しく理解しているなら、'CommitRetaining' と 'RollbackRetaining' はデータをコミットしたりロールバックしたりしますが、データセットを開いたままにします。そのうち誰かが教えてくれるでしょう。
76+次のは何に使うのかはわかりません: CommitRetaining, RollbackRetaining
9377
94-'DataBase' プロパティ(オブジェクトインスペクタにありましたね)にコネクションの設定をするだけで接続が行われるようになります。私の例では 'PQConnection1' でした。'SQLTransaction1' には 'Active' というプロパティがあります。'PQConnection1.Connected' と同様に、明かりのスイッチのような働きをします。ですが、SQLTransaction1 の方は 'Active' を true にすると、実際にデータベースエンジンに 'BEGIN' を送信します。false にすると' Rollback' です。'SQLTransaction1.StartTransaction' と 'StartTransaction.EndTransaction' も 'PQConnection1' のように用いることができます。
78+これらは Delphi の BDE ツールと関係があるのでしょう。私が正しく理解しているなら、'CommitRetaining' と 'RollbackRetaining' はデータをコミットしたりロールバックしたりしますが、データセットを開いたままにします。そのうち誰かが教えてくれるでしょう。
9579
96-いいかえれば、'SQLTransaction1' は名前が表すように、単に SQL のトランザクションを制御するだけのものです(訳注: 「ラッパーである」といいます)。ですから、プログラムの中で 'Begin'、'Commit'、'Rollback' の SQL コマンドを発行したい場合、SQLTransaction を使えばいいのです。{これは不正確です — 下記参照}
80+'DataBase' プロパティ(オブジェクトインスペクタにありましたね)にコネクションの設定をするだけで接続が行われるようになります。私の例では 'PQConnection1' でした。'SQLTransaction1' には 'Active' というプロパティがあります。'PQConnection1.Connected' と同様に、明かりのスイッチのような働きをします。ですが、SQLTransaction1 の方は 'Active' を true にすると、実際にデータベースエンジンに 'BEGIN' を送信します。false にすると' Rollback' です。'SQLTransaction1.StartTransaction' と 'StartTransaction.EndTransaction' も 'PQConnection1' のように用いることができます。
9781
98-次は私が「SUPERコントロール」と呼ぶ所のもの — 'TSQLQuery' コントロールです。同じようにフォームにドラッグ&ドロップします。ずっと右にある下向き矢印をクリックして“Database”及び“Transaction”のフィールドを埋めます。実際には、“Database”フィールドを埋めれば、“Transaction”は自動的に埋められます。次に"SQL"フィールドをダブルクリックするとダイアログが開きます。ここでは単純な SQL 選択文 select statement をタイプしなければなりません。何か簡単なもの — 'select * from customers' みたいなのを入れておきましょう。文を保存します。フィールドには現れませんが、その文はちゃんと残っています。
82+いいかえれば、'SQLTransaction1' は名前が表すように、単に SQL のトランザクションを制御するだけのものです(訳注: 「ラッパーである」といいます)。ですから、プログラムの中で 'Begin'、'Commit'、'Rollback' の SQL コマンドを発行したい場合、SQLTransaction を使えばいいのです。{これは不正確です — 下記参照}
9983
100-オーケー、でもこれって何をするものなの? オブジェクトインスペクタには 'Active' プロパティがあり、他のコントロールが'SQLQuery'をオンにしたりオフにしたりするのと全く同じように働きます。結局オブジェクトインスペクタはそんなに助けにならなかったのですが、FPCのexampleは大いに役立ちました。
101-```
102-with Fquery do
84+次は私が「SUPERコントロール」と呼ぶ所のもの — 'TSQLQuery' コントロールです。同じようにフォームにドラッグ&ドロップします。ずっと右にある下向き矢印をクリックして“Database”及び“Transaction”のフィールドを埋めます。実際には、“Database”フィールドを埋めれば、“Transaction”は自動的に埋められます。次に"SQL"フィールドをダブルクリックするとダイアログが開きます。ここでは単純な SQL 選択文 select statement をタイプしなければなりません。何か簡単なもの — 'select * from customers' みたいなのを入れておきましょう。文を保存します。フィールドには現れませんが、その文はちゃんと残っています。
85+
86+オーケー、でもこれって何をするものなの? オブジェクトインスペクタには 'Active' プロパティがあり、他のコントロールが'SQLQuery'をオンにしたりオフにしたりするのと全く同じように働きます。結局オブジェクトインスペクタはそんなに助けにならなかったのですが、FPCのexampleは大いに役立ちました。
87+
88+ with Fquery do
10389 begin
104-
90+
10591 SQL.Clear;
10692
10793 SQL.Add('select * from FPDEV');
108-
94+
10995 open;
11096
11197 Edit;
112- FieldByName('name').AsString := FPdevNames[1];
113- FieldByName('birthdate').AsDateTime := FPdevBirthDates[1];
98+ FieldByName('name').AsString := FPdevNames[1];
99+ FieldByName('birthdate').AsDateTime := FPdevBirthDates[1];
114100 Post;
115101
116102 Append;
117- FieldByName('id').AsInteger := 8;
118- FieldByName('name').AsString := FPdevNames[8];
119- FieldByName('email').AsString := FPdevEmails[8];
120- FieldByName('birthdate').AsDateTime := FPdevBirthDates[8];
103+ FieldByName('id').AsInteger := 8;
104+ FieldByName('name').AsString := FPdevNames[8];
105+ FieldByName('email').AsString := FPdevEmails[8];
106+ FieldByName('birthdate').AsDateTime := FPdevBirthDates[8];
121107 post;
122108
123109 ApplyUpdates;
124-
110+
125111 end;
126112 Ftransaction.Commit;
127-
113+
128114 Fquery.Free;
129115 Ftransaction.Free;
130116 Fconnection.Free;
131117 end.
132-```
133118
134-この例では、 'Fquery' はTSQLQueryコントロールに名前をつけただけのものです。また、ここでは接続とトランザクションのコントロールはどちらも既にセットアップされています。'Fquery'には接続を設定するための'Database'フィールドとトランザクションを設定するための'Transaction'フィールドがあります。この例がやっていることは、こんなです:
119+この例では、 'Fquery' はTSQLQueryコントロールに名前をつけただけのものです。また、ここでは接続とトランザクションのコントロールはどちらも既にセットアップされています。'Fquery'には接続を設定するための'Database'フィールドとトランザクションを設定するための'Transaction'フィールドがあります。この例がやっていることは、こんなです:
135120
136- 1. 'SQL.Clear'(実際には 'Fquery.SQL.Clear')によって、コントロールにある SQL コマンドを全てクリアします
137- 2. 次いで 'Add' 手続きによって SQL 命令を付け加えます。この命令が「何を行うか」を決めます。
138- 3. 次は “open” です。これでリクエストを実行します。別の表現をすれば、SQL命令が実行されます。
139- 4. “edit” が次にきます。この手続きによって、引き出されたデータを編集可能にできます。データ制御を「知っている」オブジェクトなら上手く動きます。
140- 5. 続く数行はフィールド名によって実際にデータを変更しています。
141- 6. “post” でデータをローカルキャッシュに保存しますが、データをコミットすることも、データベースにアップデート命令を送ることも'ありません'。
142- 7. “append” は別のルーチンの例です。ここでは SQLQuery はレコードまたはtupleないし行を追加することになります。
143- 8. “applyupdate” がデータベスに更新命令を送ります。
144- 9. 実際のコミットはトランザクション制御によることに注意して下さい(この例では'Ftransaction.commit')。
145- 10. 残りのコマンドで通常の free 手続きによってコントロールを閉じています。閉じる順序に注意して下さい。
121+1. 'SQL.Clear'(実際には 'Fquery.SQL.Clear')によって、コントロールにある SQL コマンドを全てクリアします
122+2. 次いで 'Add' 手続きによって SQL 命令を付け加えます。この命令が「何を行うか」を決めます。
123+3. 次は “open” です。これでリクエストを実行します。別の表現をすれば、SQL命令が実行されます。
124+4. “edit” が次にきます。この手続きによって、引き出されたデータを編集可能にできます。データ制御を「知っている」オブジェクトなら上手く動きます。
125+5. 続く数行はフィールド名によって実際にデータを変更しています。
126+6. “post” でデータをローカルキャッシュに保存しますが、データをコミットすることも、データベースにアップデート命令を送ることも'ありません'。
127+7. “append” は別のルーチンの例です。ここでは SQLQuery はレコードまたはtupleないし行を追加することになります。
128+8. “applyupdate” がデータベスに更新命令を送ります。
129+9. 実際のコミットはトランザクション制御によることに注意して下さい(この例では'Ftransaction.commit')。
130+10. 残りのコマンドで通常の free 手続きによってコントロールを閉じています。閉じる順序に注意して下さい。
146131
147-ところで、なぜこれが「SUPERコントロール」なのでしょうか — オブジェクトインスペクタでイベントを全部調べてご覧なさい。
132+ところで、なぜこれが「SUPERコントロール」なのでしょうか — オブジェクトインスペクタでイベントを全部調べてご覧なさい。
148133
149-
150-判ったのはこの辺までなので、ここでやめときます。実際のプログラムで SQLdb コントロールをどう使うかがもっとよく判ったら、もっといろんな知識を書きます。そうなるといいな。
134+判ったのはこの辺までなので、ここでやめときます。実際のプログラムで SQLdb コントロールをどう使うかがもっとよく判ったら、もっといろんな知識を書きます。そうなるといいな。
151135
152-John Fabiani
136+John Fabiani
153137
154-
155-I'm Back!
138+I'm Back!
156139
157-Change my thinking or don't use SQLdb.
140+Change my thinking or don't use SQLdb.
158141
159-In the windows world I have always used an ODBC connection to the database engine for my connections from FoxPro. I have come to expect that I controlled when a transaction starts and stops. But in the Delphi/FPC world this is not the way it works. The act of setting the transaction.active:=True; causes the transaction control to send a 'begin' to the database engine. This means if you are just requesting data from the database as in “Select * from sometable” it is done within a SQL transaction. In other words a 'begin' was sent to the database engine. BTW the corresponding “Rollback” or “Commit” is not sent automatically after retrieving the data. So what has to occur is as follows:
142+In the windows world I have always used an ODBC connection to the database engine for my connections from FoxPro. I have come to expect that I controlled when a transaction starts and stops. But in the Delphi/FPC world this is not the way it works. The act of setting the transaction.active:=True; causes the transaction control to send a 'begin' to the database engine. This means if you are just requesting data from the database as in “Select * from sometable” it is done within a SQL transaction. In other words a 'begin' was sent to the database engine. BTW the corresponding “Rollback” or “Commit” is not sent automatically after retrieving the data. So what has to occur is as follows:
160143
161-transaction.starttransaction; // the same as transaction.active:=true; sqlquery.open; //this already has the sql statement “select * from sometable” transaction.endtransaction; // the same as transaction.active:=False;
144+transaction.starttransaction; // the same as transaction.active:=true; sqlquery.open; //this already has the sql statement “select * from sometable” transaction.endtransaction; // the same as transaction.active:=False;
162145
163-This of course is very different than what I'm used too. I sort got my head around using the transaction start and end. But that is not all that is different. Again, in the windows world I only used one connection to the database for everything (well almost everything). So in my coding with FPC I attempted to use one connection (one pqconnection). Man this proved to be difficult. It worked but it was a lot of coding. I asked the mailing list how everyone handled this question (use one connection or use multi connections) I got no response. I'm not sure what that means but I checked the web for delphi examples of data access with multiple forms. In each example (remember these were for delphi) the authors used multiple connections. One for each form. So now I'm using a new connection for each form I open. This actually made the coding much easier. I still had to setup the connection fields (databasename, username,password, etc) in code but the rest of the data access controls can be set at design time and required no setup coding. But what this means is I will more than one connection to the database per each user of my program. Image a user with 10 forms open and ten users. This means I could have 100 connections open to the database engine. Is this important? I know that the Postgres database engine can support thousands of connections. So in the end I guess not. I just have to set a parameter in the Postgres configuration. So I have changed my thinking.
146+This of course is very different than what I'm used too. I sort got my head around using the transaction start and end. But that is not all that is different. Again, in the windows world I only used one connection to the database for everything (well almost everything). So in my coding with FPC I attempted to use one connection (one pqconnection). Man this proved to be difficult. It worked but it was a lot of coding. I asked the mailing list how everyone handled this question (use one connection or use multi connections) I got no response. I'm not sure what that means but I checked the web for delphi examples of data access with multiple forms. In each example (remember these were for delphi) the authors used multiple connections. One for each form. So now I'm using a new connection for each form I open. This actually made the coding much easier. I still had to setup the connection fields (databasename, username,password, etc) in code but the rest of the data access controls can be set at design time and required no setup coding. But what this means is I will more than one connection to the database per each user of my program. Image a user with 10 forms open and ten users. This means I could have 100 connections open to the database engine. Is this important? I know that the Postgres database engine can support thousands of connections. So in the end I guess not. I just have to set a parameter in the Postgres configuration. So I have changed my thinking.
164147
165148## Add a Login Screen
166149
167-04/17/06 Adding a login screen (splash screen too).
150+04/17/06 Adding a login screen (splash screen too).
168151
169-OK so I will need a login screen because my program accesses a database. It has to be the first screen the user will see but not the main screen. My main screen is a form with a bunch of buttons (sort of a menu of buttons) to call other forms and I want it to control and close all the other forms should the user close the main form. So how do I get a form to display before the main screen opens? Searching the internet provided part of the answer. Researching the Lazarus forum provided even more and including the the trick to making a splash screen to work.
152+OK so I will need a login screen because my program accesses a database. It has to be the first screen the user will see but not the main screen. My main screen is a form with a bunch of buttons (sort of a menu of buttons) to call other forms and I want it to control and close all the other forms should the user close the main form. So how do I get a form to display before the main screen opens? Searching the internet provided part of the answer. Researching the Lazarus forum provided even more and including the the trick to making a splash screen to work.
170153
171-In the main program file 'project1.lpr' file is where you add your code. This is the code that starts the program. Yours should look something a like below and mine opens a login form:
172-```
173-program project1;
174-
154+In the main program file 'project1.lpr' file is where you add your code. This is the code that starts the program. Yours should look something a like below and mine opens a login form:
155+
156+ program project1;
157+
175158 {$mode objfpc}{$H+}
176-
159+
177160 uses
178161 {$IFDEF UNIX}{$IFDEF UseCThreads}
179162 cthreads,
180163 {$ENDIF}{$ENDIF}
181164 Interfaces, // this includes the LCL widgetset
182165 Forms, Controls,
183166 { add your units here }, menu1, login1, sqlunit, SQLDBLaz, custunit,
184167 contactunit, lookup, vendunit, speciesunit, varietyunit, wareunit, icunit;
185168 var loginform:Tlogin;
186169 begin
187170 Application.Initialize;
188171 loginform:=Tlogin.Create(nil);
189172 loginform.edit2.text:='johnf';
190173 if loginform.showmodal <> mrOk then
191174 begin
192175 loginform.free;
193176 loginform:=nil;
194177 end;
195-
178+
196179 Application.CreateForm(Tmenuform, menuform);
197180 Application.Run;
198181 end.
199-```
200182
201-Notice that I create and open a form after the “Application.Initialize;” It is important that your code be added after the 'Application.Initialize;'! The above works as long as I call 'showmodal'. But if I call 'show' the form opens but nothing is displayed in the form. To get it to display correctly just add 'Application.ProcessMessages;' as in the example below.
202-```
203-Application.Initialize; //this line exists!
204- splashScreen := TSplashScreen.Create(nil);
205- SplashScreen.ShowOnTop;
206- Application.ProcessMessages; //need this line to allow display
207- SplashScreen.Update;
208- delay(1000);
209- Application.CreateForm(TForm1, Form1);
210- SplashScreen.Hide;
211- SplashScreen.Free;
212- Application.Run;
213-```
183+Notice that I create and open a form after the “Application.Initialize;” It is important that your code be added after the 'Application.Initialize;'! The above works as long as I call 'showmodal'. But if I call 'show' the form opens but nothing is displayed in the form. To get it to display correctly just add 'Application.ProcessMessages;' as in the example below.
214184
185+`  Application.Initialize; //this line exists!`\
186+`  splashScreen := TSplashScreen.Create(nil);`\
187+`  SplashScreen.ShowOnTop;`\
188+`  Application.ProcessMessages;  //need this line to allow display`\
189+`  SplashScreen.Update;`\
190+`  delay(1000);`\
191+`  Application.CreateForm(TForm1, Form1);`\
192+`  SplashScreen.Hide;`\
193+`  SplashScreen.Free;`\
194+`  Application.Run;`
195+
215196I'm still learning and I hope more will come. Bye for now.
216197
217198---
218-*From the Free Pascal wiki, page "Adventures of a Newbie/ja", as the Internet Archive kept it on 2023-04-01. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
199+*From the Free Pascal wiki, page "Adventures of a Newbie/ja", as it stood on 2012-04-13 after a change by Chronos, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
200+Category: Lazarus/ja

Back to history