1 :
デフォルトの名無しさん :
04/09/01 08:59
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 で調べてみてください。
>>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 で例外発生時には実行されない これでいいと思うが
>>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内で必ず何か記述させるより正常なシーケンスで何か呼ばせる方が 呼び忘れたときの検出が容易で被害が少ないと思うし。
すみません、追加の質問です。 TMainMemuの操作中の判断はWM_ENTERMENULOOPとWM_EXITMENULOOPで無事判断する 事ができました。 しかし、TPopupMenuのメッセージはうまく取得できませんでした。 また、Personalしか持っていないので「WinSight」の代わりに「Spy++」を 使って送られてくるメッセージを見てみたんですが、メニュー関連と思われる ものを見つける事が出来ませんでした。 ポップアップメニューを操作しているかどうかの判断は、どうすれば出来ます でしょうか?
一応、テストに使ったロジックになります。 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 にして。
>>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って今後尻すぼみってほんとですか?
ほんとです。
ま、拡大していく要素なんか皆無だし、今後尻すぼみって言うより、すでに尻すぼみなわけだし
>複数ある内のどれかがポップアップしているのかを判断したいのです。 だって、手動でポップアップメニューを表示してるんだから、その前後でどこの メニューが開こうとしているか、閉じようとしているかはコードでいかようにも 知らせることができるだろうさ
例えば 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は一切使わない。これ最強。
ひょっとして、また質問のふりをした釣りなのか?
>>48-49 えーと、情報が小出しみたいになってすみません。
「その他、色々な場所で何種類かのポップアップメニューを表示」は
下のようなPopupMenuプロパティでのポップアップも含めてになります。
Panel1.PopupMenu := PopupMenu3;
Panel2.PopupMenu := PopupMenu4;
・
・
・
あとポップアップメニューの個数も、ポップアップするタイミングも、後から
追加していく事も多いので、出来れば設定を1箇所にまとめたいもので。
あと、
>>40 の意味がわかりにくかったですね。
基本的にやりたい事は、
>>11 のTPopupMenu版になります。
「複数ある内のどれかがポップアップしているのかを判断したい」は
「どのメニューがポップアップしているか」ではなくて、
「操作しているアクティブなものがポップアップメニューか(を判断し
タイマーイベントを処理するか判断する)」
あるいは「複数あるポップアップメニューの操作開始・操作終了を
一箇所で拾いたい(操作開始ならタイマー無効、操作終了なら
タイマー開始)」になります。
と言うか、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を拾えるもより。
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;
適材適所
>>60 6personalを使っているのでそれが原因だったんですか・・・
他の方法を試してみます。ありがとうございます
ずっと前にわざわざ機械語まで追ってくれた人が居たが その人によるとOrd()とByte()の生成するコードはまったく同じらしい。 好みで使い分ければよろし
ポップアップメニューの件について、いろいろ調べていただいてありがとう ごさいました。 PopupListなんてものがあるんですね。 コンポーネントを派生してなにかしないといけないのかと思っていましたが、 かなりスッキリしたコードになりそうです。ありがとうごさいました。
87 :
デフォルトの名無しさん :04/09/04 01:25
Extendedで扱えないような巨大な実数を処理するためのライブラリはありませんか?
C:\HOGE\ フォルダの中に、20040829.txt, 20040830.txt, 20040901.txt, 20040902.txt ・・・ みたいな感じで、日付をそのまま名前にしたテキストファイルがびっしり詰まっているとします。 日付は必ずしも連続していません。 この中からいちばん日付の新しいもの(ファイルプロパティのUPDATE日付じゃなく、ファイル名の日付) を取得するうまい方法ってありますか。
>>88 ファイル名をすべて列挙して調べるしかない。
>>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のは知らない。
>>92 すげーです
Delphi初心者なのはいうまでもないとして、WHS(VBS)はちょこっとかじったことがあり、
あるフォルダ中のファイル名列挙ってのは以前似たようなことをやった経験があるので、
そのコードを見直しながら、まずは何とかDelphiに翻訳しようと格闘していたんですが、
疲れて一服している間に、コード有り難うございます(なんでこんなに短けーんだ)
if latest<date then
begin
Result:= sr.Name;
latest:= date;
end;
↑この手順がマジに震えるほどカッコいいです。
>>93 ええ、その方法は漠然と考えてました。
かなりレベルの低い形で、ですけど。
いまやってるアプリはDBも扱っているので、そこに適当な仮テーブルでっちあげて、
いっこずつファイル名とって次々にぶち込んでいく、で、ソートした結果セットの
一番下を・・・いや、バカっぽくてごめんなさい
入れ子状態の関数(?)ってのは初めて見るので、何となくなじめなくて分けて書いてみたんですが、 それを解読しているうちに、もしかしたら日付にこだわる必要もないのかなという気もしてきて、 取りあえず以下のような形に(変数なんかは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)って結果はまったく同じですよね? 自分の解釈では同じだと判断したのですが 先輩(もう居ない)のソースコードを見ると両方が入れ違いに使われてたりするので なにか自分の知らない意味があるのかと気になっているのですが・・。
>>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;
こんな感じ。(テストはしてないから、そのまま動くかどうかは不明)
ファイルのリストからではなくて、現在の日付から存在が予測されるファイル名を
決めうちでどんどん作って存在するか調べてみる。という方法。
>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代わりになるものってないのですか?
>>104 見落としてました。
有り難うございます。
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
何かみなさんグニャグニャです。アタマやわらかすぎです。
特に
>>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関係ないし
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 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 のどれかだとは思うのですが。
>>120 clGrayText
clInactiveCaptionはアクティブじゃないタイトルバーの背景色
clInactiveCaptionTextは同テキストの色
ちなみに影付き
影付きの場合はclBtnHighlightとclBtnShadow
Popupメニューのようなちょっと他のところをクリックしただけで消えるような メッセージボックスを作りたいのですが何のイベントを拾えばいいのでしょう?
ShellExecuteで起動したアプリケーションをアクティブにしたいのですが 最小化した状態のアプリケーションからタイマーで起動すると 起動したアプリケーションが非アクティブで起動されてしまいます。
>>126 なるほど。そうだったのですか、ご忠告感謝します
>>122 さん、ありがとう。
もうひとつ質問します。
StatusBarの右下にあるサイズ変更可能をしめす
三角形の[//.]こんなマークを
FormやPanelに描画するスマートなやり方は
ありますか?
.NETのWinFormでSizeGripStyle Showにしたら出るので
何かAPIで描画できるようなきがするのです。
>>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にする。
>>139 おぉ、ありがとうございます。
なるほど、プロパティを弄るのでしたか。
焦りすぎて間違えますた・・
>>140 さんありがとうございます。
亀だけど、dクス!
144 :
デフォルトの名無しさん :04/09/05 21:06
PageControlのページ切り替えを出来なくする事は可能ですか? EnabledをFalseにすると、ページ内のコンポーネントまで死んでしまうので他の方法があれば教えてください。
>>144 OnChangingイベントで、AllowChangeをfalseにする。
即レスありがとうございました。
半径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 イベントが発生して全体が無効化される。
従って、表示中に複数に分けて描画を行うとパフォーマンスが低下する。
>>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を使用して)って言ってんだから悪くないだろ。 ただの難癖代案厨だからスルーしとけ。 書き方は問題ないよ。
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 つかわんの
やりたいことはタスクトレイに入っているアプリケーションから あるイベントでフォームをクリエイトしてそのときはまだ不可視で タスクトレイから出したときにそのクリエイトしたフォームを可視化したいです。 そこでメインフォームがリストア時に不可視のウィンドウを検索して すべて可視化したいといったところです。
>>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;
>>169 またまた即レス感謝。
VBとそっくりですね。試してみます。ありがとうございました。
思い通りど動作になりました。ありがとうございました。
うーむ、なんでフォームの名前が分かってて検索する必要があるんだろうか。 インスタンスを管理しないで、名前だけ付けてるとかかな。
同じ名前のフォームが複数あって、一挙に表示したい、ってことだろ
普通は TList かなにかを使って複数のインスタンスを管理する。フォームは 自分がなくなるとき、自分をリストから削除する、と。
代案厨乙
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
人生いろいろ普通もいろいろ
了解です!
なんでIsじゃなくてName使うの?
Isってどうやって使えばいいですか? if Screen.Forms[I] Is frmHoge then Screen.Forms[I].Show; という感じですか?
それでいいよ。 is使うと後からフォームのクラス名変えるとかクラス名のタイポしたとき ちゃんとコンパイルエラーが出てくれる。
nameだと'frmHoge'でもういっこ作ると'frmHoge_1'となりました。 Isを使ってみます。ありがとうございました。
Isでできました。ありがとうございました。
あの、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
例えばですね ポップアップメニューを表示しているときに タイマーによって起動されたちょっと長い処理があると その処理が終わるまでメニューの操作ができないのです。
200 :
デフォルトの名無しさん :04/09/07 16:14
>>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; で試してみたのですが、止まってしまいます。 どこらへんがまずいでしょう?
>>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は俺じゃないよ
俺でもないよ
垣間というより全開で見えるけど。オレでもないよ
お前らじゃないとしたら俺はいったい誰なんだ?
俺を愛せばいい
少し寝たほういい
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;
ちょっと説明が変でした。 ツールバーのボタンを押します。 他のウィンドウを触ってフォーカスをはずします。 ツールバーのボタンを押します。 ここで見た目は押されていない状態になります。 コマンドボタンを押します。TRUEと表示されます。 TRUEと表示されるということは押された状態ということです。 でも、表示上は押されてない状態なのです。 これはコンポーネントのバグなのでしょうか?
ちなみにDelphi6Personalです。
Focus を得る瞬間と Enabled := true になるタイミングがクリティカルなんじゃないの なんでそんな制御しなけりゃならんのか、わからんな
タイミングがクリティカルだからというのは ちょっとよくわかりません。
はぁ? >他のウィンドウを触ってフォーカスをはずします。 >ツールバーのボタンを押します。 このこと。 ・フォーカスを得る ・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はこんなのがけっこうたくさんある
ファイル名を...とかで縮めて表示するのってどうやったっけ?
>>237 順番はどうあれ見た目では押された状態じゃないのに
プロパティは押されていると返すのはバグじゃないの?
といっているのです。
>>238 ありがとうございます。試してみます。
バグだけど、どうしてフォーカス制御するひつようがあるの?
>>241 DrawText() + DT_PATH_ELLIPSIS とかなんとか
それは秘密です。
>>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
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 こんな便利なのあるんだ・・・付属の一生懸命使ってたのは何だったんだ
277 :
デフォルトの名無しさん :04/09/09 20:44
279 :
デフォルトの名無しさん :04/09/09 23:03
英語が分からない俺には駄目みたいだ。orz 簡単にBDEも同梱できるんだったら使いたかったんだが。甘かった。
おいおい
このスレって横からやりとりを見てたら時々美味しい情報が紛れ込んでるんだよね。 今回も美味しそうだったからつまみ食いしようと思ったんだが。
TServerSocketというコンポーネントを使いたいのですが、パレットのどのページにあるのでしょうか。 当方Delphi7Proを使っています。
>>283 Del7だったらTTcpServerじゃない?
ありがとうございました。TTcpServerでやってみます。
解説書よりもWEB上のサイトのほうがよっぽど分かり易い。 何のために本買ったんですか?俺は。
>>285 パレットには載ってないけど、ScktCompをusesに加えれば従来通りTServerSocketも使えます。
この場合はTServerSocketのインスタンスを自分で作成する必要があります。
1から100までのランダムな数値が取得したいのですが どのように書けばよいでしょうか?
Randomize; Random(100)+1;
Randomize を毎回呼ばないように。 特別な用途がない限り、アプリ起動に対し一回だけで良し。 かつライブラリが自動的に呼び出しているので、乱数を手に入れることだけが目的なら Randomize は必要ないですし、繰り返し呼ぶと乱数の列が乱れます。
292 :
デフォルトの名無しさん :04/09/10 14:52:55
フォルダを指定するにはどうしたら良いのでしょうか? opendialogを使うとファイルの指定は出来ますが、フォルダの指定が出来ないので。
APIに渡すために buff: array[0..255] of char; と宣言している配列をAPIに渡すためにクリアしたいのですが どのような方法が一番簡単で確実でしょうか? GetWindowText(handle, buff, sizeof(buff)); を使用しています。 取得できたら sCaption: String; へ、 sCaption := buff; としてStringへ変換しています。 ひょっとしてこの場合はクリアする必要はないですか?
SetLength(sCaption, GetWindowTextLength(handle)); GetWindowText(handle, PChar(sCaption), Length(sCaption));
>>294 カコイイ
でも、1行目と2行目でキャプションが変わったらどうしましょう。
SetString(sCaption, buff, GetWindowText(handle, buff, SizeOf(buff)));
298 :
デフォルトの名無しさん :04/09/10 15:59:34
どなたか292についてよろしくお願いします。
>>298 SHBrowseForFolderを使えばいいと思います。
>>292 これは良く見かける質問だね。
SelectDirectory関数とか。
昔はOpenDialogでダミーのファイル名"(ディレクトリ)"とか設定しといて OK押されたらExtractFilePathでディレクトリ取得という技もあったな。 プレースバーも使えるので個人的には一番使いやすかったり。ダサいけど。
>>291 >かつライブラリが自動的に呼び出しているので、乱数を手に入れることだけが目的なら
>Randomize は必要ないですし、繰り返し呼ぶと乱数の列が乱れます。
Randomize でソースをGrepしても System.pas の宣言と実装しか引っかからないけど。
ライブラリのどこで呼び出してるの?
Randomize を呼び出さないでテストしてみるといつも同じランダム数列が得られるけど?
>>292 デフォルトのコンポーネント使って自分なりの「フォルダ選択ダイアログ」を作る
って手もありかと。
※スルーされたからって、催促書くのはどーかと。
>>293-296 が気になるのですけど、
取得する文字列がbuffより長い場合はどうやって安全に全部の文字列を取得できますか?
>でも、1行目と2行目でキャプションが変わったらどうしましょう。 こういう心配をする人には、根本的な解決策はありません。でっかいbuffを取っておくように。
308 :
デフォルトの名無しさん :04/09/11 09:12:09
ドッキングテクニックを解説しているサイトはあるでしょうか? DEMOを見てもサッパリです。 お助けください。
>でも、1行目と2行目でキャプションが変わったらどうしましょう と >取得する文字列がbuffより長い場合はどうやって安全に全部の文字列を取得できますか? は かなり異質の問題と思うけどなぁ。
そうお? GetWindowTextLength で取った数値が GetWindowText を使うときにはもう信用できないかも、 っていう心配してるんだから、同じじゃないの? TMemo みたいにバカ長いテキストも あり得るんだから、そんな心配より、全部取れないかもしれない、という心配のほうが ずっと価値あると思うんだけど。
GetWindowTextは同一プロセス内でしか使えないから、 この場合は自分で管理すればよろしい。 他プロセスとのやり取りは、そもそも危険。
>GetWindowTextは同一プロセス内でしか使えないから、
MSDN says,
GetWindowText cannot retrieve the text of a control in another application.
ということで、そもそも
>>295 >でも、1行目と2行目でキャプションが変わったらどうしましょう。
はあり得ないってことですね。サンクス
>>311
ダイアグラムエディタ(フローチャート?)のコンポーネントってないですかね?
VISIOみたいなやつ?
おれのマシンからは(今)DevExpress つながるが?
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引数でエラーになるようなのですが 渡し方が間違っているのでしょうか?
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; できました。
ActiveXDLLをDel6Personalで作成できますか?
>>321 ファイル|新規作成の所に、ActiveXというタブはありますか?
その中に、ActiveXライブラリというアイコンがあれば可能です。
>>319-320 ポインタが var パラメータになっている関数の宣言がおかしいのでは?
var パラメータはその位置にある変数を指すポインタを渡すという意味なので、
ポインタのポインタを渡してることになりますよ。
Delphi7ってフリーじゃなくなっちゃったんでしょうか? ダウンロードしたのですが、 30日評価版の文字が・・・
>>324 フリーはDelphi 6。Delphi 7にフリーは無い
大いにスレ違い。反省
TabControl,PageControlでMultiLineをTrueにした状態でタブが動かないコンポーネントを探しているのですが ありますでしょうか?
上段のタブがアクティブになった時にどんな絵になるのか、 ちょっと描いてみてくれ。
ボタン型にすれば動かない
151 名前:デフォルトの名無しさん :04/09/14 06:21:35 Delphi覚えたけど何の役にもたたんね
ウィンドウのサイズを縦だけ可変にしたいのですが
他にもやり方はありますが 縦だけ可変ということは横を固定にしたいわけだから Form の constrains プロパティで maxwidth と minwidth を同じ値に指定。
>>334 ありがとうございました。
ほんとDelphiって簡単になんでもできてしまうんですね。
Delphi7で主にテキストエディタ系を勉強したいのですが、 何処のどの本がいいですかね?
付録サンプルのテキストエディタのコード見た方が早いのでは?
コンポーネントの親の切り替えについての質問です。 TPanelやTMemoはParentを切り替えるだけで親を切り替えられたのですが、 WebBrowserコンポーネントのは場合うまく行きませんでした。 得たい結果としては「元々表示していたページ・入力していた値は消えない」で 「切り替えた先の親に合わせてリサイズが自動で行われる」です。 試したパターンでは、どちらか片方の結果しか得られませんでした。 WebBrowserの親の切替については直接の切替ではなく、親のパネルの切替でも 構わないのですが、なにか良い方法は無いでしょうか。 From1 Panel1 WebBrowser1 Button1〜Button4 From2 Panel2
//リサイズはフォーム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;
オブジェクトのシリアライズってできますか?
WebBrowserってActiveXだっけ? Parent切り替え時にウィンドウハンドルも再生成されるから、 その時に情報が失われるのかもしれないね。
>>340 出来ますけど。何か?
キーワード:RTTI。SaveToStream
必死こいてclassの勉強してます classのメンバに整数型の動的配列入れたいんですが、 どうやってアクセスさせればいいんでしょうか(文が変 hoge = class(TObject) private FList : array of integer; public ここに何書けばいいんかわかんない end; FList[n]の値を代入・値を取得したいです。
フラットボタンだな
>>343 たとえば
property Items[Index: integer]: integer read GetItems write PutItems;
コンストラクタでSetLength()しといてね
347 :
デフォルトの名無しさん :04/09/15 11:56:52
[ スレッドオブジェクトを作る時、名前つきスレッドを選択すると [エラー] Unit3.pas(67): 'TThreadNameInfo' と 'Cardinal' には互換性がありません って出るんだけど、どうすればいいですか?
コードを一行も示さずにそんなこといったって
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
>>347 TThreadNameInfoって何?
352 :
347 :04/09/15 14:51:34
新規作成でプロジェクトをつくって、スレッドオブジェクトを 名前付きで作成して、1行もコード書かなくてもコンパイルすると エラーになるんです。 TThreadNameInfoてのは、名前付きでスレッド作ると Delが勝手に作ってくるです。 スレッドのデモも実行出来なくて。 Del7でアップデートしたらおかしくなったので、その辺りかなと思ったり思わなかったり。。。
Del7だからな
エラーでてるところの前後4行くらい、ペーストできる?
>>352
355 :
347 その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}
356 :
347 その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;
手元でやってみましたが、エラー出ません。
RaiseException で「'TThreadNameInfo' と 'Cardinal' には互換性がありません 」 が出ているのだね? プロジェクトのコンパイルオプションの「型付 @ 演算子」のチェックをはずすこと。
あまり良くないエラーメッセージですね。 どうにかできるかな?
>>346 >>349 ありがとうございますー。
だんだんちょびっとずつコツがわかってきた、ような希ガスる。
>>349 を読んでて思ったけど、
TListにはポインタが入るってことは、
Listに加える内容はオブジェクトでも変数でもなーんでもイイヨ ってことになるんかな?
としたらものすげー便利?
ううむ、奥が深い
これだけのことで感動できるのか…
Star Team エディションってなんだ? まぁ、バージョンアップするほど使いこなしてないけどなー
343ではないけど、ポインタの概念理解できたとき無茶苦茶はしゃいだ…
気持ちはわかるな、おれも。実体を操作するよりずっと軽くて気持ちいいし。
>>341 そーですActiveXです。
確かに、
>>339 の「元々表示していたページが消えてしまう」場合のハンドルを
調べてみたら変わってました。WebBrowser1.LocationURLも消えてました。
「元々表示していたページ・入力していた値は消えない」場合は同じハンドル
でした。
ページが消えるのは困るので消えないパータンでなんとかしたいのですが、
リサイズ対象の件についてなにか情報がありましたらよろしくお願いします。
368 :
デフォルトの名無しさん :04/09/15 23:06:57
DBの日付データをDateTimePickerで入力したり表示するときはどうすればいいんですか?
>>367 あらためて Navigate したらいいんじゃないの。
>>369 レスどもです。
確かに消えてしまったページを再度Navigateすればページは表示されるんですが、
入力していた値が消えてしまったり、表示位置が先頭に戻ってしまうのが不便なのと、
実際のプログラムでは複数のブラウザコントロールに対して親の切り替えを
一気に行うので、再度読み込みに行ってしまう事を控えたいというのがあります。
>>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;
>>370 もうさ、Parentプロパティは一切設定しないでさ、
ブラウザは動的に作成、親はAPIのSetParentで設定、リサイズは自分で行う
って風にしてしまうのはどうだい。
間違えた。訂正 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;
(;・∀・) 8秒差でかぶったぜ
Align が自動じゃだめなんだな
すみません、さらに訂正 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;
>>371 サンプルコードわざわざどうもです。試してみました。
これは初回移動時用でリサイズは自前の場合の例ですよね。この場合、
親のリサイズ時にはSetBoundsで子供のサイズ変更が必要になりますね。
>>372 ブラウザの動的作成も試してみたんですが、結果は最初から貼り付けた時と
同じでした。
「リサイズは全部自前」も考えてはいたんですが、複数ある子供を管理する
仕掛けを作らないといけなそうなので、最終手段かなと思ってました。
自分が親になってるコントロールをぐるぐるループして見つけてサイズ変更
していくとか、各親に子供のブラウザーを管理するリストをつけるとか。
それと、どうもリサイズが元の親に対して行われてしまう原因(Parent以外の
何か)を見逃してるような気がしてたもので。
> ブラウザの動的作成も試してみたんですが、結果は最初から貼り付けた時と同じでした。 それはたぶんその後ParentやAlignを設定したからでは。当然結果は同じだね。 > それと、どうもリサイズが元の親に対して行われてしまう原因 それはAPIでSetParentしても、VCL側ではParentが元のままだから、ちゅう単純な理由だね。 それでParentを一切設定せずに全部自前ってのを薦めたんだけも、まあいろいろ悩みがあるようだね。
>>378 >>ブラウザの動的作成も試してみたんですが、結果は最初から貼り付けた時と同じでした。
>れはたぶんその後ParentやAlignを設定したからでは。当然結果は同じだね。
そうですね。というかParentを設定しないと見えなくなっちゃっていたので。
>それはAPIでSetParentしても、VCL側ではParentが元のままだから、ちゅう単純な理由だね。
なるほどそうなんですか(といいつつ完全には理解しきれてませんが)。
可能ならロジックは減らしたいというのもあったんですが、「リサイズは全部自前」は
最終手段というほどのものでもないですし、もう少し情報を待ちつつ調べてみて、
方法が見つからなかったら自前にしてみようと思います。ありがとうございました。
ListViewでOwnerDataをtrueにしていると、OnCustomDrawItemでCanvasを 変更しても実行時には変更されないのですが、こういう仕様なのでしょうか? OwnerDataをfalseにしていると、Canvas.Fontなどの変更も反映されます。
ポップアップメニューでメニューを選択したときに 「メニューアイテムの選択が、右クリックか、左クリックか」を OnClick内で判別したいのですが、どうすればいいのでしょうか?
そんな変なUIを作る人はVBを使って下さい。
矢印キープラスEnterでも選択できるわけだし
>>382 人に使って貰うソフト用でなくて、自分専用のソフトで
ナビゲートを少しでも効率的にしようかと思って考えた
んですが、やっぱり変ですよね(自分専用だから変でも
良いかと思ったんですが)。
>>383 キーボードのときは左クリックとすれば問題ないかと。
OnClick で GetAsyncKeyState を。VK_RBUTTON が使える
>>385 ありがとうございます。が、メニューが選択された時点では
ボタンは既に離されているので、同じ値しか返ってきません
でした。
クリックされたマウスボタンではなく他の方法を使って実装
しようかと思います。
Visual SourceSafeでは通常のクリックで実行、 Shift+クリックで詳細なダイアログを表示して実行ボタンを押すと実行というので使い分けてるな。 で、そのダイアログにはSHIFTを押したときのみこのダイアログを表示みたいなチェックがついてた。
>が、メニューが選択された時点ではボタンは既に離されているので、 >同じ値しか返ってきませんでした。 あのね、そのとき押してるかかどうかのほかに履歴も取れるんだよ
妄想で書いてないで実験してちゃんとしたコード書いたら。
指定したフォルダ以下にある全てのフォルダの名称を取り出したい のですが、どうすればよいでしょうか?宜しくお願いします。
>>390 FindFirst
FindNext
FindClose
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;
>>388 でもメニューをポップアップする時点で右クリックするわけだから、
右クリックの履歴をとっても常に「クリックした」となると思うのですが...
OnPopUp で一度呼び出して履歴をクリアしてるんだよな
って
>>381 は試したの?
ちゃんと動くよ。
教えがいの内野氏だな
代案厨と妄想厨のせいで無駄に長引いてしまいましたが解決しました。 スレ汚されて迷惑な話ですが。
無駄に長引いたのは自分のコードを一行も示さないからだと思うな
スレ汚しは381
スレ汚したのはむしろおま(ry
教えてもらうのに、正解以外は妄想だとか代案だとかいってけなすのはどうかと思うぞ 正解が見えないからこそ、いろいろやってみるんだと
正解が一つとも限らないし。 教えてもらうのがヘタな香具師は結果的に自分が損することになるよ
どうやって解決したかも書いてないし・・・情報ぜろ
自覚症状のない典型的な痛い奴
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
別に望んでいない人にはコンサルティングよりQ&A
>>392 , 394, 395
遅くなって申し訳ありません。時間が無くてテストできませんでした。
394,395さんのレスで392さんのコードが分かりました。
いま試したところ、ちゃんと動くようになりました。
みなさん、ありがとうございます。
TClientSocket を使って通信を行っているのですが、 非ブロッキング通信だと正常に切断されるのに 全く同じことをブロッキング通信で行うと、いつまで待っても切断されません(TClientSocket.Socket.Connected が False にならない) どういうことなのでしょうか?
相手側がちゃんと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;
>>411 var
pos: TSmallPoint;
begin
pos := TSmallPoint(Memo1.Perform(EM_POSFROMCHAR, 5, 0));
Caption := IntToStr(pos.x);
end;
すげぇ・・こんなことができるなんて考えてもみなかったぜ
>>410 同じことを非ブロック通信でやれば問題ないのですが、
これは相手側が確実に切断している事にはなりませんか?
非ブロッキングとブロッキングのコードが意味的に同じであることを保証してくれるならなる。
ファイルのドラッグアンドドロップに関する質問なんですが、 ウィンドウのクライアント領域だけドロップを受け付ける (タイトルバーや枠では受け付けない)ようにするにはどうしたら 良いのでしょうか? DragAcceptFiles(Form1.Handle,True) でドロップを受け付けるので、 DragAcceptFiles(Form1.ClientHandle,True)でも出来ると思ったんですが、 これだと全く受け付けてくれません。 仕方が無いので、クライアント領域と同じ大きさのパネルを置いて、 そのパネルをドロップを受け付けるようにする、と考えましたが、 他にいい方法は無いでしょうか?
>DragAcceptFiles(Form1.ClientHandle,True)でも出来ると思ったんですが、 MDI親フォームなの? そうだとしても、ClientHandle に対応するウィンドウはフォームじゃないよ。 別ウィンドウだけど。 下の方法がいいと思うけど、なんか都合が悪いことあるの?
>>416 OLEドラッグ&ドロップなら、カーソル位置によってドロップ禁止したり自由に出来るけど、
パネル置くより面倒かも。コンポーネント拾ってくれば楽かもね。
ちなみにClientHandleはFormStyleがfsMDIFormの時なら使える。
>ちなみにClientHandleはFormStyleがfsMDIFormの時なら使える。 使えるけど TForm のメッセージハンドラでは WM_DROPFILES は受け取れないよ
>>419 別にApplication.OnMessageで受け取ればいい
パネルを使ってはいけない特別な理由があるのだろうか…
なんとなく邪魔なんだろ
非クライアント領域で受け取りたくない理由も分からないし
うだうだ言ってんのがいるな…。代案厨の派生か何かか
ちょっとした疑問 代案って何か問題あるのか?
>>428 ただ代案を出すだけなら問題ないんでない
199 名前:お馬鹿な回答者の為の回答フロー[sage] 投稿日:04/08/10 13:58 〜がありますか? if あるなら then その方法を提示; if ないなら or 現実的でないなら then begin 直接的な解はないと回答 while さらに別の方法が必要か? do 一段階上位の要求を聞きだして、その方法を提示 end;
昨日から変なのがいる。時々騙りもするみたいだし。キモイ
>>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 がキューに入ることしらんかった。ありがと
if 自分には解決できない then ShowMessage('なんでそんな事するの?必要あるの?')
>>430 どうでもいいんだが、
> if ないなら or 現実的でないなら then
> begin
> 直接的な解はないと回答;
じゃね?
>>433 今回の場合は
if 簡単に解決できるけど then ShowMessage('なんでそんな事するの?必要あるの?')
ってことだよ。質問自体の内容はハッキリしてるけど、理由が不明だから、簡単に解決する
けど、なんだか変 って感じなの
レスありがとうございます。
パネルを使って処理する事に特に問題は無いんですが、もし使わないで
同じことが出来るならそうしたいと思い、質問した次第です。
パネルを使う方法と、うまく使いこなせるか分かりませんが、
>>432 さんのコードも試してみたいと思います。ありがとうございました。
>>436 MDI親フォームなの?
そうなら、
>>432 でいいけど、普通のフォームならパネル使って
>>432 のコードで ClientHnalde
のところを Panel1.Handle に変えてね
>>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 されているようです。
ドキュメントが正しく、OSが間違ってるかもよ?
わははは、きみはドキュメントの上でアプリを走らせるわけじゃないだろ
441 :
デフォルトの名無しさん :04/09/19 08:40:28
ちょっと躓いたので質問させてください FindFirstでファイル一覧を取得しているのですが、とある複数の拡張子を取得したいと思っています *.txtと*.htmlのみを取得しようとしたら、FindFirstをそれぞれ二回やらないとダメでしょうか? 二つ三つならまだいいけど、十個などになるとさすがにきついと思うので 何かスマートな方法ないでしょうか?
*.*で検索してExtractFileExt、UpperCase、AnsiMatchText, AnsiMatchStrあたりで比較
const Extentions:string = 'txt;html;'; *.*で検索 ExtractFileExt(FileName)+';'でPos
10個も検索するの?
>>443 酷いコードだな
tmlでも引っかかるし
だいたい ; ってファイル名に含められるし
TFileListBoxをこっそり使うとか。
>>442-447 *.*で検索後から必要な物を抜き出す方法を試してみました。
うまくいきました。ありがとうございます。
でもTFileListBoxをこっそり使った方が手間が省ける事が解かって
ちょっと気が抜けちゃいました
ま、若いうちの苦労は買ってでもs…と言うことで
450 :
デフォルトの名無しさん :04/09/19 19:17:10
質問させてください。 TListViewのOwnerDataとOwnerDrawをtrueにして、仮想リストビューとして使っているのですが、 MemCheckユニットで確認したところ、終了時にメモリリークするようになってしまいました。 穴が開くほど確認しましたが、自作クラスなどの解放はやっています。 また、OwnerDataをfalseにすると、メモリリークは起こりませんでした。 MemCheckによって生成されたログを見ると、リークはTListItem.Createで作られた インスタンスだと思われます。 OwnerDataを使うのは初めてなのですが、もしかして、何か自前で解放しなくては いけないのでしょうか? また、そうだとしたら、具体的に何を解放すればよいのでしょうか。 一応、フォームのOnDestroyに、リストアイテムを解放させるコードも書いて試してみましたが、 思った通りアクセス違反の例外が発生しました。
素のDel6では、OwnerData使うとリークするバグがある。 Proだとアップデート当てれば直ったはず。Perはどうだかわからん。
>>451-452 ご返答ありがとうございました。
情報の後だしになってしまったようで申し訳ないのですが、
Delphi6ですが、既にUpdate2パッチは当ててあります…。
また、
>>452 のバグは、TSubItem周辺のものだと思われますが、
仮想リストビューでSubItemは全く弄っておりません。
もつかれさま。 ファイルパスが UNCかC:\形式か、それともファイルパスとしてふさわしくないか を調べる関数など、JEDIとかMonaや自作ルーチンで あったら教えてくださいませ。 場当たり的な実装ではなくて(場当たり的なのは自作できるし) 比較的汎用的なものがほしいです。 あと、ファイルパスが何階層目なのかを調べる関数なども あったら教えてくださいませ。 .NETあたりにはあるのかな?
実際に存在するかとかは関係なく字面の形式性のチェックってこと?
アクセスが遅いメディアからムービーを読み込んで再生させようとすると、 音声と映像の同期がとれなかったり、再生が遅延したりしてしまう・・・。 TMediaPlayer使ってるんですが、なんかいい解決法ないですか?(´・ω・`) FormCreate内でopenしてplayしようとすると、映像が展開される前に 音声だけ流れ始めたりして、再生がしっちゃかめっちゃかになります。 もちろんHDDからだと問題ないけれど、CDに焼くと途端に崩壊・・・。 TWindowsMediaPlayer使うと上手くいくんですが、ユーザの環境 (プレーヤのバージョンとか)に思い切り依存するのでボツりました。
>>455 さん
そうっす。
となると、生気表現かすら?
>>456 某所で「ぎこちないTMediaPlayerのムービー再生」というタイトルで質問してた人ですか?
isvalidpathってのが引っかかるんだけど何物?
>>454 ない。作れ。すぐできるぞ。
\\で始まるか、アルファベット:かで区別すればよい。これ以外は相対パスかな。
不正な文字が含まれているかどうかチェックをつけるかは任意で。
463 :
450 :04/09/20 11:53:39
ageさせて頂きます。
そもそもOwnerData := TrueでItems.Addするのがおかしい。 そんなことをしたときの挙動がおかしいのかもしれないね。 ほんとはInvalidOperationだかの例外を投げるべきなのかもしれないけど。
すまん。少し保留しといて。 とりあえず解決するにはItemsではなく独自のコンテナにデータを保持して OnData,OnDataFindでデータをセットすればリークは消えるはず。
ヘルプより 仮想リストビューコントロールに格納される情報は,選択およびフォーカス情報だけです。 だから、自分で開放しなけりゃリークするのは当然だと思うけど。
>>464-466 ご返答ありがとうございます。
どうも私の使い方が間違っているようですね…。
独自のコンテナを使うのは問題無いのですが、
リストビューにOwnerDrawで表示する場合、どんな風にイベントが起こるのでしょうか。
(例えば、リストアイテムの数などは、どのイベントで設定するのでしょうか。)
何分、OwnerDataを使うのが初めてなので、ノウハウが良くわからないです…。すいません。
TListView OwnerData などで検索してみましたが、
ヒットするサムネイル表示のサンプルでは、OwnerData:=Trueの状態で
Items.Add をしていますね。やはりこれも間違っているのでしょうか。
正しいサンプルが見つかりません… orz
と思ったら、TListItems.Count はReadOnlyなプロパティじゃなくて 設定できるのですね… orz なんとかなりそうです。ありがとうございました。
グラフィックス関係のコンポーネントを 使ってプログラムを実行しようとすると Graphics.pasがないです といわれてしまうのですが、 どうすればいいのでしょう。 このファイルはどこでダウンロードできるのでしょうか。
お使いの Delphi のバージョンと、 使いたいコンポーネントの名前。 おそらくは、バージョンの不一致。
>>469 uses節に「Graphics」を追加すると、どう?
>>470 Delphiのバージョンは6です。
使いたいコンポーネントはデフォルトでついている
OpenPictureDialog
Image
Buttonです。
ダイアログを出して、画像ファイル(jpg)を選択すると
上記メッセージがでます。
>>471 自動的に追加されてました。
6 Personal かな? で、コンパイル時ではなく、アプリ実行時のエラーなのですね? それは、単にデバッガがソースコード表示をしようとしていて、 Personal 版だからソースがない。といってきているだけかと。 無視してください。 ただ、デバッガが開いたということは何かバグがあったということですから、 虫取りしましょう。
>画像ファイル(jpg)を選択すると uses に jpeg を追加してみると変化があるかも。
>>474 kita-------
キターーー
キターーーーー
きたーーーーーー
来たーーーーーーー
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
いいからもちつけ
478 :
450 :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による複数選択が使えないのは
辛いです。何か代替案等ありましたらよろしくお願いします。
すいません、訂正です。 Ctrlによる複数選択は SelCount に反映されるようです。 正しくは Shift で複数選択を行った時、でした。
>478 ああ、subitemの話じゃないのか。それなら477は関係なかった。
API直呼び。これ最強。つーかVCLのListViewバグが多いし 使えない機能もあるんでAPIに頼らないとダメなんだな。
そうかい
調べてみましたが、どうやらShift選択すると、Selectedにすら反映されないようです。
それで、
>>481 さんの言う通り、LVM_GETNEXTITEM で直接数えてみましたが、
やはりShift選択に限っては 0 になりました。
恐らく、仮想リストビューでShift選択しても反映されないのは、
Windowsの仕様(もしくはバグ)みたいなので、APIスレに行って参ります。
ぶっちゃけ、お前のバグが原因だ。まず、自分自身を疑え。話はそれからだ。
関数で2つの値を返したいときはどうすればいいんでしょうか? 配列に入れて買えそうと思いましたが、 function() : Integerとか function() : Arrayとか やってもうまくいきません。
そういうときは、頭にvarを付けた配列またはレコード型の引数を使う 関数内で結果をその引数に代入すれば戻せる。
引数をポインタのようにして扱うという ことなんでしょうか??? クラスにした方がいいような気がしてきました。
案その一 procedure 一度に二つの整数を返す関数 (var x, y : integer); begin x := 1; y ;= 2; end;
案その二 type 二つの整数を保持する型 = record x, y : integer; end; function 二つの整数を保持する型を返す関数 : 二つの整数を保持する型; begin result.x := 1; result.y := 2; end;
ちょっと先が思いやられるので、半日でいいから文法書を読みなさい。 基礎力付けとかないとこの先大変だぞ
ざっと試した感じ、Shiftを押して項目を選択すると、
いったん全体が解除されて、OnSelectItemが発生する。
このとき引数であるItemはnil(=全体)で、SelectedはFalse(=選択解除)。
>>485 のソースだと、このときSelCountを表示してるので、0が表示される。
で、その後はOnSelectItemではなく、OnDataStateChangeが発生する。
ここでは選択範囲をインデックスで知ることができ、
SelCountにはちゃんと選択数が入っている。
つまりSelCountが0と表示されたのはバグでも何でもない。
全体解除されるタイミングがあり、そのタイミングで表示しただけのこと。
>485 MLに同じ質問があるから検索汁。
やっぱりくらすにした方がスマートなような気がする 戻り値を因数にするってのが なんかいやだ〜〜 単なるこだわり
×因数 ○引数
×いんすう ○ひきすう
いんすうでも間違いではない
金地院崇伝
>>485 APIスレに投げた質問取り消しておけよ。
>>498 マジで最近は「いんすう」でも間違いではないらしい。
こだわるのは考えが古いのだろうか
>>492 うは、なるほど。OnSelectItemで取得していたのが悪かったのですね… orz
OnDataStateChange で拾う事に致します。
詳しいご説明ありがとうございました。
>>493 既出でしたか…。申し訳ありません。検索したつもりでしたが、漏らしていたようです。
>>500 かしこまりました。
皆様お手数をかけてしまい、申し訳ありませんでした。
お陰様で、OwnerData の使い方が大分理解できました。
有難うございました。
ていうかそれくらいサンプル作っとけよ>某
いいえ、ちゃんとありますけど。
>>505 ほんとだ… orz
身を持って習得できたので悲しいけど嬉しいです。。。
Delphiのオブジェクト指向は メンバーにクラスを持たせることができる仕様なんでしょうか・・・?
>>507 質問が曖昧なのでもう少し具体的に。
クラスのインスタンスを持たせたいのか
メタクラス(クラス参照)を持たせたいのか
クラス内でクラスを定義したいのか。
上の二つなら可能。一番下はDel8なら可能。
iniファイルを作成したく、作成先を c:\Documents and settings\ユーザ名\ の下にしたいんですが、ユーザ名のところには何て書けばいいですか?
そんな所に作らない方がいいよ。
コンパイル時に[エラー] Unit1.pas(33): 文字列の要素が 255 を超えましたというエラーがでるんですが、 回避する方法ってありますか?
>>508 ありがとうございました。
UML敵にどう書くのかなw
イメージ系のクラスが大量にあって どれがどれだかわからなくなってくるのですが うまくまとめているページありませんでしょうか。
>>515 いやクエリとか書いてて、マジで256以上なるんですよ。
んで、一つの句ごとに改行しているので、
なんかあまり美しくなくて。
>>512 ・プロジェクト(P)-オプション(O...)で出てくる設定ウィンドウの コンパイラ タブにある
「長い文字列を使う」にチェックを入れる。
・string[255]、ShortStringなどを使わず、普通にstringを使う。
・PCharを使う。
データベースの制限についてはわかりません。
Delphi5を使用しているのですが、 [エラー] XXXX.pas(2455): for ループ制御変数 'i' に代入しました と表示されるのですが、DelphiだとFor文のループ制御変数に値を代入する 事はどうやっても出来ないのでしょうか(ノД`) VBだと普通にi=5とか出来たのですが・・・。
>>518 できません。
while文かrepeat文を使いましょう。
>>519 出来ないのでしかー。
わかりますた。アリガトン
長い文字列定数の定義は、文字列リテラルを結合します。 longlong = '1......' + '................' + '................'; 一行 1024 文字、ひとつの文字列リテラルが 255 の制限があるだけで 文字列定数そのものの制限は... 8192 文字までは試した覚えあり。
522 :
デフォルトの名無しさん :04/09/21 15:27:57
>>516 TQuery.Add('ほにゃらら');
とかで分割して入れたらOK!!
ははーん。 ''の間はどうしても255文字までなんですね ということは、そんなふうに分けないといけないのでつね。 なんか、あまり美しくないようなきもしますが・・・ さしあたりありがとうございました。
確認のために追加。 定数式の結合はコンパイル時に行われるので、ソース上で最長 255文字ごとに 改行が必要になるだけ。生成コードは最初からひとつの文字列になっています。
一部の引数の省略可能な関数・手続きはどうやって作ったらよいのでしょうか? 例えば、Inc関数なんかは Inc(i); でも Inc(i,10); でも使えますよね。こんなのを作りたいんです。 とりあえず、今はoverloadで全引数有りと一部引数抜きの2つを作ってごまかしているんですが overloadを使わないで作る方法を教えてください。
procedure myinc(var i: integer; delta: integer = 1); begin inc(i,delta); end; myinc(i); myinc(i,10);
>>526 サンクスです。
実は、今自分で書いてたとこなんですが
質問してから自分でやってるうちに解決できました(泣
画像の拡大・縮小に StretchBlt関数を使っているのですが 品質がいまいちです。 もっとよい品質で拡大・縮小をする方法はありませんでしょうか?
まさか自分で実装しなきゃいけないとかではないですよね・・・。 PHPみたいなスクリプト言語でさえ綺麗なサムネイルが 作成できる時代に・・・・。 ちなみにDelphi6 Personalです。
どうやら自分で リサンプリングのコードを書いて 実装させる必要があるみたいですね・・・。 ひえー。
GDI+とかのライブラリを使えば良いのでは? JEDIに定義ファイルがあったはず。
中村先生が画像関連のライブラリ公開してたような
HALFTONEは95/98じゃ使えないんだっけかな。まあこんなOS切り捨て(ry
535 :
デフォルトの名無しさん :04/09/22 00:15:49
∫,,,,,,,,,∧,,∧ 今日も、もつかれー ⊂,,,,,,,,,つ,,゚Д゚ミつ ちょっとメモリク話題が出たので もいちど話だしときます 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すれば よさそうですけど... 何か回避策とかありますか? そもそもこれはバグ?漏れの環境だけ?
実際漏れてるな
回避策 if CheckListBox1.count>0 then CheckListBox1.Items[0] := 'テスト0'
>>538 それ違う。Button2を押す前にButton1はもちろん押してるぞ。
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とかするしか。
ポップアップメニューが表示されているかどうかを 判定する方法はありませんか?
Spy++
そのポップアップメニューは自分で表示したものです。 でも、モーダルダイアログと違っていつ閉じられるか イベントがないのでどうしたらいいものかと
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;
こんな感じじゃ無理ですか? if menuhoge = nil then showmessage('メニューは表示されてないよ') else showmessage('メニューは表示されてるよ');
WM_EXITMENULOOPをメインウィンドウで拾えませんか?
できました。ありがd
550 :
デフォルトの名無しさん :04/09/22 17:56:38
Delphi5Proでソフトを作っているのですが、いつも必ず0による除算の エラーが出てしまいます。 /で検索をかけても/はコメントと日付のセパレートとしてしか 使われていません。 F8の乱打ではとても追いつけないほどループを繰り返しているので、 F8も使えないのですが、0による除算のエラーがでる直前のところで 処理を止める方法はないでしょうか? あるいはどこで0による除算のエラーが出たか知る方法はありませんか? よろしくお願いします。
>>550 すこしづつ絞っていくことぐらいはできるのでは?
なお、 div も割り算です。
552 :
デフォルトの名無しさん :04/09/22 19:11:26
FireBird1.5を使ってるのですが、どこかでなるべくIBTableを 使わないほうがいいという書き込みを見たような気がします。 C/SではIBTableを使わないほうがいいんでしょうか? 予想レコードは10万件、同時接続クライアントは10件くらいです。 代替えにIBQueryかIBDataSetを使おうと思ったのですが、使い方が分かりません。 IBTableだとDataSourceと一つずつあればとりあえず動きますが、IBQueryとかだと DataSourceと排他ですよね。ヘルプ見ても分からないので質問しますが、 DBコンポーネントと連携したいのですがどういった構成で使うものなんでしょう?
>WM_EXITMENULOOPをメインウィンドウで拾えませんか?
メインウィンドウのポップアップなら拾えるんでは。
その他のコントロールなら、それ自身で拾うか、
>>64 とかフックとか
>>552 結局IBTableもクエリー流してるだけじゃないの、
といってみるテスト。
>>550 メモリ関係のエラーが発生した場合、無関係なエラーメッセージが出る場合がある。
配列操作やクラスの生成解放などで、怪しい所はないですか?
mod も割り算です。
557 :
デフォルトの名無しさん :04/09/22 22:55:44
質問です。 TListBox の Columns を設定すると、スクロールバーが水平方向しか出ないのですが 垂直方向にスクロールするようにはどうしたらよいでしょうか。 Style には lbVirtualOwnerDraw を指定して、仮想リスト+オーナードローで使ってます。
ScrollぼxにListぼxを乗せる。ではダメかね。
スクリーンショットを撮って保存する方法おせーて下さい
キーボードのPrint Screenを押してペイントに貼り付けて保存。
Delphiのコードでおながいします
begin Google; end
すみません、ググったら意味不明なスクショが出てくるだけで解説が無いんです、、、
SavePictureDialogで フィルターをたとえばjpgにしていたら、 ファイル名に拡張子を指定していない場合でも 自動的に.jpgという拡張子をつけて 保存するようにしたいと 考えているのですが、どのようにしたらいいのでしょうか?
Delphi6 Personalです。
DefaultExt
if FileNameに拡張しか含まれていない then if FilterIndex =1 then DefaultExt := bmp FileName := Filename +'.'+ DefaultExt みたいな面倒なことしなきゃだめなんでしょうか?? もっとスマートな方法ってありますか?
>>570 FileNameに何が返ってくるのか試してみたのか?
それじゃD6インストールしてませんって言ってるようなもんだぞ?
ためしてみました。 てことは、やっぱりこの面倒な方法しかないんですね・・・・・
PictureDialogで bmp、jpeg以外の画像をクリックすると デバッグでエラーがでてしまいます。 このエラーを回避するにはどうしたらいいのでしょうか? (エラーを出さずに、単に「なし」と表示させたい)
Filterをbmp、jpegだけにするのはダメなの?
ちょっとお尋ねします。 bmpをクリップボードにコピーして、 他のソフトから読めるようにする方法を 説したサイトなんてないですか?
ヘルプ
ヘルプを読むと分かるよ 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;
画像を開いて表示するだけのソフトなのですが、 Formのサイズをautosizeにしていたときは大丈夫だったのですが、 画像を開くと同時にその画像の高さ・幅をformの高さ、幅に 指定するように書き直したところ、 画像を開いた瞬間にWindowsXPのVisualStyleが 適用されないウィンドウに変化してしまうようになりました。 これはどうしたらいいのでしょうか?
Delphi6 Personalです。
どうやらスクロールバーがでるような操作をすると、 Visual Styleが無効になっているみたいです。 何か参考となる情報
ScrollBox つかったら
ScrollBoxを使うとうまくいきますが、 ユーザーが故意にウィンドウサイズを変更して スクロールバーがでるような 状態になったときにやはり VisualStyleが適用されないウィンドウに なってしまいます。 これはDelphi6の仕様上どうしようもない 現象なのでしょうか。
ScrollBox の Align を alClient にするだけ
Updateで直ったような気がするけど?
Updateしてみます。 ただいまダウンロード中・・
UPdate Pack#2までいれたら VS適用されました!!
>>577 ありがとうございます。
やっぱりその方法ですか。
以前、その通りにやって、クリップボードにコピーされたはずのbmpが
他のグラフィックソフトで貼り付けできない(というか、「貼り付け」メニュー
項目がアクティブにならない)ことがあったので。。。
もう一度やっています。
単純な画像ビューアーをつくっています。 画像が表示されていないときは メニューのコピーや切り取りをつenable := falseにして 画像が表示されていたらtrueにしたいとおもってます。 「開く」メニューや「閉じる」ボタンにいちいち その処理を書いていくのは面倒なので ユーザーが何かの操作をしたときに毎回 Imageがからかどうかを確かめてそれによってメニューが 使えるかどうかを設定したいと思っています。 そこでユーザーが何かの操作をしたときに毎回 呼び出されるようなプロージャってあるのでしょうか?
OnMouseDownやOnClick等のイベントから共通の関数を呼ぶようにすればよいだけ。
その機能を手続き化しておいて 「開く」や「閉じる」の中でその手続きを呼び出す。 これすら面倒というのならつける薬はないだろ。
>>588 メニューの項目の Enabled を決定するのは、それがぶら下がっている項目の
OnClick イベントで表示される直前に。
それ以外の方法では面倒
やっぱりいちいちすべてのメニュー、操作に 編集を加えなきゃだめですか。 了解しました。
TActin/TActionList使っとけ。
>>593 試してみます。
>>594 同じ動作をいろいろなところに分散させて記述するのは
仕様を変更したり機能を拡張したりするときの
バグの元になります。
1カ所にまとめてそれを呼び出すんだよ
>>557 Windowsのリストボックスは縦スクロールか横スクロールしかできないと思います.
グリッドではだめですか?
すいません、
>>558 さんのレスに気づかずに読み飛ばしていました… orz
>>558 ,597
えと、申し訳ありません。どうも自分の使い方にはTListViewの方が
あっているようなのです。
ただ、TListViewでは大きなアイコン表示でオーナードローする際に、
アイコンとアイコンの間隔がWindowsの設定のものになってしまうので、
それをアプリケーション側から(Windowsの設定を弄ることなく)決めたいと思っています。
これは、可能でしょうか。もし可能ならば、具体的にはどのようにすれば良いでしょうか?
また、ImageListを設定せずに、1項目のサイズを設定する方法はあるのでしょうか?
それ 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;
TPageControl/TTabControlのMultiSelectedがTrueの場合 どうやって選択しているタブを取得するのでしょうか?
603 :
デフォルトの名無しさん :04/09/24 17:00:49
Del4のgraphsv3は、Del7ではどうなりましたか?
>>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);
とできるだろう。
勘違いしてるぞ
607 :
603 :04/09/24 17:54:12
TGraph が見当たらないんですが、 どうしたら良いんでしょうか?
608 :
デフォルトの名無しさん :04/09/24 18:47:55
>>605 すみません、おおざっぱに抜粋し過ぎました。
605さんのその方法はよくわかります。
しかし、ストリームのデータサイズが不定のため、その方法は
やりたくないんです。
うまいことキャストとかしてStream.Memory(要はPointer型)を
引数であるarray of Charに渡したいんです。
>しかし、ストリームのデータサイズが不定のため、その方法は >やりたくないんです。 意味不明。不定だからこそ 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のままじゃ無理ですもんね。
・・・渡される方が変更できないんです・・・
マルチポストは嫌いじゃ
>>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;
IEコンポーネントの使い方を解説したサイト キボンヌ
2chブラウザのサイト
616 :
デフォルトの名無しさん :04/09/24 23:30:59
Free Pascal Compilerのドキュメントの日本語訳はどこにありますか? 穂積一平さんのサイトにあるようですが、見つかりません。
マルチポストは人間のクズ
一週間粘ってだめだったら書き込もうと思ってて、だめだったので書き込ませてもらいます。 プログラミングをはじめたのが上記のとおりの真性初心者なんですけど (ifとforをやっと理解できた程度の雑魚です。。。) BUTTONを押したら他のアプリケーションが複数機動できるようにしたいのですが、 どういうコマンドがありますか?? 本当にへぼい質問ですいません。ご教授のほどよろしくお願いします。
ShellExecute
>>619 ShellExecute(絶対パス)
でいいのでしょうか??
スタイル付きのテキストを編集・表示したいのですが どうしたらよいのでしょうか? メモ帳の拡張版みたいなのを作りたいと思ってます。
>>621 そうですね。教えて君ですみませんでした↓↓以降気をつけます!!
624 :
デフォルトの名無しさん :04/09/25 00:24:13
Fortran ⇒ MS-C ⇒ VB6 とプログラミングしてきたんですけど Delphi6がわからないです。。。orz 秀和システムの「基礎からわかるDelphi6」を買ったんですけど いまいちで。。。 ギコナビ・プロジェクトははるか先です(涙) 初心者にナイスな本を教えてください。 お願いします。
VB6がわかればDelphiもわかると思うけどな
626 :
624 :04/09/25 00:29:02
>>625 コードの書き方というか、とっかりになるような本ありませんか。
マルチポストではありません(´Д`)
>>624 塚越本(はじめてのDelphi,Delphiオブジェクト指向プログラミング)がおすすめ。
はじめて…は絶版だったかな?
コンソールアプリを多用していて一見とっつきにくそうだが
余計なものがない分すごく分かりやすい。そして…
Delphiに慣れてくるとVB6に対して今までと違う感情を抱くようになるw
7,8年前の本がオススメって、なんかむなしいな。
>>626 = >624
『コードの書き方』というのが漠然としていて何を指すのかがはっきりしませんが,
言語仕様をお知りになりたいのでしたらオンラインヘルプの
『Object Pascal言語ガイド』をご覧ください.
できればどこまでできてどこでつまずいているかを具体的に書いていただければ
より適切なアドバイスのレスが返ってくるのではないかと思います.
アフェリとかじゃねーから是非買ってくれよ。 delphiがもっと楽しくなるぜ。 怪しいと思うなら、紀伊国屋書店で検索な。
基本的に分厚い本を買ってくれば 上達した後でも辞書がわりに使えたりして便利。 初心者向きの薄めの本はわかりやすいし、たくさんの機能を紹介してるけど 広く浅くしか紹介してないから ちょっと突っ込んだことやろうとするといきなり情報がなくなる。 それに、分厚い本といっても1ページ目から全部読む必要はない 自分が面白そうだと思ったところだけ読めばいい 今は興味がなくてわけがわからないところも レベルが上がってくれば意味がわかるようになるし 個人的には分厚い本がお勧め。
ああ、薄い目の本だけど塚越さんの本は確かにいいよ。 あれも辞書代わりに使える。 クラス設計のところが非常細かくて、ちょうどクラスに興味のあったころだったから 自作クラス作る際のいい教科書になった。 薄い本で使えないと思ったのは、「Delphiの奇跡」とか「Windows98ではじめるDelphiプログラミング」とか・・
基礎からわかるDelphi6って本を買おうか迷ってる。 これってどう?
>>638 あ、そこ見るの忘れてたー。やっぱAmazonの評価見て買った方がいいんですかね。
>>639 さいですか、ありがとうございます。
とりあえず、そこのページを見て学習してみようかな。
>>640 なんか信用しがたいレビューですな(汗
フォントの変更だけができる WYSSIGなHTMLエディタ を作ろうと思っているのですが どうしたらいいのか 途方に暮れています。 何かヒントになる情報をください。
Delphiを使った「プログラミング」の入門書 ありせんか? Delphi6Personalで
StringReplace関数でワイルドカードを指定することはできないのでしょうか? たとえば abではじまってssで終わる文字列を置換したいときは ab*ssと指定するとか。 このようなことができる別の関数があれば教えて頂きたいです。
どうやらできないみたいですね。 Delphiつかえねーーー
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'の使っていたメモリってちゃんと解放されるのでしょうか? いや、普通に考えると解放されるはずで解放されないとすげー困るんですけど、 ヘルプのどこを探しても解放されると書いてなくて気になってるんです
0 からだよ
気にする必要ない。ローカル変数でルーチン外に出たときほんとに解放されている かどうか気にしないだろ。それと同じ。
>>644 >StringReplace関数でワイルドカードを指定することはできないのでしょうか?
できませんね。
>abではじまってssで終わる文字列を置換したいときはab*ssと指定するとか。
「abではじまってssで終わる文字列」を検索する関数をつくる
んで
その結果を使って置換する。
これは簡単。
>>645 標準の関数や他人のつくった関数だけをつかって問題を解決しようとすると、Delphi
に限らずすぐ行き詰まります。自分の頭をつかって関数をつくる事から始めるといろ
いろ出来るようになります。Delphi は文字列の扱いが得意とは言えないけど、それ
なりにやりたいことはできると思うんですけど。
>>650 >Delphi は文字列の扱いが得意とは言えない
冗談も休み休み言え
休み 休み
コンポーネントのメソッドじゃない Delphiの関数ってどこかにまとめられていたりしませんか?
>>652 得意ではないと思いますよ。
いままでPHPつかってたんで
そこはすごく感じます。
PerlやPython、Ruby なんかのスクリプト言語は、テキストいじるためにあるような ものなので、Delphiより文字列操作は楽だよね。
まだ休み中・・・
スクリプトと一緒にすんなバカ
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
スクリプトより劣ってるのが気にくわないみたいだな。
Delphi は文字列の扱いが得意とは言えないだろ。
>>660 みたいなコンパイラ信者はどうにかならんかね
>>665 いってる意味が分からんけど超初心者スレだから許す
コンパイラ型の言語をマンセーし、インタプリタ型を見下すアフォのことだよ
うむ。 それぞれの長所、短所を見極めずに やれスクリプトは糞だのインタプリタは糞だのと喚く コンパイラ型とインタプリタ型というので言語比較してる時点でアレだな
なんか香ばしいのがいますね
>>649 > 「abではじまってssで終わる文字列」を検索する関数をつくる
この関数を作りたいのですがどの関数を使えばいいんでしょうか?
ヘルプで正規表現で検索したり
googleでDelphi 正規表現で検索したりしていますが
それらしい物がでてきません。
もし、こういった関数やコンポーネントが列記されているリファレンス
があれば教えてほしいです。
ちなみに今は
・カンタン!Delphiプログラミング
・はじめてのObjectPacalプログラミング
という本を参考にしながら勉強していますが
両方の本ともイマイチです。
>>670 ヘルプの
文字列処理ルーチン
文字列処理ルーチン(ヌルで終わる)
が参考になります。
自分がつくるとしたら AnsiStrPos() を使うでしょうね。
>670 TRegExprでぐぐってみな。
つくってみた。例外処理はなし、たたき台ということで。 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;
つづき。実行例 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 せいきひょうげんで検索したりしていますが それらしい物がでてきません。
RegExprじゃ読めねえからRegExにすれと何度(ry
IEコンポーネントで URLを開くんじゃなくて 文字列を引数として与えると それをレンダリングしてくれるような 関数ってないのでしょうか? HTMLエディタにプレビュー機能をつけたいと思っています。
DOM
>667-668 VB畑の方ですか?
Delphi C++ 関係のものですが
というか、スクリプト糞、インタプリタ糞なんて 誰もいってないけどね。 何か嫌なトラウマでもあんのだろうか。
↑上手く逃げたね
いや、実際 PythonとかLuaとかDmonkeyとかで遊ぶの好きだし
誰もそんなこと聞いてない
>>676 そういう場合たいていのソフトは一旦HTMLファイルに書き出して
そのファイルをIEコンポで開いてるよ
代案厨キタ━━━━(゚∀゚)━━━━ッ!!
>>685 おまえは相変わらず無意味なことばっかり言ってるな
なんか最近変なのがはみ出してきてるな
なんか香ばしいのがいるな
676=685
知らないなら黙っててもらえますか? スレが無駄に荒れると他の人にも迷惑なので。
夏はもう終わりました
スルー
自分で自分の首絞めるマゾはスルー
ボタンアイコンの素材集って どこかにおちていませんかね。 自分で作成しようと思ったのですが センスのなさに愕然としてしまいましたよ・・・。 Janeみたいなカコイイアイコンほしい・・・。
そうですね・・・ Delphi関係ないですもんね・・・ よかったらスレ誘導してください・・・・
>>676 Monazilla の資料室あたりにあった気がする
TreeViewで使うノードのアイコンを変えたい (カテゴリとノードで変えたい) のですがどのようにしたらいいのでしょうか。
おい、苺きんたまとかいうウイルス作ったのDelphianらしいじゃねーか 責任取れよお目ーら
デルファイアン? デルフィアン? デルファイラー? デルフィラー? デルファイニャン? デルフィニャン?
delphiなら簡単に作れるね
タダだしな・・
delphiは阿呆にやさしい言語 VBについで
阿呆にも
おなじことするのにわざわざやさしくない言語を使うヤツは阿呆以下だな
阿呆以下つーかマゾ
function Tfoo.baa: Thoge; var h: Thoge; begin h := Thoge.Create; h.Assign(Self); Result := h; end; というようなコードを見かけたのですが、 はじめから Result に Thoge.Create せずに ローカル変数をはさんだほうがよいのですか?
なんちゅう日本語だ
好みによりけり。
それだけのコードであれば明らかにhは不要。 単に試行錯誤した過程が残ってるだけだったり。
Delphiの仕様がわからない。。。 Enter押しても改行しなかったり改行しなかったり改行しなかったり・・・。
独り言はどっか別なところでやってくれ
>>714 何がしたくてどういう状況でEnterを押したのかぐらい書いてもらわないと
それだけでは何にもわからない
まさしく独り言だ。
プログラムの知識が皆無に近いんだケドも、興味本位でデルファイDLしてきました。 ヘルプ見ながらがんばればそこそこプログラムできる様になれるでしょうか?
ヘルプだけじゃつらいよ オンラインの入門サイトがいくつかあるからそこら辺眺めとくといいよ
>>718 おお、、オンラインかぁ。2ちゃんでは勉強できないかな。なんかギコナビ気にいっちゃって、使いたくてしょうが無かったり・・。
2chはアフォが多いので初心者には正直おすすめできない (2ちゃんねらーすべてがアホという意味ではない)
722 :
デフォルトの名無しさん :04/09/27 23:18:28
>>710 try〜exceptブロックをはさんだほうがよい。
一概にそうは言えない
724 :
デフォルトの名無しさん :04/09/28 05:05:04
クラスコンストラクタ内で例外を生成した場合、 当該クラスのインスタンスに割り当てられるべきだったメモリは自動的に開放されますか?
>>724 インスタンスのメモリが割り当てられてから、コンストラクタが呼ばれます。
コンストラクタの実行中に例外が生成された場合,デストラクタが自動的に
呼び出されてインスタンス・メモリが解放されます。
TreeViewコンポーネントのノードに URLやファイル名のデータを関連づけて 保存したいのですが どうしたらいいのでしょうか
NodePath1/NodePath2/NodePath3=C:\Windows\Calc.exe みたいにINIファイルに書き出したら
NodePathっていうのはどこから取得できるんでしょうか・・
ちなみにTextプロパティはかぶってもいい仕様です。
>>727 TStringList にURLを保持して、Node の Data のそのインデックスをキャスト
やっぱりそうするしかないですか。 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 のオブジェクト指向度が低いから、とはいえるかも
おはようございまs^^
738 :
デフォルトの名無しさん :04/09/28 22:15:04
Delphi7のコンソールアプリケーションで、コンソールを非表示にする方法ってありますか? (バックグラウンドで実行されるような感じにしたい) 初めてDelphi触ってるんで混乱中 orz
まぁbcc32で言うなら-Wオプションをつけてコンパイルry
システムの、警告のサウンドなんかを再生するには、どうすればいんでしょね?
>>740 MessageBeep(MB_ICONASTERISK);
742 :
デフォルトの名無しさん :04/09/29 00:44:03
背景の上にEditボックスを置いてるんですが、 Editボックスを透明にすることはできないでしょうか? borderを消すことはできたんですが。 Styleがないので、bsClearとかは使えないですよね
「透明」をもう少し説明しないとレスが付かないヨカーン。
透過ということです TLabelでいうTransparentみたいなプロパティが、TEditにないかと思って でもプロパティにないってことはないということなんでしょうかね
XP特製ボタンとでも呼ぶのか、あのふちの丸いボタンってコンポーネントでありますでしょうか?
>コンソールを非表示にする方法ってありますか? コンソールモードを OFF にしてコンパイル。 Win32 のコンソールモードは、アプリ起動時にコンソールが開くかどうかの違いしかない。 writeln などのコンソールとの読み書きを行わないアプリならコンソールモードでなくても 問題ない。 逆に、デバッグの時とかで VCL アプリをコンソールモードでビルドする場合もある。
747 :
デフォルトの名無しさん :04/09/29 11:57:52
748 :
デフォルトの名無しさん :04/09/29 11:59:13
Delphi6のPersonalでは、データベースを作る事は無理なんでしょうか? Proからで無いと無理な様な事を見た気がしたのですが、簡単な物でも作れればと思って。
DB対応コンポーネントが使えないだけでコード上からならいくらでも使えます。 例えばMSDE2000をインストールしてADOのタイプライブラリ取り込みして使うとか。
ようするにできません。
752 :
デフォルトの名無しさん :04/09/29 13:30:21
Interbase(Firebird)に論理型が無いのですがどうすればよいですか? DBCheckBoxを使いたいのです。
smallintで代用する。 値を判定してDBCheckBoxに相当する表示を工夫する。
TreeViewのノードを一意に決定できるプロパティって ないんでしょうか? オブジェクトを永続化しようとして躓いています。
回答しても応答しないから、もうしない
短気になるな
人にモノを訊いて答えをもらっても返事をせずに立ち去る、ってリアル世界では あり得ない。でも、ここに限らずWEB上では日常茶飯事なのよね。まっ、回答する ほうも勝手にしているわけだけど。
>>755 オブジェクトの永続化って、具体的にどういう意味?
SaveToFile LoadFromFile とかと関係ある?
>>759 関係あります。
メモリ上のオブジェクトをHDD上に書き出して
次も使えるようにすることです。
結局TStringList.AddObjectとして
TStringListとTTreeViewを両方
永続化し、行で対応づけることで解決しました。
クライアント側の指示でサーバを動作させるプログラムを作ろうと思っています。 SendTextでメッセージを表示させられるところまではできたのですが、別の指示の出し方が分かりません。 もう接続できていて、なおかつSendTextでメッセージを送れている場合、もうサーバ側は弄らなくても良いのでしょうか?
StringGridでOptionsがgoRangeSelectを含むときに、 Excelのように固定行または列でドラッグすると連続して列や行を選択できるようにするには どのようにしたらよいのでしょうか?
そのようにコードを書く
>>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;
つづき 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
さらに 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;
>>753 要するにTDBCheckBoxは使えないってことですね。
サン糞!
>>767 DataSource 上で代替フィールドを作ればすむ話ではないか?
>>768 それはOnCalcFieldsを使えってことですか?
>>767 ヘルプでTDBCheckBoxのValueChecked,ValueUncheckedの説明を見てみよう。
771 :
デフォルトの名無しさん :04/09/30 13:03:03
>>751 見てみたんですが、何がなんだかちんぷんかんぷんでした。
いちばん上のADOって奴をちょっと試しにやってみたんですケド、
応用するにはかなりの勉強が必要ですね。
Proでなら簡単に出来そうな気がするんですが、気のせいでしょうか?
でもあまりに高価過ぎて手が出せそうにありませんケドね。。
どっちにせよ、もうちょっとじっくりやる時間が出来たら、先のページで
いろいろ実験してみます。また不明な事が出て来たら、あまりにも初歩的な事なのかもしれませんケド、
教えてやって下さい。
別の意味でTDBCheckBoxは使えないから普通のTCheckBoxにしといた方が良いかも。 TDBRadioGroupもだったか忘れたがうざい時あるな。 QueryをOpenした時値が入ってたらOnClickが反応したりとか最悪。
773 :
デフォルトの名無しさん :04/09/30 13:06:33
774 :
デフォルトの名無しさん :04/09/30 13:13:39
776 :
デフォルトの名無しさん :04/09/30 14:26:08
>7のパーソナルは無償配布、終了しちゃったんですね。 7のパーソナルなど最初からない。6のはまだ配布中。
778 :
デフォルトの名無しさん :04/09/30 18:27:37
DelphiでPNGを扱うにはどうすればよいのじゃろうか GLDPNGは開発終了したみたいだし・・・ Jpegみたいに簡単に扱えない?
TPNGImageってのがあるのね 使ってみます
最新バージョンではTDBGridのスクロールバーの表示・非表示は設定できるようになってますか?
>>764-766 返事が遅くなってすみません。
期待する動作にかなり近い動作をいたしました。
これを叩き台にしていろいろいじくってみようと思います。ありがとうございました。
ふーん。 いつの間にか「TkPNG」って言うシェアウェアへ 移行してたんだねぇ…。
TkPNGの方がGLDPNGより先に開発されてたと思うけど…。
>>783 あら、そーなんだ。これは失敬、知らなんだ。
では続きをどうぞ↓
Client側のEdit1とEdit2に書かれた文字列をボタンを押すことで送信し、Server側で受け取り、 ダイアログボックス(「タイトル」=Edit1,「本文」=Edit2)を表示させるにはどのように記述すれば良いでしょうか。 Client側、Server側それぞれお願いします。
786 :
デフォルトの名無しさん :04/10/01 06:49:52
プロジェクト毎にコンポーネントを管理したいのですが、 何かよい方法ありますか?
そういうコンポーネントは実行時に作成する。
>>786 プロジェクトごとに、コンポーネントを切り替えたいという事なら
プロジェクトごとに、batファイルでレジストリを切り替えれば良い。
パッケージ
791 :
786 :04/10/01 16:38:54
>>788 レジストリの切り替え・・・
よさそうですね。
しかし、レジストリのどのあたりをbatで切り替えるのでしょうか?
>>791 たぶん
HKEY_CURRENT_USER/Software/Borland/Delphi/<Version.0>/Known Packages
追加で HKEY_CURRENT_USER/Software/Borland/Delphi/<Version.0>/Palette
794 :
786 :04/10/01 18:42:43
>>792-793 実行できる環境で、是非やってみようと思います。
ありがとうございました。
>>785 Delphiのdemosフォルダを見なさい
\demos\internet\chat
AABBCCDEFGHという文字列から3文字使って並べると 何通りか、そして全ての文字列を出力するというプログラムを 作っているのですが、どうやってもうまくいきません。 考え方としては、全ての通りを出し、そこから重複を削除するという形で よいのでしょうか?
>>796 煽りでもなんでもないが、意味が分からない。
頭悪すぎ・・・
>>797 順列なんですが。説明下手ですいません・・・。
>>799 謝ることは無いよ。オレが理解出来ないだけだから。
TStringListを使って、まだ追加していないなら追加する の方が簡単だと思うよ。 forループを3つ重ねればよい。
AABBCCDEFGHがあらかじめ整列済みであるという性質を利用すれば 重複チェックは直前のものとの比較のみでいい。
>>802 ちょっとそれは私、確信が持てませんが、本当に大丈夫ですか?
なんか宿題臭いけど、汎用性を無視すればABCDEFの順列6P3と XXY、XYX、YXX(X=[A..C]、Y=[A..F]-X)の3*3*6の組み合わせしかない。
質問させてください。Delphi6 Personalです。 TScrollBoxで、スクロールをしている最中にイベントを起こせませんか?
ごめんなさい。解決しました。 OnConstrainedResizeで拾えました。
808 :
デフォルトの名無しさん :04/10/02 15:15:33
コンソールアプリで標準エラー出力に出力するのってどうやるの?
ErrOutputだった。Outputの参照から飛べるようにしてくれ・・・
TRichEdit でマウスポインタの位置をキャレットの位置(行、桁)に変換するにはどうすればよいですか?
∫,,,,,,,,,∧,,∧ ⊂,,,,,,,,,つ,,゚Д゚ミつ 教えてくださまい。 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'; がせいぜいでもちろんだめでした。
Form2を含むUNITの implementation節 usesの項に form1を加えれば良い。 例: implementation uses Unit1;//(Form1のユニットファイル名)
こうすることにより、 Unit1のinterfaceにて宣言された変数 Form1: TForm1 を、Form2のimplementationの USES宣言以下で使用可能になり、 Form1.Edit1.Text := 'Hello'; という命令もコンパイルされる事になる。
やってみたところできました。 適当だと思っていた Form1.Edit1.Text := 'Hello'; 自体はあってたんですね。 素早い回答ありがとうございます。
>>810 >>816 ∫,,,,,,,,,∧,,∧
⊂,,,,,,,,,つ,,゚Д゚ミつ
つまり、SelStartを保持しておいて、擬似的にクリックして
桁/行情報を取得してから、元のSelStartに戻すとか?
力技。。。
818 :
デフォルトの名無しさん :04/10/03 00:20:01
ファイル内に文字列があるかどうか判定するルーチンを作りたいのですがどうすればいいですか?
>>818 TStringListで読み込んで、posで判定するってこと?
820 :
818 :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;
右揃えにするため、TEditの代わりにTMemoを代用したんですが、 TMemoだとやはりTEditと違って行単位でしか扱えないんでしょうか。 何行目の何文字目まで指定できると有難いんですが、 やっぱり Memo1.Lines[1] Linesとぐらいだから無理ですかね。 代用策でもかまわないんですが何かあれば教えてもらえるとありがたいです。
ああ、というか内容を 1回普通の文字列型に移してそれを経由してやればいいんですかね そんなにたいしたことじゃなさそうだ
>>820 >if Pos(slFile.Text,Text)<>0 then
オレもたま〜にやるけど、逆でない?
→if Pos(Text,slFile.Text)<>0 then
824 :
818 :04/10/03 00:52:47
>>820 ヌ・・・初歩的なミス・・・。
解決いたしました。
どうもありがとうございました。
>>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;
TMemoryStreamの方がいいかもね。
∫,,,,,,,,,∧,,∧
>>825 ⊂,,,,,,,,,つ,,゚Д゚ミつ それだ!
http://www.borland.co.jp/tips/delphi/dh013/index.html
830 :
デフォルトの名無しさん :04/10/03 01:28:26
すいません。 cygwinのホームディレクトリの設定ってどうやるんでしょうか?
>>825 おおお!出来た。
どうもありがとう御座います。
プログラム内からコンソールアプリを呼び出すと、 DOS窓が一瞬で閉じてしまうんですが、 DOS窓を表示したままには出来ないのでしょうか。 ちなみにWinExec使用です。
cmd hoge.exe command hoge.exe
cmd /k yourprog.exe
system("pause");
>834-836 ありがとうございます。 835さんの方法でできました。 普通にDOS窓開いた時と違って、PATHが通ってないんですね。
838 :
デフォルトの名無しさん :04/10/04 00:59:26
自作でコンポーネント作ってるんですが、一般的にはコンポーネントをフォームに乗せると自動的に uses節にコンポーネントのユニットが追加されますよね。 で、それと同時に別に追加したいユニットがあるのですが、それも自動で追加させるにはどうすればいいのでしょうか? 例えば、IndyのTIdHttpコンポーネントを乗せるとIdHttp以外のユニットも自動的に usesされますが、そんな感じのことをしたいのです。
Indyの登録関係ユニットを見てみては?
>>838 コンポーネントのパッケージに登録されているユニットが
勝手に追加されているだけでは?
指定したオブジェクトが、すでにCreateされているかどうか見分けるにはどうしたらいいですか?
>>838 もしかして、イベントハンドラで使われる引数の型を定義しているユニットも
自動的に追加されるのかもしれないね。
最前面のアプリのハンドルがあるとして、 そのアプリの、今フォーカスのあるコントロールの ハンドルを取得するにはどうしたらよいでしょう。
845 :
デフォルトの名無しさん :04/10/05 23:50:18
FreeAndNil で、Freeとnilをやってくれる以外にどんな利点があるのですか?
848 :
デフォルトの名無しさん :04/10/06 00:26:13
オブジェクトのフィールドを書き換えたら、 別のオブジェクトとして認識してほしいのですが、 うまくいきません。 例えば、AとBを同一のクラスに属するオブジェクトとすると、 ... B:=A; A.FMem:=2*A.FMem//フィールドの値の更新 ... としたとすると、AとBを別のオブジェクトと 認識してほしいのに、同一のオブジェクト(A=B) と認識されてしまいます。 何か付け加える必要があるのでしょうか?
>>848 B.FMem を確認してごらん。同じになってるから。
B:=A;
は、参照を代入してるから、A と B は同一の実体を参照してるんだよ
Delphiのオブジェクト変数はC++みたいに実体として存在できないのです。 全部オブジェクトへの参照でしか存在できない。 オブジェク変数に別のオブジェクト変数を代入すれば 参照しているオブジェクトを付け替えることになる、 B:=AをやればAとBが指し示すオブジェクトは同じの物となる。 もし、Bのフィールド内容をAにコピーしたいのならAssignメソッドを使わなければならない。 B.Assign(A) でAの内容がBにコピーされる。
>もし、Bのフィールド内容をAにコピーしたいのならAssignメソッドを使わなければならない。 Aのフィールド内容をBにコピーしたいのなら だね。 Assign メソッドが必ずあるとは限らない。自分で実装する必要がある場合がある。 また、内容同士を比較するメソッドも必要になるかもしれないね。
>>851 FreeAndNil は、すでにDelphiにあるのを使うこと。危ないことはない。
君の「悩み」については、だれも知らない。具体的に。
>>848 TPersistent.Assign のヘルプを読むことをすすめる
私の悩みとは、FreeAndNil は危険だし、たいした利点もないので 使わない方が良いのではないか? と言うものです。 ローカル変数であれば Obj.Free; だけでいいし、 それで不十分なら、 Obj := nil; を加えれば良いのではないですか? FreeAndNil を使う理由は何なのでしょう?
FreeAndNil の危険性とは、 初期化していない変数を渡しても警告が出ない事と、 オブジェクト変数以外を渡してもコンパイルエラーが出ない事です。
> FreeAndNil を使う理由は何なのでしょう? インスタンス参照にnilを代入しておくと、それが有効な参照かどうかを確認する ことが出来るようになります。ローカル変数を最後に解放するのでしたら、Free で十分でしょう。
これです。
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.
読み返してみると質問が変わってました。 どうして nil を代入してから Free するのか、が今の悩みです。 procedure FreeAndNil(var Obj); var P: TObject; begin P := TObject(Obj); TObject(Obj) := nil; P.Free; end;
>>838 TIdHTTP は、TObject → TPersistent → TComponent → TIdBaseComponent
→ TIdComponent → TIdTCPConnection → TIdTCPClient → TIdCustomHTTP の
順に派生されているので、上位クラスが宣言されているユニットが順番に
追加される。
これと同じように UnitA のコンポーネントを貼り付けたときに UnitB も
追加されるようにしたければ UnitB で宣言したクラスを上位に持つように
すればいい。
ただし、共通部分を持つクラスをほかに作らない場合は、一つにまとめた方が
サイズ的にも速度的にも有利になる。
>>860 グローバル変数を複数のスレッドからアクセスした場合とかに、処理の順序が
重なりあうという偶然が生じた場合に、複数回 Destroy しないためじゃないの?
複数の変数にコピーしてれば意味なさそうだけど。
>>861 マルチスレッドの場合はEnterCriticalSectionを使わないと駄目では?
同時にFreeAndNilが呼ばれた場合、同時に一時変数へ保存して、同時に同じオブジェクトをFreeする事になりますよ。
NG読むと、Free後にnilを代入しても手遅れと言う意見がありました。
つまり、デストラクタ内では既にオブジェクトは無効という考えらしい。
本当か?
>NG読むと、Free後にnilを代入しても手遅れと言う意見がありました。 Free したオブジェクト参照にnilを代入することの必要性が理解できていれば 一瞬でも、Free したオブジェクトの参照がnilになっていないのは、危険である ことが分かると思います。ですから、Free する前に nil を代入しておくわけです。 シングルスレッドでは、 Obj.Free Obj := nil; の二行のコードの実行時間差があったとしても、同じプロセスのコードで Obj に アクセスする機会がないように感じるかも知れません。でも、Free から呼び出される メソッド、とくにデストラクタから、何かメッセージを処理したり、他の手続きを 呼び出したりしているとき、この Obj にアクセスすることになるかも知れません。 ですから先にnilを代入しておけば、Free 呼び出した時点で、この Obj へのアクセス は無効である、とコードで判断できます。マルチスレッドでは、上のコードで nil が 代入される前に、プリエンプションが起こってサブスレッドに制御が移り、Obj に アクセスする機会が生まれます。クリティカルセクションを必ず使うという制約より FreeAndNil を使うことにした方が制約は少ないと思います。 「手遅れ」っていうのはこういう意味です。
>同時にFreeAndNilが呼ばれた場合、同時に一時変数へ保存して、同時に同じオブジェクトをFreeする事になりますよ。 同時に呼ばれることはありません。参照の代入は単純なマシンコードなので<途中>で別スレッドにうつること はないと思います。ですから、あとに呼ばれた方は、すでにnilになっているのでなにもしません。 マルチプロセッサの場合は知りませんが。その場合でも Free してから nil を代入するより 安全だとは思いますけど。
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;
>>811 上は単に既存コントロールにプロパティを追加して Getメソッで値を読み取る時に1/10とか1/100すればいい
2番目は、理論的には作れない。
少数点以下を100000倍して10で割りながら余りがゼロでないというようなことを考えているのだろうが
少数点以下有効桁数は3であっても 1.200 である場合というのがありえるから
>既存コントロールにプロパティを追加して Getメソッで値を読み取る時に1/10とか1/100すればいい 表示はGUIの大事な部分。ユーザが1.33に設定したいとき133を入力させるのはGUIとして失格。
"待ち時間(0.01秒単位)"って項目があったっておかしくはないと思うが。 "金額(100円単位)"は微妙に混乱するかもしれないけど。 混乱度が低いなら慣れ親しんだ標準のコントロールを ユーザーに使わせるのは十分あり。
1ドル33セント=133セントかー 1.33ドルにしたいなー
教えてください。ページコントロールのコンポを作成しています。 ページコントロールのメソッドをoverrideして、タブシートを下記の コードのように動的に作成しており、このコンポーネントをインストールして ポトペタで使用したいのですが、ポトペタ時にタブシートが作成され、 さらに実行時にもタブシートが作成され、同一のシートが二つ作成 されてしまいます? こういう場合の、いい解決法ってありますか? procedure TPageControl.CreateWnd(); var TabSheet: TTabSheet; begin inherited; //タブシートの作成 TabSheet := TTabSheet.Create(Self.Owner); TabSheet.PageControl := Self; TabSheet.Parent := Self; end;
コンポつくってて ComponentState を知らないってことはないよな
>>871 おお
いや、勉強のためにコンポ作りしてて、悩んでますた。
これで実行時と設計時でいろいろできますねー
助かりました。ありがとう!
873 :
デフォルトの名無しさん :04/10/07 14:53:22
すでに内容があるファイルを部分的に書き換えるのってどうやるのですか?
>>873 ・全部読み込んで部分的に書き換えて全部書き込む。
・seekやposを使って書き込む位置を指定して書き込む。
875 :
デフォルトの名無しさん :04/10/07 18:25:18
Windows標準のプリンタドライバを使ったプリンタの設定を、保存したり復元したりしたいのですが レジストリを設定する事になるのでしょうか?
FormatDateTime のフォーマットで 'gee/mm/dd' では「昭52/01/01」となりますが、 フォーマットの指定のみで「S52/01/01」みたく表示できますか?
ヘルプを読んだことないの?
>>876 おそらく無理。
年号の変換は結局のところWindowsAPIのGetDateFormatを利用してるみたいだけど
そもそもGetDateFormat自体が(H,S,T,M)形式の年号に対応してない。
自力で関数を作るならまぁ結構簡単に作れそうだけど・・
というか、実験してみて笑ったんだけど
年号って明治までしか用意されてないのなw
>自力で関数を作るならまぁ結構簡単に作れそうだけど・・ そうなの? Format 文字列の中に元号と関係なく平や昭や明なんかの文字があったり する可能性があるので結構面倒だと思うけど
エスケープしときゃ良さそうだけど
明治以前で寛永2年とか安政1年とか使いたいとかはあんまりないだろな
>エスケープしときゃ良さそうだけど おっ、なるほど!
883 :
デフォルトの名無しさん :04/10/07 22:04:00
VC++のソースを元にDelphiに変更したいのですが PRINTDLG構造体はDelphiではどのように記述するのでしょうか 教えてください。 PRINTDLG pd; ZeroMemory (&pd, sizeof(PRINTDLG));
uses CommDlg; TPrintDlg
uses節にCommDlgを追加しる TPrintDlgという型で定義されている。
なんで同じこと書くの?
俺の存在感の無さ故、見えてないのだろう。よく言われるよ。フフ
889 :
883 :04/10/07 23:07:11
>>884 ,885
ありがとうございます。
しかしこんな簡単なことに丸2日使ったのか・・・
TDataSetのFilterOptionを使いたいんですが 1.FilterOptionの設定の仕方がよくわからないです。 2.Filterを使って前後方一致比較ってできないんですか? 前方一致は*でいけるみたいなんですが、後方ができないようで。 何か方法があれば教えて頂けると助かります。
>>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; もうたったこれだけで一日悩んでいます。 どなたかアドバイスいただけないでしょうか。 よろしくお願いいたします。
>>820 質問とは全く関係ないが
if (〜) then
Result := True
else
Result := False;
の部分は
Result := (〜);
にするとコードがすっきりする。
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 )を渡したいのですがどうやったらいいのでしょうか。 よろしくお願いします。
普通は C:\borland\bcc32.exe を立ち上げて、そのパラメータに C:\borland\test.cpp を 指定すると、勝手にコマンドプロンプトが立ち上がってくれるもんだが。
ども、早速やってみます
やっぱオレの能力じゃわからないや(':ω)| ̄|_
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によるネストはしたくないのです。 よろしくお願いいたします。
Exit
すんまそん。 Exit でいけるんですね。。。 お騒がせいたしますた。
TEditでUnicodeを使いたいと思い、ぐぐったところ、TNTというサイトが見つかりました。 それとは別の日本語のサイトに、 これを入れると既存のコンポーネントが上書きされる と書いてあったのですが、他にUnicodeを使えるようにする方法はありませんか?
>>902 上書きなど初耳だが。
そのサイト晒してみてくれ。
必要なし
インラインアセンブラで割り算する時、 div ebx って書くとエラーが出ます。 div eax,ebx だとエラー出ないが、これは文法的に間違ってないですかね? あとdiv edx っていうのは間違いですか?
>>905 ありがとうございます。それじゃ早速使ってみます。
ソースフォルダに大量に生成される、拡張子の頭に'~'のついたファイルは編集時のテンポラリファイルなのでしょうか? その場合、編集が終われば削除してもいいのでしょうか? また、これらが自動的に削除されるような方法はないのでしょうか?
一つ前のバックアップ。気にするな。神経質に消す方が疲れる。
なるほど。 で、そのバックアップを生かしたい時は手で拡張子直すのでしょうか? ざっとメニューみてみましたがそれらしいツールはありませんでした。
>で、そのバックアップを生かしたい時は手で拡張子直すのでしょうか? もう5年以上使ってるけど、一度だけ手で直したことがある。ほかのやり方は知りません。
>>906 「書くとエラー」って言うから、コンパイルエラーかと思った。
オーバーフローだろ?
divは上位edx、下位eaxの64bitの数を指定のレジスタで割るから。
edxにゴミでも入ってるんだろ。
当然div edxもオーバーフローする。常に商がeaxに収まらないから。
>>908 作らせないようにする設定なら、エディタオプションの「表示」の所にある。
914 :
デフォルトの名無しさん :04/10/09 10:33:40
ADOConnection>ADOQuery>DataSource>DBGridでmdbのデータを一覧表示しています。 ADOQueryのActiveをTrueにしているので、表示した瞬間にDBの内容が表示されます。 ここでDBの内容を再取得して再表示したいのですがやり方がさっぱりわかりません。 どなたかご教授いただけませんでしょうか。
自己レスです。 これで正しいのかどうかわかりませんが、 ADOQuery.Active := False; ADOQuery.Active := True; DBGrid.Refresh; とすることで表示更新できました。 お騒がせしました。 また、これが間違っていたらツッコミよろですm(__)m
>>913 作っておいた方が精神衛生上いいかも。
消したくなったら、
DEL *.^??
みたいなバッチ作っておけば一発で消せるし。
[環境設定]の[自動保存]もチェック付けといた方がいいね。構成管理ツール導入して版管理できれば尚いい。
ごめ、ハットとチルダ間違えました。 DEL *.~??
バックアップファイルなんて一度も役に立ちそうなシチュエーションはなかったな。 まともなソース管理ツール使っとけ。
*.~?? のファイル消すツールなら、それこそ簡単にDelphiで作れるね。
バックアップとか無停電電源とか生命保険とかは実際は役立たないほうが幸せ。 万が一に備えているわけだから。
無停電電源あって良かった事の9割は雷サージを防げたことだった。
>>892 SQL := 'INSERT INTO test2tb ([date],[time]) VALUES("' + DateToStr(Now) + '","' + TimeToStr(Now) + '")';
でやってみそ
すいません。
先ほどの
>>914-915 です。
>>915 の方法では追加更新削除の処理をした後、
なぜか再取得できるときとできないときがあります。
もうなにがなにやら。。。
アドバイスいただければうれしいです。
よろしくお願いいたします。
>>915 オレも詳しい原理は知らないが
DataSource.DataSet.Close;
DataSource.DataSet.Open;
で表示の更新ができる。
同じ対象をさしているはずなのに
なぜQueryでなくDataSource.DataSetの方じゃないといけないか
自分でもよくわからないんだけどな。
フォームのリサイズを不可にしたいのですが、どのプロパティをいじればいいのでしょうか?
>>924 レスありがとうございます。
しかし、それでも再取得できたりできなかったり。。。
もしや時間的に再取得できないのかと思い、
DB更新処理後に「更新しました」とダイアログ出して時間とってみたのですが、
それでも一緒です。
フォーム上にボタンを作って、
ADOQuery.Active := False;
ADOQuery.Active := True;
DBGrid.Refresh;
としてみると100%再取得できます。
うーむ。。。
>>927 ありっす。
最小化が使えなくなるのですね。。。
工夫してみます。
MaxHeightとかで指定するのは?
931 :
デフォルトの名無しさん :04/10/10 00:19:07
すみません、↓のプログラムのだめなところが判りません testin.bmpをロードして(Image1)、画像の一部を切り出して 切り出した部分(Image2)をtestout.bmpとして保存したいのですが 実行すると止まってしまいます。 ヘルプを参照しても不明です。 bmpの扱い方を解説してるページなどありますか? (検索しましたが、見つけられませんでした)
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}
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.
オレがめんどくさいから誰か書いてくれないかな〜、と思っていて 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;
>931 .Picture
>933 DeleteObject(Rgn); Image1.Free; Image2.Free; end; end. 後始末も。
>>937 ありがとうございます。
早速訂正してみましたが、出力ファイルが作られません・・・・
>>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;
.Picture消せ
939 です。 × Image2.Picture.SaveToFile('testout.BMP'); ○ Image2.SaveToFile('testout.BMP');
名前を bmp1 bmp2 とかにするといいものを Image1 とかにするから面倒なことに・・・・
「実行すると止まる」とはコンパイルエラーの事だったのか。
946 :
デフォルトの名無しさん :04/10/10 04:30:54
多次元配列 A: array[0..2, 1..3] of Integer; で、 High(?) = 2 を求めるには?にどう書けば良いのでしょう? High(A[0]) = 3 ですし。
High(A)
できました。 ありがとうございます。 ついでに A: array[0..1, 2..3, 4..5] of Integer; で、4, 5を求める場合は Low(A[0, 2]) High(A[0, 2]) でした。
他人デバッグ
950 :
デフォルトの名無しさん :04/10/10 13:49:09
文章を読み上げる機能をつけたいんですが、コンポーネント とか無いんでしょうか。 マイクロソフトのエンジンを使うとして、 メモに貼り付けた日本語を読んでくれるだけでいいんですが・・。 どなたか分るかた居ないでしょうか
MSのって英語だけじゃなかったっけ? IBMからSDK付で出てたような。
上でComponentStateを教えてもらった者ですが、また新たな問題が・・ PageControlのコンポを作っていて、設計時に固定のTabSheetを動的に生成しています。 その処理はCreateWndメソッドをオーバーライドして、 if csDesigning in ComponentState thenの中で記述しています。 これでポトペタ時にはTabSheetもちゃんと表示され、実行時には作成されずちゃんと動作 するのですが、いったんフレームに貼り付けて設計し、そのフレームをフォームに貼り付けよう とすると、「コンポーネント名TabSheetはすでに使われています」のようなメッセージがでて、 うまく動作しません・・・。 こんな場合にはどうすればいいんでしょう・・・・。どなたか教えてください!
953 :
950 :04/10/10 14:02:09
>>951 レスどうも。いえ日本語もできます。他の言語も。それを使った
読み上げのフリーソフトとか結構ありますし。
ただそれを自分のソフトに組み込むのはどうすればよいのやら・・。
いろいろ試したら、やっとできました。 回答くださった方々、ありがとうございました もう1つお願いします・・・・ BM(Tbitmap)の座標(100,100)にある点の色が何色か知るにはどうしたら良いのですか? とりあえず黒かどうか判定するに Canvas.Draw(0, 0, BM); if Canvas.Pixels[300, 300] = clBlack then hantei := 0 という文を書いたのですが・・ 黒ならhanteiの値を0にしてその後の処理を分岐しようかと でもうまく行きません。何がまずいのでしょう? Drawとかしなくても直接BMのある点の色を知る方法とか無いですか? ヘルプを見てるのですが、「色を知る」 という情報が検索できません 「色を知る」が検索かけてそっくりそのまま出るとは思いませんが
>>954 1.TBitmapにもCanvasプロパティがある
2.100, 100 が知りたいのに何でPixels[300, 300]?
>>954 hanteiをhentaiと読み間違えたよ。それだけだけど。
if BM.Canvas.Pixels[
DBGridに表示するデータについてなのですが、
データが0の時は'XP'、1の時は'Me'と表示するようなことをしたいのですが、
どうすればいいのでしょうか?
それと
>>914 で質問しました、DBGridのデータ再取得でいまだに悩んでおります。
DBGridでデータ一覧を表示>別画面に移ってデータ改変>またDBGridに戻る
といったような画面ハンドリングの場合、みなさんはどうやってDBGridのデータを再取得しているのでしょうか?
DBの種類や接続方法によって違うのでしょうが、参考に教えていただければうれしいです。
チャット&ファイル転送を兼ね備えたものを作っているのですが、 何故かローカルじゃないと接続できません。 どういった間違いがあるとこういう事が起こるのでしょうか? 例えば自分のプライベートIPを入れて接続しようとしても接続できません。
9割方DNSかデフォルトゲートウェイの設定が不良
またネットワークの基礎知識の無い奴が ネットワークアプリ作ろうってのかい?
>>950 MSのエンジン使いたいみたいだけど、
日本語にも対応するようになったんだな。
自分は以前、テレフォニー関係のツールで
合成エンジンが必要になって、MSのも
調べたが、当時は日本語ができなくて
結局、OKIのSmarttalkを使った。
OKIのはActiveXだから、Delでも簡単に実装できた。
>>961 ,962
すいません本当にアホみたいな間違いしてました。できました。
お騒がせしました^__^;
965 :
デフォルトの名無しさん :04/10/10 23:41:37
おおおっっぱい♪ いもうとのおっぱい みくろなおっぱい 洗濯かごの中 いっぱいオッパイの残り香イエエエエエ! ダンシングしながらはいてみたよ!イエエエエエ おっぱいみたいな肉まん当てたら疑似餌なおっぱい アンダー60 トップ80 (笑い) そんなミクロのオッパイ光恵kてやる是イエエエエエ
966 :
デフォルトの名無しさん :04/10/11 00:11:10
引数がキーと文字列でレジストリ値を加えたり 削除したりするソースを公開しているホームページを 知りませんか? プログラムだけでもいいんですけど。
reg.exew
968 :
デフォルトの名無しさん :04/10/11 00:20:14
>>966 TRegIniFileかTRegistryで検索しろ
>>959 >表示するデータ
対応するテーブルを作るしかないんじゃないの?
>データ再取得
トランザクション再接続じゃダメ?
>>969 DBGridの表示内容改変はできないのですね。了解しました。
トランザクション再接続とは具体的にはどうすればいいのでしょうか。
再取得方法として、以下の方法で再接続してみたのですが、
ADOQuery.Active := False;
ADOQuery.Active := True;
DBGrid.Refresh;
でも
DataSource.DataSet.Close;
DataSource.DataSet.Open;
DBGrid.Refresh;
でもだめなのです。
だめというか、同じ処理を2〜4回やると再取得できているというのが現状です。
なぜ一回ではダメで複数回で反応するのかがまったくの謎なのです。。。
そろそろ次スレ。
973 :
デフォルトの名無しさん :04/10/11 10:14:44
TEditorってシェアウェアなんだけど機能制限ってあるんですか? ある程度、物になったら払ってもいいかなとは思ってますけど・・・
んだな。次スレで聞けや
>>975 超初心者向けスレッドでそういうボケをかますと本気にされそうですね.
念のために書いておくと
>>974 氏の意図は
「TEditorのおひさるページで調べるなり,作者に直接問い合わせるなりすればよいのに
なぜわざわざここで尋ねるのか?」
ということだと思われます.
すみません。TWebBrowser について詳しいサイトを教えてください。 日本語でも英語でもかまいません。よろしくお願いします。
>>978 わざわざ、ありがとうございました。信じられないことに検索をすることをど忘れしていました。
>>970 ゴメン、ADO使ってないのにレスしてしまった。
参考までにIBの場合で書くと、
DataSetをPostしてもトランザクションをコミットしないと実際にはDBに
書込まれないので、他のクライアントからは更新されてないように見える。
任意にサーバーのDB更新したいならコミット処理を書く。
たぶん同じケースなんだと思うけど、ADO知らないので詳細は不明。
perlで言うところのSpriteの様なライブラリのdelphi版はないでしょうか? 機能的にはSQLのサブセットを使ってテキストファイルに入出力を行うものです.
すれ違いですがお願いします。 WinXPでCD-ROMやリムーバブルドライブにメディアを挿入した時に ドライブ内のファイルによって自動再生プログラムを選択する ダイアログが表示されますが、その中に自作プログラムを入れたいのですが どうすればよいでしょうか? 具体的には、デジカメのメモリーカードを挿した時に自動でHDDに取り込む プログラムを作っています。
自動起動するCDをエクスプローラで開き、autorun.infというファイルの中身を見れ。 もしくは"autorun.inf"でぐぐれ。
そういうこっちゃねーだろ
>>983 オレもそう答えそうになって踏みとどまったのだよ
>>982 漏れならそのダイアログにあるプログラムの名前で
レジストリをサーチする。
何件か絞り込んだらなんとかなるんじゃないかな
>すれ違いですがお願いします。 図々しい。