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の裏側でした。


BFのヘッダー形式取得について


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の定義名を直接書くか、プログラムで 書くかの違いです。


BFファイルに画像データを取り込む方法


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]を選択しますと
該当行にカーソルが移動したエディターウインドウが
開きます。
なを基底クラスでエラーが発生した場合は この方法では
修正に入れません。