モナーの *やさしい* Delphi質問スレ Ver.7

このエントリーをはてなブックマークに追加
939909です:02/06/08 00:42
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を
利用したいだけなのですが・・・。

941素人:02/06/08 01:19
>>939
今時珍しい心の清らかな人アルネ。あやまらんでもいいアルヨ。
942940:02/06/08 02:41
MDAC_TYP.EXE と Jet40Sp3_Comp.exe を
http://www.microsoft.com/japan/msdn/data/download.asp
ここから取ってきてインストールするだけでした、

これを再配布して良いのか悪いのかイマイチ不明ですが、とりあえずAccessランタイム無くても解決しました。
この構成でmdbの最適化(サイズを小さくするやつ)ができるのか不明ですが、これから試してみます。
>>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を代入したのも、新しく覚えた言葉を使いたがってるだけとか。
952929:02/06/08 12:39
>>937
アプリがアクティブかどうかは問いません。
どちらかで動作していて、ユーザがパソコンに触れていない時間が続いたら、
自動的に終了するようにしたいのですが、どうすればできるのか見当も付きません・・・
953945:02/06/08 13:25
有難う御座いました 出来ました。
nil=null=空で使えるかと思ってました。
954953:02/06/08 13:30
×945 ○947
955948:02/06/08 13:36
>>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を用いれば十分ですね。
963962:02/06/09 12:20
ミスった…。ShortIntじゃなくてSmallIntです。
>>956
それ、やっぱDLL作ってシステムフックでやるの?

ちょっと面倒だなぁ…
いろいろと…
965962:02/06/09 15:32
 あるプロシージャでpCharのメモリをStrAllocを用いて確保したのを、
別のプロシージャ(Destroy)でStrDisposeを用いて解放しようとすると
無効なポインタ操作と言われます。
 解放するにはどうしたらいいのでしょうか?
>>965
方法は間違ってない。なにか変なことやってるだろ。
ソース晒してみたら?
967デフォルトの名無しさん:02/06/09 18:08
>>965
…ローカル変数じゃねーの?
>>965-967
ローカル変数だったら「未定義の識別子」だろ。
やっぱソース晒すしか無さそうだね。

あとString使って、SetLengthで代用できるなら、そっちの方が
なにかと安全かな。
>>968 ローカル変数だったら「未定義の識別子」だろ。
違うプロシージャで同じ名前のローカル変数っていう可能性もある
970965=962:02/06/09 19:20
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のほうじゃない?
972965=962:02/06/09 19:36
>>971
 StrDisposeの方をコメントアウトすると例外が生成されないんですが…。
>>972
StrAllocの方はどうやってる?
974デフォルトの名無しさん:02/06/09 19:42
こういう場合どうするんでしょうか


str := ''';

975965=962:02/06/09 19:48
>>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]));
だと思われ。
977974:02/06/09 20:03


>975

アリガトウ

>>974
str := '''';
979965=962:02/06/09 20:06
>>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を上書きしていない?
982965=962:02/06/09 21:31
>>980-981
 う〜ん、色々と見たんですが何せソースが膨らみすぎてて…。
印刷して色々と調べてみます。

  ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ( ´∀`)<. 次スレはこちら(重複スレを再利用)。
 (    ) .| モナーの *やさしい* Delphi質問スレ Ver.7
 | | |  | http://pc.2ch.net/test/read.cgi/tech/1021262086/l50
 (__)_)  \_________________________
>>983 整理しにくくなるじゃねーかよ! 新しいの立てろゴルァ!
>>984
あっちを残しておくとまた厨がageて
ごっちゃになるのであっち使おうぜ。
986984:02/06/11 17:59
>>985
しゃーねーな、削除依頼出して消してもらえんのかな。
>>984
スレのタイトルが気に食わないんだったら
.idxファイルを直接いじって変えられるけど?

的外れなレスだったらスマソ
あ、かちゅ〜しゃ使ってるんだったらだけどね