Object Oriented XBASE Forum
Visual FoxPro FAQ
オブジェクト指向XBASE言語研究会のVisual
FoxPro会議室Q&Aコーナーより抜粋・内容を編集したものです。
無断で転載しないように願います。
内容の正確さにつきまして掲載者及び投稿者は責任を持ちません。あらかじめご理解頂き利用されますようお願い致します。
☆FoxPro設定/修正情報 ( Ver5.0a〜Ver9.0の設定他 SetUp.EXE作成の指針等
)
Windows98上でのプリンター環境窓の異常
SP3を適用したけれど..
Gridでカレントレコードのみ色を変えるには
Grid内でのフォーカスの移動について
Gridで累計を表示したい
Gridとワークファイルを接続できない
Gridの左右パーティション表示設定の注意
Textオブジェクトの数値入力におけるpicture句制御
マウスポインタを砂時計に変えるには
派生クラスとDODEFAULT()関数
メニューバーのないアプリケーション
Date Time Picker Controlの使い方
Office2000のPivotTableを使う
リサイズについて教えて下さい
Foxの裏側
DBFのヘッダー形式取得について
DBFファイルに画像データを取り込む方法
コンボボックスのリスト表示行の設定
コンボボックス、リストボックスでのファイル選択法
レポートでカラー印刷できない
レポートファイルのプリンター情報を解析
ページフレームを使ったフォームのフォーカス移動
手軽にMAILウインドウを立ち上げる方法
Foundation Classの探検
Debbugerとソースの修正連携について
Gridでカレントレコードのみ色を変えるには
レコード(行)単位での色変え
これを行うためには、Columnのプロパティを設定します。
Layout TAB の DynamicBackcolor に注目します。
プロパティウィンドゥのスストボックスをクリックすると
フォームに張り付けたオブジェクトがツリー表示されます。
Grid1 の下の Column1を選択して下さい。
Layout TAB の DynamicBackcolor propertyを下記のように設定します。
="IIF(MOD(RECNO( ),2)=0,RGB(255,255,255),RGB(0,255,0))"
1行全体を色変えする場合は、すべてのカラムに同様の設定を行って下さい。
このように Dynamic....
のプロパティは動的に設定を変えたい時に有効です。
> ="IIF(MOD(RECNO(
),2)=0,RGB(255,255,255),RGB(0,255,0))">
これはレコード番号が偶数の場合はバックカラーを白に、奇数の場合は
緑にという設定ですよね。
このようにある条件が成り立つ場合に色を変更するというような場合には
これでいいのですが、
カレントレコードの場合は、という条件設定ができません。
^^^^^^^^^^^^^
グリッドのレコード移動のメソッドあたりになにか書く必要がある?!
既に解決されていると思いますけど、DynamicBackcolor
propertyに
="IIF(THIS.ACTIVEROW=RECNO(
),RGB(0,255,0),RGB(255,255,255))"
でした。
Gridで一行ごとに色を変える件 Dynamic Back Color上
="IIF(MOD(RECNO( ),2)=0,RGB(255,255,255),RGB(0,255,0))"
とした時indexが掛かってなければ一行おきにうまく行きます。
indexをかけると、recno()がみだれる?ため色順が乱れます。
それでも、一行ごとに色換えをしたいのです。
>="IIF(THIS.ACTIVEROW=RECNO(
),RGB(0,255,0),RGB(255,255,255))"
これもindexがらみでうまく行かなかったようですが解決はされたのでしょうか
インデックスのかかっていないテーブルの場合は、問題ないんですが、
インデックスをかけたテーブルをグリッド表示した場合、
色が変わりません。
インデックスをかけると、レコード番号とグリッドの表示順の関係が
くずれるためです
グリッド表示用にインデックス順にワークファイルに書き出す方法しか
今のところ思いつきません
Windows98上でのプリンター環境窓の異常
マイクロソフトのナレッジベースの最新のものに USのWin98ではプリンター設定ダイアログを 表示すると致命的なエラーの発生が報告されており 改善を検討中とのコメントが出ました。 レポートコマンド等にPROMPTオプションを つけると異常動作になります。 日本語Win98では落ちないのですが、先般来報告して おりますように、IMEの異常動作(フォント化け)に つながります。 コモンダイアログ(ActiveX)Ver6.0を利用すると この問題を回避することが出来ます。 なを この問題でのWin98日本語版上の異常報告は USマイクロソフトにレポート済みです。
Q193294 - PRB: PRTINFO() Function Causes Fatal Error on
Windows 98
A fatal exception error occurs on a Windows 98 computer
after you use the GETPRINTER() function and SET PRINTER ON PROMPT
command followed by a PRTINFO function. The current resolution is
to avoid
using the GETPRINTER function and SET
Q193294-PRB:PRTINFO()関数は、Windows98上で致命的な例外エラーが生じる
Windows98コンピューター上でPRTINFO機能に関与したGETPRINTER()関数、
およびSET PRINTER ON PROMPTコマンドを使用すると致命的なエラー
(Fatal Error)を引き起こします。
現時点での回避方法はGETPRINTER関数およびSETを使用しないようにします。
SP3を適用したけれど..
SP3が送られてきたので適用してみたけれど、VFPを壊したかな?
自動実行の最初で、「複数の言語のバージョンがインストールされている」
というよな
警告が出て、「OK」を押して実行すると、「MDAC2.1」がどうのこうのと
エラーがでて、「正常にインストールされませんでした」というようなメッセージで
終了してしまいました。 Mdac_type.exeを実行してから、再度SP3を適用する時に、
間違えて英語版のディレク
トリーから実行してしまい、その後、日本語版を適用。
このあたりでシステムを壊して しまったか?
動作はするけど、
「VFPでより多くのACTIVE−Xを」って、USのホームページに
書いてあったが、
やっぱりADOでGRID表示は出来ない。
元々、出来ないのか?
システムを壊してしまったのか?
誰か、ADOでGRID表示出来た方います?
ADOを使ってGRIDへの表示は、何故か知らないけど出来ました。
でも、問題あり。
Visual Studio
にSP3を適用するには、MDAC2.1がインストールされていないと
エラーになると言うことが、READMEに書いてあったのですが、更にその先に、
>レコードを削除すると、Microsoft Access ODBC
ドライバおよび ADO ドライバで
>カーソル位置が失われます。
>MDAC 2.1 または MDAC 2.1 SP1 Access ODBC
ドライバを直接使用している場合、
>または、ADO と OLE DB Provider for ODBC
を使っている場合には、レコードを削除
>するとカーソル位置が失われます。カーソル位置が事前に判明していない場合、左に位置
>するため、アプリケーションが予期したとおりに動作せず、データが損失する可能性があ
>ります。 この問題の詳細については、J047771
を参照してください。この問題に対する
>修正は、Microsoft Visual Studio ホーム
ページで公開されます。また、この問題は、
>MDAC 2.1
の将来のリリースで解決される予定です。
これじゃぁ、ADOとOLE DB Provider for ODBCを使えない。
HDをイニシャライズしてWin98、VFP6.0、Visual Studioの
順にインストールして、
SP3を適用したら問題ありませんでした。
私の環境が壊れていたみたいです。
SP3の適用にあたり、日本語のmdac2.1をインストールし、英語版のSP3を適用。
VB、VC++などが見つかったと表示されますが、実行中のメッセージを見ていると
VFPに関係する修正のみ行っているようです。
英語版の修正が終わったら、日本語のSP3を適用します。
Grid内でのフォーカスの移動について
grid
の右端のカラムでリターンキーを押した時に次レコードの
左端のカラムに
フォーカスを移動させる方法です
対処法を考えましたので、興味のある方は
一度試してみて下さい
VFPのデフォルトの仕様では Gridの最右端カラムで
リターンキーを押すと
同じレコードの最左端のカムにフォーカスが移ります。
これを 次レコードの最左端のカラムに動かす方法です。
一番右のカラムの textbox の keypress event
に下記のコードを加えます
LPARAMETERS nKeyCode, nShiftAltCtrl
IF nkeycode = 13
skip
Thisform.grid1.refresh
Thisform.grid1.column1.text1.setfocus
ENDIF
*grid1,column1,text1
等は適用するフォームのコントロール名に直して下さい
要するに、リターンキーが押されたら
次レコードに移動して
グリッドをリフレッシュさせて最左端のカラムのテキストボックスに
フォーカスを当てる、 という内容です。
このロジックを拡張すると、ある条件のレコードにだけ
フォーカスをあてることができます。
たとえば 性別で男性のみにレコード移動したいとかの場合
skip
DO WHILE (.NOT. SEIBETU = "男") .AND. (.NOT. EOF() )
SKIP
ENDDO
Thisform.grid1.refresh
Thisform.grid1.column1.text1.setfocus
これでリターンキーを押すと次の
男性レコードまでskipしてくれる?
とすると↑キーにも対応させないといけない。
あとは皆さん考えて下さい。
Textオブジェクトの数値入力におけるpicture句制御
テキスト入力オブジェクトで数値を入力する際にカンマ区切り入力に
せず。
表示のみカンマ区切りにする方法です。
オブジェクトをtext1とします。
text1.propertyで Init event this.value =
0
Format はselect on
entryをT
Gotfocus event this.Imputmask = "999999999"
Lostfocus exent this.Imputmask = "999,999,999"
またプロパティウインドウでinputmaskとmaxlengthは記入しないでおきます。
お試しください
マウスポインタを砂時計に変えるには
locate
検索を実行中 マウスポインタ砂時計に変えたいと思って
次のようなコードを記述しましたがだめでした。
Thisform.MousePointer = 11 && HourGlassの値
locate *****************
Thisform.MousePointer = 0 && default値
どうしたらよいでしょう?
with thisform
.setall("MousePointer",11)
set cursor off
〜〜
.setall("MousePointer",0 )
set cursor on
endwith
あたりでは如何でしょう。
派生クラスとDODEFAULT()関数
DODEFAULT()と:: Scope Resolution Operatorの違いを以下のように解釈しました。
DODEFAULT()の場合は、親クラスの自分と同じ名前のメソッド・イベントが
呼び出されて
実行する。パラメータを渡して戻り値を取れる。
:: Scopeの場合は、親クラスのにあるメソッドなら、自分と違う名前でも指定して
実行できる。
さて、DODEFAULT()、:: Scopeのどちらも派生させたクラスメソッドの先頭に書く必要は
無いようです。 MESSAGEBOXを表示する簡単なテストプロを実行してみたら、
派生させたクラスのメソッドの中で、親クラスのメソッドを呼ぶ前の「前処理」を
行ってから、親クラスのメソッドを呼び、その後で「後処理」を行うことが可能でした。
勿論、親のクラスで行っている内容に依存するでしょうから、全てに可能なわけではないと思います。
メニューバーのないアプリケーション
VFPでメニューバーのないアプリケーションにするには どうすればいいんでしたっけ?
私は下記の通りに書いて実行しています。昔風です。
goApp.cStartupMenu=""
goApp.cStartupForm="forms\mainform"
メニューバーのラインも完全に殺す場合は
hide menu _MSYSMENU
で 消すことが出来ます。
Date Time Picker Controlの使い方
Microsoft Date Time Picker Control, ver6.0の使い方です DtPickerをフォームにolecontrol1として貼りつけます。 Form-NewPropertyでHizukeを新たに設定します。 Hizukeがデフォルトで.F.になっているのをDELして[none]にします。 Form Load event に thisfrom.hizuke = "1999/09/19" とかにします。 あるいは thisform.hizuke = dtoc(date()) ・・ 文字型で初期化 ただし日付型の設定でANSIですとセパレータがドットになっているので 日付のセパレータをスラッシュにしておく必要があります。 olecontrol1 - ControlSourceプロパティに thisform.hizuke と書いておきます。 フォームにボタンを1つ つけて click event に ? thisform.hizuke とか messageboxを噛ませれば 結果が確認できます。 hizukeの変数型は文字型です。
Office2000のPivotTableを使う
Microsoft Office PivotTable 9.0を VFP6.0から使う方法です。(VFP5.0では、使えません。)
1.まず、データベースに接続するための、ODBCを作成します。
ユーザDSNを「PivotTest」で作成し、VFPのサンプルデータベースのTestdata.dbcに
接続するように DSNを構成します。
2.フォームにPivotTableコントロールを配置します。
コントロールの AutoFitプロパティを
「.F.-False(Default)」に変更します。
(なぜか、配置した時は「.T.-True」になっています)
3.PivotTable の Init Event
に、下記コードを書きます。
oConnection = CreateObject("ADODB.Connection")
oConnection.Open("PivotTest", "",
"") // PivotTestは、ODBCのユーザDSN名です。
This.Connectionstring = oConnection.Connectionstring
4.フォームにボタンを配置し、Click Event
に、下記コードを書きます。
ThisForm.Olecontrol1.CommandText = "Select * from
Orders" // 実際には、こんなSQLでは役に立たない
loView = ThisForm.Olecontrol1.ActiveView
loView.AutoLayout
5.実行して、ボタンを押してみて下さい。
Ordersテーブルの内容がPivotTableに表示されます。
グループ化するフィールドやフィルターを設定するフィールドを自動で設定することも
可能かもしれません。
ボタンを複数配置して、それぞれに違ったSELECT文を書いておけば、
「受注分析」・「売上分析」や「利益分析」等が
簡単にできるようになります。
リサイズについて教えて下さい
以前、いただいたリサイズ用VCTについて、教えて下さい。
Formsetのリサイズがどうしてもうまくいきません。
何か方法はありますか。
御願いします。
form_dr をリサイズすると、フォームのResizeObjectsイベントを呼び出すのですが、
これをFormsetから呼べばなんとかなると....
次の方法で試して下さい
1.テスト用のプロジェクトを作ります。
2.DynamicResolutionクラスを追加します。
3.DynamicResolutionクラスにFormSetを継承してFormSet_drを作ります。
4.FormSet_drクラスに新しいメソッド ResizeForms
を追加し、コードを書きます。
「論よりコード」で、エラーは考慮していません。
Local x
With ThisFormSet
For x = 1 To .FormCount
.Forms(x).Height = .ActiveForm.Height
.Forms(x).Width = .ActiveForm.Width
.Forms(x).ResizeObjects
EndFor
EndWith
5.FormSet_drクラスにForm_drをドラッグ&ドロップします。
6.FormSet_drクラスに最初からあった、Form1
を削除します。
7.FormSet_drクラスに追加したForm_drクラスの
Risize Event に
ThisFormSet.ResizeForms
と書き、FormSet_drクラスを保存します。
8.フォームを新規に作成します。
9.先ほど作成した、FormSet_drクラスを新規フォームにドラッグ&ドロップします。
10.次にForm_drをドラッグ&ドロップします。(2つほど追加して、3つの画面にします)
追加したフォームの Resize Event
は、7と同様に ThisFormSet.ResizeForms にします。
11.Label_drやCommandButton_dr等を核フォームに適当に貼り付けます。
12.フォームを保存して Run してみて下さい。
どのフォームをリサイズしても、
全てのフォームがリサイズされるはずです。
さて、Form_drをドラッグ&ドロップして、Resize
イベントを毎回書き換えるのが
面倒であれば、From_drを継承してFrom_xxクラスを作成して
Resize Event に
ThisFormSet.ResizeForms
と書いておけば手間が省けれかも。
既に、作成済みのFormSetも同様の方法で何とかなると思います。
Foxの裏側
Vfp6\Toolsの中にXSourceというディレクトリーがあって、その中にSolnhlp.zipと
Xsource.zipがあります。
Solnhlp.zipは、VFPのサンプルの細かな解説がhtmlの形式で入っています、Xsource.zipを
解凍してみると何やらよく分からないものがいっぱいあります。
どなたか、このあたりを探究された方いますか?
Toolsの中は、Hexeditしか使ったことがないので、他に有用なものが入っているのか、
又 どう使うのか?
Xsource.zipを解凍してできたディレクトリのWxfoxdocにanalyzer.pjxがあるのですが、
このあたりはVFPのプログラムのドキュメンターなのだろうか?
VFPのToolsディレクトリにあるAnalyzerとどう違うのか?
暇なのでディレクトリを覗いていたら、深みにはまってしまいました。
Xsource.zipが、何なのか分かりました、お騒がせモードでした。
VFPのツールバー「Tools」から選択して実行されるプログラムのソースコードのようです。
ソースとして提供されているのは、Wizards(サブメニューを含む)からCoverage
Profiler までのようです。
「やってることが、気に入らなければ自分で勝手に変更しろ」って、ことなのでしょうね。
ウィザードが殆どxBaseで作成されていたとは...
「その気になれば、VFPで何でもできます」
という見本ですね。
いやはや、本当にFoxの裏側でした。
DBFのヘッダー形式取得について
DBFファイルはdBASEIII とVisual FOXpro ではヘッダー構造が違ってますが ちなみに SYS(2029) 関数でDBFファイルのタイプを調べることができます。 USE コマンドでファイルをopenした後、 ? sys(2029) を実行 dBASEIII 形式(メモフィールドなし) 3 を返す Visual foxpro形式(メモフィールドなし) 48 を返す 詳しくは sys(2029)のヘルプを参照してください。
Gridで累計を表示したい
とうとう Foxを本格的に触り始めた(まだ[趣味]の段階ですが)のですが,
今現金出納 帳を作成しています。Gridで入金と出金の累計を表示させたいのですが,
やり方がよく わかりません。 以前Accessでやっていたときにはクエリーをうまく操作してできました。
Delphiでは 配列を使ったサンプルがあり,これが一番うまく動作しました。
さて,Foxではどうやるのでしょうか?
一般的に最も簡略な方法は
累計を計算したワークファイルを書き出しておき
リレーションを取りグリッド内に表示します。
他にグリッド内で計算結果を表示するような方法は
HPのサンプルの中に4つのリレーションを表示する
方法を解説したものがあります。ご参照下さい。
xBase的にやるのであれば、HPのサンプルを試して下さい。
SQLでやるなら
1.グリッドのプロパティに直接SQLを書く
RecordSource に select xxx, sum(yyy), sum(zzz) from
テーブル名 group by 項目名
RecordSourceType を 4 にする
2.プログラムで書く
フォームに貼り付けたグリッドの名前が
Grid1 として
With ThisForm
.RecordSource = "select xxx, sum(yyy), sum(zzz)
from テーブル名 group by 項目名"
.RecordSourceType = 4
EndWith
要するに、1でプロパティに直接していしたのを PGで書いただけ。
1 & 2 でやると、Queyが最初に開いて
これをクローズしないとフォームが表示されません。
Queryを表示しないようにするのは?
3.View や Queryを利用する
やり方は同じで、グリッドのプロパティにViewやQueryの定義名を直接書くか、プログラムで
書くかの違いです。
DBFファイルに画像データを取り込む方法
DBFファイルに画像データを取り込む方法です。 まずDBFファイルに general型のフィールドを作成します。 このファイルに画像データを取り込むためのコマンドは次のようになります。 APPEND GENERAL [field name] FROM [file name] 普通のフィールドに値を入れる場合はreplace コマンドですが、 この場合はappendコマンドになりますのでお間違いなく。 ちなみにmemo型フィールドにテキストファイルを取り込む場合は APPEND MEMO [field name] FROM [file name] となります。
General Field のビットマップデータをBMPファイルへ 出力する方法。 General Field Nameを たとえば GAZOHとします。 書き出したいBMPデータの入ったレコードからテンポラリーへ 吐き出します。 Copy to Temp Fields GAZOH Next 1 次に 以下のプロシージャを実行します。 hdc_fpt = FOpen("temp.fpt") hdc_bmp = FCreate("sample.bmp") nLast = FSeek( hdc_fpt, 0, 2 ) nTop = FSeek( hdc_fpt, 0 ) sData = FRead( hdc_fpt, nLast ) sBmpData = Right( sData, Len( sData ) - 599 ) nOutBytes = FWrite( hdc_bmp, sBmpData ) lRetVal = FClose( hdc_fpt ) lRetVal = FClose( hdc_bmp )
grid の左右パーティション表示設定の注意
VFP の gridコントロールの view property で '1 browse
change 'に 設定すると
gridの左半分が browser、右半分がレコード単位での表示と
することができます。
このとき起動時の split bar の位置を決めるpropertyが
partition propertyです
但し、この値を設定する場合、grid width
の半分より大きい値を 設定した場合、
エラーが発生することがあります。
このフォームをrunさせた時、次のようなエラーメッセージを表示
フォームは起動できません。
また、いったんこのエラーが発生すると
修正もできなくなって しまうので、
(modifyを実行しようとしても同じエラーが発生して修正画面が開けない)
フォーム作成の苦労が一瞬にして水泡と化すことになります。
Error loading file - record number 6.
........ ............. partition: Expression evaluated to an
illegal value
この回避策がみつかりました。
エラーになるのは、フォームデザイナーの中で
gridのproperty window の partition propetyに値をセットした場合です。
フォームのinit methodに直接コードを記述した場合はOKでした。
例 Thisoform.oGridNAME.Partition = 400
コンボボックスのリスト表示行の設定
コンボボックスでリスト表示させると
デフォルトの設定では7行しか表示してくれないと思いますが、
これをもっと多く表示させたい場合、コンボボックスの
displaycount property に値をセットします。
たとえば 20にセットすると20行分表示してくれます。
レポートでカラー印刷できない
レポートデザイナーでレポートを作成しているのですが、
カラーの設定をしても印刷したときに
カラー印刷せずに白黒の階調表示に
なってしまいます。
プレビュー画面ではカラーで表示されています。
レポートによっては、
正常にカラー印刷してくれるものもあります。
使用のプリンタはキャノンのBJC240J。もちろん、他の
アプリケーションからは正常に
カラー印刷しています。
このような現象に出会った方います?
レポート設計時点で デフォルトのプリンターが
レーザーとかで設計していませんか?
あとさらに、カラープリンターでもPrintSetUpメニューで
モノクロの設定になっていることがあるので
初期設定でプリンターの設定をカラーにしないとダメです。
レポートファイルのプリンター情報を解析
VFPのレポートファイル(*.frx)には設計した時点で 接続されていたプリンタの情報が書き込まれています。 従って、設計時と実行時の環境(プリンタ)が異なると期待 していた通りに印刷してくれないという問題が発生することがあります。 今回の問題はA5の伝票を印刷するのにレポート側ではトレイからの 給紙を指定していたのに、プリンタ側の設定ではA5用紙はカセット 給紙の設定になっていたので、整合性がとれなくて毎回給紙ボタンを 押して手動で用紙を選択しなければならなかったようです。 *.frxに書き込まれているプリンタ情報を調べるには次のようにします。 1.該当するレポートファイル(*.frx)を VFPのcommand windowから use コマンドでopenする。 (なんと frxファイルは dbf型式のファイルだったのです) use XXXXX.frx 2.browseコマンドでデータ内容を表示してみる 3.LOCATE FOR Objtype = 1 .and. Objcode = 53 でプリンタ情報の 含まれているレコードを検索する(たいてい 第1レコード) 4.そのレコードの Expr field(メモフィールド)内容をダブルクリックして表示させる 次のような内容が表示されます。 例) DRIVER=WINSPOOL DEVICE=Canon LBP-470 OUTPUT=LPT1: ORIENTATION=1 PAPERSIZE=11 COPIES=1 DEFAULTSOURCE=4 PRINTQUALITY=-3 TTOPTION=3 内容の詳細は PRTINFO()関数のヘルプを参照下さい 印刷環境が異なることにより正常に印刷できない場合は、 1.実行環境でレポートデザイナーを起動して menu の page setup ... print setupで 再度プリンタの設定を行う 2.上記の方法で 直接 Expr field を編集する のいずれかでレポートファイルを修正する必要があります
レポートファイルからプリンタに関する情報を排除する方法
前項に示したように use
コマンドでレポートファイルをopenします
LOCATE FOR Objtype = 1 .and. Objcode = 53 でレコード検索
REPLACE Tag WITH ""
REPLACE Tag2 WITH ""
REPLACE Expr WITH ""
を実行してプリンタ情報に関する部分を削除する
ファイルクローズ
以上でレポートファイルからプリンタ設定に関する情報は削除され
windowsの通常使用するプリンタに基づいてレポートが実行されます。
ページフレームを使ったフォームのフォーカス移動
ページフレームを使ったフォームで 1ページ目の最後のテキストボックスの入力が終わった時に 自動的に2ページ目の最初のテキストボックスにフォーカスを 移したいんですが、どうもうまくいかないんですが。 Thisform.pageframe1.page2.setfocus このコードではページ2のタブにフォーカス移動する。 Thisform.pageframe1.page2.text1.setfocus このようなコードを書いてもテキストボックスにフォーカス 移動してくれません。 なにか別の方法があるんでしょうか?
Thisform.pageframe1.page2.setfocus Thisform.pageframe1.page2.text1.setfocus と、連続して書けば上手くいきます。
もう1つの方法で page2のsetfocusメソッドに text1へのsetfocusを書いてもOK です。これですとマウスでクリックしてもデフォルトの 入力フィールドへJump可能となります。
Gridとワークファイルを接続できない
昔のようにcopy to でワークファイルを作ってGridと接続させようとしてみたのですがうまくゆきません。 多分ワークファイルとのリンクが良くないのでしょう。 具体的な対処、どなたか教えてください。 ついでに ・グリッド、デフォルトのヘッダ部は隠せましたが、左の灰色の部分は消せますか? 単純に表だけの形にしたいのです。 ・Row全体を色変えしてもクリックで選択枠(セルの)が出ますがこれも消したいのですが。 ・いっそのこと、VBでは良くやったのですがグリッド自体をワークファイル代わりに 使えませんか?つまり単なる入れ物として当該データを流し込み色々操作、選択後、選択 データにて本データを更新なりしたいのですが?
>この時昔のようにcopy to でワークファイルを作って見たけどうまくゆきません。 >多分ワークファイルとのリンクが良くないのでしょう。 まずフォームのload event で ワークファイルを作成しておきます。 use ORIGINAL copy to WORK use WORK grid の RecordsourceType を Alias にして recordsource を ワークファイルの Alias名(WORK)にすればいと思いますが。 それから columnの controlsource property に元のファイルのアリアス名がついて いると表示しません。アリアス名を取り除くかWORKに変更する。 >・グリッド、デフォルトのヘッダ部は隠せましたが、左の灰色の部分は消せますか? >単純に表だけの形にしたいのです。 grid のプロパティの deletemark property と recordmark property を .F. に変更すればOKだと思います。 >・Row全体を色変えしてもクリックで選択枠(セルの)が出ますがこれも消したいのですが。 grid内のtextbox の selectedbackcolor と selectedforecolor propetyを 色変えしたい色に設定しておけばOKではないでしょうか? VFPのgridは非常に優秀です。使いようによってはかなり細かい制御も 可能ではないかと。ぜひいろいろ研究してみてください。
GRIDは大変多機能でテキストだけでなく色々な オブジェクトを貼りつけることが出来ます。 さらにデータファイルが1つだけでなく複数の テーブルをも表示することも出来ます。 また、a*bの結果を表示させるようなことも出来ます。 GRIDの水平スクロールバーの左側にある 黒い隙間のところへマウスを持っていきますと ←||→ というようなカーソルに変わります。 この状態でマウスをドラッグしてGRID中央へ 移動させますと2面のグリッドが表示されます。 このプロパティはViewとpartitionです。 ViewでBrowse-Changeとかにすると左が一覧 右がカード型表示となります。 フィールド名称が表示されているヘッダーは ボタンとしても動作します。
>・グリッド、デフォルトのヘッダ部は隠せましたが、左の灰色の部分は消せますか? >単純に表だけの形にしたいのです。 grid のプロパティの deletemark property と recordmark property を .F. に変更すればOKだと思います。 消せました. >・Row全体を色変えしてもクリックで選択枠(セルの)が出ますがこれも消したいのですが。 どうしても選択セルの枠とカーソルが出てしまいます.確かに色は同じになりましたが、 選択枠、カーソルを表示させないpropetyはないのでしょうか? やりたい事は単純でグリッドの選択時レコード(ROW)だけにしたいのです。 >この時昔のようにcopy to でワークファイルを作って見たけどうまくゆきません。 use ORIGINAL copy to WORK use WORK これも、ひっかかっています。まず、ファイル名の書き方は単純に書けないのでしょうか? カレントのPATHの書き方がイマイチ理解不足です。VFPのprojectはめんどくさい気がします。 一応やりたい事は以下のとおりです. マスタ、テーブル等の検索部を作ってます。検索キーは1〜4つ位まであり其々前方検索(ルーズに)が可能でオペレートはどれを入力しても多重でも構いません。 これらはリンクなしのテキストBOXにて入力。 ヒットした分だけをグリッドに見出し(検索キーの部分だけ)を全データ表示させ、 グリッド内での選択で1行リバース(色変え)し、入力部(メインのテキストBOX)へ戻してやる というものです。 ・いっそのこと、VBでは良くやったのですがグリッド自体をワークファイル代わりに 使えませんか?つまり単なる入れ物として当該データを流し込み色々操作、選択後、選択 データにて本データを更新なりしたいのですが? これが可能なら解かりやすいのですが、つまり、グリッドに何のレコードソースも与えず VB、オラクルなどのレコードセット風に使えると便利なのですが。 VBではサードパーティのスプレッドを使ってましてこれが非常に便利でしたので。 具体的には、例えばあるDBFファイルより条件抽出したデータそのものをグリッドに流し込 んで表示(編集、計算可能)させると言ったことですが? 長々書きましたが。よろしかったら、よろしくお願いします.
ファイルが特定できないのは、もしかしてカレントディレクトリの 問題が解決できていないのかもしれません。 Foxのプロジェクトでアプリケーションを作成している場合 アプリケーションのフォームとかをテストRUNしたとき カレントディレクトリはVFPが起動したディレクトリになります。 c:¥programfiles¥VisualStudio¥vfp〜 とかになってしまいます。 この絶対パス属性を排除するためには プロジェクトでアプリケーション開発作業を開始する前に コマンドウインドウで cd c:¥開発中のプロジェクトディレクトリーパス で明示しておくと間違えなくて済みます。 このようにしておきまして アプリケーション中では use data¥table1 in 0 のように 相対パス記述にすると良いです。 exeを作成した場合は 起動exeのディレクトリパスが カレントになりますので カレントディレクトリ下にある dataディレクトリのテーブルがポイントされるようになります。 もう1つ重要なのは 一般的にフォーム中にグリッドを作成するときには データエンバイロメントからドラッグ&ドロップで 持ち込みますが、このデータエンバイロメントが フルパスでプロパティ内に記憶されてしまいます。 これがデータを任意にワーク書き出しをした時に GRIDと接続できないエラーとなる要因となります。 これを回避するには 1.Form上でGRIDとかのオブジェクの無い場所で マウス右クリック 2.メニューからDataEnviromentを選択し 3.テーブル構造ウインドウをワンクリック 4.Delキーで削除 こうしてフォームのデータ接続環境から削除し Formの Load Eventに use data\customer in 0 copy to data\work use in "customer" use data\work in 0 というように記述します。 Load Event以外に記述するとGRIDと接続できなくなります。 [これはGRIDのオブジェクトがフォームに作成されるときに すでにリンクするデータ環境が確立されていないとエラーに なるためです。] workの内容を変更したい場合や set filterをかけたいときなどは 例 with thisform .lockscreen = .T. &&いったん グリットを停止します。 workに対してなにかやりたい作業を書きます .lockscreen = .F. .Grid1.SetFocus Goto Top .Grid1.Refresh endwith
>どうしても選択セルの枠とカーソルが出てしまいます.確かに色は同じになりましたが、選択 >枠、カーソルを表示させないpropetyはないのでしょうか? >やりたい事は単純でグリッドの選択時レコード(ROW)だけにしたいのです。 グリッドを単に表示用のみとして使われるんですか? どうも選択枠を消すのはむずかしそうです カーソルを表示させないのは grid の textbox の enabled property を .F. にして disabledbackcolor disabledforecolor の色設定を適当に変更すれば カーソルを消すことができそうです。
コンボボックス、リストボックスでのファイル選択法
コンボボックスやリストボックスでファイル名のリストを選択させる方法です。 基本的にコンボボックスもリストボックスも同じです。 フォーム上にコンボボックスを張り付けます propertyを次のようにセットします。 RowsourceType 7-files Rowsource *.txt (たとえば拡張子がtxtのファイルのみ表示させたい場合) 次にInteractiveMethod に次のようなコードを書きます Thisform.label1.caption = alltrim(Thisform.combo1.value) これでファイル名は取得できるのですが、これではパス名がないので そのファイルを参照できません。 パス名を取得するには次のようにします。 Thisform.label1.caption = Thisform.combo1.list(2)+alltrim(Thisform.combo1.value) このように Thisform.combo1.list(2) にパスが格納されています。
手軽にMAILウインドウを立ち上げる方法
フォームへ フォームツールバー中の ハイパーリンクオブジェクトをドロップします。 トリガーとなるボタンのクリックメソッド等に thisform.HyperLink1.NavigateTo("mailto:mailID@doutarakoutara.ne.jp") でOKです。 メールアドレスは適当に変えてくださいね。 MAPIをコントロールしなくても とりあえず 送信先アドレスを入れたメールウインドウを立ち上げたい ようなときに とってもお手軽です。
Foundation Classの探検
VFP6の faundation class には かなり役にたつツールというかクラスが含まれているようです。 みなさん 時間があるときは faundation class を探検してみては? VFPを起動して、メニューバーの [TOOL] ..[Component Gallery]を 開きます。 クラスのアイコンをダブルクリックするとクラスデザイナーが立ち上がって中が見えます。 もうひとつ Solutions Sample を実行してみると いろいろなテクニックがわかります。 基本的なgrid buton combobox Checkbox の使い方から、高度なテクニックまで Help から Microsoft VusalFoxpro Help Topics を選んでください MSDNが開きますのでその中からVisual Foxpro Documentationを選んで SAMPLES VisualFoxpro Samples からサンプルプログラムを実行。 または Visualfoxpro Faundation Classes を覗いてみてください。 Faundation Classの解説があります。 ただしもちろん英語だょ!!!
Foundation Class の探検 その1(Multimedia)です。 VFPのメニューバーから[TOOLS] .. [Conponent Gallery]を 選択してconponent Gallery を開いてください Foundation Classes の下のmultimediaを選択します。 左側のwindowにsoundplayer とvideoPlayer というアイコンが表示されます。 このアイコンをフォームデザイナーで作成中のフォームの上にドラッグ&ドロップ するだけで音声データと(wav)と動画データ(AVI)player オブジェクトを フォーム上に張り付けることができます。 貼り付けると自動的にbuilderウィンドゥが開きますのでselect video(sound)に 音声(動画)データのファイル名を指定するだけです。 これでフォームを実行すると音声(動画)データが再生されます。
Foundation Classes の探検 その2(date/time) その1と同じように Conponent Gallery を開きます。 Foundation Class の下のdate/timeをクリックします ActiveX Calendar, Stop watch, clock の3つのアイコンが表示されます。 機能はそれぞれ名前の通りで、カレンダー表示、ストップウォッチ、デジタル表示の時計です。 アイコンを選択して右クリックでショートカットメニューがでます。 このメニューから View Sample を選んで run でサンプルプログラム が実行されます。 使い方も前回と同じようにフォーム上にドラッグ&ドロップするだけ。 フォームを実行してみてください。
Debbugerとソースの修正連携について
デバッガーから直接ソースを修復する方法の件です。 方法はエラー発生時 サスペンドボタンを押した後 デバッガーが立ち上がり エラー発生行を→が示している 状態でメニューの[Debug]-[Fix]を選択しますと 該当行にカーソルが移動したエディターウインドウが 開きます。 なを基底クラスでエラーが発生した場合は この方法では 修正に入れません。