モナーの *やさしい* Delphi質問スレ Ver.7
911,913さん
ごめなさい〜ほんと、endがなかったです。申し訳ありません
ほんとの素人とは私です......
940 :
デフォルトの名無しさん:02/06/08 01:19
D6proからADOでmdbファイルを使ってプログラムしようとしているのですが、
私の認識としては mdbを使う場合、Access自体かAccessのランタイムが必要になる
であろうと考えておりました、実験してみると、やはりAccessが入っていないPCでは
mdbへアクセス出来ませんでした。
ここまでは予想していた通りだったのですが、実はOfficeのDeveloper版を購入してあり、
AccessRTのセットアップでAccessのランタイムをインストールすると見事にD6で作成
したプログラムが実行できましたが、Accessのランタイムをアンインストールした後も
実行出来る事が判りました。D6からmdbを使う場合にはAccessのランタイムをインストール
しなくても何かDLLをコピーするだけで使えるのでしょうか?
mdb(Access)側でVBAを使うでもなく、単にDelphiのISAMファイルとしてmdbを
利用したいだけなのですが・・・。
>>939 今時珍しい心の清らかな人アルネ。あやまらんでもいいアルヨ。
>>940 DBをアプリで使う&配布を簡単に済ませたい場合は
MyBaseしかないかなーと思いこんでいたからAccess+ADOは
盲点だった&ちょっと注目してる。
この方法だとAccessさえ持ってればアプリで作成したデータを
Accessで好きなように加工/メンテ/他形式への変換ができるから
作り込むアプリの機能を最低限で済ませられるメリットがあるのが
良いね。
もしよかったら今後も経過報告してくれるとうれしい。
サブルーチンを作って呼び出すにはどうすれば良いんでしょうか?
>>944 procedure sub(var x:Integer);
begin
x:= x*x;
end;
と、どこかに書きます。 コンパイルしてエラーが出るなら書く場所が違うので移動
サブルーチンでなく、"関数"あるいは"手続き"でヘルプをお探しなさい
>>945 それを呼び出すにはどうすれば良いんでしょうか?
sub(nil);だとエラーが出ます。
>>947 Integerにnilを渡しちゃだめ。
変数パラメータに定数を渡しちゃだめ。
procedure sub(x: Integer); とすれば、
sub(0); で呼び出し可能。でも計算結果は戻ってこない。
てか、これはマジな質問なのか?
ねたに一票。
そもそもnilを渡すことなど思いつくことがおかしい・・・。
サブルーチンとか言ってるし、ブビ厨か?
nilを代入したのも、新しく覚えた言葉を使いたがってるだけとか。
>>937 アプリがアクティブかどうかは問いません。
どちらかで動作していて、ユーザがパソコンに触れていない時間が続いたら、
自動的に終了するようにしたいのですが、どうすればできるのか見当も付きません・・・
有難う御座いました 出来ました。
nil=null=空で使えるかと思ってました。
×945 ○947
>>953 ネタじゃないらしいので一言。
nilは空のポインタだが、数値に空という概念はない(必ず何かの値が入っている)。
Delphiに限定した話ではないが、0とnil(null)を混同しているなら整理が必要。
>>952 「ユーザがパソコンに触れていない時間」を取得できればいいわけか。
昔メーリングリストでそんなのあったな・・・
>>952 アプリの外で何か作業をしているかを確認しないといけないならフックが必要だと思いますよ。
>「ユーザがパソコンに触れていない」
なら、スクリーンセーバを登録して、スクリーンセーバからメッセージを貰ったら?
>>958 ユーザのスクリーンセーバーの設定を強引に変更するのはスマートじゃないよねぇ
pCharをファイルに書き込む際、
var
p: pChar;
f: file;
begin
(略)
BlockWrite(f, p, StrLen(p)+1);
(略)
end;
としているのですが、読みとり方が分かりません。
#0が出るまで1Byteずつ調べていかねばならないのですか?
>>960 後方シークが許されるなら、適当な長さずつまとめて読み込んで、メモリ上で
#$00を探す、という手が使えますが、出来ないなら1Byteずつ、ってなりますね。
特に既存のファイルフォーマットに制約されないなら、文字列の直前に
文字列長を書き込んどけば楽でっせ。
var
s: String;
len: Byte;
//書き込むとき
len := Length(s);
BlockWrite(f,len,1);
BlockWrite(f,PChar(s)^,len);
//読み込むとき
BlockRead(f,len,1);
SetLength(s,len);
BlockRead(f,PChar(s)^,len);
これだとByte型の制約から255文字までだけど・・・
>>961 なるほど、やはり直前にサイズを書いておくべきですね。
ファイルのパスを保存するので、ShortIntを用いれば十分ですね。
ミスった…。ShortIntじゃなくてSmallIntです。
>>956 それ、やっぱDLL作ってシステムフックでやるの?
ちょっと面倒だなぁ…
いろいろと…
あるプロシージャでpCharのメモリをStrAllocを用いて確保したのを、
別のプロシージャ(Destroy)でStrDisposeを用いて解放しようとすると
無効なポインタ操作と言われます。
解放するにはどうしたらいいのでしょうか?
>>965 方法は間違ってない。なにか変なことやってるだろ。
ソース晒してみたら?
967 :
デフォルトの名無しさん:02/06/09 18:08
>>965-967 ローカル変数だったら「未定義の識別子」だろ。
やっぱソース晒すしか無さそうだね。
あとString使って、SetLengthで代用できるなら、そっちの方が
なにかと安全かな。
>>968 ローカル変数だったら「未定義の識別子」だろ。
違うプロシージャで同じ名前のローカル変数っていう可能性もある
PDataSという、TDataS構造体へのポインタがありまして…。
Name: pCharといふフィールドを持っています。(他にもありますが)
これをTListを継承したリストに格納(StrAllocとStrPLCopyで。)
して、Destroyするときに
for i := 0 to Count-1 do
begin
StrDispose(PDataS(Items[i])^.Name);
Dispose(Items[i]);
end;
としているんですが、どこが違うでしょうか?
>>970 StrDisposeじゃなくてDisposeのほうじゃない?
>>971 StrDisposeの方をコメントアウトすると例外が生成されないんですが…。
974 :
デフォルトの名無しさん:02/06/09 19:42
こういう場合どうするんでしょうか
str := ''';
>>973 procedure AddData(bs: String;...);
var
ps: PDatas;
(略)
New(ps);
ps^.Name := StrAlloc(Length(bs)+1);
StrPLCopy(ps^.Name, bs, Length(bs));
(略)
Add(ps);
としています。
>>974 str := #$27;
で良いと思います。
>>972 Disposeの方をコメントアウトしても例外が生成されないだろ、多分。
とりあえず、
> Dispose(Items[i]);
は
Dispose(PDataS(Items[i]));
だと思われ。
>975
アリガトウ
>>976 Dispose(PDataS(Items[i]));
に書き換えましたが、やはり例外が発生します。
>>979 ここに上がってるソースには問題ない。
どこかほかの個所でメモリを破壊してるんだろ。
ちなみに↓はうまくいくコードだ。
procedure TForm1.Button1Click(Sender: TObject);
type
PDatas = ^TDataS;
TDataS = record
Name: PChar;
end;
var
ps: PDatas;
bs: String;
list: TList;
i: Integer;
begin
list := TList.Create;
bs := '( ´∀`)';
for i := 0 to 999 do begin
New(ps);
ps^.Name := StrAlloc(Length(bs)+1);
StrPLCopy(ps^.Name, bs, Length(bs));
list.Add(ps);
end;
for i := 0 to list.Count - 1 do begin
StrDispose(PDataS(list.Items[i])^.Name);
Dispose(PDataS(list.Items[i]));
end;
list.Free;
end;
DataSの他のメンバは?Nameを上書きしていない?
>>980-981 う〜ん、色々と見たんですが何せソースが膨らみすぎてて…。
印刷して色々と調べてみます。
>>983 整理しにくくなるじゃねーかよ! 新しいの立てろゴルァ!
>>984 あっちを残しておくとまた厨がageて
ごっちゃになるのであっち使おうぜ。
>>985 しゃーねーな、削除依頼出して消してもらえんのかな。
>>984 スレのタイトルが気に食わないんだったら
.idxファイルを直接いじって変えられるけど?
的外れなレスだったらスマソ
あ、かちゅ〜しゃ使ってるんだったらだけどね