くだすれDelphi(超初心者用)その18

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。

<前スレ>
くだすれDelphi(超初心者用)その17
http://pc5.2ch.net/test/read.cgi/tech/1091671391/

<その他>
ボーランド
http://www.borland.co.jp/
DelWiki
http://onigiri.s3.xrea.com:8080/delphi/
TIdFTPを使っています
ダウンロードを途中で止めたい場合、abortを使っているのですが例外がでてしまいます。
abortをtry〜exceptで囲っても捕まえることができません。
この例外を出ないようにしたいのですがどうすればよいでしょうか?
yahooで「TIdFTP abort」で検索すると、threadの中でAbortするな
みたいな記事がでてくるけどどう?

IndyのサンプルプログラムにTIdFTPのデモってないのかな?
>>4
すばやいレスありがとうございます。Yahooは未チェックで検索結果がGoogleとここまで違うとは収穫でした。

Indyのサンプルプログラムでも同じ例外はでます。
ほかにもTIdFTPを使ったサンプルをいくつかみつけましたがどれも同様でした。
検索して出てきた記事を何度か読み直してみましたがおそらく今回の件とは関係ないようです。
デバッグ環境でやってて例外をキャッチしないとかじゃないよね。
デバッグオプションで例外のチェックをはずすか、.exeから実行
すればちゃんとキャッチするとかだったら、既出度120%で今にも
波動砲が発射されそうな勢いなのだが。
>>6
すいません、わからない事もあって説明がおかしいかもしれません。
追加でわかった事も含めてもう一度まとめました。

abortを実行すると切断を知らせる例外が発生するのですが
それはIdFTP1.abort;をtryで囲んでも捕まえられません。
Button1Clickでabortを実行するとButton1Clickを抜けてから
例外が発生するようです。(TIdAntiFreezeを利用しています。)
また、TIdFTPのOnWorkイベントでも同様でした。
なのでどこをtryで囲めばいいのかわかりません。

メッセージボックスに表示されるのは「Disconnected.」です。(IDEではなくexeをダブルクリックして実行した場合)
おそらくIdIOHandlerSocket.pasの
raise EIdClosedSocket.Create(RSStatusDisconnected);
だと思うのですがコメントアウトすると
'access violation at 0x00406609: write of address 0x00030ec0'
とでます。

言語固有の例外にEIdSilentExceptionは追加しています。
実験してないのでわかんないけど、Abortすると
KillDataChannelも同時に実行されてソケットハンドルが閉じられるそうだけど、
Abort後にそれに対して何か操作してるところとかない?
TDBGridのColumnsの話なんですけど
今、表示されてる(VisibleがTrueになってる)アイテムの数を知るプロパティみたいなものってないですか?
FieldCountだと非表示のやつまでカウントされるんで・・
>>8
Abortの後は何もしないようにしています。
Getメソッドの中で何かしてるのかと思い調べていきましたがよくわかりませんでした。
(Getメソッドの中を弄らないといけないならちょっと手に負えない気がします)

Getメソッドは受信したファイルを書き込むファイル名、もしくはTStreamを指定できるのですが
ファイル名のほうを指定し
procedure TIdTCPConnection.RaiseExceptionForLastCmdResult;
begin
raise EIdProtocolReplyError.CreateError(LastCmdResult.NumericCode, LastCmdResult.Text.Text);
end;
のraiseをコメントアウトすれば例外はでなくなりました。
とりあえずの解決です。

ただ、TStream(TFileStreamを使っていますが)を使いたいのでもう少し調べてみます。
長い時間ありがとうございました。

ちょっと時間をかけ過ぎたようで自前実装のほうが速かったような気もします orz
TMainMemuに関しての質問です。
メニュー操作中は処理を一時無効にして、メニューが実行された場合やメニューから
フォーカスが外れた場合に処理を再開しようとしています。
TMainMemuにはFocusedメソッドも無く、ActiveControlでは判断できませんでした。
メニューが操作中か、メニューにフォーカスがあるかわかる方法は無いでしょうか?
>>11
フォーム直下に表示されるメニューに関しては、操作の開始と終了時に
フォームに WM_ENTERMENULOOP と WM_EXITMENULOOP がそれぞれ
送られてくるようです。
それ以外にもメニューの状態変化は、親ウィンドウにメッセージとして
送られてきますので、適当なものを WinSight で調べてみてください。
1311:04/09/01 22:07
>>12
素早い回答ありがとうございました。
WM_ENTERMENULOOPとWM_EXITMENULOOPを調べて試してみます。
finally〜end; で、例外でないときのみ実行したいコードがある場合、
どうすれば良いのでしょうか?
ExceptObject は例外があってもなくても nil なので使えませんでした。

 try
  raise Exception.Create('Hoge');
 finally
  // if not 例外 then 処理A
  if ExceptObject = nil then
   ShowMessage('finally: ExceptObject = nil');
 end;
finally〜end; でないといかんの?

try
finally
end;
// ここに書いたコードは try〜 finally で例外発生時には実行されない

これでいいと思うが
1614:04/09/02 01:21
>>15
例外発生時には同じ関数内で別の処理をしたいのですよ。
こんな感じです。

procedure EndUpdate;
begin
 Dec(UpdateCount);
 if UpdateCount = 0 then
  if not 例外 then 処理A
end;

 BeginUpdate;
 try
  raise Exception.Create('Hoge');
 finally
  EndUpdate;
 end;

finally直前に UpdateCount = 1 の時に処理Aをするはカッコ悪いので駄目です。
  ...
  if UpdateCount = 1 then 処理A
 finally
  Dec(UpdateCount);
 end;

これもカッコ悪いので駄目。
 except
  EndUpdate;
  raise;
 end;
 EndUpdate;
例外発生にかかわらず、同じ関数内でしたい処理もある。
と言うべきでした。
そもそもfinally部が
「例外が起こっても絶対に実行する処理」なわけだから
そこで一部だけ処理したいと発想するのがおかしい
日系ソフトウェアを読みながらメールクライアントを
作っているのですが
Dateヘッダーの形式
Sat, 14 Apr 2004 12:08:43
を作るにはどうしたらよいでしょうか?
>C言語の__FILE__, __LINE__に相当する機能は? ↑

>基本的にありませんが、Assertで失敗することで取得できます。
>ただし字面の見栄えが悪いのと速度が遅いのが難点です。

>try Assert(False) except on E:EAssertionFailed do ShowMessage(e.Message); end;

これって、AssertErrorProc 使ったほうがいいみたいだね

>これって、AssertErrorProc 使ったほうがいいみたいだね
影響が大きすぎるだろ。
備わっていない機能を無理に使うよりモジュール名メソッド名を
手打ちで出力しておいたほうがよっぽどまし。
備わっていない機能って何?
>C言語の__FILE__, __LINE__に相当する機能は? ↑
いや、そういう意味じゃなくて、
tryとかで無理矢理はさむよりAssertErrorProcを使ったほうがいいよねって意味で言ったの
AssertErrorProc自体無理やりだろって意味で言ったの
ごめん。意味わかんない。
>>26
言いたいことは「影響が大きすぎるだろ。」って事だけだよ。
無理やりAssertErrorProcを使って取得するのは現実的ではない。
実際に試してみたか?
他の箇所でもAssertを大量にばら撒いているようなプロジェクトでさ。
messageで振り分ければ簡単
ファイル名や行番号取得目的でなかったらデフォルトの呼べばいいし
割り込み。
AssertErrorProcを置き換える時に元のアドレスも保存しておいて

ShowOnce := True; //グローバル変数。一回だけ情報表示に使う意味
Assert(False); //AssertErrorProcでShowOnceを見て呼び分ける。ShowOnceをFalseに戻す。

なんてのを思いついた。
>>28
だからそれを実際にやっているのかと・・・
万難を排して実現するようなもんじゃないだろ。
ってのは俺の価値観か。邪魔したね。
影響が大きすぎるというなら、そもそもe.Messageにファイル名と行番号が入っているとは限らなんな
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
>>14
字面通り解釈するならこんなのでどうでしょうか.

var ExceptionRaised: boolean; // 『例外が生成された』フラグ

procedure BeginUpdate;
begin

 処理
 ExceptionRaised := False; // 例外はまだ生成されていない 
end;

procedure EndUpdate;
begin
 Dec(UpdateCount);
end;

BeginUpdate;
try
 try
  処理
 except
  ExceptionRaised := True; // 例外が生成されたことを記録
  例外処理
 end;
finally
 EndUpdate;
end;

ごめんなさい.間違ってポストしてしまいました.手続き差し替えです.

procedure BeginUpdate;
begin
 if UpdateCount = 1 then
  ExceptionRaised := False; // 例外はまだ生成されていない 
 Inc(UpdateCount);
 処理
end;

procedure EndUpdate;
begin
 Dec(UpdateCount);
 if UpdateCount = 1 then
  if ExceptionRaised then
   例外発生時の処理
  else
   処理A;
end;
#ところでUpdateCountのデフォルト値って1でよいのですよね.
フラグのExceptionRaisedがグローバル変数なのは
ちょっとまずいんじゃないの?
グローバル変数じゃなくってプロパティだろ。
どっちにしてもわけわかな副作用を持たせるより
素直にメソッド分けるなりして単純愚直にやるのが定石。
BeginUpdate
try
 ...
 Succeed or Finish or Close;
finally
 EndUpdate;
end;
except内で必ず何か記述させるより正常なシーケンスで何か呼ばせる方が
呼び忘れたときの検出が容易で被害が少ないと思うし。
3711:04/09/02 20:55
すみません、追加の質問です。
TMainMemuの操作中の判断はWM_ENTERMENULOOPとWM_EXITMENULOOPで無事判断する
事ができました。
しかし、TPopupMenuのメッセージはうまく取得できませんでした。
また、Personalしか持っていないので「WinSight」の代わりに「Spy++」を
使って送られてくるメッセージを見てみたんですが、メニュー関連と思われる
ものを見つける事が出来ませんでした。
ポップアップメニューを操作しているかどうかの判断は、どうすれば出来ます
でしょうか?
3811:04/09/02 20:56
一応、テストに使ったロジックになります。
 protected
  procedure WndProc(var Msg: TMessage); override;

procedure TForm1.WndProc(var Msg: TMessage);
begin
 case Msg.Msg of
  WM_ENTERMENULOOP:Memo1.Lines.Add('WM_ENTERMENULOOP');
  WM_EXITMENULOOP:Memo1.Lines.Add('WM_EXITMENULOOP');
  //WM_COMMAND:Memo1.Lines.Add('WM_COMMAND');
  WM_CONTEXTMENU:Memo1.Lines.Add('WM_CONTEXTMENU');
  WM_INITMENU:Memo1.Lines.Add('WM_INITMENU');
  WM_INITMENUPOPUP:Memo1.Lines.Add('WM_INITMENUPOPUP');
  WM_NEXTMENU:Memo1.Lines.Add('WM_NEXTMENU');
  WM_ENTERIDLE:Memo1.Lines.Add('WM_ENTERIDLE');
 end;
 inherited WndProc(Msg);
end;

procedure TForm1.FormClick(Sender: TObject);
begin
 PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;
>>38
モーダルなんだから

procedure TForm1.FormClick(Sender: TObject);
begin
Memo1.Lines.Add('PopUpEnter');
PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
Memo1.Lines.Add('PopUpOut');
end;

で十分。ただし、AutoPopup は false にして。
4011:04/09/02 21:18
>>39
あ、すみません。テストロジックの例がまずかったですね。
1つの場所だけではなく、複数ある内のどれかがポップアップしているのかを
判断したいのです。

procedure TForm1.WndProc(var Msg: TMessage);
begin
 case Msg.Msg of
  WM_ENTERMENULOOP:Timer1.Enabled := False;
  WM_EXITMENULOOP: Timer1.Enabled := True;
  //どこかのポップアップメニューを操作中:Timer1.Enabled := False;
  //どこかのポップアップメニューの操作を抜けた: Timer1.Enabled := True;
 end;
 inherited WndProc(Msg);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 //処理を行う。ただしメニュー操作中は無効。
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 PopupMenu2.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;
//その他、色々な場所で何種類かのポップアップメニューを表示
ToolHelp関数を使って他アプリケーションのヒープサイズを測っています。
今のところHeap32First+Heap32Nextを繰り返し回して合計を返すようにしているのですが、この部分が激烈に遅いのです。

例えばexplorer.exeのヒープサイズを測ろうとすると30秒近く待たされるのです。

var
h: THandle;
pe: TProcessEntry32;
hl: THeapList32;
he: THeapEntry32;
HeapSize: DWord;
st: Integer;
begin
h := CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if h = INVALID_HANDLE_VALUE then
begin
Exit;
end;

pe.dwSize := SizeOf(TProcessEntry32);
if Process32First( h, pe ) then
repeat
if pe.szExeFile='explorer.exe' then
Break;
until not Process32Next( h, pe );
CloseHandle( h );
h := CreateToolhelp32Snapshot( TH32CS_SNAPALL, pe.th32ProcessID );
if h = INVALID_HANDLE_VALUE then begin
Exit;
end;

//ヒープの列挙
st:=GetTickCount;
HeapSize:=0;
hl.dwSize:=SizeOf(THeapList32);
if Heap32ListFirst( h, hl ) then begin
repeat
he.dwSize:=SizeOf(THeapEntry32);
if Heap32First( he, hl.th32ProcessID, hl.th32HeapID ) then begin
repeat
if he.dwFlags and LF32_FREE = 0 then
Inc(HeapSize,he.dwBlockSize);
until not Heap32Next( he );
end;
until not Heap32ListNext( h, hl );
end;
MessageBox(Handle,
PChar(Format('Time: %d'#13+
'Heap Use: %d',
[GetTickCount-st, HeapSize]))
,'',0);

CloseHandle( h );
end;

実行環境は Win2k+D5+P3 850MHz です。
タスクマネージャで監視していると、Heap32Nextのループでexplorer.exeのプロセス占有が上がっていました。
なんとか速度を改善する方法、またはヒープサイズの計測で別な方法があればご教授願います。
Win32APIスレで聞いたら
Delphiって今後尻すぼみってほんとですか?
ほんとです。
>>45
なぜに?
ま、拡大していく要素なんか皆無だし、今後尻すぼみって言うより、すでに尻すぼみなわけだし
>複数ある内のどれかがポップアップしているのかを判断したいのです。

だって、手動でポップアップメニューを表示してるんだから、その前後でどこの
メニューが開こうとしているか、閉じようとしているかはコードでいかようにも
知らせることができるだろうさ
例えば wparam が 0 で開く、1 で閉じる。lparam はメニューの番号とかにして

procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(Handle,WM_APP,0,1); 
PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
PostMessage(Handle,WM_APP,1,1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
PostMessage(Handle,WM_APP,0,2);
 PopupMenu2.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
PostMessage(Handle,WM_APP,1,2);
end;
>>33-35
UpdateCountのデフォルトは0ですよ、当然。
Unitのプライベートな変数を使うのは構わないのですけど、
try〜exceptブロックが増えるので駄目です。
BeginUpdate〜EndUpdateのコンビは今でも4回使われていて、
将来も増えるかもしれないので、なるべくシンプルにしたいのです。

>>36 の Succeed or Finish or Close; ではまだ UpdateCount > 0 なのですよね。
やはり、 UpdateCount = 0 の時に処理をしたい。
と言うわけで、これが一番マシかな。

 try
  ...
 finally
  EndUpdate;
 end;
 Succeed or Finish or Close;
Del房ってネガティブだね
いきなり発売中止されたVBより何倍もまし
>>50
> UpdateCountのデフォルトは0ですよ、当然。
なんで当然なの?

> Unitのプライベートな変数を使うのは構わないのですけど、
> try〜exceptブロックが増えるので駄目です。
そこまで言いきるなら、try〜exceptは一切使わない。これ最強。


ひょっとして、また質問のふりをした釣りなのか?
5411:04/09/03 00:02
>>48-49
えーと、情報が小出しみたいになってすみません。

「その他、色々な場所で何種類かのポップアップメニューを表示」は
下のようなPopupMenuプロパティでのポップアップも含めてになります。
Panel1.PopupMenu := PopupMenu3;
Panel2.PopupMenu := PopupMenu4;
  ・
  ・
  ・
あとポップアップメニューの個数も、ポップアップするタイミングも、後から
追加していく事も多いので、出来れば設定を1箇所にまとめたいもので。

あと、>>40の意味がわかりにくかったですね。
基本的にやりたい事は、>>11のTPopupMenu版になります。
「複数ある内のどれかがポップアップしているのかを判断したい」は
「どのメニューがポップアップしているか」ではなくて、
「操作しているアクティブなものがポップアップメニューか(を判断し
タイマーイベントを処理するか判断する)」
あるいは「複数あるポップアップメニューの操作開始・操作終了を
一箇所で拾いたい(操作開始ならタイマー無効、操作終了なら
タイマー開始)」になります。
>>53
VCLソース読んだ事ある?


>>53
http://pc5.2ch.net/test/read.cgi/tech/1062422335/210-224
214
220
222
と同じ人物?

新手のVB荒らし?
と言うか、Halbowだろ。
ずいぶんいきなりだな。
軽量化のためにKOLを入れてみたのですがKOL関連のものを使うと

ファイル'ExptIntf.dcu'が見つかりません

と出ます。ExptIntf.dcuで検索してもロシア語のページが数件出てくるだけです。
どこかでExptIntf.dcuはDL出来るものなのですか?
ExptIntfはプロ版以上のみ。
>>54
>「操作しているアクティブなものがポップアップメニューか(を判断しタイマーイベントを処理するか判断する)」

うーん、いろんなところでポップアップされる可能性があるなら、メッセージを一つの
プロシージャで捕まえるのは難しそう。

TPopupMenu.PopUp() は仮想メソッドなので、これを override して

procedure TMyPopupMenu.Popup(X, Y: Integer);
begin
PostMessage(Application.Handle,WM_APP+55,0,0);
inherited;
PostMessage(Application.Handle,WM_APP+55,1,0);
end;

のようにした派生コンポーネントをつくって、Application.OnMessage で受け取ればいい
じゃないかな。試してないですけど。
61は駄目そう。表示中は Application.OnMessage 呼ばれない。Windows の方の
メッセージループを実行中なんだな。ごめん。
TPopupMenu.PopUp() は仮想メソッドなので、これを override して
OnInitPopUp と OnClosePopup イベントを付けた派生コンポをつくるのが簡単かも
>>54
TPopupList型のPopupListという、グローバル変数がある。

↓こんなクラスを作って、
type
 TMyPopupList = class(TPopupList)
 protected
  procedure WndProc(var m: TMessage); override;
 end;

プロジェクトソースを書き換えて、
 Application.Initialize;
 PopupList.Free;
 PopupList := TMyPopupList.Create;
 Application.CreateForm(TForm1, Form1);

とすれば、TMyPopupList.WndProcで、TPopupMenuの
WM_ENTERMENULOOPやWM_EXITMENULOOPを拾えるもより。
同じようなことしてた。
http://www.delphipraxis.net/post210991.html
ここみたくInitializationでやればプロジェクトソースは書き換えなくて済むか。
var
Hook: HHOOK;

function CallWndRetProc(code:integer;wparam:WPARAM;lparam:LPARAM):LRESULT;stdcall;
var
pCWPR:PCWPRetStruct;
begin
if (code < 0) then begin
result := CallNextHookEx(Hook,code,wparam,lparam);
exit;
end;

if (Code = HC_ACTION) then begin
pCWPR := PCWPRetStruct(lParam);
case pCWPR^.message of
WM_ENTERMENULOOP:
if pCWPR^.hwnd = PopupList.Window then
Form1.Memo1.Lines.Add('PopupEnter')
else
Form1.Memo1.Lines.Add('MainEnter');
WM_EXITMENULOOP:
if pCWPR^.hwnd = PopupList.Window then
Form1.Memo1.Lines.Add('PopupExit')
else
Form1.Memo1.Lines.Add('MainExit');
end;
end;

result := CallNextHookEx(Hook,code,wparam,lparam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Hook := SetWindowsHookEx(WH_CALLWNDPROCRET,CallWndRetProc,0,GetCurrentThreadID);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnHookWindowsHookEx(Hook);
end;

>>64
>>11 じゃないけど
すばらしい! TPopupMenu.PopUp() の中の最後の TrackPopupMenu() の中の
ウィンドウハンドルが PopupList.Window になってるんですね。ここで一括して
処理してるんだなー。なるほど。

ところで WM_ENTERMENULOOP や WM_EXITMENULOOP って SendMessage() なんで
すね。フックでも捕まりました。

長いループ処理で中でapplication.processMessages
をしているのに途中でフォームが閉じれないのはなぜでしょうか?
そのループを脱出できないからです
closeイベントでフラグ立ててそのループの中で
フラグを見るようにしました。
71デフォルトの名無しさん:04/09/03 10:22
>>68
ループ内のどの辺で、どのくらいの時間を消費しているのか
測定してみて、定期的にApplication.ProcessMessagesを
呼び出すようにすればいいのでは?

ただ、Application.ProcessMessagesを使いすぎるとパフォーマンスが
落ちることがあるようなので、その辺はチューニングする必要ありかも。
DelphiってWebアプリがしょぼいのしか作れなくて駄目だ
>>72
それでは、お勧めの開発ツールは何ですか?
php
75デフォルトの名無しさん:04/09/03 13:20
プログラムに関する質問じゃなくてもOKでしょうか?ダメならスルーしてください.

現在アニメーションのプログラムを製作しているのですが,知識が不足してきまして,
新しい参考書を買って勉強しようと考えています.
どの参考書が有効なのか自分だけでは判断付かなかったので,オススメの本がありましたら教えていただけませんか?

なお,今まで「Delphiゲームプログラミングのエッセンス(著:日高 徹)」という本を使って勉強していました.
ただこれは人から譲り受けたものでして,私はゲームを作っているわけではありません.
アニメーションと言いましても,シミュレーション結果をアニメーション表示する機能が付いている,というものです.
OpenGL
Charを、Integerに型キャストするにはどうすればいいんだ?
function Ord(C: Char): Integer;
>>72
IntraWebは?

あとPHPなら、Delphiと連携出来るみたい
http://users.chello.be/ws36637/php4delphi.html
適材適所
>>77
i:= byte(c);
8259:04/09/03 17:40
>>60
6personalを使っているのでそれが原因だったんですか・・・
他の方法を試してみます。ありがとうございます
>>81
なぜにByte・・・
Ordにしとけ
ずっと前にわざわざ機械語まで追ってくれた人が居たが
その人によるとOrd()とByte()の生成するコードはまったく同じらしい。
好みで使い分ければよろし
>>83
キャストでしょ?
8611:04/09/03 21:38
ポップアップメニューの件について、いろいろ調べていただいてありがとう
ごさいました。
PopupListなんてものがあるんですね。
コンポーネントを派生してなにかしないといけないのかと思っていましたが、
かなりスッキリしたコードになりそうです。ありがとうごさいました。
87デフォルトの名無しさん:04/09/04 01:25
Extendedで扱えないような巨大な実数を処理するためのライブラリはありませんか?
C:\HOGE\ フォルダの中に、20040829.txt, 20040830.txt, 20040901.txt, 20040902.txt ・・・
みたいな感じで、日付をそのまま名前にしたテキストファイルがびっしり詰まっているとします。
日付は必ずしも連続していません。
この中からいちばん日付の新しいもの(ファイルプロパティのUPDATE日付じゃなく、ファイル名の日付)
を取得するうまい方法ってありますか。
>>88
ファイル名をすべて列挙して調べるしかない。
9088:04/09/04 02:06
>>89
やっぱり・・・_| ̄|○・・・そうですよね

何かこう、拳握りしめて全身震わせながら叫びたくなるような
カッコいい方法があるんじゃないかと夢見てたんですが
88さんはなかなかの面白人間ですね。
>>90
function FindNewestFile(const Path: String): TFileName;
 function FileNameToDate(const FileName: TFileName): TDate;
 var
  y, m, d: Integer;
 begin
  y := StrToInt(Copy(FileName, 1, 4));
  m := StrToInt(Copy(FileName, 5, 2));
  d := StrToInt(Copy(FileName, 7, 2));
  Result := EncodeDate(y, m, d);
 end;
var
 sr: TSearchRec;
 date, latest: TDate;
begin
 latest := 0;
 Result := EmptyStr;
 if FindFirst(Path, faAnyFile, sr) = 0 then
 begin
  repeat
   date := FileNameToDate(sr.Name);
   if latest < date then
   begin
    Result := sr.Name;
    latest := date;
   end;
  until FindNext(sr) <> 0;
  FindClose(sr);
 end;
end;

こんな感じかな?もっと効率のいい方法があったら教えてくれ。
そのフォルダには日付ファイル名しかないと仮定して・・

ファイル名のリストを作成してソートをかけて
一番下のファイル名を返したら?
Dir /ON の結果をリダイレクトで取得して
一番上のファイル名を取得するやり方はどうかな。
ファイル名のフォーマットがYYYYMMDDなら、
>>92の比較部分をCompareStrにするのが一番早い気がする。
MMDDYYYYとかになったら対応できんけど。
>>87
Cのなら探せばあるはず。 Delphiのは知らない。
9788:04/09/04 04:19
>>92
すげーです
Delphi初心者なのはいうまでもないとして、WHS(VBS)はちょこっとかじったことがあり、
あるフォルダ中のファイル名列挙ってのは以前似たようなことをやった経験があるので、
そのコードを見直しながら、まずは何とかDelphiに翻訳しようと格闘していたんですが、
疲れて一服している間に、コード有り難うございます(なんでこんなに短けーんだ)

if latest<date then
begin
Result:= sr.Name;
latest:= date;
end;

↑この手順がマジに震えるほどカッコいいです。


>>93
ええ、その方法は漠然と考えてました。
かなりレベルの低い形で、ですけど。
いまやってるアプリはDBも扱っているので、そこに適当な仮テーブルでっちあげて、
いっこずつファイル名とって次々にぶち込んでいく、で、ソートした結果セットの
一番下を・・・いや、バカっぽくてごめんなさい
9888つづき:04/09/04 04:20
入れ子状態の関数(?)ってのは初めて見るので、何となくなじめなくて分けて書いてみたんですが、
それを解読しているうちに、もしかしたら日付にこだわる必要もないのかなという気もしてきて、
取りあえず以下のような形に(変数なんかはVBS以来のなじみの形に直して使わせてもらいました)
procedure TForm1.Button1Click(Sender: TObject);
var
MySrc:TSearchRec;
MyInt:integer;
MyPrv:integer;
MyStr:string;
begin
MyPrv:= 0;
MyStr:='';
if FindFirst('C:\Hoge\*.txt',faAnyFile,MySrc) = 0 then
begin
repeat
MyInt:=StrToInt(copy(MySrc.Name,1,8));
if MyPrv<MyInt then
begin
MyStr:=MySrc.Name;
MyPrv:=MyInt;
end;
until FindNext(MySrc) <> 0;
FindClose(MySrc);
end;
ShowMessage(MyStr) ;
end;
ちょっと確認したいのですが、

データセットなどのIsEmptyと(Bof and Eof)って結果はまったく同じですよね?

自分の解釈では同じだと判断したのですが
先輩(もう居ない)のソースコードを見ると両方が入れ違いに使われてたりするので
なにか自分の知らない意味があるのかと気になっているのですが・・。
100A:04/09/04 07:27
>>88 >>92
どっちが効率がいいかは、状況次第になるけど…。

私は、似たような処理の必要なアプリで、>92とは逆のアプローチでやってる。
>92にあわせて書いてみると……

function FindNewestFile2(const Path: String): TFileName;
 function DateToFileName(const Date: TDate): TFileName;
 begin
  Result := FormatDate('yyyymmdd', Date) + '.txt' ;
 end;
var
 date: TDate;
 nowfile: TFileName;
begin
 date := Now;
 repeat
  Result := DateToFileName( date );
  if FileExists(Path + Result) then Break;
  date := date - 1;
  Result := EmptyStr;
 until (Now - date) < 100;  // 最大検索数を設定。
end;

こんな感じ。(テストはしてないから、そのまま動くかどうかは不明)

ファイルのリストからではなくて、現在の日付から存在が予測されるファイル名を
決めうちでどんどん作って存在するか調べてみる。という方法。
101A:04/09/04 07:28
>88 を見た感じ、なんらかのログファイルっぽい。
そういうファイルは、ほぼ毎日次々と製作される可能性が高いので…

最新のファイルは、現在からそう日を置かない物の可能性が高い。
同じ場所にかなり大量のファイルが存在する可能性が高い。

と判断。
そういう条件の場合においては、存在するファイルを全て調べる>92の方法よりは、
こっちのほうが、効率が良くなるんじゃないかな…? と思ってみた。

ただし、この方法の欠点は、前提となる条件が外れると、むちゃくちゃ効率悪くなることw
あと、最大検索数より古いものが最新だった場合、検知できないこと。
正規表現でフィルタかけてファイル名ソートするとかもあるけどDelphiには標準で正規表現が無いんだな。
そこで良くない方法かもしれないけどStrToIntが例外起こすかどうかでチェックする場合の例
function FindNewestFile3(const Path: String): TFileName;
  function Check(const FileName: TFileName): Boolean;
  begin
    Result:=True;
  try StrToInt(ChangeFileExt(FileName, '')); except Result:=False; end;
  end;
var
  Files: TStringList;
  F: TSearchRec;
begin
  Result:='';
  Files:=TStringList.Create;
  try
    if FindFirst(IncludeTrailingPathDelimiter(Path)+'*.txt', faAnyFile, F)=0 then
    begin
      repeat
        if Check(F.Name) then
          Files.Add(F.Name);
      until FindNext(F)<>0;
    FindClose(F);
    end;
    Files.Sort;
    Result:=Files[Files.Count-1]//何もないときは例外起きそう
  finally
    Files.Free;
  end;
end;
103デフォルトの名無しさん:04/09/04 15:36
DelphiでBASICのMid代わりになるものってないのですか?
>>103
copy
>>104
見落としてました。
有り難うございます。
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
10788:04/09/04 17:34
何かみなさんグニャグニャです。アタマやわらかすぎです。
特に>>100 のお手並みはもうガツンです。
初心者でそれを知らなかったから思いつかなかった、なんて言い訳は通らないぐらいガツンです。
FileExists('--') ぐらいは僕だって知ってました。でも脳味噌ソリッドな僕には思いつきませんでした。

日付の間隔についてはさほど神経質になる必要はありません。100日どころか10日もとっておけば余裕です。

以下でOKでした(変数は勝手な自己流に直してます)
procedure TForm1.Button3Click(Sender: TObject);
var
MyHiduke: TDate;
MyFileNM:string;
begin
MyHiduke:=Date;
repeat
MyFileNM:=FormatDateTime('yyyymmdd',MyHiduke) + '.txt';
if FileExists('C:\aaa\' + MyFileNM) then
begin
ShowMessage(MyFileNM);
exit
end;
MyHiduke:=MyHiduke - 1;
until (Date-MyHiduke) > 10;
end;

>>102 のやり方はちょっと解読に時間がかかりそうです
MessageBoxを表示したときに音が出ますが
あの音だけを鳴らしたい場合、どのようにすればよいでしょうか?
sndPlaySound('chime.wav', SND_ASYNC)
ポーン
MessageBeep(MB_ICONEXCLAMATION);
IEのキャッシュから特定のファイル(URLを指定)を
別のフォルダにコピーするにはどうしたらいいでしょうか?
WininetのFindFirstUrlCacheEntryやFindNextUrlCacheEntryを使えばいいのでしょうか?
Delphi関係ないし
>>109
>>110
ありがとうございます。>>110さんのほう、いただきました。
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
{タスクトレイのアイコンを変える}
procedure TForm1.Button2Click(Sender: TObject);
begin
with NotifyIcon do
begin
hIcon := Icon.Handle;
end;
Shell_NotifyIcon(NIM_MODIFY,@NotifyIcon);
end;

ここのIcon.Handleのところですが
任意のアイコンを指定したいのですが
このIconはどこに読み込んでおけばいいのでしょうか?
外部のファイルとかリソースとか
>>116
そのリソースというのがやりたいです。
>>115
@FormにImageコントロールを貼り付けて
 Handle := Image1.Picture.Icon.Handle;
 ・・・

AもしくはTIconのインスタンスを自分で作成する
var
 MyIcon: TIcon;
begin
 MyIcon := TIcon.Create;
 MyIcon.LoadFromFile('hoge.ico');
 Handle := MyIcon.Handle;
 ・・・

Bリソースから読み込む
 事前にイメージエディタでプロジェクトのリソースファイルにアイコンを追加しておく
 Handle := LoadIcon(HInstance, 'hugo');
 ・・・

Cフォームのアイコンを流用する
 Handle := Self.Icon.Handle;
 ・・・

お好きなのをどうぞ
>>118
わお!勉強になります。
@をいただきます。ありがとうございます。
    ∧,,∧  
   ミ,,゚Д゚彡
    ミ つ旦)~~
  〜と,,,~),,~)

コントロールがDisabledの時の
Fontの色は何がつかわれているのでしょうか?

clInactiveCaption/clInactiveCaptionText/clGrayText
のどれかだとは思うのですが。
>>119 TImageList がおすすめ
>>120
clGrayText

clInactiveCaptionはアクティブじゃないタイトルバーの背景色
clInactiveCaptionTextは同テキストの色
ちなみに影付き
影付きの場合はclBtnHighlightとclBtnShadow
Popupメニューのようなちょっと他のところをクリックしただけで消えるような
メッセージボックスを作りたいのですが何のイベントを拾えばいいのでしょう?
ShellExecuteで起動したアプリケーションをアクティブにしたいのですが
最小化した状態のアプリケーションからタイマーで起動すると
起動したアプリケーションが非アクティブで起動されてしまいます。
>>126
なるほど。そうだったのですか、ご忠告感謝します
>>122さん、ありがとう。

もうひとつ質問します。

StatusBarの右下にあるサイズ変更可能をしめす
三角形の[//.]こんなマークを
FormやPanelに描画するスマートなやり方は
ありますか?

.NETのWinFormでSizeGripStyle Showにしたら出るので
何かAPIで描画できるようなきがするのです。

>>127
そうなんです。どうにかなりませんか?
>>128
やったことないけどDrawFrameControlで出来るんじゃないかしら。
DrawFrameControl(Canvas.Handle, Rect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP)

こんなんでパネルにSizeGripを表示してるコードが見つかった。
 ∫,,,,,,,,,∧,,∧  ありがとうございます。>>130-131さん
⊂,,,,,,,,,つ,,゚Д゚ミつ

Form上に貼り付けてみました。
object SizeGridImg: TImage
Anchors = [akRight, akBottom]
end

FormCreateイベントで
 SizeGridImg.Width := GetSystemMetrics(SM_CXVSCROLL);
 SizeGridImg.Height := GetSystemMetrics(SM_CXHSCROLL);
 SizeGridImg.SetBounds(
  Self.ClientWidth - GetSystemMetrics(SM_CXVSCROLL),
  Self.ClientHeight- GetSystemMetrics(SM_CXHSCROLL),
  GetSystemMetrics(SM_CXVSCROLL),
  GetSystemMetrics(SM_CXHSCROLL) );
 DrawFrameControl(SizeGridImg.Canvas.Handle, SizeGridImg.Canvas.ClipRect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);


このコントロールをMouseDownしているときに
リサイズ中なメッセージをFormに投げてあげたりするには
どうしたらいいんでしょうか…
錨使えば?
>>132
ReleaseCapture();
Perform(WM_SYSCOMMAND, SC_SIZE | 8, 0);
>>132
WM_NCHITTESTのメッセージハンドラでXPOS、YPOSがグリップ位置にあるかを判定して
Message.Result:=HTBOTTOMRIGHT;ってやるだけ。
 ∫,,,,,,,,,∧,,∧  
⊂,,,,,,,,,つ*゚Д゚ミつ
            おー、
        これでできた。
サンスコ。>>133-135のみなさん。

マジックナンバーの8ってのは
定義では喃喃でしょうね?

procedure TForm1.FormCreate(Sender: TObject);
begin
 Image1.Anchors := [akRight, akBottom];
 Image1.SetBounds(
  Self.ClientWidth - GetSystemMetrics(SM_CXVSCROLL),
  Self.ClientHeight- GetSystemMetrics(SM_CXHSCROLL),
  GetSystemMetrics(SM_CXVSCROLL),
  GetSystemMetrics(SM_CXHSCROLL) );
 DrawFrameControl(Image1.Canvas.Handle, Image1.Canvas.ClipRect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
 Image1.Cursor := crSizeNWSE;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin//
 if ssLeft in Shift then
 begin
  ReleaseCapture;
  SendMessage(Self.Handle, WM_SYSCOMMAND, SC_SIZE or 8, MakeLong(X, Y));
 end;
end;
俺もSC_MOVE or 2の2が気になる…
                               /  気  !
                           l      |
''''''''''‐-、,                        |   に  |
::::::::::::::::::::\                     |        |
:::::::::::::::::::::::::ヽ               _,,,,,,_ .|   す  |
:::::::::::::::::::::::::::::':,               ,.-''"::::::::::::`l        |
::::::::::::::::::::;ヘ::::;::i            /::::::::::::::::::::::::|   る   l
::::::::::::::::::::'、|ヽ!ヾ           /::::::::A:::;::::/!::ムli       |
:::::::::::::::::::、:'、              ,':::::::::ハ;ハ;l レ' '|ヽ  な  /
:::::::::::::::;:::| `!  ,.,.._         レi::;lV. ┃   ┃''"ム  /
::::::/l:::ハ:|,/  i ヽヘ,       '〈|         ソ'''''、
:::/ ,|/,,/    ',  l, ヽ.       l、   r一‐:、  /:::::::::::'、
/ | ''      \ 丶.ll''r、.,_   /::`':.、 ヽ--‐',.イ、::::::::::::::'、
:‐┴:、.       `i''y'l |: : : ``''ヽ‐''ヾil´`i';、''" /  >、:i、::::::',
    \       '-'、/ : : : : : : :`: : : lL,, l  /_ ,//: :\'、;::、
139デフォルトの名無しさん:04/09/05 20:20
エクスプローラのプロパティとかで使われてる
編集できないけど選択範囲でコピーはできる部品って
Delphiではどのコンポーネントなんですか?
>>139
TEdit。ReadOnlyをtrueにする。
141139:04/09/05 20:40
>>139
おぉ、ありがとうございます。
なるほど、プロパティを弄るのでしたか。
142139:04/09/05 20:41
焦りすぎて間違えますた・・

>>140さんありがとうございます。
14377:04/09/05 20:42
亀だけど、dクス!
144デフォルトの名無しさん:04/09/05 21:06
PageControlのページ切り替えを出来なくする事は可能ですか?
EnabledをFalseにすると、ページ内のコンポーネントまで死んでしまうので他の方法があれば教えてください。
>>144
OnChangingイベントで、AllowChangeをfalseにする。
即レスありがとうございました。
IDiscMasterインターフェースを定義したいのですが
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/idiscmaster.asp

IDiscMaster = interface (IUnknown)
['{520CCA63-51A5-11D3-9144-00104BA11C5E}']
function Open: HResult; stdcall;
function EnumDiscMasterFormats(ppEnum: Pointer): HResult; stdcall;
end;

function GetActiveDiscMasterFormatは、どのように定義すれば良いのでしょうか?
半径100pixelの円を書きたいのですが(Sin・Cosを使用して)

begin
Image1.Canvas.MoveTo(Trunc(Sin(0)*100)+100,Trunc(Cos(0)*100)+100);
for i:=0 to 360 do
begin
Image1.Canvas.LineTo(Trunc(Sin(i*Pi/180)*100)+100,Trunc(Cos(i*Pi/180)*100)+100);
end;
end;

1度づつ線を引く場合はこの計算で無駄な部分や間違っている部分はありますか?
>>148
何で Ellipse を使わないの?
TImage の Canvas は Picture.Bitmap.Canvas と同じで、ビットマップを
変更する都度 Picture.OnChange イベントが発生して全体が無効化される。
従って、表示中に複数に分けて描画を行うとパフォーマンスが低下する。
150148:04/09/06 19:37
>>149
普段の円はEllipseを使うのですが
Sin・Cosを使用しての場合これでよいのか聞いたんです。
円を描くだけでなくて他に応用
するつもりでしたが、質問の仕方が悪かったんですね。

Trunc(Sin(i*Pi/180)*100)とTrunc(Cos(i*Pi/180)*100)
の計算はこれでよいのかって事です。
yattemitaraii
DegToRad
>>148
0から360まで回すのが無駄(特にsinとかcosとか重そうな演算を使っているときは)。
0から90まで回して、x軸、y軸の線対称と円の中心の点対称で描いてやれば速くなるかも。

それよりもTBitmapのオブジェクトを作ってメモリ内で描画して、
その後にImage1.picture.bitmapにAssignする方が速かったりして。


>Trunc(Sin(i*Pi/180)*100)とTrunc(Cos(i*Pi/180)*100)
>の計算はこれでよいのかって事です。

自分でやってみればすぐ分かるんでは?
>質問の仕方が悪かったんですね。
(Sin・Cosを使用して)って言ってんだから悪くないだろ。
ただの難癖代案厨だからスルーしとけ。
書き方は問題ないよ。
155148:04/09/06 20:31
DegToRadを使えば式自体は小さくなりそうですね。
参考になりました。ありがとうごさいます。
くだスレではバグとりもやってくれるのか?
内容によると思う。
>>147
JEDIのAPI Conversion Library Graded Packs

type
IDiscMaster = interface (IUnknown)
['{520CCA62-51A5-11D3-9144-00104BA11C5E}']
function Open: HRESULT; stdcall;
function EnumDiscMasterFormats(out ppEnum: IEnumDiscMasterFormats): HRESULT; stdcall;
function GetActiveDiscMasterFormat(out lpiid: TGUID): HRESULT; stdcall;
function SetActiveDiscMasterFormat(const riid: TGUID; out ppUnk: IUnknown): HRESULT; stdcall;
function EnumDiscRecorders(out ppEnum: IEnumDiscRecorders): HRESULT; stdcall;
function GetActiveDiscRecorder(out ppRecorder: IDiscRecorder): HRESULT; stdcall;
function SetActiveDiscRecorder(pRecorder: IDiscRecorder): HRESULT; stdcall;
function ClearFormatContent: HRESULT; stdcall;
function ProgressAdvise(pEvents: IDiscMasterProgressEvents; out pvCookie: UINT): HRESULT; stdcall;
function ProgressUnadvise(vCookie: UINT): HRESULT; stdcall;
function RecordDisc(bSimulate, bEjectAfterBurn: BOOL): HRESULT; stdcall;
function Close: HRESULT; stdcall;
end;
>>158
Thx!!

CLSID・・・クラス GUID
IID・・・インターフェースGUIDなんですね_| ̄|○

ところでVC用のヘッダーって参考になりますか?
>内容によると思う。
148みたいに質問をよそおうといいのね
自信なさげにな
相変わらず勘違いレスして逆切れする初心者回答者が大活躍なスレですね。
VBでいうところの
for each hoge in forms
if hoge.name = "hoge" then
hoge.visible = true
end if
next

というのがやりたいのですがDelphiではどのように書きますか?
>>163
procedure hogehoge(AParent: TWinControl);
var
 I: Integer;
begin
 for I := 0 to AParent.ControlCount - 1 do
 begin
  if AParent.Controls[I].Name = "hoge" then
   AParent.Controls[I].Show;
  if AParent.Controls[I] is TWinControl then
   hogehoge(AParent.Controls[I]);
 end;
end;
>>164
スマソ、最後の再帰呼び出しの所はTWinControlにキャストして
>>164,165
即レス、感謝。
試してみます。
名前が Hoge なのが複数あるんか? なぜ FindComponent つかわんの
168163:04/09/07 10:01
やりたいことはタスクトレイに入っているアプリケーションから
あるイベントでフォームをクリエイトしてそのときはまだ不可視で
タスクトレイから出したときにそのクリエイトしたフォームを可視化したいです。
そこでメインフォームがリストア時に不可視のウィンドウを検索して
すべて可視化したいといったところです。
169164:04/09/07 10:07
>>168
ごめん、勘違いしてた
Form検索するならこうだね

var
 I: Integer;
begin
 for I := 0 to Screen.FormCount - 1 do
  if Screen.Forms[I].Name = "hoge" then
   Screen.Forms[I].Show;
end;
170163:04/09/07 10:09
>>169
またまた即レス感謝。
VBとそっくりですね。試してみます。ありがとうございました。
171163:04/09/07 10:32
思い通りど動作になりました。ありがとうございました。
うーむ、なんでフォームの名前が分かってて検索する必要があるんだろうか。
インスタンスを管理しないで、名前だけ付けてるとかかな。
同じ名前のフォームが複数あって、一挙に表示したい、ってことだろ
普通は TList かなにかを使って複数のインスタンスを管理する。フォームは
自分がなくなるとき、自分をリストから削除する、と。
代案厨乙
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
177163:04/09/07 11:36
>>174
>>169の場合だとどういった問題があるのでしょうか?
人生いろいろ普通もいろいろ
>>177
全然問題ないよ。>>174のは別に普通じゃないから気にスンナ
180163:04/09/07 12:42
了解です!
なんでIsじゃなくてName使うの?
182163:04/09/07 13:16
Isってどうやって使えばいいですか? 
if Screen.Forms[I] Is frmHoge then
   Screen.Forms[I].Show;

という感じですか?
それでいいよ。
is使うと後からフォームのクラス名変えるとかクラス名のタイポしたとき
ちゃんとコンパイルエラーが出てくれる。
184163:04/09/07 13:27
nameだと'frmHoge'でもういっこ作ると'frmHoge_1'となりました。
Isを使ってみます。ありがとうございました。
185163:04/09/07 13:33
Isでできました。ありがとうございました。
>>179
問題出てきたじゃないかよ
>>186
>>174, 177の流れで>>169は問題ないと言ったのだよ。新しくリスト作る必要ないだろ。
あの、DelphiでアプリにPython埋め込むことできますか?
インタープリタとして使いたいんですが・・・。
189デフォルトの名無しさん:04/09/07 14:26
Delphi8を使ってるんですが、WindowsXP SP2をインストールして
アプリケーションのコンパイルをすると、Borland$が見つかりません
というエラーが出てコンパイルできなくなってしまいました。
何か対処の方法があるのでしょうか?
SP2はまだ入れたらだめだよ
Del8 再インストールで直ることもあるらしい、と Blog に書いてあった
192デフォルトの名無しさん:04/09/07 14:39
修復してみたのですが、駄目でした。
SP2アンインストールします。
193デフォルトの名無しさん:04/09/07 14:40
修復してみたのですが、駄目でした。
SP2アンインストールします。
194デフォルトの名無しさん:04/09/07 15:24
MSのBorlandへの嫌がらせ?
VBのDoEventsのような強力なアイドル関数ないでしょうか?
質問。
procedure Thoge.New;
begin
self.Free;
self:=Thoge.create;
end;
ってできるんですか?
>>195
強力かどうか知らんが、Application.ProcessMessages
>>197
それがかなり貧弱で困ってます。
例えばですね
ポップアップメニューを表示しているときに
タイマーによって起動されたちょっと長い処理があると
その処理が終わるまでメニューの操作ができないのです。
200デフォルトの名無しさん:04/09/07 16:14
>>198
長い処理はスレッド使ってください。
>>201
それしかないですか。
大部分がフォームのコンポーネントにアクセスするので
面倒なんですよね。
>>199
メニューの操作程度ならApplication.ProcessMessagesでも出来ます。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
while true do
begin
application.ProcessMessages;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
PopupMenu1.Popup(0,0);
end;

で試してみたのですが、止まってしまいます。
どこらへんがまずいでしょう?
>>196
無理
>>204
ループはいる前にTimer1.Enabled:=False;を入れないと次々イベントが発生して死にます
>>206
すみません。サンプルが悪かったですね。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled := false;
while true do
begin
application.ProcessMessages;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled := true;
PopupMenu1.Popup(0,0);
end;

この場合ポップアップメニューを表示してタイマー起動されると
ポップアップメニューが固まって選択不能になります。
ポップアップメニューのモーダルループのじゃましてるんだから当然
なるほど。
モードレスでポップアップできないでしょうか?
DoEventsの説明を見るとこの場合はDoEventsだろうと無理だと思うんだけど違うの?
あぅ。ほんとだ。
短い間隔でDoEventsやProcessMessages呼ばなければ
サブ処理(メニュー操作?)がもったりするのは当然ぽ。
呼び出し間隔関係なし
> モードレスでポップアップできないでしょうか?

Windows の仕組みですから無理
Delphiの限界。というやつですね
>>215
違います(^^;)
215の知能レベルが垣間見えました
215は俺じゃないよ
俺でもないよ
垣間というより全開で見えるけど。オレでもないよ
お前らじゃないとしたら俺はいったい誰なんだ?
俺を愛せばいい
少し寝たほういい
224デフォルトの名無しさん:04/09/07 21:45
例えば、メモ帳で文字列が選択されたかどうかを監視したい時、
「TApplicationのOnIdele」、「TActionListのOnUpdate」どちらを使った方が良いですか?
それとも、別の何かこれを使うのが普通といったものがありますでしょうか
TActionManagerのTActionのOnUpdate。
エディットコントロールのコピーなら標準アクションのTEditCopyでも良い。
>>202

>面倒なんですよね。

プログラミングなんて面倒なことだらけかと。
割と禁句かと。
面倒がイヤならプログラミングやめるとか。
> 割と禁句かと。

そうそう。そんならはなからやめとけっていいたくなるよね。
> 割と禁句かと。

そうそう。そういう奴は豆乳でも飲んでろっていいたくなるよね
自分のアプリケーションのメインウィンドウがフォーカスを
失ったことをイベントで知りたいのですが
どうしたらいいですか?
OnDeactivateとかって事じゃないんだろうな、多分
>>230
どうも。たぶんそれです。
ありがとうございます。
フォームにツールバーを置いてボタンをひとつ新規作成します。
そのボタンのスタイルはtbsCheckにしました。
ToolButton1.Downというプロパティで押されているかどうか
わかるはずなのですが
↓のソースのようにフォームにフォーカスが無くなったとき
このボタンを使用不可にしてフォーカスを得たら使用可能に
しているのですが
フォーカスが無くなり使用不可の状態でツールバーのボタンを
押して、フォーカスを外し、その状態でいきなりそのツールバーの
ボタンを押してButton1をクリックするとtrueが帰ってきてしまいます。
見た目は押されてない状態なのでFALSEが帰ってきてほしいのですが
どのあたりに問題があるのでしょうか?

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
ToolButton1.Enabled := false;
end;

procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
ToolButton1.Enabled := true;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if ToolButton1.down then
showmessage('true')
else
showmessage('false');
end;
233232:04/09/08 12:31
ちょっと説明が変でした。
ツールバーのボタンを押します。
他のウィンドウを触ってフォーカスをはずします。
ツールバーのボタンを押します。
ここで見た目は押されていない状態になります。
コマンドボタンを押します。TRUEと表示されます。
TRUEと表示されるということは押された状態ということです。
でも、表示上は押されてない状態なのです。
これはコンポーネントのバグなのでしょうか?
234232:04/09/08 12:36
ちなみにDelphi6Personalです。
Focus を得る瞬間と Enabled := true になるタイミングがクリティカルなんじゃないの
なんでそんな制御しなけりゃならんのか、わからんな
236232:04/09/08 13:15
タイミングがクリティカルだからというのは
ちょっとよくわかりません。
はぁ?

>他のウィンドウを触ってフォーカスをはずします。
>ツールバーのボタンを押します。

このこと。

・フォーカスを得る
・Enabled が true になる
・ボタンが押された

どの順序で起こることを期待してるの?
なんでToolButtonにFDownメンバが用意されてるんだろうね。
GetDownメソッドを用意して、常にToolBarウィンドウにボタンの状態を問い合わせるようにすれば、
こういうバグは発生しないのに。まあ何かしら理由がある…と思いたいけど。じゃなきゃ設計が(ry

>>232 とりあえず↓のようにすれば正しい状態を取得できるよ。
down := ToolBar1.Perform(TB_GETSTATE, ToolButton1.Index, 0) and TBSTATE_CHECKED <> 0;
false → true は MouseDown で
true → false は MaouseUp で
Activate は MouseDown で
FDown のトグルは MouseDown で

ということが複雑に絡み合って
>GetDownメソッドを用意して、常にToolBarウィンドウにボタンの状態を問い合わせるようにすれば、

御意。VCLはこんなのがけっこうたくさんある
ファイル名を...とかで縮めて表示するのってどうやったっけ?
242232:04/09/08 13:47
>>237
順番はどうあれ見た目では押された状態じゃないのに
プロパティは押されていると返すのはバグじゃないの?
といっているのです。

>>238
ありがとうございます。試してみます。
バグだけど、どうしてフォーカス制御するひつようがあるの?
>>241
DrawText() + DT_PATH_ELLIPSIS とかなんとか
245232:04/09/08 13:55
それは秘密です。
>>241
MinimizeName?
247232:04/09/08 13:58
>>238
ありがとうございます。できました。
こういうときは素直にAPIでやればいいんですね。
>>246
多分それだと思うけど、なんかうまくできない。
二番目のカンバスってなんだ?
調べてもぴんとこない。
未定義の識別子”MinimizeName"ってでる。
Del6パーソナルを使い始めたものです。
DelphiでUnicodeを扱えないというのを聞いたのですが、
Unicodeが使えないと困る時ってどういう時ですか?
エディタソフトを作る時とかに困るんですかね?
使おうと思えば使えるけどそれなりの苦労をします。
Unicodeが使えないとUnicodeを使うときに困ります。
ごもっともな回答がきてしまった。
244はスルーですか、そうですか。
ファイル名から拡張子を取り除く関数ってありませんか?
自前で作るべきですか?
GetFileTitleというAPIがあるけどだめかな?
256デフォルトの名無しさん:04/09/08 18:59
WindowsXP sp2入れたらDelphi7のTMonthCalendar等の表示がおかしいのですが
なにか改善策ありますか?
>>254
VCLでやるならChangeFileExt(filename, '') かね。
258デフォルトの名無しさん:04/09/08 19:10
>>256
XpSP2やめろ。
QC にレポートすれば直るよ
260デフォルトの名無しさん:04/09/08 20:14
>>259
XpSP2の話題は、本家ニュースグループ(delphi.non-technical)が最強。
普通某がチェックしてサイトに掲載しないか?
暴に頼ってはいけません
某はメンテナンスには興味なし
NG や QC や Blog はたんにユーザのご機嫌取り
都合のいい部分だけ汲み上げ。あとは無視。
266デフォルトの名無しさん:04/09/08 23:31
すみません、おもいっきり初心者の質問だと思いますが、ご教授願います。

1、delphiでBDEを使ってデータベースに接続するソフトを書いたのですが、
これを他のマシンで使う場合、実行ファイルのほかにどのファイルをコピーしないと駄目ですか?

2、Form1、unit1に書いてあるQuery1をUnit2から利用したいのですが、unit2のInterface部にunit1を入れ、
unit1のimplementation部にunit2を書いているのですが、Query1だけが利用できません。
Queryは他のユニットからは使えないのでしょうか?
>>266
使用マシンで、BDEをインストールしないと駄目
ODBCとか使っていたら、それも設定する

Query1は、Form1.Query1とする。
268デフォルトの名無しさん:04/09/09 00:11
>>267
>使用マシンで、BDEをインストールしないと駄目
>ODBCとか使っていたら、それも設定する
と言うことは、DelphiのインストールCDを使ってBDEやODBCをインストールしないと
駄目ってことでしょうか?
それともその辺をまとめたファイルがBorlandのサイトかどこかにありますか?

BDEは付属のInstall Shieldでインストーラを作成し配布する。
その他、BDEのディレクトリにあるBDEINST.CABを使ってWebで
配布する方法もある。同じディレクトリにあるBDEINST.TXTを参照の事。
リドミすら読まずにプログラミングした
266の作ったアプリのユーザーに同情するよ・・・・
InnoSetupでインストーラ作ればBDEのマージモジュールもあるし、setup.exe一個になるよね。
正直フリーソフトみたいな簡単な物以外のリードミーなんて読まないな
改めないとな、漏れも
簡単な物のは読むんだぁー。変わってるな。
だよなw変だな漏れ
>>271
こんな便利なのあるんだ・・・付属の一生懸命使ってたのは何だったんだ
>>270
ひどいなー。言いがかりだ。
277デフォルトの名無しさん:04/09/09 20:44
>>271
InnoSetupって何?
279デフォルトの名無しさん:04/09/09 23:03
>>277
すまん、こっちだった
http://www.jrsoftware.org/
280277:04/09/10 00:08
英語が分からない俺には駄目みたいだ。orz
簡単にBDEも同梱できるんだったら使いたかったんだが。甘かった。
おいおい
282277:04/09/10 01:10
このスレって横からやりとりを見てたら時々美味しい情報が紛れ込んでるんだよね。
今回も美味しそうだったからつまみ食いしようと思ったんだが。

TServerSocketというコンポーネントを使いたいのですが、パレットのどのページにあるのでしょうか。
当方Delphi7Proを使っています。
>>283
Del7だったらTTcpServerじゃない?
ありがとうございました。TTcpServerでやってみます。
解説書よりもWEB上のサイトのほうがよっぽど分かり易い。
何のために本買ったんですか?俺は。
>>285
パレットには載ってないけど、ScktCompをusesに加えれば従来通りTServerSocketも使えます。
この場合はTServerSocketのインスタンスを自分で作成する必要があります。
1から100までのランダムな数値が取得したいのですが
どのように書けばよいでしょうか?
Randomize;
Random(100)+1;
>>289
即レス感謝
291デフォルトの名無しさん:04/09/10 14:37:31
Randomize を毎回呼ばないように。
特別な用途がない限り、アプリ起動に対し一回だけで良し。
かつライブラリが自動的に呼び出しているので、乱数を手に入れることだけが目的なら
Randomize は必要ないですし、繰り返し呼ぶと乱数の列が乱れます。
292デフォルトの名無しさん:04/09/10 14:52:55
フォルダを指定するにはどうしたら良いのでしょうか?

opendialogを使うとファイルの指定は出来ますが、フォルダの指定が出来ないので。
293デフォルトの名無しさん:04/09/10 14:58:05
APIに渡すために

buff: array[0..255] of char;

と宣言している配列をAPIに渡すためにクリアしたいのですが
どのような方法が一番簡単で確実でしょうか?

GetWindowText(handle, buff, sizeof(buff));
を使用しています。

取得できたら
sCaption: String;
へ、

sCaption := buff;

としてStringへ変換しています。
ひょっとしてこの場合はクリアする必要はないですか?
294デフォルトの名無しさん:04/09/10 15:09:30
SetLength(sCaption, GetWindowTextLength(handle));
GetWindowText(handle, PChar(sCaption), Length(sCaption));
295293:04/09/10 15:14:51
>>294
カコイイ
でも、1行目と2行目でキャプションが変わったらどうしましょう。
296デフォルトの名無しさん:04/09/10 15:22:02
SetString(sCaption, buff, GetWindowText(handle, buff, SizeOf(buff)));
297293:04/09/10 15:30:07
>>296
これだ!
さんくすです。
298デフォルトの名無しさん:04/09/10 15:59:34
どなたか292についてよろしくお願いします。
299293:04/09/10 16:06:45
>>298
SHBrowseForFolderを使えばいいと思います。
300デフォルトの名無しさん:04/09/10 16:44:39
>>292
これは良く見かける質問だね。
SelectDirectory関数とか。
301デフォルトの名無しさん:04/09/10 18:33:22
昔はOpenDialogでダミーのファイル名"(ディレクトリ)"とか設定しといて
OK押されたらExtractFilePathでディレクトリ取得という技もあったな。
プレースバーも使えるので個人的には一番使いやすかったり。ダサいけど。
302デフォルトの名無しさん:04/09/10 19:17:25
>>291
>かつライブラリが自動的に呼び出しているので、乱数を手に入れることだけが目的なら
>Randomize は必要ないですし、繰り返し呼ぶと乱数の列が乱れます。

Randomize でソースをGrepしても System.pas の宣言と実装しか引っかからないけど。
ライブラリのどこで呼び出してるの?
303デフォルトの名無しさん:04/09/10 19:19:03
Randomize を呼び出さないでテストしてみるといつも同じランダム数列が得られるけど?
304デフォルトの名無しさん:04/09/11 00:03:11
>>280
遅いレスだが、日本語化できるみたい
http://www.jrsoftware.org/files/istrans/
305デフォルトの名無しさん:04/09/11 00:51:20
>>292
デフォルトのコンポーネント使って自分なりの「フォルダ選択ダイアログ」を作る
って手もありかと。
※スルーされたからって、催促書くのはどーかと。
306デフォルトの名無しさん:04/09/11 01:38:02
>>293-296が気になるのですけど、
取得する文字列がbuffより長い場合はどうやって安全に全部の文字列を取得できますか?
307デフォルトの名無しさん:04/09/11 07:12:03
>でも、1行目と2行目でキャプションが変わったらどうしましょう。

こういう心配をする人には、根本的な解決策はありません。でっかいbuffを取っておくように。
308デフォルトの名無しさん:04/09/11 09:12:09
ドッキングテクニックを解説しているサイトはあるでしょうか?
DEMOを見てもサッパリです。
お助けください。
309デフォルトの名無しさん:04/09/11 11:31:22
>でも、1行目と2行目でキャプションが変わったらどうしましょう

>取得する文字列がbuffより長い場合はどうやって安全に全部の文字列を取得できますか?

かなり異質の問題と思うけどなぁ。
310デフォルトの名無しさん:04/09/11 11:45:36
そうお?
GetWindowTextLength で取った数値が GetWindowText を使うときにはもう信用できないかも、
っていう心配してるんだから、同じじゃないの? TMemo みたいにバカ長いテキストも
あり得るんだから、そんな心配より、全部取れないかもしれない、という心配のほうが
ずっと価値あると思うんだけど。
311デフォルトの名無しさん:04/09/11 23:53:31
GetWindowTextは同一プロセス内でしか使えないから、
この場合は自分で管理すればよろしい。

他プロセスとのやり取りは、そもそも危険。
312デフォルトの名無しさん:04/09/12 00:35:13
>GetWindowTextは同一プロセス内でしか使えないから、

MSDN says,

GetWindowText cannot retrieve the text of a control in another application.

ということで、そもそも
>>295
>でも、1行目と2行目でキャプションが変わったらどうしましょう。

はあり得ないってことですね。サンクス >>311
313デフォルトの名無しさん:04/09/12 13:51:20
ダイアグラムエディタ(フローチャート?)のコンポーネントってないですかね?
314デフォルトの名無しさん:04/09/12 14:43:54
VISIOみたいなやつ?
315デフォルトの名無しさん:04/09/12 15:27:51
>>314
だいたいそんな感じです。
316デフォルトの名無しさん:04/09/12 15:36:21
>>313
ttp://www.tmssoftware.com/diagram.htm
ttp://www.devexpress.com/ ←現在、サーバーが死んでいる。製品名OrgChart
317デフォルトの名無しさん:04/09/12 16:23:29
>>316
thx!どうもです。
318デフォルトの名無しさん:04/09/12 17:50:03
おれのマシンからは(今)DevExpress つながるが?
319デフォルトの名無しさん:04/09/13 08:59:13
procedure TForm1.Button1Click(Sender: TObject);
var
d: Longword;
ret: LongWord;
begin

ret := GetTcpTable(nil,@d,false);

end;

[エラー] Unit1.pas(68): 変数実パラメータと変数仮パラメータとは同一の型でなければなりません

となります。

宣言は
function GetTcpTable(var TcpTable: PMIB_TCPTABLE;
var Size: PDWord; bOrder: Boolean): LongWord; stdcall
としています。
第2引数でエラーになるようなのですが
渡し方が間違っているのでしょうか?


320319:04/09/13 09:21:29
procedure TForm1.Button1Click(Sender: TObject);
var
d: Longword;
d2: PDWord;
ret: LongWord;
a: PMIB_TCPTABLE;
begin

d2 := @d;
a := nil;
ret := GetTcpTable(a,d2,false);
showmessage(inttostr(ret));

end;

できました。
321デフォルトの名無しさん:04/09/13 15:45:57
ActiveXDLLをDel6Personalで作成できますか?
322デフォルトの名無しさん:04/09/13 20:15:15
>>321
ファイル|新規作成の所に、ActiveXというタブはありますか?
その中に、ActiveXライブラリというアイコンがあれば可能です。
323デフォルトの名無しさん:04/09/13 20:29:07
>>319-320
ポインタが var パラメータになっている関数の宣言がおかしいのでは?
var パラメータはその位置にある変数を指すポインタを渡すという意味なので、
ポインタのポインタを渡してることになりますよ。
324デフォルトの名無しさん:04/09/13 20:50:09
Delphi7ってフリーじゃなくなっちゃったんでしょうか?
ダウンロードしたのですが、
30日評価版の文字が・・・
325デフォルトの名無しさん:04/09/13 20:58:47
>>324
フリーはDelphi 6。Delphi 7にフリーは無い
326デフォルトの名無しさん:04/09/14 00:49:42
アメリカで流行っているか?太鼓

http://borcon2004.blogspot.com/
> David I have continued a yesterday Dale’s music line and joined Taiko group
> (Taiko? Read this http://www.taiko.com/rollingthunder.html).
> Drums - Great wake up call for us
327デフォルトの名無しさん:04/09/14 00:50:55
大いにスレ違い。反省
328デフォルトの名無しさん:04/09/14 02:54:10
TabControl,PageControlでMultiLineをTrueにした状態でタブが動かないコンポーネントを探しているのですが
ありますでしょうか?
329デフォルトの名無しさん:04/09/14 03:04:09
上段のタブがアクティブになった時にどんな絵になるのか、
ちょっと描いてみてくれ。
330デフォルトの名無しさん:04/09/14 03:48:12
ボタン型にすれば動かない
331デフォルトの名無しさん:04/09/14 07:26:00
151 名前:デフォルトの名無しさん :04/09/14 06:21:35
Delphi覚えたけど何の役にもたたんね
332デフォルトの名無しさん:04/09/14 07:43:00
>>331
立てたよ。ネガティブな悪口はそちらでどーぞ。

Delphi覚えたけど何の役にもたたんね
http://pc5.2ch.net/test/read.cgi/tech/1095115109/
333デフォルトの名無しさん:04/09/14 07:49:06
ウィンドウのサイズを縦だけ可変にしたいのですが
334デフォルトの名無しさん:04/09/14 09:26:19
他にもやり方はありますが

縦だけ可変ということは横を固定にしたいわけだから
Form の constrains プロパティで maxwidth と minwidth を同じ値に指定。


335デフォルトの名無しさん:04/09/14 10:09:24
>>334
ありがとうございました。
ほんとDelphiって簡単になんでもできてしまうんですね。
336デフォルトの名無しさん:04/09/14 14:59:43
Delphi7で主にテキストエディタ系を勉強したいのですが、
何処のどの本がいいですかね?
337デフォルトの名無しさん:04/09/14 16:00:06
付録サンプルのテキストエディタのコード見た方が早いのでは?
338デフォルトの名無しさん:04/09/14 22:38:08
コンポーネントの親の切り替えについての質問です。
TPanelやTMemoはParentを切り替えるだけで親を切り替えられたのですが、
WebBrowserコンポーネントのは場合うまく行きませんでした。

得たい結果としては「元々表示していたページ・入力していた値は消えない」で
「切り替えた先の親に合わせてリサイズが自動で行われる」です。
試したパターンでは、どちらか片方の結果しか得られませんでした。
WebBrowserの親の切替については直接の切替ではなく、親のパネルの切替でも
構わないのですが、なにか良い方法は無いでしょうか。

From1
 Panel1
  WebBrowser1
  Button1〜Button4
From2
 Panel2
339デフォルトの名無しさん:04/09/14 22:39:11
//リサイズはフォーム2に合わせて自動で行われるが、
//元々表示していたページが消えてしまう。
procedure TForm1.Button1Click(Sender: TObject);
begin
 //WebBrowserの親のパネルを切り替え
 Panel1.Parent := Form2.Panel2;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 //WebBrowserを切り替え
 Windows.SetParent(WebBrowser1.Handle, Form2.Panel2.Handle);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
 //WebBrowserを切り替え
 TOleControl(WebBrowser1).Parent := Form2.Panel2;
end;

//元々表示していたページ・入力していた値は消えないが、
//リサイズが元の親のフォーム1に合わせて行われてしまう。
procedure TForm1.Button4Click(Sender: TObject);
begin
 //WebBrowserを切り替え
 Windows.SetParent(WebBrowser1.Handle, Form2.Panel2.Handle);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
 //WebBrowserを切り替え(一旦親フォームに移動してみる)
 Windows.SetParent(WebBrowser1.Handle, Form2.Handle);
 Windows.SetParent(WebBrowser1.Handle, Form2.Panel2.Handle);
end;
340デフォルトの名無しさん:04/09/14 22:40:44
オブジェクトのシリアライズってできますか?
341デフォルトの名無しさん:04/09/15 00:09:29
WebBrowserってActiveXだっけ?
Parent切り替え時にウィンドウハンドルも再生成されるから、
その時に情報が失われるのかもしれないね。
342デフォルトの名無しさん:04/09/15 00:56:49
>>340
出来ますけど。何か?
キーワード:RTTI。SaveToStream
343デフォルトの名無しさん:04/09/15 07:25:16
必死こいてclassの勉強してます
classのメンバに整数型の動的配列入れたいんですが、
どうやってアクセスさせればいいんでしょうか(文が変

hoge = class(TObject)
 private
  FList : array of integer;
 public
  ここに何書けばいいんかわかんない
end;

FList[n]の値を代入・値を取得したいです。
344デフォルトの名無しさん:04/09/15 08:17:44
>>329
http://tabbrowser.ktplan.jp/valinor/sleipnir.html
これはSleipnirのですがこんな感じを想定しています

>>330
やっぱりタブで使いたいです
345デフォルトの名無しさん:04/09/15 09:02:56
フラットボタンだな
346デフォルトの名無しさん:04/09/15 10:33:29
>>343
たとえば

property Items[Index: integer]: integer read GetItems write PutItems;

コンストラクタでSetLength()しといてね
347デフォルトの名無しさん:04/09/15 11:56:52
[
スレッドオブジェクトを作る時、名前つきスレッドを選択すると
[エラー] Unit3.pas(67): 'TThreadNameInfo' と 'Cardinal' には互換性がありません
って出るんだけど、どうすればいいですか?
348デフォルトの名無しさん:04/09/15 13:49:43
コードを一行も示さずにそんなこといったって
349デフォルトの名無しさん:04/09/15 13:51:01
>343
動的配列じゃなくてTList使ってるけど、ここが参考になると思う。
ttp://hp.vector.co.jp/authors/VA009712/take/delphi/pointer.htm#tlist
350デフォルトの名無しさん:04/09/15 14:13:54
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
351デフォルトの名無しさん:04/09/15 14:43:04
>>347
TThreadNameInfoって何?
352347:04/09/15 14:51:34
新規作成でプロジェクトをつくって、スレッドオブジェクトを
名前付きで作成して、1行もコード書かなくてもコンパイルすると
エラーになるんです。
TThreadNameInfoてのは、名前付きでスレッド作ると
Delが勝手に作ってくるです。
スレッドのデモも実行出来なくて。
Del7でアップデートしたらおかしくなったので、その辺りかなと思ったり思わなかったり。。。
353デフォルトの名無しさん:04/09/15 16:24:03
Del7だからな
354デフォルトの名無しさん:04/09/15 16:45:34
エラーでてるところの前後4行くらい、ペーストできる?>>352
355347 その1:04/09/15 17:08:47
ちょっとながですが、こんなんです。
Tyyって名前で「名前付きスレッド」作りました。
type
TThreadNameInfo = record
FType: LongWord; // 0x1000 にすること。
FName: PChar; // (ユーザー空間での) 名前文字列へのポインタ
FThreadID: LongWord; // スレッド ID (呼び出しスレッドは -1)
FFlags: LongWord; // 将来のために予約。0 にすること。
end;
{$ENDIF}

356347 その2:04/09/15 17:09:47
{ Tyy }

procedure Tyy.SetName;
{$IFDEF MSWINDOWS}
var
ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
ThreadNameInfo.FType := $1000;
ThreadNameInfo.FName := 'yvy';
ThreadNameInfo.FThreadID := $FFFFFFFF;
ThreadNameInfo.FFlags := 0;

try
RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
except
end;
{$ENDIF}
end;
357デフォルトの名無しさん:04/09/15 18:32:05
手元でやってみましたが、エラー出ません。
358デフォルトの名無しさん:04/09/15 18:36:36
RaiseException で「'TThreadNameInfo' と 'Cardinal' には互換性がありません 」
が出ているのだね?

プロジェクトのコンパイルオプションの「型付 @ 演算子」のチェックをはずすこと。
359デフォルトの名無しさん:04/09/15 18:37:54
あまり良くないエラーメッセージですね。
どうにかできるかな?
360343:04/09/15 20:19:04
>>346>>349
ありがとうございますー。
だんだんちょびっとずつコツがわかってきた、ような希ガスる。
361343:04/09/15 20:31:29
>>349を読んでて思ったけど、
TListにはポインタが入るってことは、
Listに加える内容はオブジェクトでも変数でもなーんでもイイヨ ってことになるんかな?
としたらものすげー便利?
ううむ、奥が深い
362デフォルトの名無しさん:04/09/15 20:43:27
これだけのことで感動できるのか…
363デフォルトの名無しさん:04/09/15 20:57:13
>>362
頭の皮膚の固いロートルは消えろ
364デフォルトの名無しさん:04/09/15 21:30:38
Star Team エディションってなんだ?
まぁ、バージョンアップするほど使いこなしてないけどなー
365デフォルトの名無しさん:04/09/15 21:58:18
343ではないけど、ポインタの概念理解できたとき無茶苦茶はしゃいだ…
366デフォルトの名無しさん:04/09/15 22:02:10
気持ちはわかるな、おれも。実体を操作するよりずっと軽くて気持ちいいし。
367338:04/09/15 22:29:53
>>341
そーですActiveXです。
確かに、>>339の「元々表示していたページが消えてしまう」場合のハンドルを
調べてみたら変わってました。WebBrowser1.LocationURLも消えてました。
「元々表示していたページ・入力していた値は消えない」場合は同じハンドル
でした。

ページが消えるのは困るので消えないパータンでなんとかしたいのですが、
リサイズ対象の件についてなにか情報がありましたらよろしくお願いします。
368デフォルトの名無しさん:04/09/15 23:06:57
DBの日付データをDateTimePickerで入力したり表示するときはどうすればいいんですか?
369デフォルトの名無しさん:04/09/15 23:11:18
>>367
あらためて Navigate したらいいんじゃないの。
370338:04/09/15 23:26:49
>>369
レスどもです。
確かに消えてしまったページを再度Navigateすればページは表示されるんですが、
入力していた値が消えてしまったり、表示位置が先頭に戻ってしまうのが不便なのと、
実際のプログラムでは複数のブラウザコントロールに対して親の切り替えを
一気に行うので、再度読み込みに行ってしまう事を控えたいというのがあります。
371デフォルトの名無しさん:04/09/15 23:54:42
>>370
これ試してみて

procedure TForm1.ChangeParent(WB: TWebBrowser; ParentWnd: TWinControl);
begin
Windows.SetParent(WB.Handle,ParentWnd.Handle);
WebBrowser1.Align := alNone;
WebBrowser1.SetBounds(0,0,ParentWnd.Width,ParentWnd.Height);
end;
372デフォルトの名無しさん:04/09/15 23:54:50
>>370
もうさ、Parentプロパティは一切設定しないでさ、
ブラウザは動的に作成、親はAPIのSetParentで設定、リサイズは自分で行う
って風にしてしまうのはどうだい。
373デフォルトの名無しさん:04/09/15 23:56:17
間違えた。訂正

procedure TForm1.ChangeParent(WB: TWebBrowser; ParentWnd: TWinControl);
begin
Windows.SetParent(WB.Handle,ParentWnd.Handle);
WB.Align := alNone;
WB.SetBounds(0,0,ParentWnd.Width,ParentWnd.Height);
end;

374デフォルトの名無しさん:04/09/15 23:57:14
(;・∀・) 8秒差でかぶったぜ
375デフォルトの名無しさん:04/09/15 23:59:40
Align が自動じゃだめなんだな
376デフォルトの名無しさん:04/09/16 00:07:14
すみません、さらに訂正

procedure TForm1.ChangeParent(WB: TWebBrowser; ParentWnd: TWinControl);
begin
Windows.SetParent(WB.Handle,ParentWnd.Handle);
WB.Align := alNone;
WB.SetBounds(0,0,ParentWnd.ClientWidth,ParentWnd.ClientHeight);
end;
377338:04/09/16 00:33:59
>>371
サンプルコードわざわざどうもです。試してみました。
これは初回移動時用でリサイズは自前の場合の例ですよね。この場合、
親のリサイズ時にはSetBoundsで子供のサイズ変更が必要になりますね。

>>372
ブラウザの動的作成も試してみたんですが、結果は最初から貼り付けた時と
同じでした。
「リサイズは全部自前」も考えてはいたんですが、複数ある子供を管理する
仕掛けを作らないといけなそうなので、最終手段かなと思ってました。
自分が親になってるコントロールをぐるぐるループして見つけてサイズ変更
していくとか、各親に子供のブラウザーを管理するリストをつけるとか。

それと、どうもリサイズが元の親に対して行われてしまう原因(Parent以外の
何か)を見逃してるような気がしてたもので。
378デフォルトの名無しさん:04/09/16 00:48:21
> ブラウザの動的作成も試してみたんですが、結果は最初から貼り付けた時と同じでした。
それはたぶんその後ParentやAlignを設定したからでは。当然結果は同じだね。

> それと、どうもリサイズが元の親に対して行われてしまう原因
それはAPIでSetParentしても、VCL側ではParentが元のままだから、ちゅう単純な理由だね。
それでParentを一切設定せずに全部自前ってのを薦めたんだけも、まあいろいろ悩みがあるようだね。
379338:04/09/16 01:07:34
>>378
>>ブラウザの動的作成も試してみたんですが、結果は最初から貼り付けた時と同じでした。
>れはたぶんその後ParentやAlignを設定したからでは。当然結果は同じだね。
そうですね。というかParentを設定しないと見えなくなっちゃっていたので。

>それはAPIでSetParentしても、VCL側ではParentが元のままだから、ちゅう単純な理由だね。
なるほどそうなんですか(といいつつ完全には理解しきれてませんが)。

可能ならロジックは減らしたいというのもあったんですが、「リサイズは全部自前」は
最終手段というほどのものでもないですし、もう少し情報を待ちつつ調べてみて、
方法が見つからなかったら自前にしてみようと思います。ありがとうございました。
380デフォルトの名無しさん:04/09/17 05:39:57
ListViewでOwnerDataをtrueにしていると、OnCustomDrawItemでCanvasを
変更しても実行時には変更されないのですが、こういう仕様なのでしょうか?
OwnerDataをfalseにしていると、Canvas.Fontなどの変更も反映されます。
381デフォルトの名無しさん:04/09/17 11:54:35
ポップアップメニューでメニューを選択したときに
「メニューアイテムの選択が、右クリックか、左クリックか」を
OnClick内で判別したいのですが、どうすればいいのでしょうか?
382デフォルトの名無しさん:04/09/17 12:02:07
そんな変なUIを作る人はVBを使って下さい。
383デフォルトの名無しさん:04/09/17 12:11:41
矢印キープラスEnterでも選択できるわけだし
384381:04/09/17 13:20:12
>>382
人に使って貰うソフト用でなくて、自分専用のソフトで
ナビゲートを少しでも効率的にしようかと思って考えた
んですが、やっぱり変ですよね(自分専用だから変でも
良いかと思ったんですが)。

>>383
キーボードのときは左クリックとすれば問題ないかと。
385デフォルトの名無しさん:04/09/17 14:09:18
OnClick で GetAsyncKeyState を。VK_RBUTTON が使える
386381:04/09/17 14:23:41
>>385
ありがとうございます。が、メニューが選択された時点では
ボタンは既に離されているので、同じ値しか返ってきません
でした。

クリックされたマウスボタンではなく他の方法を使って実装
しようかと思います。
387デフォルトの名無しさん:04/09/17 14:27:15
Visual SourceSafeでは通常のクリックで実行、
Shift+クリックで詳細なダイアログを表示して実行ボタンを押すと実行というので使い分けてるな。
で、そのダイアログにはSHIFTを押したときのみこのダイアログを表示みたいなチェックがついてた。
388デフォルトの名無しさん:04/09/17 16:20:25
>が、メニューが選択された時点ではボタンは既に離されているので、
>同じ値しか返ってきませんでした。

あのね、そのとき押してるかかどうかのほかに履歴も取れるんだよ
389デフォルトの名無しさん:04/09/17 17:21:53
妄想で書いてないで実験してちゃんとしたコード書いたら。
390デフォルトの名無しさん:04/09/17 17:48:42
指定したフォルダ以下にある全てのフォルダの名称を取り出したい
のですが、どうすればよいでしょうか?宜しくお願いします。
391デフォルトの名無しさん:04/09/17 17:50:39
>>390
FindFirst
FindNext
FindClose
392デフォルトの名無しさん:04/09/17 20:00:38
388じゃないけどこんな感じか
procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
 GetAsyncKeyState(VK_LBUTTON);
 GetAsyncKeyState(VK_RBUTTON);
 GetAsyncKeyState(VK_RETURN);
end;

procedure TForm1.HogeClick(Sender: TObject);
begin
 if GetAsyncKeyState(VK_LBUTTON) and 1 <> 0 then Caption := '左' else
 if GetAsyncKeyState(VK_RBUTTON) and 1 <> 0 then Caption := '右' else
 if GetAsyncKeyState(VK_RETURN) and 1 <> 0 then Caption := 'Enter' else Caption := '?';
 if GetKeyState(VK_SHIFT) < 0 then Caption := Caption + ' + Shift';
end;
393381:04/09/17 20:45:19
>>388
でもメニューをポップアップする時点で右クリックするわけだから、
右クリックの履歴をとっても常に「クリックした」となると思うのですが...
394デフォルトの名無しさん:04/09/17 21:22:40
>>393
志村上ー、上ー!
395デフォルトの名無しさん:04/09/17 22:33:39
OnPopUp で一度呼び出して履歴をクリアしてるんだよな

って >>381 は試したの?
396デフォルトの名無しさん:04/09/17 22:38:03
ちゃんと動くよ。
397デフォルトの名無しさん:04/09/17 22:41:28
教えがいの内野氏だな
398381:04/09/17 22:50:47
代案厨と妄想厨のせいで無駄に長引いてしまいましたが解決しました。
スレ汚されて迷惑な話ですが。
399デフォルトの名無しさん:04/09/17 22:56:01
無駄に長引いたのは自分のコードを一行も示さないからだと思うな
400デフォルトの名無しさん:04/09/17 23:07:03
スレ汚しは381
401デフォルトの名無しさん:04/09/17 23:08:20
スレ汚したのはむしろおま(ry
402デフォルトの名無しさん:04/09/17 23:19:42
教えてもらうのに、正解以外は妄想だとか代案だとかいってけなすのはどうかと思うぞ
正解が見えないからこそ、いろいろやってみるんだと
403デフォルトの名無しさん:04/09/17 23:21:26
正解が一つとも限らないし。

教えてもらうのがヘタな香具師は結果的に自分が損することになるよ
404デフォルトの名無しさん:04/09/17 23:28:41
どうやって解決したかも書いてないし・・・情報ぜろ
405デフォルトの名無しさん:04/09/17 23:36:44
自覚症状のない典型的な痛い奴
406デフォルトの名無しさん:04/09/18 05:45:50
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
407デフォルトの名無しさん:04/09/18 08:36:39
別に望んでいない人にはコンサルティングよりQ&A
408381:04/09/18 08:54:09
>>392, 394, 395
遅くなって申し訳ありません。時間が無くてテストできませんでした。
394,395さんのレスで392さんのコードが分かりました。
いま試したところ、ちゃんと動くようになりました。

みなさん、ありがとうございます。
409デフォルトの名無しさん:04/09/18 19:22:19
TClientSocket を使って通信を行っているのですが、
非ブロッキング通信だと正常に切断されるのに
全く同じことをブロッキング通信で行うと、いつまで待っても切断されません(TClientSocket.Socket.Connected が False にならない)
どういうことなのでしょうか?
410デフォルトの名無しさん:04/09/18 19:30:05
相手側がちゃんとCloseしてるのは間違いない?
411デフォルトの名無しさん:04/09/18 19:42:06
質問があります。
メモ内のテキストの5バイト目の文字の左上の座標を求めたいのですけど、
以下の方法ではうまくいかないのですけど、どうすればいいでしょうか?

procedure TForm1.Button1Click(Sender: TObject);
var
 P: TPoint;
begin
 Memo1.Perform(EM_POSFROMCHAR, Integer(@P), 5);
 Caption := IntToStr(P.X);
end;
412デフォルトの名無しさん:04/09/18 19:48:43
>>411
var
 pos: TSmallPoint;
begin
 pos := TSmallPoint(Memo1.Perform(EM_POSFROMCHAR, 5, 0));
 Caption := IntToStr(pos.x);
end;
413デフォルトの名無しさん:04/09/18 19:58:57
すげぇ・・こんなことができるなんて考えてもみなかったぜ
414デフォルトの名無しさん:04/09/18 20:09:54
>>410
同じことを非ブロック通信でやれば問題ないのですが、
これは相手側が確実に切断している事にはなりませんか?
415デフォルトの名無しさん:04/09/18 20:23:12
非ブロッキングとブロッキングのコードが意味的に同じであることを保証してくれるならなる。
416デフォルトの名無しさん:04/09/18 21:14:16
ファイルのドラッグアンドドロップに関する質問なんですが、
ウィンドウのクライアント領域だけドロップを受け付ける
(タイトルバーや枠では受け付けない)ようにするにはどうしたら
良いのでしょうか?

DragAcceptFiles(Form1.Handle,True) でドロップを受け付けるので、
DragAcceptFiles(Form1.ClientHandle,True)でも出来ると思ったんですが、
これだと全く受け付けてくれません。

仕方が無いので、クライアント領域と同じ大きさのパネルを置いて、
そのパネルをドロップを受け付けるようにする、と考えましたが、
他にいい方法は無いでしょうか?
417デフォルトの名無しさん:04/09/18 22:14:08
>DragAcceptFiles(Form1.ClientHandle,True)でも出来ると思ったんですが、

MDI親フォームなの?
そうだとしても、ClientHandle に対応するウィンドウはフォームじゃないよ。
別ウィンドウだけど。

下の方法がいいと思うけど、なんか都合が悪いことあるの?
418デフォルトの名無しさん:04/09/18 22:14:12
>>416
OLEドラッグ&ドロップなら、カーソル位置によってドロップ禁止したり自由に出来るけど、
パネル置くより面倒かも。コンポーネント拾ってくれば楽かもね。
ちなみにClientHandleはFormStyleがfsMDIFormの時なら使える。
419デフォルトの名無しさん:04/09/18 22:33:09
>ちなみにClientHandleはFormStyleがfsMDIFormの時なら使える。

使えるけど TForm のメッセージハンドラでは WM_DROPFILES は受け取れないよ
420デフォルトの名無しさん:04/09/18 22:34:31
>>419
別にApplication.OnMessageで受け取ればいい
421デフォルトの名無しさん:04/09/18 22:51:14
>>420
ほほう、それは初耳
422デフォルトの名無しさん:04/09/18 22:52:00
パネルを使ってはいけない特別な理由があるのだろうか…
423デフォルトの名無しさん:04/09/18 22:56:35
なんとなく邪魔なんだろ
424デフォルトの名無しさん:04/09/18 22:57:14
>>420 は試したことがあるの?
425デフォルトの名無しさん:04/09/18 23:00:20
非クライアント領域で受け取りたくない理由も分からないし
426デフォルトの名無しさん:04/09/18 23:01:27
>>424
?あるよ。
427デフォルトの名無しさん:04/09/18 23:04:02
うだうだ言ってんのがいるな…。代案厨の派生か何かか
428デフォルトの名無しさん:04/09/18 23:18:02
ちょっとした疑問
代案って何か問題あるのか?
429デフォルトの名無しさん:04/09/18 23:24:24
>>428
ただ代案を出すだけなら問題ないんでない
430デフォルトの名無しさん:04/09/18 23:28:36
199 名前:お馬鹿な回答者の為の回答フロー[sage] 投稿日:04/08/10 13:58
〜がありますか?

if あるなら then
 その方法を提示;

if ないなら or 現実的でないなら then
begin
 直接的な解はないと回答
 while さらに別の方法が必要か? do
  一段階上位の要求を聞きだして、その方法を提示
end;
431デフォルトの名無しさん:04/09/18 23:29:14
昨日から変なのがいる。時々騙りもするみたいだし。キモイ
432デフォルトの名無しさん:04/09/18 23:30:53
>>426

procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(ClientHandle,true);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(ClientHandle,false);
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
case Msg.message of
WM_DROPFILES:if Msg.hwnd = ClientHandle then ShowMessage('DROPFILES');
end;
end;

確認した。WM_DROPFILES がキューに入ることしらんかった。ありがと
433デフォルトの名無しさん:04/09/18 23:36:41
if 自分には解決できない then ShowMessage('なんでそんな事するの?必要あるの?')
434デフォルトの名無しさん:04/09/18 23:39:35
>>430
どうでもいいんだが、

> if ないなら or 現実的でないなら then
> begin
>  直接的な解はないと回答;

じゃね?
435デフォルトの名無しさん:04/09/18 23:40:36
>>433
今回の場合は

if 簡単に解決できるけど then ShowMessage('なんでそんな事するの?必要あるの?')

ってことだよ。質問自体の内容はハッキリしてるけど、理由が不明だから、簡単に解決する
けど、なんだか変 って感じなの
436416:04/09/18 23:40:58
レスありがとうございます。
パネルを使って処理する事に特に問題は無いんですが、もし使わないで
同じことが出来るならそうしたいと思い、質問した次第です。

パネルを使う方法と、うまく使いこなせるか分かりませんが、
>>432 さんのコードも試してみたいと思います。ありがとうございました。
437デフォルトの名無しさん:04/09/18 23:46:30
>>436
MDI親フォームなの?
そうなら、>>432 でいいけど、普通のフォームならパネル使って >>432 のコードで ClientHnalde
のところを Panel1.Handle に変えてね
438デフォルトの名無しさん:04/09/19 00:09:34
>>432
>WM_DROPFILES がキューに入ることしらんかった。

わたしにも意外でした。ちょっと調べてみました。

MSDN では

WM_DROPFILES Message

--------------------------------------------------------------------------------

Sent when the user drops a file on the window of an application that has registered
itself as a recipient of dropped files.

Win32.hlp では

The WM_DROPFILES message is sent when the user releases the left mouse button while
the cursor is in the window of an application that has registered itself as a recipient
of dropped files.

どちらも sent となっていて、キューに入るとは考えられない。

http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N022.html では自前でこのメッセージ
を送っているようだけど

>ここでは、PostMessage()で成功しているが、SendMessage() では失敗する。

と書かれている。

WM_DROPFILES はドキュメントと違って PostMessage されているようです。
439デフォルトの名無しさん:04/09/19 02:14:26
ドキュメントが正しく、OSが間違ってるかもよ?
440デフォルトの名無しさん:04/09/19 02:15:54
わははは、きみはドキュメントの上でアプリを走らせるわけじゃないだろ
441デフォルトの名無しさん:04/09/19 08:40:28
ちょっと躓いたので質問させてください

FindFirstでファイル一覧を取得しているのですが、とある複数の拡張子を取得したいと思っています
*.txtと*.htmlのみを取得しようとしたら、FindFirstをそれぞれ二回やらないとダメでしょうか?

二つ三つならまだいいけど、十個などになるとさすがにきついと思うので
何かスマートな方法ないでしょうか?
442デフォルトの名無しさん:04/09/19 09:09:10
*.*で検索してExtractFileExt、UpperCase、AnsiMatchText, AnsiMatchStrあたりで比較
443デフォルトの名無しさん:04/09/19 16:03:23
const
Extentions:string = 'txt;html;';

*.*で検索
ExtractFileExt(FileName)+';'でPos
444デフォルトの名無しさん:04/09/19 16:35:49
10個も検索するの?
445デフォルトの名無しさん:04/09/19 16:45:12
>>443
酷いコードだな
tmlでも引っかかるし
だいたい ; ってファイル名に含められるし
446デフォルトの名無しさん:04/09/19 16:52:41
TFileListBoxをこっそり使うとか。
447デフォルトの名無しさん:04/09/19 17:08:55
>>443
IndexOfの方が良くないか?
448デフォルトの名無しさん:04/09/19 17:20:27
>>280
超遅レスだが、InnoSetupで、BDEを配布する方法(和訳)
http://www.geocities.jp/mystral_kk/iskb13.htm
449デフォルトの名無しさん:04/09/19 17:50:49
>>442-447
*.*で検索後から必要な物を抜き出す方法を試してみました。
うまくいきました。ありがとうございます。
でもTFileListBoxをこっそり使った方が手間が省ける事が解かって
ちょっと気が抜けちゃいました
ま、若いうちの苦労は買ってでもs…と言うことで
450デフォルトの名無しさん:04/09/19 19:17:10
質問させてください。
TListViewのOwnerDataとOwnerDrawをtrueにして、仮想リストビューとして使っているのですが、
MemCheckユニットで確認したところ、終了時にメモリリークするようになってしまいました。
穴が開くほど確認しましたが、自作クラスなどの解放はやっています。
また、OwnerDataをfalseにすると、メモリリークは起こりませんでした。

MemCheckによって生成されたログを見ると、リークはTListItem.Createで作られた
インスタンスだと思われます。

OwnerDataを使うのは初めてなのですが、もしかして、何か自前で解放しなくては
いけないのでしょうか? また、そうだとしたら、具体的に何を解放すればよいのでしょうか。
一応、フォームのOnDestroyに、リストアイテムを解放させるコードも書いて試してみましたが、
思った通りアクセス違反の例外が発生しました。
451デフォルトの名無しさん:04/09/19 19:33:49
素のDel6では、OwnerData使うとリークするバグがある。
Proだとアップデート当てれば直ったはず。Perはどうだかわからん。
452デフォルトの名無しさん:04/09/19 20:10:06
ソースはコレね。Update2で修正されてる。
ttp://buglist.jrsoftware.org/generated/entry0575.htm
453450:04/09/19 20:24:17
>>451-452
ご返答ありがとうございました。
情報の後だしになってしまったようで申し訳ないのですが、
Delphi6ですが、既にUpdate2パッチは当ててあります…。
また、>>452のバグは、TSubItem周辺のものだと思われますが、
仮想リストビューでSubItemは全く弄っておりません。
もつかれさま。

ファイルパスが
UNCかC:\形式か、それともファイルパスとしてふさわしくないか
を調べる関数など、JEDIとかMonaや自作ルーチンで
あったら教えてくださいませ。

場当たり的な実装ではなくて(場当たり的なのは自作できるし)
比較的汎用的なものがほしいです。

あと、ファイルパスが何階層目なのかを調べる関数なども
あったら教えてくださいませ。


.NETあたりにはあるのかな?
455デフォルトの名無しさん:04/09/19 22:42:45
実際に存在するかとかは関係なく字面の形式性のチェックってこと?
456デフォルトの名無しさん:04/09/20 00:20:35
アクセスが遅いメディアからムービーを読み込んで再生させようとすると、
音声と映像の同期がとれなかったり、再生が遅延したりしてしまう・・・。
TMediaPlayer使ってるんですが、なんかいい解決法ないですか?(´・ω・`)

FormCreate内でopenしてplayしようとすると、映像が展開される前に
音声だけ流れ始めたりして、再生がしっちゃかめっちゃかになります。
もちろんHDDからだと問題ないけれど、CDに焼くと途端に崩壊・・・。

TWindowsMediaPlayer使うと上手くいくんですが、ユーザの環境
(プレーヤのバージョンとか)に思い切り依存するのでボツりました。
>>455さん
そうっす。

となると、生気表現かすら?
458デフォルトの名無しさん:04/09/20 00:29:35
>>456
某所で「ぎこちないTMediaPlayerのムービー再生」というタイトルで質問してた人ですか?
459デフォルトの名無しさん:04/09/20 00:31:39
isvalidpathってのが引っかかるんだけど何物?
>>453,>>450さん
RTLupdate関係なのかな?

うちでは仮想ListViewでMemCheckしても発生してないですね。

再現する小さいプログラムコードを

ソース置き場
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html

などに掲載するとええかも。
461デフォルトの名無しさん:04/09/20 01:30:48
>>454
ない。作れ。すぐできるぞ。
\\で始まるか、アルファベット:かで区別すればよい。これ以外は相対パスかな。
不正な文字が含まれているかどうかチェックをつけるかは任意で。
462450:04/09/20 11:31:53
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1017673221_8/MemLeakTest.zip
にあげてみました。実行にはMemCheckユニットが必要です。

ボタンを押すと仮想ListViewのアイテムを増やします。
その後、フォームを閉じるとメモリリークが検知されます。

私の環境では、1回ボタンを押してフォームを閉じると
150回のメモリリークが起きます。
(追加したアイテムのキャプションを変更するとさらに増える)

私の環境が悪いのでしょうか…
463450:04/09/20 11:53:39
ageさせて頂きます。
464デフォルトの名無しさん:04/09/20 12:03:09
そもそもOwnerData := TrueでItems.Addするのがおかしい。
そんなことをしたときの挙動がおかしいのかもしれないね。
ほんとはInvalidOperationだかの例外を投げるべきなのかもしれないけど。
465464:04/09/20 12:19:11
すまん。少し保留しといて。
とりあえず解決するにはItemsではなく独自のコンテナにデータを保持して
OnData,OnDataFindでデータをセットすればリークは消えるはず。
466デフォルトの名無しさん:04/09/20 12:31:26
ヘルプより

仮想リストビューコントロールに格納される情報は,選択およびフォーカス情報だけです。

だから、自分で開放しなけりゃリークするのは当然だと思うけど。

467450:04/09/20 12:45:37
>>464-466
ご返答ありがとうございます。
どうも私の使い方が間違っているようですね…。

独自のコンテナを使うのは問題無いのですが、
リストビューにOwnerDrawで表示する場合、どんな風にイベントが起こるのでしょうか。
(例えば、リストアイテムの数などは、どのイベントで設定するのでしょうか。)
何分、OwnerDataを使うのが初めてなので、ノウハウが良くわからないです…。すいません。

TListView OwnerData などで検索してみましたが、
ヒットするサムネイル表示のサンプルでは、OwnerData:=Trueの状態で
Items.Add をしていますね。やはりこれも間違っているのでしょうか。
正しいサンプルが見つかりません… orz
468450:04/09/20 13:16:21
と思ったら、TListItems.Count はReadOnlyなプロパティじゃなくて
設定できるのですね… orz

なんとかなりそうです。ありがとうございました。
469デフォルトの名無しさん:04/09/20 14:04:56
グラフィックス関係のコンポーネントを
使ってプログラムを実行しようとすると
Graphics.pasがないです
といわれてしまうのですが、
どうすればいいのでしょう。
このファイルはどこでダウンロードできるのでしょうか。
470デフォルトの名無しさん:04/09/20 14:48:14
お使いの Delphi のバージョンと、
使いたいコンポーネントの名前。

おそらくは、バージョンの不一致。
471デフォルトの名無しさん:04/09/20 14:49:30
>>469
uses節に「Graphics」を追加すると、どう?
472469:04/09/20 15:04:48
>>470
Delphiのバージョンは6です。
使いたいコンポーネントはデフォルトでついている
OpenPictureDialog
Image
Buttonです。
ダイアログを出して、画像ファイル(jpg)を選択すると
上記メッセージがでます。

>>471
自動的に追加されてました。
473デフォルトの名無しさん:04/09/20 15:35:02
6 Personal かな?

で、コンパイル時ではなく、アプリ実行時のエラーなのですね?
それは、単にデバッガがソースコード表示をしようとしていて、
Personal 版だからソースがない。といってきているだけかと。

無視してください。
ただ、デバッガが開いたということは何かバグがあったということですから、
虫取りしましょう。
474デフォルトの名無しさん:04/09/20 15:35:45
>画像ファイル(jpg)を選択すると

uses に jpeg を追加してみると変化があるかも。
475469:04/09/20 16:29:51
>>474
kita-------
キターーー
キターーーーー
きたーーーーーー
来たーーーーーーー
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
476デフォルトの名無しさん:04/09/20 16:31:18
いいからもちつけ
477デフォルトの名無しさん:04/09/20 17:58:41
>450
これが原因ではないかな。
ttp://hogehoge2001.at.infoseek.co.jp/note-delphi.html
>☆TListView☆(2002-02-03追加)
478450:04/09/20 18:09:00
>>477
わざわざありがとうございます。
すいません、一応解決済みです。
OwnerData := True の状態で Items.Add をしていたのが原因のようです。
本来ならば、Items.Count を増やすところでした。

で、またまた質問です。というか、バグっぽいのですが、
TListView の OwnerData := True MultiSelect := True にして、
Shift や Ctrl を使った複数選択をすると、SelCount に 0 が代入されます。
本来ならば選択された数が入るはずなのですが…
また、普通にマウスによる範囲選択を行うと、ちゃんとSelCountに反映されます。

選択数が必要なので、取得したいのですが、ShiftやCtrlによる複数選択が使えないのは
辛いです。何か代替案等ありましたらよろしくお願いします。
479450:04/09/20 18:13:24
すいません、訂正です。
Ctrlによる複数選択は SelCount に反映されるようです。
正しくは Shift で複数選択を行った時、でした。
480デフォルトの名無しさん:04/09/20 18:19:27
>478
ああ、subitemの話じゃないのか。それなら477は関係なかった。
481デフォルトの名無しさん:04/09/20 18:51:34
API直呼び。これ最強。つーかVCLのListViewバグが多いし
使えない機能もあるんでAPIに頼らないとダメなんだな。
482デフォルトの名無しさん:04/09/20 18:51:52
そうかい
483450:04/09/20 19:15:59
調べてみましたが、どうやらShift選択すると、Selectedにすら反映されないようです。
それで、>>481さんの言う通り、LVM_GETNEXTITEM で直接数えてみましたが、
やはりShift選択に限っては 0 になりました。

恐らく、仮想リストビューでShift選択しても反映されないのは、
Windowsの仕様(もしくはバグ)みたいなので、APIスレに行って参ります。
484デフォルトの名無しさん:04/09/20 19:54:13
ぶっちゃけ、お前のバグが原因だ。まず、自分自身を疑え。話はそれからだ。
485450:04/09/20 20:26:14
>>484
もちろん自分のプログラムの間違いの可能性もあったので、
一応簡単なテストプログラムも作りましたが、結果は同じでした。

もし何だったら試してみてください。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1017673221_9/MultiSelectTest.zip
このプログラムを実行して、アイテムをShift+クリックなどで複数選択すると、
SelCount は 0 となりました。
486469:04/09/20 20:26:20
関数で2つの値を返したいときはどうすればいいんでしょうか?
配列に入れて買えそうと思いましたが、
function() : Integerとか
function() : Arrayとか
やってもうまくいきません。
487デフォルトの名無しさん:04/09/20 20:32:21
そういうときは、頭にvarを付けた配列またはレコード型の引数を使う
関数内で結果をその引数に代入すれば戻せる。
488469:04/09/20 20:40:32
引数をポインタのようにして扱うという
ことなんでしょうか???
クラスにした方がいいような気がしてきました。
489デフォルトの名無しさん:04/09/20 20:41:07
案その一
procedure 一度に二つの整数を返す関数 (var x, y : integer);
begin
 x := 1;
 y ;= 2;
end;
490デフォルトの名無しさん:04/09/20 20:43:56
案その二
type
 二つの整数を保持する型 = record
  x, y : integer;
 end;

function 二つの整数を保持する型を返す関数 : 二つの整数を保持する型;
begin
 result.x := 1;
 result.y := 2;
end;
491デフォルトの名無しさん:04/09/20 20:45:39
ちょっと先が思いやられるので、半日でいいから文法書を読みなさい。
基礎力付けとかないとこの先大変だぞ
492デフォルトの名無しさん:04/09/20 21:07:02
ざっと試した感じ、Shiftを押して項目を選択すると、
いったん全体が解除されて、OnSelectItemが発生する。
このとき引数であるItemはnil(=全体)で、SelectedはFalse(=選択解除)。

>>485のソースだと、このときSelCountを表示してるので、0が表示される。

で、その後はOnSelectItemではなく、OnDataStateChangeが発生する。
ここでは選択範囲をインデックスで知ることができ、
SelCountにはちゃんと選択数が入っている。

つまりSelCountが0と表示されたのはバグでも何でもない。
全体解除されるタイミングがあり、そのタイミングで表示しただけのこと。
493デフォルトの名無しさん:04/09/20 21:08:25
>485 MLに同じ質問があるから検索汁。
494469:04/09/20 21:14:39
やっぱりくらすにした方がスマートなような気がする
戻り値を因数にするってのが
なんかいやだ〜〜
単なるこだわり
495469:04/09/20 21:15:19
×因数
○引数
496デフォルトの名無しさん:04/09/20 21:16:14
×いんすう
○ひきすう
497デフォルトの名無しさん:04/09/20 21:17:09
いんすうでも間違いではない
498デフォルトの名無しさん:04/09/20 21:19:36
>>497
うそだ
499デフォルトの名無しさん:04/09/20 21:19:50
金地院崇伝
500デフォルトの名無しさん:04/09/20 21:25:29
>>485
APIスレに投げた質問取り消しておけよ。
501デフォルトの名無しさん:04/09/20 21:53:56
>>498
マジで最近は「いんすう」でも間違いではないらしい。
こだわるのは考えが古いのだろうか
502デフォルトの名無しさん:04/09/20 21:59:46
http://www20.big.or.jp/~o-shin/bbs/bender/pg/pslg353.html
年寄りほど「いんすう」と呼ぶらしいから、そいつらこそ「いんすう」にこだわってるんじゃないか。
503450:04/09/20 22:18:27
>>492
うは、なるほど。OnSelectItemで取得していたのが悪かったのですね… orz
OnDataStateChange で拾う事に致します。
詳しいご説明ありがとうございました。

>>493
既出でしたか…。申し訳ありません。検索したつもりでしたが、漏らしていたようです。

>>500
かしこまりました。

皆様お手数をかけてしまい、申し訳ありませんでした。
お陰様で、OwnerData の使い方が大分理解できました。
有難うございました。
504デフォルトの名無しさん:04/09/20 23:02:31
ていうかそれくらいサンプル作っとけよ>某
505デフォルトの名無しさん:04/09/20 23:12:01
いいえ、ちゃんとありますけど。
506450:04/09/20 23:28:32
>>505
ほんとだ… orz
身を持って習得できたので悲しいけど嬉しいです。。。
507デフォルトの名無しさん:04/09/21 09:43:12
Delphiのオブジェクト指向は
メンバーにクラスを持たせることができる仕様なんでしょうか・・・?
508デフォルトの名無しさん:04/09/21 09:55:14
>>507
質問が曖昧なのでもう少し具体的に。
クラスのインスタンスを持たせたいのか
メタクラス(クラス参照)を持たせたいのか
クラス内でクラスを定義したいのか。
上の二つなら可能。一番下はDel8なら可能。
509デフォルトの名無しさん:04/09/21 10:22:43
iniファイルを作成したく、作成先を
c:\Documents and settings\ユーザ名\

の下にしたいんですが、ユーザ名のところには何て書けばいいですか?
510デフォルトの名無しさん:04/09/21 10:43:16
そんな所に作らない方がいいよ。
511デフォルトの名無しさん:04/09/21 10:51:01
>>509
http://homepage1.nifty.com/MADIA/delphi/Win32API/ShFolder.htm

アプリのデータは
C:\Documents and Settings\ユーザ名\Application Data\アプリ名
かMy Documents\アプリ名
に作っとけ
512デフォルトの名無しさん:04/09/21 10:57:50
コンパイル時に[エラー] Unit1.pas(33): 文字列の要素が 255 を超えましたというエラーがでるんですが、
回避する方法ってありますか?
513デフォルトの名無しさん:04/09/21 11:02:55
>>508
ありがとうございました。
UML敵にどう書くのかなw
514デフォルトの名無しさん:04/09/21 11:03:37
イメージ系のクラスが大量にあって
どれがどれだかわからなくなってくるのですが
うまくまとめているページありませんでしょうか。
515デフォルトの名無しさん:04/09/21 11:06:21
>>512
s := 'たぶん閉じ忘れ;
516デフォルトの名無しさん:04/09/21 11:08:56
>>515
いやクエリとか書いてて、マジで256以上なるんですよ。
んで、一つの句ごとに改行しているので、
なんかあまり美しくなくて。
517デフォルトの名無しさん:04/09/21 11:16:30
>>512
・プロジェクト(P)-オプション(O...)で出てくる設定ウィンドウの コンパイラ タブにある
 「長い文字列を使う」にチェックを入れる。
・string[255]、ShortStringなどを使わず、普通にstringを使う。
・PCharを使う。

データベースの制限についてはわかりません。
518デフォルトの名無しさん:04/09/21 11:17:05
Delphi5を使用しているのですが、
[エラー] XXXX.pas(2455): for ループ制御変数 'i' に代入しました
と表示されるのですが、DelphiだとFor文のループ制御変数に値を代入する
事はどうやっても出来ないのでしょうか(ノД`)

VBだと普通にi=5とか出来たのですが・・・。
519デフォルトの名無しさん:04/09/21 11:18:50
>>518
できません。
while文かrepeat文を使いましょう。
520デフォルトの名無しさん:04/09/21 11:33:25
>>519
出来ないのでしかー。
わかりますた。アリガトン
521デフォルトの名無しさん:04/09/21 12:48:48
長い文字列定数の定義は、文字列リテラルを結合します。

longlong = '1......' +
 '................' +
 '................';

一行 1024 文字、ひとつの文字列リテラルが 255 の制限があるだけで
文字列定数そのものの制限は... 8192 文字までは試した覚えあり。

522デフォルトの名無しさん:04/09/21 15:27:57
>>516
TQuery.Add('ほにゃらら');
とかで分割して入れたらOK!!
523デフォルトの名無しさん:04/09/21 15:51:28
ははーん。
''の間はどうしても255文字までなんですね

ということは、そんなふうに分けないといけないのでつね。
なんか、あまり美しくないようなきもしますが・・・

さしあたりありがとうございました。
524デフォルトの名無しさん:04/09/21 17:38:08
確認のために追加。
定数式の結合はコンパイル時に行われるので、ソース上で最長 255文字ごとに
改行が必要になるだけ。生成コードは最初からひとつの文字列になっています。
525デフォルトの名無しさん:04/09/21 20:07:13
一部の引数の省略可能な関数・手続きはどうやって作ったらよいのでしょうか?
例えば、Inc関数なんかは
Inc(i);
でも
Inc(i,10);
でも使えますよね。こんなのを作りたいんです。

とりあえず、今はoverloadで全引数有りと一部引数抜きの2つを作ってごまかしているんですが
overloadを使わないで作る方法を教えてください。
526デフォルトの名無しさん:04/09/21 20:17:37
procedure myinc(var i: integer; delta: integer = 1);
begin
 inc(i,delta);
end;

myinc(i);
myinc(i,10);
527525:04/09/21 20:20:19
>>526
サンクスです。
実は、今自分で書いてたとこなんですが
質問してから自分でやってるうちに解決できました(泣
528デフォルトの名無しさん:04/09/21 23:06:37
画像の拡大・縮小に
StretchBlt関数を使っているのですが
品質がいまいちです。
もっとよい品質で拡大・縮小をする方法はありませんでしょうか?
529528:04/09/21 23:09:45
まさか自分で実装しなきゃいけないとかではないですよね・・・。
PHPみたいなスクリプト言語でさえ綺麗なサムネイルが
作成できる時代に・・・・。

ちなみにDelphi6 Personalです。
530528:04/09/21 23:22:42
どうやら自分で
リサンプリングのコードを書いて
実装させる必要があるみたいですね・・・。
ひえー。
531デフォルトの名無しさん:04/09/21 23:27:00
GDI+とかのライブラリを使えば良いのでは?
JEDIに定義ファイルがあったはず。
532デフォルトの名無しさん:04/09/21 23:27:04
中村先生が画像関連のライブラリ公開してたような
533デフォルトの名無しさん:04/09/21 23:30:45
>>529
逝ってよし。
534デフォルトの名無しさん:04/09/21 23:33:05
HALFTONEは95/98じゃ使えないんだっけかな。まあこんなOS切り捨て(ry
535デフォルトの名無しさん:04/09/22 00:15:49
>>528
ttp://hp.vector.co.jp/authors/VA015850/delphi/lib/index.html
ここの nstretchf.pas はどうでしょう。
536Delフサギコ ◆A6VzDeLphI :04/09/22 01:13:31
 ∫,,,,,,,,,∧,,∧  今日も、もつかれー
⊂,,,,,,,,,つ,,゚Д゚ミつ

ちょっとメモリク話題が出たので
もいちど話だしときます
D6UP2済み環境です。

procedure TForm1.Button1Click(Sender: TObject);
begin
 CheckListBox1.Items.Add('テスト');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 CheckListBox1.Items[0] := 'テスト0'
end;

MemCheckしてるとButton2の方でメモリクしてる
警告が出ます。

回避策として一度DeleteしてそこにInsertすれば
よさそうですけど...

何か回避策とかありますか?
そもそもこれはバグ?漏れの環境だけ? 
537デフォルトの名無しさん:04/09/22 02:33:28
実際漏れてるな
538デフォルトの名無しさん:04/09/22 02:44:38
回避策
if CheckListBox1.count>0 then CheckListBox1.Items[0] := 'テスト0'
539デフォルトの名無しさん:04/09/22 03:00:55
>>538
それ違う。Button2を押す前にButton1はもちろん押してるぞ。
540デフォルトの名無しさん:04/09/22 03:53:15
TListBoxStrings.Putに2行追加

 InsertObject(Index, S, nil);
 P := Pointer(ListBox.InternalGetItemData(Index)); // 追加
 if P <> nil then SysFreeMem(P); // 追加
 ListBox.InternalSetItemData(Index, TempData);
 ListBox.ItemIndex := I;
end;

ソース書き換えない事には根本的な解決は_ぽい。
フサギコの言うように、DeleteしてInsertとかするしか。
541デフォルトの名無しさん:04/09/22 09:23:52
ポップアップメニューが表示されているかどうかを
判定する方法はありませんか?
542デフォルトの名無しさん:04/09/22 09:26:29
Spy++
543デフォルトの名無しさん:04/09/22 09:30:29
そのポップアップメニューは自分で表示したものです。
でも、モーダルダイアログと違っていつ閉じられるか
イベントがないのでどうしたらいいものかと
544デフォルトの名無しさん:04/09/22 10:04:50
TPopupmenu.Popupでポップアップを表示すれば、制御が戻ったときがメニューを閉じたときだな。

別解。OnCloseContextMenuイベントの作り方。
 THonyarara = class(TWinControl)
 protected
  FOnCloseContextMenu: TNotifyEvent;
  procedure WMContextMenu(var Message: TWMContextMenu); message WM_CONTEXTMENU;
  procedure CloseContextMenu;
 public
  property OnCloseContextMenu: TNotifyEvent read FOnCloseContextMenu write FOnCloseContextMenu
 end;

procedure THonyarara.WMContextMenu(var message: TWMContextMenu);
begin
 inherited;
 CloseContextMenu;
end;

procedure THonyarara.CloseContextMenu;
begin
 if Assigned(FOnCloseContextMenu) then
  FOnCloseContextMenu(Self);
end;
545デフォルトの名無しさん:04/09/22 10:23:49
こんな感じじゃ無理ですか?
if menuhoge = nil then
showmessage('メニューは表示されてないよ')
else
showmessage('メニューは表示されてるよ');
546デフォルトの名無しさん:04/09/22 10:53:36
547デフォルトの名無しさん:04/09/22 15:39:49
WM_EXITMENULOOPをメインウィンドウで拾えませんか?
>>532
これでしょうか.
ttp://www.asahi-net.or.jp/~HA3T-NKMR/DGS/
フリーのライブラリがいろいろ揃うのはDelphiの良いところですね.
549543:04/09/22 16:29:50
できました。ありがd
550デフォルトの名無しさん:04/09/22 17:56:38
Delphi5Proでソフトを作っているのですが、いつも必ず0による除算の
エラーが出てしまいます。
/で検索をかけても/はコメントと日付のセパレートとしてしか
使われていません。
F8の乱打ではとても追いつけないほどループを繰り返しているので、
F8も使えないのですが、0による除算のエラーがでる直前のところで
処理を止める方法はないでしょうか?
あるいはどこで0による除算のエラーが出たか知る方法はありませんか?

よろしくお願いします。
551デフォルトの名無しさん:04/09/22 18:15:19
>>550
すこしづつ絞っていくことぐらいはできるのでは?
なお、 div も割り算です。
552デフォルトの名無しさん:04/09/22 19:11:26
FireBird1.5を使ってるのですが、どこかでなるべくIBTableを
使わないほうがいいという書き込みを見たような気がします。
C/SではIBTableを使わないほうがいいんでしょうか?
予想レコードは10万件、同時接続クライアントは10件くらいです。

代替えにIBQueryかIBDataSetを使おうと思ったのですが、使い方が分かりません。
IBTableだとDataSourceと一つずつあればとりあえず動きますが、IBQueryとかだと
DataSourceと排他ですよね。ヘルプ見ても分からないので質問しますが、
DBコンポーネントと連携したいのですがどういった構成で使うものなんでしょう?
553デフォルトの名無しさん:04/09/22 20:25:17
>WM_EXITMENULOOPをメインウィンドウで拾えませんか?

メインウィンドウのポップアップなら拾えるんでは。
その他のコントロールなら、それ自身で拾うか、>>64 とかフックとか
554デフォルトの名無しさん:04/09/22 21:01:51
>>552
結局IBTableもクエリー流してるだけじゃないの、

といってみるテスト。
555デフォルトの名無しさん:04/09/22 21:45:02
>>550
メモリ関係のエラーが発生した場合、無関係なエラーメッセージが出る場合がある。
配列操作やクラスの生成解放などで、怪しい所はないですか?
556デフォルトの名無しさん:04/09/22 21:54:20
mod も割り算です。
557デフォルトの名無しさん:04/09/22 22:55:44
質問です。
TListBox の Columns を設定すると、スクロールバーが水平方向しか出ないのですが
垂直方向にスクロールするようにはどうしたらよいでしょうか。
Style には lbVirtualOwnerDraw を指定して、仮想リスト+オーナードローで使ってます。
558デフォルトの名無しさん:04/09/22 23:12:29
ScrollぼxにListぼxを乗せる。ではダメかね。
559デフォルトの名無しさん:04/09/23 03:12:42
スクリーンショットを撮って保存する方法おせーて下さい
560デフォルトの名無しさん:04/09/23 07:35:37
キーボードのPrint Screenを押してペイントに貼り付けて保存。
561559:04/09/23 08:51:52
Delphiのコードでおながいします
562デフォルトの名無しさん:04/09/23 09:27:31
begin
 Google;
end
563559:04/09/23 09:50:15
すみません、ググったら意味不明なスクショが出てくるだけで解説が無いんです、、、
564デフォルトの名無しさん:04/09/23 09:57:00
565デフォルトの名無しさん:04/09/23 17:17:47
SavePictureDialogで
フィルターをたとえばjpgにしていたら、
ファイル名に拡張子を指定していない場合でも
自動的に.jpgという拡張子をつけて
保存するようにしたいと
考えているのですが、どのようにしたらいいのでしょうか?
566565:04/09/23 17:18:11
Delphi6 Personalです。
567デフォルトの名無しさん:04/09/23 17:21:35
>>565
DefaultExt
568デフォルトの名無しさん:04/09/23 17:22:03
DefaultExt
569567:04/09/23 17:28:27
>>568
幸せにしてね
570565:04/09/23 17:43:58
if FileNameに拡張しか含まれていない then
  if FilterIndex =1 then
    DefaultExt := bmp
    FileName := Filename +'.'+ DefaultExt

みたいな面倒なことしなきゃだめなんでしょうか??
もっとスマートな方法ってありますか?
571デフォルトの名無しさん:04/09/23 18:07:39
>>570
FileNameに何が返ってくるのか試してみたのか?

それじゃD6インストールしてませんって言ってるようなもんだぞ?
572565:04/09/23 18:11:19
ためしてみました。
てことは、やっぱりこの面倒な方法しかないんですね・・・・・
573デフォルトの名無しさん:04/09/23 18:28:13
PictureDialogで
bmp、jpeg以外の画像をクリックすると
デバッグでエラーがでてしまいます。
このエラーを回避するにはどうしたらいいのでしょうか?
(エラーを出さずに、単に「なし」と表示させたい)
574デフォルトの名無しさん:04/09/23 18:58:07
Filterをbmp、jpegだけにするのはダメなの?
575デフォルトの名無しさん:04/09/23 19:17:55
ちょっとお尋ねします。

bmpをクリップボードにコピーして、
他のソフトから読めるようにする方法を
説したサイトなんてないですか?
576デフォルトの名無しさん:04/09/23 19:26:56
ヘルプ
577デフォルトの名無しさん:04/09/23 20:39:57
ヘルプを読むと分かるよ

uses
Clipbrd;

procedure TForm1.Button1Click(Sender: TObject);
var
bmp:TBitmap;
begin
bmp := TBitmap.Create;
try
bmp.LoadFromFile('C:\Test.bmp');
Clipboard.Assign(bmp);
finally
bmp.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if Clipboard.HasFormat(CF_BITMAP) then Image1.Picture.Bitmap.Assign(Clipboard);
end;
578デフォルトの名無しさん:04/09/23 20:51:15
画像を開いて表示するだけのソフトなのですが、
Formのサイズをautosizeにしていたときは大丈夫だったのですが、
画像を開くと同時にその画像の高さ・幅をformの高さ、幅に
指定するように書き直したところ、
画像を開いた瞬間にWindowsXPのVisualStyleが
適用されないウィンドウに変化してしまうようになりました。
これはどうしたらいいのでしょうか?
579578:04/09/23 20:55:00
Delphi6 Personalです。
580578:04/09/23 20:56:54
どうやらスクロールバーがでるような操作をすると、
Visual Styleが無効になっているみたいです。
何か参考となる情報
581デフォルトの名無しさん:04/09/23 20:58:11
ScrollBox つかったら
582578:04/09/23 21:10:00
ScrollBoxを使うとうまくいきますが、
ユーザーが故意にウィンドウサイズを変更して
スクロールバーがでるような
状態になったときにやはり
VisualStyleが適用されないウィンドウに
なってしまいます。
これはDelphi6の仕様上どうしようもない
現象なのでしょうか。
583デフォルトの名無しさん:04/09/23 21:16:26
ScrollBox の Align を alClient にするだけ
584デフォルトの名無しさん:04/09/23 21:17:06
Updateで直ったような気がするけど?
585578:04/09/23 21:34:42
Updateしてみます。
ただいまダウンロード中・・
586578:04/09/23 21:40:46
UPdate Pack#2までいれたら
VS適用されました!!
587575:04/09/24 02:46:09
>>577
ありがとうございます。
やっぱりその方法ですか。

以前、その通りにやって、クリップボードにコピーされたはずのbmpが
他のグラフィックソフトで貼り付けできない(というか、「貼り付け」メニュー
項目がアクティブにならない)ことがあったので。。。

もう一度やっています。
588デフォルトの名無しさん:04/09/24 07:17:36
単純な画像ビューアーをつくっています。
画像が表示されていないときは
メニューのコピーや切り取りをつenable := falseにして
画像が表示されていたらtrueにしたいとおもってます。
「開く」メニューや「閉じる」ボタンにいちいち
その処理を書いていくのは面倒なので
ユーザーが何かの操作をしたときに毎回
Imageがからかどうかを確かめてそれによってメニューが
使えるかどうかを設定したいと思っています。
そこでユーザーが何かの操作をしたときに毎回
呼び出されるようなプロージャってあるのでしょうか?
589デフォルトの名無しさん:04/09/24 07:27:54
OnMouseDownやOnClick等のイベントから共通の関数を呼ぶようにすればよいだけ。
590デフォルトの名無しさん:04/09/24 07:29:38
その機能を手続き化しておいて
「開く」や「閉じる」の中でその手続きを呼び出す。
これすら面倒というのならつける薬はないだろ。
591デフォルトの名無しさん:04/09/24 07:34:41
>>588
メニューの項目の Enabled を決定するのは、それがぶら下がっている項目の
OnClick イベントで表示される直前に。

それ以外の方法では面倒
592デフォルトの名無しさん:04/09/24 07:39:06
やっぱりいちいちすべてのメニュー、操作に
編集を加えなきゃだめですか。
了解しました。
593デフォルトの名無しさん:04/09/24 08:30:43
TActin/TActionList使っとけ。
594デフォルトの名無しさん:04/09/24 09:19:48
>>592
いちいちって・・・普通だけど
595デフォルトの名無しさん:04/09/24 09:28:41
>>593
試してみます。

>>594
同じ動作をいろいろなところに分散させて記述するのは
仕様を変更したり機能を拡張したりするときの
バグの元になります。
596デフォルトの名無しさん:04/09/24 09:37:49
1カ所にまとめてそれを呼び出すんだよ
>>557
Windowsのリストボックスは縦スクロールか横スクロールしかできないと思います.
グリッドではだめですか?
598557:04/09/24 15:37:10
すいません、>>558さんのレスに気づかずに読み飛ばしていました… orz

>>558,597
えと、申し訳ありません。どうも自分の使い方にはTListViewの方が
あっているようなのです。

ただ、TListViewでは大きなアイコン表示でオーナードローする際に、
アイコンとアイコンの間隔がWindowsの設定のものになってしまうので、
それをアプリケーション側から(Windowsの設定を弄ることなく)決めたいと思っています。
これは、可能でしょうか。もし可能ならば、具体的にはどのようにすれば良いでしょうか?
また、ImageListを設定せずに、1項目のサイズを設定する方法はあるのでしょうか?
599デフォルトの名無しさん:04/09/24 16:32:48
それ TDrawGrid の方がよさそうだけど
600デフォルトの名無しさん:04/09/24 16:51:44
とても困っててすみません、MemoryStreamに入っているデータを↓のextに渡したいんですけど、
どうすればいいのでしょうか?配列を渡す事はできたのですが(↓の例)、
MemoryStream内のデータの渡し方がわかりません。
extの引数は変更できないので、渡す前にどうにかしたいのですけど・・・

procedure TForm1.test;
var
aaa:array [0..5] of Char;
begin
aaaに値を入れて・・・
ext(aaa);
end;

procedure TForm1.ext(test:array of char);
begin
end;
601デフォルトの名無しさん:04/09/24 16:54:37
TPageControl/TTabControlのMultiSelectedがTrueの場合
どうやって選択しているタブを取得するのでしょうか?
602デフォルトの名無しさん:04/09/24 16:54:52
>>600
Delphi相談室(上級者用)その12
http://pc5.2ch.net/test/read.cgi/tech/1064766880/560
603デフォルトの名無しさん:04/09/24 17:00:49
Del4のgraphsv3は、Del7ではどうなりましたか?
604デフォルトの名無しさん:04/09/24 17:30:46
>>600

aaa[0]に6バイト分読み込む
605デフォルトの名無しさん:04/09/24 17:35:10
>>600
提示されているコードに MemoryStream が見当たらないが。

初心者が落ちる良くあるポイント。
関数/手続き/メソッドの引数内で配列を定義しないこと。
C/C++ と異なり、それぞれの定義はそれぞれ別の型を生む。

事前に
type
 TArrayOfSixChar = array [0..5] of Char;
とでもしておけば、

procedure TForm1.test;
var
 aaa: TArrayOfSixChar
begin
 //aaaに値を入れて・・・
 ext(aaa);
end;

procedure TForm1.ext(test: TArrayOfSixChar);

とできるだろう。
606デフォルトの名無しさん:04/09/24 17:38:35
勘違いしてるぞ
607603:04/09/24 17:54:12
TGraph が見当たらないんですが、
どうしたら良いんでしょうか?
608デフォルトの名無しさん:04/09/24 18:47:55
>>605
すみません、おおざっぱに抜粋し過ぎました。
605さんのその方法はよくわかります。
しかし、ストリームのデータサイズが不定のため、その方法は
やりたくないんです。
うまいことキャストとかしてStream.Memory(要はPointer型)を
引数であるarray of Charに渡したいんです。
609デフォルトの名無しさん:04/09/24 19:01:34
>しかし、ストリームのデータサイズが不定のため、その方法は
>やりたくないんです。

意味不明。不定だからこそ

type
 TArrayOfSixChar = array of Char;

にしておいて SetLength() するべき。ポインタはメモリ上の一点の位置を指してる
だけ。array of char のようなものをわたしたいんなら、内容をコピーしないと。



610デフォルトの名無しさん:04/09/24 19:08:44
>>609
あ、あ、あなた様はもしや・・・
いや間違いない。絶対そうだ。
あっちでお願いします。

意味不明ですみませんでした。
type
 TArrayOfSixChar = array of Char;
これでやると
渡される方もこうしないとダメですよね。
array of Charのままじゃ無理ですもんね。
・・・渡される方が変更できないんです・・・
611デフォルトの名無しさん:04/09/24 19:11:28
マルチポストは嫌いじゃ
612デフォルトの名無しさん:04/09/24 19:56:42
>>610-611
自分、array of Charの引数渡しを質問出したけど、609は別人だよ。
>>598
やってみた.(Delphi 5 Pro@WinXP SP1で確認)
リストビューの項目にPositionプロパティに表示させたい座標を指定することで任意の間隔で配置できる模様.以下サンプル.

//●リストビューのアイコンを配置し直すメソッド
procedure TForm1.ArrangeListItems;
const cColumns = 4; cXPitch = 128; cYPitch = 160; // 横項目数,横間隔,縦間隔
var i, ix, iy: integer;
begin
 ListView1.Items.BeginUpdate;
 try
  for i := 0 to pred(ListView1.Items.Count) do
   ListView1.Items.Item[i].Position := Point((i mod cColumns) * cXPitch, (i div cColumns) * cYPitch);
 finally
  ListView1.Items.EndUpdate;
 end;
end;
614デフォルトの名無しさん:04/09/24 22:53:53
IEコンポーネントの使い方を解説したサイト
キボンヌ
615デフォルトの名無しさん:04/09/24 22:55:49
2chブラウザのサイト
616デフォルトの名無しさん:04/09/24 23:30:59
Free Pascal Compilerのドキュメントの日本語訳はどこにありますか?
穂積一平さんのサイトにあるようですが、見つかりません。
617デフォルトの名無しさん:04/09/24 23:59:45
マルチポストは人間のクズ
618デフォルトの名無しさん:04/09/25 00:03:14
一週間粘ってだめだったら書き込もうと思ってて、だめだったので書き込ませてもらいます。
プログラミングをはじめたのが上記のとおりの真性初心者なんですけど
(ifとforをやっと理解できた程度の雑魚です。。。)
BUTTONを押したら他のアプリケーションが複数機動できるようにしたいのですが、
どういうコマンドがありますか??
本当にへぼい質問ですいません。ご教授のほどよろしくお願いします。
619デフォルトの名無しさん:04/09/25 00:04:20
ShellExecute
620618:04/09/25 00:10:25
>>619
ShellExecute(絶対パス)
でいいのでしょうか??
621デフォルトの名無しさん:04/09/25 00:13:22
622デフォルトの名無しさん:04/09/25 00:20:01
スタイル付きのテキストを編集・表示したいのですが
どうしたらよいのでしょうか?
メモ帳の拡張版みたいなのを作りたいと思ってます。
623618:04/09/25 00:20:59
>>621
そうですね。教えて君ですみませんでした↓↓以降気をつけます!!
624デフォルトの名無しさん:04/09/25 00:24:13
Fortran ⇒ MS-C ⇒ VB6 とプログラミングしてきたんですけど
Delphi6がわからないです。。。orz

秀和システムの「基礎からわかるDelphi6」を買ったんですけど
いまいちで。。。
ギコナビ・プロジェクトははるか先です(涙)

初心者にナイスな本を教えてください。
お願いします。
625デフォルトの名無しさん:04/09/25 00:26:49
VB6がわかればDelphiもわかると思うけどな
626624:04/09/25 00:29:02
>>625
コードの書き方というか、とっかりになるような本ありませんか。
627616:04/09/25 00:29:14
マルチポストではありません(´Д`)
628デフォルトの名無しさん:04/09/25 00:30:57
>>624
開発者ガイド端から読んどけ
629デフォルトの名無しさん:04/09/25 00:31:30
>>626
VBで作ったものを移植してみる。
630デフォルトの名無しさん:04/09/25 03:05:02
>>624
塚越本(はじめてのDelphi,Delphiオブジェクト指向プログラミング)がおすすめ。
はじめて…は絶版だったかな?
コンソールアプリを多用していて一見とっつきにくそうだが
余計なものがない分すごく分かりやすい。そして…
Delphiに慣れてくるとVB6に対して今までと違う感情を抱くようになるw
631デフォルトの名無しさん:04/09/25 11:27:12
7,8年前の本がオススメって、なんかむなしいな。
>>626 = >624
『コードの書き方』というのが漠然としていて何を指すのかがはっきりしませんが,
言語仕様をお知りになりたいのでしたらオンラインヘルプの
『Object Pascal言語ガイド』をご覧ください.

できればどこまでできてどこでつまずいているかを具体的に書いていただければ
より適切なアドバイスのレスが返ってくるのではないかと思います.
633デフォルトの名無しさん:04/09/25 12:20:51
http://bookweb.kinokuniya.co.jp/guest/cgi-bin/wsea.cgi?USID=&skey=1&KEYWORD=delphi%83I%83u%83W%83F%83N%83g
ま、仕方ねーんじゃないのか。
良本は時を経ても良本で、糞本は永遠に糞本。
日本語うまくて、なにからなにまでわかってて、しったかせずに全部教えてくれる人は少ない、
っつーか国内じゃ塚越+2人しかいねーと思う。
634デフォルトの名無しさん:04/09/25 12:21:55
アフェリとかじゃねーから是非買ってくれよ。
delphiがもっと楽しくなるぜ。
怪しいと思うなら、紀伊国屋書店で検索な。
635デフォルトの名無しさん:04/09/25 12:44:37
基本的に分厚い本を買ってくれば
上達した後でも辞書がわりに使えたりして便利。
初心者向きの薄めの本はわかりやすいし、たくさんの機能を紹介してるけど
広く浅くしか紹介してないから
ちょっと突っ込んだことやろうとするといきなり情報がなくなる。
それに、分厚い本といっても1ページ目から全部読む必要はない
自分が面白そうだと思ったところだけ読めばいい
今は興味がなくてわけがわからないところも
レベルが上がってくれば意味がわかるようになるし
個人的には分厚い本がお勧め。
636635:04/09/25 12:50:12
ああ、薄い目の本だけど塚越さんの本は確かにいいよ。
あれも辞書代わりに使える。
クラス設計のところが非常細かくて、ちょうどクラスに興味のあったころだったから
自作クラス作る際のいい教科書になった。

薄い本で使えないと思ったのは、「Delphiの奇跡」とか「Windows98ではじめるDelphiプログラミング」とか・・
637デフォルトの名無しさん:04/09/25 13:14:09
基礎からわかるDelphi6って本を買おうか迷ってる。
これってどう?
638デフォルトの名無しさん:04/09/25 13:35:11
639デフォルトの名無しさん:04/09/25 13:35:11
持ってる。
絶対駄目。買っちゃ駄目。
455ページ中300ページくらいゴミが混ざってるので、実質150ページしか無いし、その150ページもイマイチ〜平凡。
http://kakinotane.s7.xrea.com/
ここ全部やればそれ以上のものが見につく。
640デフォルトの名無しさん:04/09/25 13:36:43
641デフォルトの名無しさん:04/09/25 14:02:49
>>638
あ、そこ見るの忘れてたー。やっぱAmazonの評価見て買った方がいいんですかね。
>>639
さいですか、ありがとうございます。
とりあえず、そこのページを見て学習してみようかな。
>>640
なんか信用しがたいレビューですな(汗
642デフォルトの名無しさん:04/09/25 14:26:29
フォントの変更だけができる
WYSSIGなHTMLエディタ
を作ろうと思っているのですが
どうしたらいいのか
途方に暮れています。
何かヒントになる情報をください。
643デフォルトの名無しさん:04/09/25 15:24:39
Delphiを使った「プログラミング」の入門書
ありせんか?
Delphi6Personalで
644デフォルトの名無しさん:04/09/25 15:36:38
StringReplace関数でワイルドカードを指定することはできないのでしょうか?
たとえば
abではじまってssで終わる文字列を置換したいときは
ab*ssと指定するとか。
このようなことができる別の関数があれば教えて頂きたいです。
645デフォルトの名無しさん:04/09/25 15:52:57
どうやらできないみたいですね。
Delphiつかえねーーー
646デフォルトの名無しさん:04/09/25 16:01:16
ary_str: array of string
SetLength(ary_str, 3);
ary_str[1] := '111111';
ary_str[2] := '222222';
ary_str[3] := '333333';

であるとして、SetLength(ary_str, 0);をしたとき
'111111'や'222222'の使っていたメモリってちゃんと解放されるのでしょうか?
いや、普通に考えると解放されるはずで解放されないとすげー困るんですけど、
ヘルプのどこを探しても解放されると書いてなくて気になってるんです
647デフォルトの名無しさん:04/09/25 16:34:13
0 からだよ
648デフォルトの名無しさん:04/09/25 16:35:54
気にする必要ない。ローカル変数でルーチン外に出たときほんとに解放されている
かどうか気にしないだろ。それと同じ。
649デフォルトの名無しさん:04/09/25 16:38:51
>>644
>StringReplace関数でワイルドカードを指定することはできないのでしょうか?

できませんね。

>abではじまってssで終わる文字列を置換したいときはab*ssと指定するとか。

「abではじまってssで終わる文字列」を検索する関数をつくる
んで
その結果を使って置換する。

これは簡単。
650デフォルトの名無しさん:04/09/25 16:55:49
>>645

標準の関数や他人のつくった関数だけをつかって問題を解決しようとすると、Delphi
に限らずすぐ行き詰まります。自分の頭をつかって関数をつくる事から始めるといろ
いろ出来るようになります。Delphi は文字列の扱いが得意とは言えないけど、それ
なりにやりたいことはできると思うんですけど。
651デフォルトの名無しさん:04/09/25 17:08:12
>>650
相手するな。したければこちらへ誘導の上存分にやってくれ。

ミ,,゚Д゚彡フサギコのフサフサDelphi談話室その15
http://pc5.2ch.net/test/read.cgi/tech/1095399719/
652デフォルトの名無しさん:04/09/25 17:31:49
>>650
>Delphi は文字列の扱いが得意とは言えない
冗談も休み休み言え
653デフォルトの名無しさん:04/09/25 17:49:22
休み

休み
654645:04/09/25 18:30:35
コンポーネントのメソッドじゃない
Delphiの関数ってどこかにまとめられていたりしませんか?
655645:04/09/25 18:31:03
>>652
得意ではないと思いますよ。
いままでPHPつかってたんで
そこはすごく感じます。
656デフォルトの名無しさん:04/09/25 18:32:21
>>654
ヘルプに機能別の索引があるはずだけど
657デフォルトの名無しさん:04/09/25 18:35:16
PerlやPython、Ruby なんかのスクリプト言語は、テキストいじるためにあるような
ものなので、Delphiより文字列操作は楽だよね。
658デフォルトの名無しさん:04/09/25 18:48:14
>>653
冗談はどうした、冗談は。
659デフォルトの名無しさん:04/09/25 19:08:52
まだ休み中・・・
660デフォルトの名無しさん:04/09/25 20:20:29
スクリプトと一緒にすんなバカ
661デフォルトの名無しさん:04/09/25 20:21:29
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
662デフォルトの名無しさん:04/09/25 20:44:45
スクリプトより劣ってるのが気にくわないみたいだな。
663デフォルトの名無しさん:04/09/25 20:46:10
Delphi は文字列の扱いが得意とは言えないだろ。
664デフォルトの名無しさん:04/09/25 20:50:16
スレ違いですよ

Delphi覚えたけど何の役にもたたんね
http://pc5.2ch.net/test/read.cgi/tech/1095115109/
665デフォルトの名無しさん:04/09/25 21:01:18
>>660
みたいなコンパイラ信者はどうにかならんかね
666デフォルトの名無しさん:04/09/25 21:11:01
>>665
いってる意味が分からんけど超初心者スレだから許す
667デフォルトの名無しさん:04/09/25 21:16:52
コンパイラ型の言語をマンセーし、インタプリタ型を見下すアフォのことだよ
668デフォルトの名無しさん:04/09/25 21:19:52
うむ。
それぞれの長所、短所を見極めずに
やれスクリプトは糞だのインタプリタは糞だのと喚く
コンパイラ型とインタプリタ型というので言語比較してる時点でアレだな
669デフォルトの名無しさん:04/09/25 21:22:28
なんか香ばしいのがいますね
670645:04/09/25 21:48:03
>>649

> 「abではじまってssで終わる文字列」を検索する関数をつくる

この関数を作りたいのですがどの関数を使えばいいんでしょうか?
ヘルプで正規表現で検索したり
googleでDelphi 正規表現で検索したりしていますが
それらしい物がでてきません。
もし、こういった関数やコンポーネントが列記されているリファレンス
があれば教えてほしいです。
ちなみに今は
・カンタン!Delphiプログラミング
・はじめてのObjectPacalプログラミング
という本を参考にしながら勉強していますが
両方の本ともイマイチです。
671デフォルトの名無しさん:04/09/25 22:01:37
>>670

ヘルプの

文字列処理ルーチン
文字列処理ルーチン(ヌルで終わる)

が参考になります。

自分がつくるとしたら AnsiStrPos() を使うでしょうね。
672デフォルトの名無しさん:04/09/25 23:01:15
>670
TRegExprでぐぐってみな。
673671:04/09/26 00:33:21
つくってみた。例外処理はなし、たたき台ということで。

TSearchData = record
  Pos:integer;
  Length:integer;
end;

TSearchDataArr = array[0..1000] of TSearchData;

function SearchStr2(const Str,StStr,SpStr:string;var SD:TSearchDataArr):integer;
var
  pInit,pStStr,pSpStr,pSt,pSp,pS:PChar;
  StLen,SpLen:integer;
begin
  result := 0;
  pInit := PChar(Str);pStStr := PChar(StStr);pSpStr := PChar(SpStr);
  StLen := Length(StStr);SpLen := Length(SpStr);
  pS := PInit;
  while true do begin
    pSt := AnsiStrPos(pS,pStStr);
    if pSt = nil then Break;
    pS := pSt+StLen;
    pSp := AnsiStrPos(pS,pSpStr);
    if pSp = nil then Break;
    SD[result].Pos := integer(pSt-PInit)+1;
    SD[result].Length := Integer(pSp-pSt)+SpLen;
    Inc(result);
    pS := pSp+SpLen;
  end;
end;
674671:04/09/26 00:33:46
つづき。実行例

procedure TForm1.Button2Click(Sender: TObject);
var
  SD:TSearchDataArr;
  i,num:integer;
  Str:string;
begin
  Str := Memo1.Text;
  num := SearchStr2(Str,'正','現',SD);
  if num > 0 then
    for i := num-1 downto 0 do begin
      Delete(Str,SD[i].Pos,SD[i].Length);
      Insert('せいきひょうげん',Str,SD[i].Pos);
    end;
  Memo2.Text := Str;
end;

結果

[変換前 Memo1.Text]
ヘルプで正規表現で検索したり
googleでDelphi 正規表現で検索したりしていますが
それらしい物がでてきません。

[変換後 memo2.Text]
ヘルプでせいきひょうげんで検索したり
googleでDelphi せいきひょうげんで検索したりしていますが
それらしい物がでてきません。
675デフォルトの名無しさん:04/09/26 00:44:29
RegExprじゃ読めねえからRegExにすれと何度(ry
676デフォルトの名無しさん:04/09/26 10:07:37
IEコンポーネントで
URLを開くんじゃなくて
文字列を引数として与えると
それをレンダリングしてくれるような
関数ってないのでしょうか?
HTMLエディタにプレビュー機能をつけたいと思っています。
677デフォルトの名無しさん:04/09/26 10:09:49
DOM
678デフォルトの名無しさん:04/09/26 10:31:53
>667-668
VB畑の方ですか?
679デフォルトの名無しさん:04/09/26 11:41:59
Delphi C++ 関係のものですが
680デフォルトの名無しさん:04/09/26 12:40:09
というか、スクリプト糞、インタプリタ糞なんて
誰もいってないけどね。
何か嫌なトラウマでもあんのだろうか。
681デフォルトの名無しさん:04/09/26 13:08:19
↑上手く逃げたね
682デフォルトの名無しさん:04/09/26 13:13:58
いや、実際 PythonとかLuaとかDmonkeyとかで遊ぶの好きだし
683デフォルトの名無しさん:04/09/26 13:24:54
誰もそんなこと聞いてない
684デフォルトの名無しさん:04/09/26 14:52:48
>>676
そういう場合たいていのソフトは一旦HTMLファイルに書き出して
そのファイルをIEコンポで開いてるよ
685デフォルトの名無しさん:04/09/26 14:56:40
代案厨キタ━━━━(゚∀゚)━━━━ッ!!
686デフォルトの名無しさん:04/09/26 15:12:33
>>685
実装できるなら何でもいいよ
687デフォルトの名無しさん:04/09/26 15:16:44
>>685
おまえは相変わらず無意味なことばっかり言ってるな
688デフォルトの名無しさん:04/09/26 15:17:22
なんか最近変なのがはみ出してきてるな
689デフォルトの名無しさん:04/09/26 15:18:13
なんか香ばしいのがいるな
690デフォルトの名無しさん:04/09/26 15:23:34
676=685
691676:04/09/26 15:24:33
知らないなら黙っててもらえますか?
スレが無駄に荒れると他の人にも迷惑なので。
692デフォルトの名無しさん:04/09/26 15:25:44
夏はもう終わりました
693デフォルトの名無しさん:04/09/26 15:26:10
スルー
694デフォルトの名無しさん:04/09/26 15:27:41
自分で自分の首絞めるマゾはスルー
695デフォルトの名無しさん:04/09/26 16:15:50
ボタンアイコンの素材集って
どこかにおちていませんかね。
自分で作成しようと思ったのですが
センスのなさに愕然としてしまいましたよ・・・。
Janeみたいなカコイイアイコンほしい・・・。
696デフォルトの名無しさん:04/09/26 16:22:34
>>695
それはスレ違いかな
697695:04/09/26 16:28:52
そうですね・・・
Delphi関係ないですもんね・・・
よかったらスレ誘導してください・・・・
698デフォルトの名無しさん:04/09/26 17:28:08
699デフォルトの名無しさん:04/09/26 18:20:00
>>676
Monazilla の資料室あたりにあった気がする
700デフォルトの名無しさん:04/09/26 18:54:17
>>699
ありました
ありがとうございました
701デフォルトの名無しさん:04/09/26 19:02:58
TreeViewで使うノードのアイコンを変えたい
(カテゴリとノードで変えたい)
のですがどのようにしたらいいのでしょうか。
702デフォルトの名無しさん:04/09/26 21:03:03
おい、苺きんたまとかいうウイルス作ったのDelphianらしいじゃねーか
責任取れよお目ーら
703デフォルトの名無しさん:04/09/26 21:06:14
デルファイアン?
デルフィアン?
デルファイラー?
デルフィラー?
デルファイニャン?
デルフィニャン?
704デフォルトの名無しさん:04/09/26 21:31:18
delphiなら簡単に作れるね
705デフォルトの名無しさん:04/09/26 21:33:07
タダだしな・・
706デフォルトの名無しさん:04/09/26 22:08:11
delphiは阿呆にやさしい言語
VBについで
707デフォルトの名無しさん:04/09/26 22:23:14
阿呆にも
708デフォルトの名無しさん:04/09/26 22:24:34
おなじことするのにわざわざやさしくない言語を使うヤツは阿呆以下だな
709デフォルトの名無しさん:04/09/27 03:13:56
阿呆以下つーかマゾ
710デフォルトの名無しさん:04/09/27 11:14:08
function Tfoo.baa: Thoge;
var
h: Thoge;
begin
h := Thoge.Create;
h.Assign(Self);
Result := h;
end;

というようなコードを見かけたのですが、
はじめから Result に Thoge.Create せずに
ローカル変数をはさんだほうがよいのですか?
711デフォルトの名無しさん:04/09/27 12:06:10
なんちゅう日本語だ
712デフォルトの名無しさん:04/09/27 12:27:58
好みによりけり。
713デフォルトの名無しさん:04/09/27 14:18:05
それだけのコードであれば明らかにhは不要。
単に試行錯誤した過程が残ってるだけだったり。
714デフォルトの名無しさん:04/09/27 18:38:22
Delphiの仕様がわからない。。。
Enter押しても改行しなかったり改行しなかったり改行しなかったり・・・。
715デフォルトの名無しさん:04/09/27 18:45:07
独り言はどっか別なところでやってくれ
716デフォルトの名無しさん:04/09/27 20:04:29
>>714
何がしたくてどういう状況でEnterを押したのかぐらい書いてもらわないと
それだけでは何にもわからない

まさしく独り言だ。
717デフォルトの名無しさん:04/09/27 21:52:21
プログラムの知識が皆無に近いんだケドも、興味本位でデルファイDLしてきました。
ヘルプ見ながらがんばればそこそこプログラムできる様になれるでしょうか?
718デフォルトの名無しさん:04/09/27 21:54:40
ヘルプだけじゃつらいよ
オンラインの入門サイトがいくつかあるからそこら辺眺めとくといいよ
719デフォルトの名無しさん:04/09/27 22:26:08
>>718
おお、、オンラインかぁ。2ちゃんでは勉強できないかな。なんかギコナビ気にいっちゃって、使いたくてしょうが無かったり・・。
720デフォルトの名無しさん:04/09/27 22:35:18
2chはアフォが多いので初心者には正直おすすめできない
(2ちゃんねらーすべてがアホという意味ではない)
721デフォルトの名無しさん:04/09/27 22:49:51
>>720
見てるとおっかしぃ事、いっぱい書いてあるね。まぁ仲良くやろ〜や。

んで、さっそくこんなサイト、見つけたので報告。

http://www.geocities.co.jp/SiliconValley-SanJose/2560/delphi4/index.htm

ちょっと古いのかもしれないけれど、ここを参考に1からやってみまっす。


722デフォルトの名無しさん:04/09/27 23:18:28
>>710
try〜exceptブロックをはさんだほうがよい。
723デフォルトの名無しさん:04/09/27 23:23:25
一概にそうは言えない
724デフォルトの名無しさん:04/09/28 05:05:04
クラスコンストラクタ内で例外を生成した場合、
当該クラスのインスタンスに割り当てられるべきだったメモリは自動的に開放されますか?
725デフォルトの名無しさん:04/09/28 05:17:57
>>723
どうして?

>>724
意味が解らないからコード例だして。
726デフォルトの名無しさん:04/09/28 09:25:18
>>724
インスタンスのメモリが割り当てられてから、コンストラクタが呼ばれます。
コンストラクタの実行中に例外が生成された場合,デストラクタが自動的に
呼び出されてインスタンス・メモリが解放されます。
727デフォルトの名無しさん:04/09/28 09:45:52
TreeViewコンポーネントのノードに
URLやファイル名のデータを関連づけて
保存したいのですが
どうしたらいいのでしょうか
728デフォルトの名無しさん:04/09/28 09:49:59
NodePath1/NodePath2/NodePath3=C:\Windows\Calc.exe
みたいにINIファイルに書き出したら
729デフォルトの名無しさん:04/09/28 09:55:53
NodePathっていうのはどこから取得できるんでしょうか・・
730デフォルトの名無しさん:04/09/28 09:56:50
ちなみにTextプロパティはかぶってもいい仕様です。
731デフォルトの名無しさん:04/09/28 10:03:27
>>727

TStringList にURLを保持して、Node の Data のそのインデックスをキャスト
732デフォルトの名無しさん:04/09/28 11:13:21
やっぱりそうするしかないですか。
TreeViewのメソッドにそんな機能の物が
あるだろうとおもっていたのですが・・。
自分で実装するしかないようですね。
ありがとうございました。
ちょっとPHPになれすぎてしまったようです。
733デフォルトの名無しさん:04/09/28 11:24:12
Delphiはオブジェクト指向度が低いから
オブジェクトの永続化も満足にできないんだよ。
734デフォルトの名無しさん:04/09/28 11:25:11
>>732

そう。index ゼロはダミーにしてつかわないように。保存・読み込みは

http://www.lmc-mediaagentur.de/dpool/tips/0703.htm

を参考にして Stream の LoadFromFile SaveToFile を使う。一番内側のループ
で Data プロパティーをキャストして WriteInteger ReadInteger してください

URL をほじした TStringList を別に保存するのがいやなら、インデックスではなく
文字列そのものを WriteString しておき、読み出し時に ReadString で読み出して
改めて関連付けしてもいい
735デフォルトの名無しさん:04/09/28 11:27:33
>>733

TreeView は Windows のコモンコントロール、Delphi はラップしてるだけ。
Windows のオブジェクト指向度が低いから、とはいえるかも
736デフォルトの名無しさん:04/09/28 14:08:30
>>733
そんなエサで(ry
737 ◆R.3bEnaric :04/09/28 14:27:20
おはようございまs^^
738デフォルトの名無しさん:04/09/28 22:15:04
Delphi7のコンソールアプリケーションで、コンソールを非表示にする方法ってありますか?
(バックグラウンドで実行されるような感じにしたい)

初めてDelphi触ってるんで混乱中 orz
739デフォルトの名無しさん:04/09/28 23:01:23
まぁbcc32で言うなら-Wオプションをつけてコンパイルry
740デフォルトの名無しさん:04/09/28 23:57:27
システムの、警告のサウンドなんかを再生するには、どうすればいんでしょね?
741デフォルトの名無しさん:04/09/29 00:00:05
>>740
MessageBeep(MB_ICONASTERISK);
742デフォルトの名無しさん:04/09/29 00:44:03
背景の上にEditボックスを置いてるんですが、
Editボックスを透明にすることはできないでしょうか?
borderを消すことはできたんですが。
Styleがないので、bsClearとかは使えないですよね
743デフォルトの名無しさん:04/09/29 01:28:14
「透明」をもう少し説明しないとレスが付かないヨカーン。
744デフォルトの名無しさん:04/09/29 01:34:22
透過ということです
TLabelでいうTransparentみたいなプロパティが、TEditにないかと思って
でもプロパティにないってことはないということなんでしょうかね
745デフォルトの名無しさん:04/09/29 02:45:48
XP特製ボタンとでも呼ぶのか、あのふちの丸いボタンってコンポーネントでありますでしょうか?
746デフォルトの名無しさん:04/09/29 11:15:28
>コンソールを非表示にする方法ってありますか?

コンソールモードを OFF にしてコンパイル。

Win32 のコンソールモードは、アプリ起動時にコンソールが開くかどうかの違いしかない。
writeln などのコンソールとの読み書きを行わないアプリならコンソールモードでなくても
問題ない。

逆に、デバッグの時とかで VCL アプリをコンソールモードでビルドする場合もある。
747デフォルトの名無しさん:04/09/29 11:57:52
>>741
ありがとう!鳴りました。
748デフォルトの名無しさん:04/09/29 11:59:13
Delphi6のPersonalでは、データベースを作る事は無理なんでしょうか?
Proからで無いと無理な様な事を見た気がしたのですが、簡単な物でも作れればと思って。
749デフォルトの名無しさん:04/09/29 12:12:25
DB対応コンポーネントが使えないだけでコード上からならいくらでも使えます。
例えばMSDE2000をインストールしてADOのタイプライブラリ取り込みして使うとか。
750デフォルトの名無しさん:04/09/29 12:13:15
ようするにできません。
751デフォルトの名無しさん:04/09/29 13:19:09
752デフォルトの名無しさん:04/09/29 13:30:21
Interbase(Firebird)に論理型が無いのですがどうすればよいですか?
DBCheckBoxを使いたいのです。
753デフォルトの名無しさん:04/09/29 22:57:52
smallintで代用する。
値を判定してDBCheckBoxに相当する表示を工夫する。
754デフォルトの名無しさん:04/09/29 23:45:25
755デフォルトの名無しさん:04/09/30 00:15:48
TreeViewのノードを一意に決定できるプロパティって
ないんでしょうか?
オブジェクトを永続化しようとして躓いています。
756デフォルトの名無しさん:04/09/30 00:44:33
回答しても応答しないから、もうしない
757デフォルトの名無しさん:04/09/30 01:00:55
短気になるな
758デフォルトの名無しさん:04/09/30 01:06:24
人にモノを訊いて答えをもらっても返事をせずに立ち去る、ってリアル世界では
あり得ない。でも、ここに限らずWEB上では日常茶飯事なのよね。まっ、回答する
ほうも勝手にしているわけだけど。
759デフォルトの名無しさん:04/09/30 02:37:09
>>755
オブジェクトの永続化って、具体的にどういう意味?
SaveToFile LoadFromFile とかと関係ある?
760デフォルトの名無しさん:04/09/30 03:12:29
>>759
関係あります。
メモリ上のオブジェクトをHDD上に書き出して
次も使えるようにすることです。
結局TStringList.AddObjectとして
TStringListとTTreeViewを両方
永続化し、行で対応づけることで解決しました。
761デフォルトの名無しさん:04/09/30 03:21:22
クライアント側の指示でサーバを動作させるプログラムを作ろうと思っています。
SendTextでメッセージを表示させられるところまではできたのですが、別の指示の出し方が分かりません。
もう接続できていて、なおかつSendTextでメッセージを送れている場合、もうサーバ側は弄らなくても良いのでしょうか?
762デフォルトの名無しさん:04/09/30 03:26:50
StringGridでOptionsがgoRangeSelectを含むときに、
Excelのように固定行または列でドラッグすると連続して列や行を選択できるようにするには
どのようにしたらよいのでしょうか?
763デフォルトの名無しさん:04/09/30 03:38:39
そのようにコードを書く
764デフォルトの名無しさん:04/09/30 04:33:30
>>762

  public
    DDStart,DDFlag:Boolean;
    IniX,IniY,IniCol,IniRow:integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ACol,ARow:integer;
begin
  with StringGrid1 do begin
    MouseToCell(x,y,ACol,ARow);
    if (ACol<FixedCols) and (ARow<FixedRows) then exit;
    if (ACol<FixedCols) or (ARow<FixedRows) then
    begin
      IniX := X; IniY := Y;
      DDStart := true;
    end;
  end;
end;
765デフォルトの名無しさん:04/09/30 04:36:05
つづき

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  R:TGridRect;
  ACol,ARow:integer;
begin
  with StringGrid1 do begin
    if DDStart and (not DDFlag) then
      if (Abs(IniX-X) > 2) or (Abs(IniY-Y) > 2) then begin
        DDFlag := true;
        MouseToCell(x,y,IniCol,IniRow);
      end;
    if not DDFlag then exit;
    MouseToCell(x,y,ACol,ARow);
    if (IniCol = ACol) and (ACol < FixedRows) then
    begin
      if iniRow >= ARow then begin
        R.Top := ARow; R.Bottom := iniRow;
      end else begin
        R.Top := iniRow; R.Bottom := ARow;
      end;
      R.Left := FixedCols; R.Right := ColCount-1;
      Selection := R;
    end
    else
    begin
766デフォルトの名無しさん:04/09/30 04:36:49
さらに

      if iniCol >= ACol then begin
        R.Left := ACol; R.Right := iniCol;
      end else begin
        R.Left := iniCol; R.Right := ACol;
      end;
      R.Top := FixedRows; R.Bottom := RowCount-1;
      Selection := R;
    end;
  end;
end;

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DDStart := false;DDFlag := false;
end;
767752:04/09/30 09:00:02
>>753
要するにTDBCheckBoxは使えないってことですね。
サン糞!
768デフォルトの名無しさん:04/09/30 09:12:24
>>767
DataSource 上で代替フィールドを作ればすむ話ではないか?
769752:04/09/30 09:37:06
>>768
それはOnCalcFieldsを使えってことですか?
770デフォルトの名無しさん:04/09/30 12:09:05
>>767
ヘルプでTDBCheckBoxのValueChecked,ValueUncheckedの説明を見てみよう。
771デフォルトの名無しさん:04/09/30 13:03:03
>>751
見てみたんですが、何がなんだかちんぷんかんぷんでした。
いちばん上のADOって奴をちょっと試しにやってみたんですケド、
応用するにはかなりの勉強が必要ですね。
Proでなら簡単に出来そうな気がするんですが、気のせいでしょうか?
でもあまりに高価過ぎて手が出せそうにありませんケドね。。
どっちにせよ、もうちょっとじっくりやる時間が出来たら、先のページで
いろいろ実験してみます。また不明な事が出て来たら、あまりにも初歩的な事なのかもしれませんケド、
教えてやって下さい。

772デフォルトの名無しさん:04/09/30 13:05:56
別の意味でTDBCheckBoxは使えないから普通のTCheckBoxにしといた方が良いかも。
TDBRadioGroupもだったか忘れたがうざい時あるな。
QueryをOpenした時値が入ってたらOnClickが反応したりとか最悪。
773デフォルトの名無しさん:04/09/30 13:06:33

http://www.teppi.com/Components/DBISAM/

こんなページを見つけたのですが、コレもぱーそなるぢゃ無理な事なんですよね?

774デフォルトの名無しさん:04/09/30 13:13:39
ボーランドのデペロッパーネットワークってトコの、Delphi Database Submissionsという所で、

http://search.jword.jp/cns.dll?type=ak&fm=1&lang=euc&name=borland&url=http%3A%2F%2Fwww.borland.co.jp%2F

ここです。ID22117のAbsolute DatabaseというのをDLしてみました。
Delphi (4-7)と書かれているのに、インストールしようとするとDelphi 7というのしか無い所を見ると、
7で無いと使えないのでしょうか?パッケージのインストールをしようとすると、rtl70がどうとか出て
出来ませんでした。for Delphi7 Personalって表示は見たケドも、無理なんですかね?


7のパーソナルは無償配布、終了しちゃったんですね。ショック。。

775デフォルトの名無しさん:04/09/30 13:57:42
>>773
それ有料
776デフォルトの名無しさん:04/09/30 14:26:08
>7のパーソナルは無償配布、終了しちゃったんですね。

7のパーソナルなど最初からない。6のはまだ配布中。
777752:04/09/30 14:59:44
>>770
あなたに惚れますた!ありがとう。
778デフォルトの名無しさん:04/09/30 18:27:37
DelphiでPNGを扱うにはどうすればよいのじゃろうか
GLDPNGは開発終了したみたいだし・・・
Jpegみたいに簡単に扱えない?
779デフォルトの名無しさん:04/09/30 19:01:00
TPNGImageってのがあるのね
使ってみます
780デフォルトの名無しさん:04/09/30 20:43:40
最新バージョンではTDBGridのスクロールバーの表示・非表示は設定できるようになってますか?
781デフォルトの名無しさん:04/09/30 22:14:09
>>764-766
返事が遅くなってすみません。
期待する動作にかなり近い動作をいたしました。
これを叩き台にしていろいろいじくってみようと思います。ありがとうございました。
782デフォルトの名無しさん:04/10/01 00:02:27
ふーん。
いつの間にか「TkPNG」って言うシェアウェアへ
移行してたんだねぇ…。
783デフォルトの名無しさん:04/10/01 00:14:08
TkPNGの方がGLDPNGより先に開発されてたと思うけど…。
784782:04/10/01 00:20:45
>>783
あら、そーなんだ。これは失敬、知らなんだ。
では続きをどうぞ↓
785デフォルトの名無しさん:04/10/01 06:09:02
Client側のEdit1とEdit2に書かれた文字列をボタンを押すことで送信し、Server側で受け取り、
ダイアログボックス(「タイトル」=Edit1,「本文」=Edit2)を表示させるにはどのように記述すれば良いでしょうか。
Client側、Server側それぞれお願いします。
786デフォルトの名無しさん:04/10/01 06:49:52
プロジェクト毎にコンポーネントを管理したいのですが、
何かよい方法ありますか?
787デフォルトの名無しさん:04/10/01 07:41:08
そういうコンポーネントは実行時に作成する。
788デフォルトの名無しさん:04/10/01 09:25:50
>>786
プロジェクトごとに、コンポーネントを切り替えたいという事なら
プロジェクトごとに、batファイルでレジストリを切り替えれば良い。
789デフォルトの名無しさん:04/10/01 12:06:40
パッケージ
790デフォルトの名無しさん:04/10/01 13:08:44
>>789
インストールが必要では?
791786:04/10/01 16:38:54
>>788
レジストリの切り替え・・・
よさそうですね。

しかし、レジストリのどのあたりをbatで切り替えるのでしょうか?
792デフォルトの名無しさん:04/10/01 16:55:49
>>791
たぶん
HKEY_CURRENT_USER/Software/Borland/Delphi/<Version.0>/Known Packages
793792:04/10/01 17:07:12
追加で
HKEY_CURRENT_USER/Software/Borland/Delphi/<Version.0>/Palette
794786:04/10/01 18:42:43
>>792-793
実行できる環境で、是非やってみようと思います。
ありがとうございました。
795デフォルトの名無しさん:04/10/01 21:14:16
>>785
Delphiのdemosフォルダを見なさい
\demos\internet\chat
796デフォルトの名無しさん:04/10/02 03:07:29
AABBCCDEFGHという文字列から3文字使って並べると
何通りか、そして全ての文字列を出力するというプログラムを
作っているのですが、どうやってもうまくいきません。

考え方としては、全ての通りを出し、そこから重複を削除するという形で
よいのでしょうか?

797デフォルトの名無しさん:04/10/02 03:24:09
>>796
煽りでもなんでもないが、意味が分からない。
798デフォルトの名無しさん:04/10/02 03:29:52
頭悪すぎ・・・
799796:04/10/02 03:44:48
>>797
順列なんですが。説明下手ですいません・・・。
800797:04/10/02 03:53:20
>>799
謝ることは無いよ。オレが理解出来ないだけだから。
801デフォルトの名無しさん:04/10/02 04:32:13
TStringListを使って、まだ追加していないなら追加する
の方が簡単だと思うよ。
forループを3つ重ねればよい。
802デフォルトの名無しさん:04/10/02 05:12:42
AABBCCDEFGHがあらかじめ整列済みであるという性質を利用すれば
重複チェックは直前のものとの比較のみでいい。
803デフォルトの名無しさん:04/10/02 06:49:56
>>802
ちょっとそれは私、確信が持てませんが、本当に大丈夫ですか?
804デフォルトの名無しさん:04/10/02 09:02:33
>>801の方法がいいんじゃない?
805デフォルトの名無しさん:04/10/02 09:58:04
なんか宿題臭いけど、汎用性を無視すればABCDEFの順列6P3と
XXY、XYX、YXX(X=[A..C]、Y=[A..F]-X)の3*3*6の組み合わせしかない。
806デフォルトの名無しさん:04/10/02 11:45:21
質問させてください。Delphi6 Personalです。
TScrollBoxで、スクロールをしている最中にイベントを起こせませんか?
807806:04/10/02 12:23:49
ごめんなさい。解決しました。
OnConstrainedResizeで拾えました。
808デフォルトの名無しさん:04/10/02 15:15:33
コンソールアプリで標準エラー出力に出力するのってどうやるの?
809デフォルトの名無しさん:04/10/02 15:40:07
ErrOutputだった。Outputの参照から飛べるようにしてくれ・・・
810デフォルトの名無しさん:04/10/02 21:25:20
TRichEdit でマウスポインタの位置をキャレットの位置(行、桁)に変換するにはどうすればよいですか?
811Delフサギコ ◆A6VzDeLphI :04/10/02 21:46:04
 ∫,,,,,,,,,∧,,∧  
⊂,,,,,,,,,つ,,゚Д゚ミつ
教えてくださまい。

TSpinEditかTUpDown似なコントロールで
小数点以下桁数指定コントロールありませんでしょうかい?

あと、Extendedに入っている値が
小数点以下有効桁数が何桁なのかを求める関数とか誰か作ってません?
※A:=1.234 f(A)→3
 B:=12.34 f(B)→2
みたいの。
FloatToStrしてAnsiPos('.', してLengthから引き算してる
マヌケコード書いたらら氏にたくなりますた。
812デフォルトの名無しさん:04/10/02 22:29:13
あるフォームから、別のフォームの変数に代入することは出来ますか?
例えば、Form2にあるButtonを使って、Form1のEdit1.Textに変数を代入するとかです。

普通にForm2のボタンに
Edit1.Text := 'Hello';
このように書き込んだだけでは、もちろん同一Formに存在しないのでダメですよね。

思いついたのは、
Form1.Edit1.Text := 'Hello';
がせいぜいでもちろんだめでした。
813デフォルトの名無しさん:04/10/02 22:34:50
Form2を含むUNITの
implementation節
usesの項に
form1を加えれば良い。

例:
implementation

uses Unit1;//(Form1のユニットファイル名)
814デフォルトの名無しさん:04/10/02 22:38:19
こうすることにより、
Unit1のinterfaceにて宣言された変数
Form1: TForm1 を、Form2のimplementationの
USES宣言以下で使用可能になり、

Form1.Edit1.Text := 'Hello';

という命令もコンパイルされる事になる。
815デフォルトの名無しさん:04/10/02 22:41:19
やってみたところできました。
適当だと思っていた
Form1.Edit1.Text := 'Hello'; 自体はあってたんですね。
素早い回答ありがとうございます。
816デフォルトの名無しさん:04/10/02 23:40:40
817Delフサギコ ◆A6VzDeLphI :04/10/03 00:18:56
>>810>>816
 ∫,,,,,,,,,∧,,∧  
⊂,,,,,,,,,つ,,゚Д゚ミつ

つまり、SelStartを保持しておいて、擬似的にクリックして
桁/行情報を取得してから、元のSelStartに戻すとか?

力技。。。
818デフォルトの名無しさん:04/10/03 00:20:01
ファイル内に文字列があるかどうか判定するルーチンを作りたいのですがどうすればいいですか?
819デフォルトの名無しさん:04/10/03 00:33:46
>>818
TStringListで読み込んで、posで判定するってこと?
820818:04/10/03 00:38:46
>>819
そうしようと思っているのですがTStringListで読み込んだ文字列を
Pos関数に渡しても0しか返ってきません。

slFile:=TStringList.Create;
slFile.LoadFromFile(FileName);
if Pos(slFile.Text,Text)<>0 then
Result:=True
else
Result:=False;
821デフォルトの名無しさん:04/10/03 00:39:02
右揃えにするため、TEditの代わりにTMemoを代用したんですが、
TMemoだとやはりTEditと違って行単位でしか扱えないんでしょうか。
何行目の何文字目まで指定できると有難いんですが、
やっぱり
Memo1.Lines[1]
Linesとぐらいだから無理ですかね。
代用策でもかまわないんですが何かあれば教えてもらえるとありがたいです。

822デフォルトの名無しさん:04/10/03 00:40:35
ああ、というか内容を
1回普通の文字列型に移してそれを経由してやればいいんですかね
そんなにたいしたことじゃなさそうだ
823デフォルトの名無しさん:04/10/03 00:44:12
>>820
>if Pos(slFile.Text,Text)<>0 then
オレもたま〜にやるけど、逆でない?

→if Pos(Text,slFile.Text)<>0 then
824818:04/10/03 00:52:47
>>820

ヌ・・・初歩的なミス・・・。
解決いたしました。
どうもありがとうございました。
825デフォルトの名無しさん:04/10/03 00:57:16
>>817
810でも816でもないが、SelStartとか擬似クリックとか、どっから出てきたっつー話ですよ

procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
 mousePos: TPoint;
 col, row, index: Integer;
begin
 mousePos := Point(X, Y);
 index := RichEdit1.Perform(EM_CHARFROMPOS, 0, LPARAM(@mousePos));
 row := RichEdit1.Perform(EM_LINEFROMCHAR, index, 0);
 col := index - RichEdit1.Perform(EM_LINEINDEX, row, 0);
 Caption := '列=' + IntToStr(col) + ', 行=' + IntToStr(row);
end;
826デフォルトの名無しさん:04/10/03 01:00:05
827デフォルトの名無しさん:04/10/03 01:09:34
TMemoryStreamの方がいいかもね。
828Delフサギコ ◆A6VzDeLphI :04/10/03 01:11:46
 ∫,,,,,,,,,∧,,∧   >>825
⊂,,,,,,,,,つ,,゚Д゚ミつ  それだ!

http://www.borland.co.jp/tips/delphi/dh013/index.html
829デフォルトの名無しさん:04/10/03 01:13:46
>>827
何の話?
830デフォルトの名無しさん:04/10/03 01:28:26
すいません。
cygwinのホームディレクトリの設定ってどうやるんでしょうか?
831デフォルトの名無しさん:04/10/03 03:31:42
>>825
おおお!出来た。
どうもありがとう御座います。
832デフォルトの名無しさん:04/10/03 06:06:38
833デフォルトの名無しさん:04/10/03 23:26:08
プログラム内からコンソールアプリを呼び出すと、
DOS窓が一瞬で閉じてしまうんですが、
DOS窓を表示したままには出来ないのでしょうか。

ちなみにWinExec使用です。
834デフォルトの名無しさん:04/10/04 00:10:00
cmd hoge.exe
command hoge.exe
835デフォルトの名無しさん:04/10/04 00:10:35
cmd /k yourprog.exe
836デフォルトの名無しさん:04/10/04 00:45:46
system("pause");
837833:04/10/04 00:52:59
>834-836 ありがとうございます。

835さんの方法でできました。

普通にDOS窓開いた時と違って、PATHが通ってないんですね。
838デフォルトの名無しさん:04/10/04 00:59:26
自作でコンポーネント作ってるんですが、一般的にはコンポーネントをフォームに乗せると自動的に
uses節にコンポーネントのユニットが追加されますよね。
で、それと同時に別に追加したいユニットがあるのですが、それも自動で追加させるにはどうすればいいのでしょうか?

例えば、IndyのTIdHttpコンポーネントを乗せるとIdHttp以外のユニットも自動的に
usesされますが、そんな感じのことをしたいのです。
839デフォルトの名無しさん:04/10/04 02:34:30
Indyの登録関係ユニットを見てみては?
840デフォルトの名無しさん:04/10/04 11:16:05
>>838
コンポーネントのパッケージに登録されているユニットが
勝手に追加されているだけでは?
841デフォルトの名無しさん:04/10/05 23:02:02
指定したオブジェクトが、すでにCreateされているかどうか見分けるにはどうしたらいいですか?
842デフォルトの名無しさん:04/10/05 23:05:02
>>841
自分で考えたやり方が正しい。
843デフォルトの名無しさん:04/10/05 23:05:52
>>838
もしかして、イベントハンドラで使われる引数の型を定義しているユニットも
自動的に追加されるのかもしれないね。
844デフォルトの名無しさん:04/10/05 23:27:58
最前面のアプリのハンドルがあるとして、
そのアプリの、今フォーカスのあるコントロールの
ハンドルを取得するにはどうしたらよいでしょう。
845デフォルトの名無しさん:04/10/05 23:50:18
FreeAndNil で、Freeとnilをやってくれる以外にどんな利点があるのですか?
846デフォルトの名無しさん:04/10/05 23:58:03
847デフォルトの名無しさん:04/10/05 23:58:54
>>845
それ以外の利点は特にない。
848デフォルトの名無しさん:04/10/06 00:26:13
オブジェクトのフィールドを書き換えたら、
別のオブジェクトとして認識してほしいのですが、
うまくいきません。

例えば、AとBを同一のクラスに属するオブジェクトとすると、
...
B:=A;
A.FMem:=2*A.FMem//フィールドの値の更新
...
としたとすると、AとBを別のオブジェクトと
認識してほしいのに、同一のオブジェクト(A=B)
と認識されてしまいます。
何か付け加える必要があるのでしょうか?
849デフォルトの名無しさん:04/10/06 00:42:00
>>848

B.FMem を確認してごらん。同じになってるから。

B:=A;

は、参照を代入してるから、A と B は同一の実体を参照してるんだよ
850デフォルトの名無しさん:04/10/06 00:45:24
Delphiのオブジェクト変数はC++みたいに実体として存在できないのです。
全部オブジェクトへの参照でしか存在できない。

オブジェク変数に別のオブジェクト変数を代入すれば
参照しているオブジェクトを付け替えることになる、
B:=AをやればAとBが指し示すオブジェクトは同じの物となる。

もし、Bのフィールド内容をAにコピーしたいのならAssignメソッドを使わなければならない。

B.Assign(A)

でAの内容がBにコピーされる。

851デフォルトの名無しさん:04/10/06 00:50:59
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1017673221&res=10&fi=no

上の記事を読むと、FreeAndNil の方が危ないと思うのですけど、どうですか・
NewsGroupでもいっぱい話題になってるけど、どれを読めば悩みが解決するのか
解りません。

852デフォルトの名無しさん:04/10/06 00:52:27
>もし、Bのフィールド内容をAにコピーしたいのならAssignメソッドを使わなければならない。

Aのフィールド内容をBにコピーしたいのなら

だね。

Assign メソッドが必ずあるとは限らない。自分で実装する必要がある場合がある。
また、内容同士を比較するメソッドも必要になるかもしれないね。
853デフォルトの名無しさん:04/10/06 00:54:43
>>851
FreeAndNil は、すでにDelphiにあるのを使うこと。危ないことはない。
君の「悩み」については、だれも知らない。具体的に。
854デフォルトの名無しさん:04/10/06 00:59:42
>>848

TPersistent.Assign のヘルプを読むことをすすめる
855デフォルトの名無しさん:04/10/06 01:03:14
私の悩みとは、FreeAndNil は危険だし、たいした利点もないので
使わない方が良いのではないか?
と言うものです。

ローカル変数であれば
Obj.Free;
だけでいいし、
それで不十分なら、
Obj := nil;
を加えれば良いのではないですか?
FreeAndNil を使う理由は何なのでしょう?
856デフォルトの名無しさん:04/10/06 01:05:18
FreeAndNil の危険性とは、
初期化していない変数を渡しても警告が出ない事と、
オブジェクト変数以外を渡してもコンパイルエラーが出ない事です。
857デフォルトの名無しさん:04/10/06 01:11:09
> FreeAndNil を使う理由は何なのでしょう?

インスタンス参照にnilを代入しておくと、それが有効な参照かどうかを確認する
ことが出来るようになります。ローカル変数を最後に解放するのでしたら、Free
で十分でしょう。
858デフォルトの名無しさん:04/10/06 01:34:16
>>857
それは解ります。

FreeAndNil を考えた人は下記の例を問題視しているみたいですけど、
もうちょっと考えてみます。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1017673221&res=11&fi=no

destructor内で例外が発生したときの為に、あらかじめ nil を代入しておくのかな?
でも、destructor内で例外が発生したら駄目ですよね。
859デフォルトの名無しさん:04/10/06 01:36:12
これです。

Delphi in a Nutshell: Chapter 2: The Delphi Object Model
http://www.oreilly.de/catalog/delphi/chapter/ch02.html

When freeing a global variable or field, always set the variable to nil when freeing the object so you are not left
with a variable that contains an invalid pointer. You should take care to set the variable to nil before freeing
the object. If the destructor, or a method called from the destructor, refers to that variable, you usually want
the variable to be nil to avoid any potential problems. An easy way to do this is to call the FreeAndNil
procedure (from the SysUtils unit):

GlobalVar := TFruitWigglies.Create;
try
 GlobalVar.EatEmUp;
finally
 FreeAndNil(GlobalVar);
end;

Each object has a separate copy of all of its fields. A field cannot be shared among multiple objects. If you need
to share a variable, declare the variable at the unit level or use indirection: many objects can hold separate
pointers or object references that refer to common data.
860858:04/10/06 01:46:50
読み返してみると質問が変わってました。
どうして nil を代入してから Free するのか、が今の悩みです。

procedure FreeAndNil(var Obj);
var
 P: TObject;
begin
 P := TObject(Obj);
 TObject(Obj) := nil;
 P.Free;
end;
861デフォルトの名無しさん:04/10/06 03:43:40
>>838
TIdHTTP は、TObject → TPersistent → TComponent → TIdBaseComponent
→ TIdComponent → TIdTCPConnection → TIdTCPClient → TIdCustomHTTP の
順に派生されているので、上位クラスが宣言されているユニットが順番に
追加される。
これと同じように UnitA のコンポーネントを貼り付けたときに UnitB も
追加されるようにしたければ UnitB で宣言したクラスを上位に持つように
すればいい。
ただし、共通部分を持つクラスをほかに作らない場合は、一つにまとめた方が
サイズ的にも速度的にも有利になる。

>>860
グローバル変数を複数のスレッドからアクセスした場合とかに、処理の順序が
重なりあうという偶然が生じた場合に、複数回 Destroy しないためじゃないの?
複数の変数にコピーしてれば意味なさそうだけど。
862デフォルトの名無しさん:04/10/06 04:24:09
>>861
マルチスレッドの場合はEnterCriticalSectionを使わないと駄目では?
同時にFreeAndNilが呼ばれた場合、同時に一時変数へ保存して、同時に同じオブジェクトをFreeする事になりますよ。

NG読むと、Free後にnilを代入しても手遅れと言う意見がありました。
つまり、デストラクタ内では既にオブジェクトは無効という考えらしい。

本当か?
863デフォルトの名無しさん:04/10/06 04:47:51
>NG読むと、Free後にnilを代入しても手遅れと言う意見がありました。

Free したオブジェクト参照にnilを代入することの必要性が理解できていれば
一瞬でも、Free したオブジェクトの参照がnilになっていないのは、危険である
ことが分かると思います。ですから、Free する前に nil を代入しておくわけです。

シングルスレッドでは、

Obj.Free
Obj := nil;

の二行のコードの実行時間差があったとしても、同じプロセスのコードで Obj に
アクセスする機会がないように感じるかも知れません。でも、Free から呼び出される
メソッド、とくにデストラクタから、何かメッセージを処理したり、他の手続きを
呼び出したりしているとき、この Obj にアクセスすることになるかも知れません。
ですから先にnilを代入しておけば、Free 呼び出した時点で、この Obj へのアクセス
は無効である、とコードで判断できます。マルチスレッドでは、上のコードで nil が
代入される前に、プリエンプションが起こってサブスレッドに制御が移り、Obj に
アクセスする機会が生まれます。クリティカルセクションを必ず使うという制約より
FreeAndNil を使うことにした方が制約は少ないと思います。

「手遅れ」っていうのはこういう意味です。
864デフォルトの名無しさん:04/10/06 05:00:16
>同時にFreeAndNilが呼ばれた場合、同時に一時変数へ保存して、同時に同じオブジェクトをFreeする事になりますよ。

同時に呼ばれることはありません。参照の代入は単純なマシンコードなので<途中>で別スレッドにうつること
はないと思います。ですから、あとに呼ばれた方は、すでにnilになっているのでなにもしません。

マルチプロセッサの場合は知りませんが。その場合でも Free してから nil を代入するより
安全だとは思いますけど。
865デフォルトの名無しさん:04/10/06 05:53:54
Free後にnilを代入する重要性は解ります。

マルチスレッドについては詳しくないので、もしFreeAndNilが
マルチスレッド用であるならば、そう理解しておきます。

>でも、Free から呼び出されるメソッド、とくにデストラクタから、
>何かメッセージを処理したり、他の手続きを呼び出したりしているとき、
>この Obj にアクセスすることになるかも知れません。

こういう事ですか? まだ納得できないけど。
VCLの csDestroying in ComponentState と似たような意味かな。

var
 Hoge: THoge;

procedure TForm1.WMMouseMove(var Message: TWMMouseMove);
begin
 if Hoge <> nil then Hoge.Proc;
end;

destructor THoge.Destroy;
begin
 // ここでメッセージキューにWM_MOUSEMOVEが入っているとすると、
 // Form1.WMMouseMove が呼ばれるが、FreeAndNil を使わない場合、
 // Hoge <> nil なので Hoge.Proc が呼ばれるが、それは期待した動作ではない。
 Application.ProcessMessages;
 inherited;
end;
866デフォルトの名無しさん:04/10/06 08:22:58
>>811
上は単に既存コントロールにプロパティを追加して Getメソッで値を読み取る時に1/10とか1/100すればいい

2番目は、理論的には作れない。 
少数点以下を100000倍して10で割りながら余りがゼロでないというようなことを考えているのだろうが
少数点以下有効桁数は3であっても 1.200 である場合というのがありえるから
867デフォルトの名無しさん:04/10/06 11:51:54
>既存コントロールにプロパティを追加して Getメソッで値を読み取る時に1/10とか1/100すればいい

表示はGUIの大事な部分。ユーザが1.33に設定したいとき133を入力させるのはGUIとして失格。
868デフォルトの名無しさん:04/10/06 12:03:46
"待ち時間(0.01秒単位)"って項目があったっておかしくはないと思うが。
"金額(100円単位)"は微妙に混乱するかもしれないけど。

混乱度が低いなら慣れ親しんだ標準のコントロールを
ユーザーに使わせるのは十分あり。
869デフォルトの名無しさん:04/10/06 12:19:17
1ドル33セント=133セントかー
1.33ドルにしたいなー
870デフォルトの名無しさん:04/10/07 09:47:45
教えてください。ページコントロールのコンポを作成しています。
ページコントロールのメソッドをoverrideして、タブシートを下記の
コードのように動的に作成しており、このコンポーネントをインストールして
ポトペタで使用したいのですが、ポトペタ時にタブシートが作成され、
さらに実行時にもタブシートが作成され、同一のシートが二つ作成
されてしまいます?

こういう場合の、いい解決法ってありますか?

procedure TPageControl.CreateWnd();
var
 TabSheet: TTabSheet;
begin
 inherited;

 //タブシートの作成
 TabSheet := TTabSheet.Create(Self.Owner);
 TabSheet.PageControl := Self;
 TabSheet.Parent := Self;
end;
871デフォルトの名無しさん:04/10/07 10:09:09
コンポつくってて ComponentState を知らないってことはないよな
872デフォルトの名無しさん:04/10/07 11:08:37
>>871
おお

いや、勉強のためにコンポ作りしてて、悩んでますた。
これで実行時と設計時でいろいろできますねー

助かりました。ありがとう!
873デフォルトの名無しさん:04/10/07 14:53:22
すでに内容があるファイルを部分的に書き換えるのってどうやるのですか?
874デフォルトの名無しさん:04/10/07 15:56:28
>>873
・全部読み込んで部分的に書き換えて全部書き込む。
・seekやposを使って書き込む位置を指定して書き込む。
875デフォルトの名無しさん:04/10/07 18:25:18
Windows標準のプリンタドライバを使ったプリンタの設定を、保存したり復元したりしたいのですが
レジストリを設定する事になるのでしょうか?
876デフォルトの名無しさん:04/10/07 19:15:29
FormatDateTime のフォーマットで
'gee/mm/dd' では「昭52/01/01」となりますが、
フォーマットの指定のみで「S52/01/01」みたく表示できますか?


877デフォルトの名無しさん:04/10/07 20:18:57
ヘルプを読んだことないの?
878デフォルトの名無しさん:04/10/07 20:20:38
>>876
おそらく無理。

年号の変換は結局のところWindowsAPIのGetDateFormatを利用してるみたいだけど
そもそもGetDateFormat自体が(H,S,T,M)形式の年号に対応してない。
自力で関数を作るならまぁ結構簡単に作れそうだけど・・

というか、実験してみて笑ったんだけど
年号って明治までしか用意されてないのなw
879デフォルトの名無しさん:04/10/07 20:29:49
>自力で関数を作るならまぁ結構簡単に作れそうだけど・・

そうなの? Format 文字列の中に元号と関係なく平や昭や明なんかの文字があったり
する可能性があるので結構面倒だと思うけど
880デフォルトの名無しさん:04/10/07 20:40:12
エスケープしときゃ良さそうだけど
881デフォルトの名無しさん:04/10/07 20:40:34
明治以前で寛永2年とか安政1年とか使いたいとかはあんまりないだろな
882デフォルトの名無しさん:04/10/07 20:41:36
>エスケープしときゃ良さそうだけど

おっ、なるほど!
883デフォルトの名無しさん:04/10/07 22:04:00
VC++のソースを元にDelphiに変更したいのですが
PRINTDLG構造体はDelphiではどのように記述するのでしょうか
教えてください。

PRINTDLG pd;
ZeroMemory (&pd, sizeof(PRINTDLG));
884デフォルトの名無しさん:04/10/07 22:17:20
uses CommDlg;

TPrintDlg
885デフォルトの名無しさん:04/10/07 22:22:14
uses節にCommDlgを追加しる
TPrintDlgという型で定義されている。
886デフォルトの名無しさん:04/10/07 22:25:14
なんで同じこと書くの?
887デフォルトの名無しさん:04/10/07 22:32:36
俺の存在感の無さ故、見えてないのだろう。よく言われるよ。フフ
888デフォルトの名無しさん:04/10/07 22:50:11
>>887
あんた、背中がすすけてるぜ
889883:04/10/07 23:07:11
>>884,885
ありがとうございます。

しかしこんな簡単なことに丸2日使ったのか・・・
890デフォルトの名無しさん:04/10/07 23:08:20
TDataSetのFilterOptionを使いたいんですが

1.FilterOptionの設定の仕方がよくわからないです。
2.Filterを使って前後方一致比較ってできないんですか?
前方一致は*でいけるみたいなんですが、後方ができないようで。
何か方法があれば教えて頂けると助かります。
891デフォルトの名無しさん:04/10/08 01:23:48
>>889

ソースをお持ちであれば、Grep するといいです。personal ユーザでも Doc ディレクトリ
にある *.int ファイルを今回であれば PRINTDLG で大文字小文字を区別しないで Grep する
と TPrintDlg レコードの定義がすぐに見つかります。
892デフォルトの名無しさん:04/10/08 14:26:14
DelphiからAccessで作ったmdbにADO経由でデータ追加しようとしています。

TestDB
 test1tb
  ID オートナンバー型
  date テキスト型
 test2tb
  ID オートナンバー型
  date テキスト型
  time テキスト型
と2つのテーブルを用意しています。

test1tbの方の追加は、
SQL := 'INSERT INTO test1tb (date) VALUES("' + DateToStr(Now) + '")';
Connection1.Open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=TestDB.mdb','','',adConnectUnspecified);
Connection1.Execute(SQL,RcA,0);
Connection1.Close;
でうまく追加できます。
IDも自動採番でユニークな番号が入っています。

しかし、test2tbへの追加が「INSERT INTO 構文の文法エラーです」で通りません。
SQL := 'INSERT INTO test2tb (date,time) VALUES("' + DateToStr(Now) + '","' + TimeToStr(Now) + '")';
Connection1.Open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=TestDB.mdb','','',adConnectUnspecified);
Connection1.Execute(SQL,RcA,0);
Connection1.Close;

もうたったこれだけで一日悩んでいます。
どなたかアドバイスいただけないでしょうか。
よろしくお願いいたします。
893デフォルトの名無しさん:04/10/08 14:31:33
>>820
質問とは全く関係ないが

if (〜) then
Result := True
else
Result := False;

の部分は

Result := (〜);

にするとコードがすっきりする。
894デフォルトの名無しさん:04/10/08 15:43:06
uses shellAPI;

procedure TForm1.Button1Click(Sender: TObject);
const
strExeName = 'C:\WINDOWS\COMMAND.COM';

begin
ShellExecute(Handle,'open',PChar(strExeName),'',
PChar(ExtractFilePath('C:\borland\')),SW_SHOWDEFAULT);
end;

このような感じでMS-DOSを立ち上げたとき、コマンドラインに
C:\borland>bcc32 test.cpp
みたいな形で値( bcc32 test.cpp )を渡したいのですがどうやったらいいのでしょうか。
よろしくお願いします。
895デフォルトの名無しさん:04/10/08 16:06:37
普通は C:\borland\bcc32.exe を立ち上げて、そのパラメータに C:\borland\test.cpp を
指定すると、勝手にコマンドプロンプトが立ち上がってくれるもんだが。
896デフォルトの名無しさん:04/10/08 16:07:58
ども、早速やってみます
897デフォルトの名無しさん:04/10/08 16:31:45
やっぱオレの能力じゃわからないや(':ω)| ̄|_
898デフォルトの名無しさん:04/10/08 18:32:21
Delphi7EnterpriseTrialを使用して勉強中です。
以前のDelphiにはIsNumericがなかったと思うのですが、
7のhelpにはIsNumericが載っています。
しかし使い方が全くわからないのです。
教えていただけませんでしょうか。
899デフォルトの名無しさん:04/10/08 19:05:19
まさにくだ質なんですが。。。

procedure form1.btnCheckClick(Sender: TObject);
begin
//入力チェック
if チェック then
エラーなら以下の処理は行わずprocedureを抜ける
//処理
・・・
end;

としたいのですが、途中でprocedureを抜ける方法がわかりません。
どうすればいいのでしょうか。
チェック項目が増えると見苦しいので、elseによるネストはしたくないのです。
よろしくお願いいたします。
900デフォルトの名無しさん:04/10/08 19:14:46
Exit
901899:04/10/08 19:15:46
すんまそん。
Exit
でいけるんですね。。。
お騒がせいたしますた。
902デフォルトの名無しさん:04/10/08 20:57:43
TEditでUnicodeを使いたいと思い、ぐぐったところ、TNTというサイトが見つかりました。
それとは別の日本語のサイトに、
これを入れると既存のコンポーネントが上書きされる
と書いてあったのですが、他にUnicodeを使えるようにする方法はありませんか?
903デフォルトの名無しさん:04/10/08 21:46:38
>>902
上書きなど初耳だが。
そのサイト晒してみてくれ。
904902:04/10/08 22:09:47
>>903
↓です。
http://hp.vector.co.jp/authors/VA004777/report/unicode.html

ごめんなさい。よく読んだら、自分で書き換えたと書いてありましたorz
でも、逆に言えばTntのコンポーネントは使用に書き換えが必要なんでしょうか?
905デフォルトの名無しさん:04/10/08 22:25:24
必要なし
906デフォルトの名無しさん:04/10/08 22:55:41
インラインアセンブラで割り算する時、
div ebx って書くとエラーが出ます。
div eax,ebx だとエラー出ないが、これは文法的に間違ってないですかね?

あとdiv edx っていうのは間違いですか?
907902:04/10/08 22:56:52
>>905
ありがとうございます。それじゃ早速使ってみます。
908デフォルトの名無しさん:04/10/08 23:21:19
ソースフォルダに大量に生成される、拡張子の頭に'~'のついたファイルは編集時のテンポラリファイルなのでしょうか?
その場合、編集が終われば削除してもいいのでしょうか?
また、これらが自動的に削除されるような方法はないのでしょうか?
909デフォルトの名無しさん:04/10/08 23:24:50
一つ前のバックアップ。気にするな。神経質に消す方が疲れる。
910デフォルトの名無しさん:04/10/08 23:35:59
なるほど。
で、そのバックアップを生かしたい時は手で拡張子直すのでしょうか?
ざっとメニューみてみましたがそれらしいツールはありませんでした。
911デフォルトの名無しさん:04/10/08 23:45:20
>で、そのバックアップを生かしたい時は手で拡張子直すのでしょうか?

もう5年以上使ってるけど、一度だけ手で直したことがある。ほかのやり方は知りません。
912デフォルトの名無しさん:04/10/09 01:22:08
>>906
「書くとエラー」って言うから、コンパイルエラーかと思った。
オーバーフローだろ?
divは上位edx、下位eaxの64bitの数を指定のレジスタで割るから。
edxにゴミでも入ってるんだろ。

当然div edxもオーバーフローする。常に商がeaxに収まらないから。
913デフォルトの名無しさん:04/10/09 09:53:04
>>908
作らせないようにする設定なら、エディタオプションの「表示」の所にある。
914デフォルトの名無しさん:04/10/09 10:33:40
ADOConnection>ADOQuery>DataSource>DBGridでmdbのデータを一覧表示しています。
ADOQueryのActiveをTrueにしているので、表示した瞬間にDBの内容が表示されます。
ここでDBの内容を再取得して再表示したいのですがやり方がさっぱりわかりません。
どなたかご教授いただけませんでしょうか。
915914:04/10/09 11:02:42
自己レスです。
これで正しいのかどうかわかりませんが、
ADOQuery.Active := False;
ADOQuery.Active := True;
DBGrid.Refresh;
とすることで表示更新できました。
お騒がせしました。
また、これが間違っていたらツッコミよろですm(__)m
916デフォルトの名無しさん:04/10/09 11:20:09
>>913
作っておいた方が精神衛生上いいかも。
消したくなったら、
DEL *.^??
みたいなバッチ作っておけば一発で消せるし。

[環境設定]の[自動保存]もチェック付けといた方がいいね。構成管理ツール導入して版管理できれば尚いい。
917916:04/10/09 11:21:21
ごめ、ハットとチルダ間違えました。
DEL *.~??
918デフォルトの名無しさん:04/10/09 11:26:16
バックアップファイルなんて一度も役に立ちそうなシチュエーションはなかったな。
まともなソース管理ツール使っとけ。
919デフォルトの名無しさん:04/10/09 11:28:34
*.~?? のファイル消すツールなら、それこそ簡単にDelphiで作れるね。
920デフォルトの名無しさん:04/10/09 11:30:56
バックアップとか無停電電源とか生命保険とかは実際は役立たないほうが幸せ。
万が一に備えているわけだから。
921デフォルトの名無しさん:04/10/09 11:53:59
無停電電源あって良かった事の9割は雷サージを防げたことだった。
922デフォルトの名無しさん:04/10/09 12:45:58
>>892
SQL := 'INSERT INTO test2tb ([date],[time]) VALUES("' + DateToStr(Now) + '","' + TimeToStr(Now) + '")';

でやってみそ
923デフォルトの名無しさん:04/10/09 14:51:30
すいません。
先ほどの>>914-915です。
>>915の方法では追加更新削除の処理をした後、
なぜか再取得できるときとできないときがあります。
もうなにがなにやら。。。
アドバイスいただければうれしいです。
よろしくお願いいたします。
924デフォルトの名無しさん:04/10/09 16:54:17
>>915
オレも詳しい原理は知らないが
DataSource.DataSet.Close;
DataSource.DataSet.Open;
で表示の更新ができる。

同じ対象をさしているはずなのに
なぜQueryでなくDataSource.DataSetの方じゃないといけないか
自分でもよくわからないんだけどな。
925デフォルトの名無しさん:04/10/09 17:08:04
フォームのリサイズを不可にしたいのですが、どのプロパティをいじればいいのでしょうか?
926デフォルトの名無しさん:04/10/09 17:30:44
>>924
レスありがとうございます。
しかし、それでも再取得できたりできなかったり。。。
もしや時間的に再取得できないのかと思い、
DB更新処理後に「更新しました」とダイアログ出して時間とってみたのですが、
それでも一緒です。
フォーム上にボタンを作って、
ADOQuery.Active := False;
ADOQuery.Active := True;
DBGrid.Refresh;
としてみると100%再取得できます。
うーむ。。。
927デフォルトの名無しさん:04/10/09 18:18:52
>>925
BorderStyle
928デフォルトの名無しさん:04/10/09 20:05:46
>>927
ありっす。
最小化が使えなくなるのですね。。。
工夫してみます。
929デフォルトの名無しさん:04/10/09 20:12:44
MaxHeightとかで指定するのは?
930デフォルトの名無しさん:04/10/09 20:14:19
>>928
Dialog以外なら最小化できるだろ
931デフォルトの名無しさん:04/10/10 00:19:07
すみません、↓のプログラムのだめなところが判りません
testin.bmpをロードして(Image1)、画像の一部を切り出して
切り出した部分(Image2)をtestout.bmpとして保存したいのですが
実行すると止まってしまいます。
ヘルプを参照しても不明です。
bmpの扱い方を解説してるページなどありますか?
(検索しましたが、見つけられませんでした)
932デフォルトの名無しさん:04/10/10 00:19:37
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
933デフォルトの名無しさん:04/10/10 00:20:00
procedure TForm1.Button1Click(Sender: TObject);
var
Rgn: HRGN;
Image1: TBitmap;
Image2: TBitmap;
begin
Image1 := TBitMap.Create;
Image2 := TBitMap.Create;
Image1.Picture.LoadFromResourceName(HInstance,'testin.bmp');
Image2.Width := Image1.Width;
Image2.Height := Image1.Height;
BeginPath(Image1.Canvas.Handle);
Image1.Canvas.Polygon([Point(50, 50), Point(100, 50),
Point(100, 100), Point(50, 100)]);
EndPath(Image1.Canvas.Handle);
Rgn := PathToRegion(Image1.Canvas.Handle);
SelectClipRgn(Image2.Canvas.Handle, Rgn);
Image2.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height),
Image1.Canvas,
Rect(0, 0, Image1.Width, Image1.Height));
Image2.Picture.SaveToFile('testout.BMP');
DeleteObject(Rgn);
end;
end.
934931:04/10/10 00:22:03
ここの真似ですが・・
http://homepage1.nifty.com/cosmic/delphi/tips_graphic.html
よく判りません・・・・助けてぇ
935デフォルトの名無しさん:04/10/10 00:22:15
オレがめんどくさいから誰か書いてくれないかな〜、と思っていて
1ヶ月もかけなかったコード

procedure TForm1.Button1Click(Sender: TObject);
var
 Dir: string;
 F: TSearchRec;
begin
 if SelectDirectory('ディレクトリを選択してください', 'C:\', Dir) then
  if FindFirst(Dir+'*.*', faAnyFile, F)=0 then
  begin
   repeat
    Memo1.Lines.Add(F.Name);
   until FindNext(F) <> 0;
   FindClose(F);
  end;
end;
936デフォルトの名無しさん:04/10/10 00:39:50
>931 .Picture
937デフォルトの名無しさん:04/10/10 00:51:47
>933

 DeleteObject(Rgn);
 Image1.Free;
 Image2.Free;
end;
end.

後始末も。
938931:04/10/10 01:08:47
>>937 ありがとうございます。

早速訂正してみましたが、出力ファイルが作られません・・・・
939デフォルトの名無しさん:04/10/10 01:28:13
>>931

procedure TForm1.Button1Click(Sender: TObject);
var
  Rgn: HRGN;
  Image1: TBitmap;
  Image2: TBitmap;
begin
  Image1 := TBitmap.Create;Image2 := TBitmap.Create;
  try
    Image1.LoadFromResourceName(HInstance,'testin.bmp');
    Image2.Width := Image1.Width;Image2.Height := Image1.Height;
    BeginPath(Image1.Canvas.Handle);
    Image1.Canvas.Polygon([Point(50, 50), Point(100, 50),Point(100, 100), Point(50, 100)]);
    EndPath(Image1.Canvas.Handle);
    Rgn := PathToRegion(Image1.Canvas.Handle);
    try
      SelectClipRgn(Image2.Canvas.Handle, Rgn);
      Image2.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height),Image1.Canvas,Rect(0, 0, Image1.Width, Image1.Height));
    finally
      SelectClipRgn(Image2.Canvas.Handle,0);
      DeleteObject(Rgn);
    end;
    Image2.Picture.SaveToFile('testout.BMP');
  finally
    Image1.Free;
    Image2.Free;
  end;
end;
940デフォルトの名無しさん:04/10/10 01:35:42
>>331
http://www.google.co.jp/search?hl=ja&q=TBitmap&lr=lang_ja

これじゃ足りないってこと?
941940:04/10/10 01:36:42
ミスった。
>>931
に訂正。
942デフォルトの名無しさん:04/10/10 01:48:26
.Picture消せ
943デフォルトの名無しさん:04/10/10 02:18:45
939 です。

× Image2.Picture.SaveToFile('testout.BMP');
○ Image2.SaveToFile('testout.BMP');
944デフォルトの名無しさん:04/10/10 02:19:52
名前を bmp1 bmp2 とかにするといいものを Image1 とかにするから面倒なことに・・・・
945デフォルトの名無しさん:04/10/10 03:31:36
「実行すると止まる」とはコンパイルエラーの事だったのか。
946デフォルトの名無しさん:04/10/10 04:30:54
多次元配列
A: array[0..2, 1..3] of Integer;
で、
High(?) = 2 を求めるには?にどう書けば良いのでしょう?
High(A[0]) = 3 ですし。
947デフォルトの名無しさん:04/10/10 06:04:05
High(A)
948946:04/10/10 07:04:43
できました。 ありがとうございます。
ついでに
A: array[0..1, 2..3, 4..5] of Integer;
で、4, 5を求める場合は
Low(A[0, 2])
High(A[0, 2])
でした。
949デフォルトの名無しさん:04/10/10 09:14:48
他人デバッグ
950デフォルトの名無しさん:04/10/10 13:49:09
文章を読み上げる機能をつけたいんですが、コンポーネント
とか無いんでしょうか。
マイクロソフトのエンジンを使うとして、
メモに貼り付けた日本語を読んでくれるだけでいいんですが・・。
どなたか分るかた居ないでしょうか
951デフォルトの名無しさん:04/10/10 13:51:15
MSのって英語だけじゃなかったっけ?
IBMからSDK付で出てたような。
952デフォルトの名無しさん:04/10/10 13:58:34
上でComponentStateを教えてもらった者ですが、また新たな問題が・・

PageControlのコンポを作っていて、設計時に固定のTabSheetを動的に生成しています。
その処理はCreateWndメソッドをオーバーライドして、
if csDesigning in ComponentState thenの中で記述しています。

これでポトペタ時にはTabSheetもちゃんと表示され、実行時には作成されずちゃんと動作
するのですが、いったんフレームに貼り付けて設計し、そのフレームをフォームに貼り付けよう
とすると、「コンポーネント名TabSheetはすでに使われています」のようなメッセージがでて、
うまく動作しません・・・。

こんな場合にはどうすればいいんでしょう・・・・。どなたか教えてください!
953950:04/10/10 14:02:09
>>951
レスどうも。いえ日本語もできます。他の言語も。それを使った
読み上げのフリーソフトとか結構ありますし。
ただそれを自分のソフトに組み込むのはどうすればよいのやら・・。
954931:04/10/10 14:26:50
いろいろ試したら、やっとできました。
回答くださった方々、ありがとうございました
もう1つお願いします・・・・

BM(Tbitmap)の座標(100,100)にある点の色が何色か知るにはどうしたら良いのですか?
とりあえず黒かどうか判定するに
Canvas.Draw(0, 0, BM);
if Canvas.Pixels[300, 300] = clBlack then hantei := 0
という文を書いたのですが・・
黒ならhanteiの値を0にしてその後の処理を分岐しようかと
でもうまく行きません。何がまずいのでしょう?
Drawとかしなくても直接BMのある点の色を知る方法とか無いですか?

ヘルプを見てるのですが、「色を知る」 という情報が検索できません
「色を知る」が検索かけてそっくりそのまま出るとは思いませんが
955デフォルトの名無しさん:04/10/10 16:12:22
>>954
1.TBitmapにもCanvasプロパティがある
2.100, 100 が知りたいのに何でPixels[300, 300]?
956931&955:04/10/10 16:16:43
ここのまねをしたら、できました。
http://homepage1.nifty.com/MADIA/delphi/Win32API/getcolorcount.htm
一行文の色値を読み込んでから、その中から目的の座標の色を探すみたいですが
直に目的の座標の色を知る方法てないんでしょうか?

>>955
すみません、座標打ち間違いです。
957デフォルトの名無しさん:04/10/10 16:31:10
>>954
hanteiをhentaiと読み間違えたよ。それだけだけど。
958デフォルトの名無しさん:04/10/10 16:36:52
if BM.Canvas.Pixels[
959デフォルトの名無しさん:04/10/10 20:12:13
DBGridに表示するデータについてなのですが、
データが0の時は'XP'、1の時は'Me'と表示するようなことをしたいのですが、
どうすればいいのでしょうか?

それと>>914で質問しました、DBGridのデータ再取得でいまだに悩んでおります。
DBGridでデータ一覧を表示>別画面に移ってデータ改変>またDBGridに戻る
といったような画面ハンドリングの場合、みなさんはどうやってDBGridのデータを再取得しているのでしょうか?
DBの種類や接続方法によって違うのでしょうが、参考に教えていただければうれしいです。
960デフォルトの名無しさん:04/10/10 22:06:09
チャット&ファイル転送を兼ね備えたものを作っているのですが、
何故かローカルじゃないと接続できません。
どういった間違いがあるとこういう事が起こるのでしょうか?
例えば自分のプライベートIPを入れて接続しようとしても接続できません。
961デフォルトの名無しさん:04/10/10 22:23:57
9割方DNSかデフォルトゲートウェイの設定が不良
962デフォルトの名無しさん:04/10/10 22:43:33
またネットワークの基礎知識の無い奴が
ネットワークアプリ作ろうってのかい?
963デフォルトの名無しさん:04/10/10 22:52:08
>>950
MSのエンジン使いたいみたいだけど、
日本語にも対応するようになったんだな。

自分は以前、テレフォニー関係のツールで
合成エンジンが必要になって、MSのも
調べたが、当時は日本語ができなくて
結局、OKIのSmarttalkを使った。

OKIのはActiveXだから、Delでも簡単に実装できた。
964デフォルトの名無しさん:04/10/10 23:31:02
>>961,962
すいません本当にアホみたいな間違いしてました。できました。
お騒がせしました^__^;
965デフォルトの名無しさん:04/10/10 23:41:37
おおおっっぱい♪ いもうとのおっぱい
みくろなおっぱい 洗濯かごの中
いっぱいオッパイの残り香イエエエエエ!
ダンシングしながらはいてみたよ!イエエエエエ
おっぱいみたいな肉まん当てたら疑似餌なおっぱい
アンダー60 トップ80 (笑い)
そんなミクロのオッパイ光恵kてやる是イエエエエエ
966デフォルトの名無しさん:04/10/11 00:11:10
引数がキーと文字列でレジストリ値を加えたり
削除したりするソースを公開しているホームページを
知りませんか?
プログラムだけでもいいんですけど。
967デフォルトの名無しさん:04/10/11 00:15:44
reg.exew
968デフォルトの名無しさん:04/10/11 00:20:14
>>966
TRegIniFileかTRegistryで検索しろ
969デフォルトの名無しさん:04/10/11 07:42:17
>>959
>表示するデータ
対応するテーブルを作るしかないんじゃないの?

>データ再取得
トランザクション再接続じゃダメ?
970デフォルトの名無しさん:04/10/11 09:17:54
>>969
DBGridの表示内容改変はできないのですね。了解しました。

トランザクション再接続とは具体的にはどうすればいいのでしょうか。
再取得方法として、以下の方法で再接続してみたのですが、
ADOQuery.Active := False;
ADOQuery.Active := True;
DBGrid.Refresh;
でも
DataSource.DataSet.Close;
DataSource.DataSet.Open;
DBGrid.Refresh;
でもだめなのです。
だめというか、同じ処理を2〜4回やると再取得できているというのが現状です。
なぜ一回ではダメで複数回で反応するのかがまったくの謎なのです。。。
971デフォルトの名無しさん:04/10/11 09:24:17
そろそろ次スレ。
972デフォルトの名無しさん:04/10/11 09:31:23
くだすれDelphi(超初心者用)その19
ttp://pc5.2ch.net/test/read.cgi/tech/1097454588/

973デフォルトの名無しさん:04/10/11 10:14:44
TEditorってシェアウェアなんだけど機能制限ってあるんですか?
ある程度、物になったら払ってもいいかなとは思ってますけど・・・
974デフォルトの名無しさん:04/10/11 10:49:44
>>973
なぜここで聞く・・・・
975デフォルトの名無しさん:04/10/11 10:56:37
んだな。次スレで聞けや
>>975
超初心者向けスレッドでそういうボケをかますと本気にされそうですね.

念のために書いておくと>>974氏の意図は

「TEditorのおひさるページで調べるなり,作者に直接問い合わせるなりすればよいのに
 なぜわざわざここで尋ねるのか?」

ということだと思われます.
977デフォルトの名無しさん:04/10/11 21:27:30
すみません。TWebBrowser について詳しいサイトを教えてください。
日本語でも英語でもかまいません。よろしくお願いします。
978デフォルトの名無しさん:04/10/11 23:22:44
979デフォルトの名無しさん:04/10/11 23:30:22
>>978

わざわざ、ありがとうございました。信じられないことに検索をすることをど忘れしていました。
980デフォルトの名無しさん:04/10/12 00:12:51
>>970
ゴメン、ADO使ってないのにレスしてしまった。
参考までにIBの場合で書くと、
DataSetをPostしてもトランザクションをコミットしないと実際にはDBに
書込まれないので、他のクライアントからは更新されてないように見える。
任意にサーバーのDB更新したいならコミット処理を書く。
たぶん同じケースなんだと思うけど、ADO知らないので詳細は不明。
981デフォルトの名無しさん:04/10/12 00:34:13
perlで言うところのSpriteの様なライブラリのdelphi版はないでしょうか?
機能的にはSQLのサブセットを使ってテキストファイルに入出力を行うものです.
982デフォルトの名無しさん:04/10/12 10:51:48
すれ違いですがお願いします。
WinXPでCD-ROMやリムーバブルドライブにメディアを挿入した時に
ドライブ内のファイルによって自動再生プログラムを選択する
ダイアログが表示されますが、その中に自作プログラムを入れたいのですが
どうすればよいでしょうか?
具体的には、デジカメのメモリーカードを挿した時に自動でHDDに取り込む
プログラムを作っています。
983デフォルトの名無しさん:04/10/12 20:22:30
自動起動するCDをエクスプローラで開き、autorun.infというファイルの中身を見れ。
もしくは"autorun.inf"でぐぐれ。
984デフォルトの名無しさん:04/10/12 22:53:27
そういうこっちゃねーだろ
985デフォルトの名無しさん:04/10/12 23:04:40
>>983
オレもそう答えそうになって踏みとどまったのだよ
986デフォルトの名無しさん:04/10/12 23:10:36
>>982
漏れならそのダイアログにあるプログラムの名前で
レジストリをサーチする。
何件か絞り込んだらなんとかなるんじゃないかな
987デフォルトの名無しさん:04/10/12 23:54:12
>すれ違いですがお願いします。
図々しい。
988デフォルトの名無しさん