くだすれDelphi(超初心者用)その19
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGもしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
<前スレ>
くだすれDelphi(超初心者用)その18
http://pc5.2ch.net/test/read.cgi/tech/1093996761/
<その他>
ボーランド
http://www.borland.co.jp/
DelWiki
http://onigiri.s3.xrea.com:8080/delphi/
0153141=143
NGNGたぶんそれはくだすれの過去ログだと思いますが、その質問をしたのは私です。
で、そのアドバイスに従ってやってみてBDEはたぶんきちんとインストールできたのですが、
どうもデータソース絡みの設定がきちんとできてないみたいでしてデータソース絡みが
きちんとインストールされていないようです。
一月悩んでもまだ解決しないのでどなたかお知恵を貸してください。
0154デフォルトの名無しさん
NGNG>プログラムを実行するとそんなデーターベースソースは無いって怒られるんです。
じゃいくつか質問。
・ファイルは展開されていますか?(展開後の BDE ファイルがどれかはわかりますね?)
・BDE アドミニストレーターはコントロールパネルにありますか?それは起動できますか?
この二つがクリアされていれば、問題は BDE インストーラーではなく(おそらく)データベースの
Alias が定義されていないだけ。でしょう。
とりあえず、ここまで確認を
0155141=143
NGNGレスありがとうございます。
>展開後の BDE ファイルがどれかはわかりますね?
がはっきりとは分からないのですが、実行ファイルはきちんと展開してあります。
あと、BDEもコンパネにあります。しかし、インストールしたいdatasourceは
表示されないです。
0156デフォルトの名無しさん
NGNGF5キーを押すとこのメソッドでエラーになるんですが、何でかな。
ショートカットキーは割り当ててないし。
ビジュアルコンポーネントをFreeした後にだけ発生します。
0157156
NGNG0158156
NGNG>function TCustomActionList.IsShortCut(var Message: TWMKey): Boolean;
2回目でエラーが出ます。
エラーが出ない場合は5回ほど飛んできます。
self.nameに値が入ってる場合は、「ActionList1」です。
0159デフォルトの名無しさん
NGNGあるアプリを起動させ、そのアプリのあるウィンドウが終了するのを待ちたいと思ってます。
アプリ自体の終了を待つならばWaitForSingleObjectでできるみたいですが、
そのアプリの特定のウィンドウの終了を待つにはどうしたら良いのでしょうか?
宜しくお願いします。
0160デフォルトの名無しさん
NGNG簡単にやるならウインドウハンドルが有効かどうかポーリングする。
一瞬の隙も見逃すわけに行かないなら
SetWindowLong関数を使ってウインドウプロシージャを書き換えてWM_CLOSEを拾う。
0161デフォルトの名無しさん
NGNGそのビジュアルコンポーネントのオーナーを
TCustomActionListのオーナーと同じものにすれば良いかと。
0163156
NGNG正常に動作するときにTCustomActionListのオーナーみてたら、
Freeされるフレームが混ざってました。
でも、ActionListのOwner差し替えしてなさそうなんだけどな...
とりあえず、アドレス違反を起こすコンポーネントが特定できたので、
サイアクの事態は回避しました。
0164156
NGNGActionListによって、
>function TCustomActionList.IsShortCut(var Message: TWMKey): Boolean;
がコールされるものとされないものと、どこで分かれるんでしょうか。
ソースをざっと見たところ、ショートカットは設定されてないし...
いくらDelphiでも、アドレス違反エラーが出る場合の対処は(´・ω・`)ショボーン
0165デフォルトの名無しさん
NGNGフォーム等で押されたキーが TAction で処理されるべきかどうかを判定するための
メソッド。
TForm (かその祖先クラス)のメッセージハンドラ近辺から読んでいくと呼び出している
コードが見つかるだろう。
0166デフォルトの名無しさん
NGNGあと、Free じゃなくて FreeAndNil を使ってみたら?
0167デフォルトの名無しさん
NGNGなるほど、ショートカットを割り当ててるからコールされるんでなくてショートカットの割り当てを判定してるんですね。
じゃぁ、毎回コールされるのかな思って、幾つかあるフレームクラス(これらのCreate/Freeが繰り返される)を見直してみたら、アクションリストがあるのはアドレス違反起こすフレームにだけありました。
つまり、フレームクラスにアクションリスト貼り付けない方が良いのかな。
0168デフォルトの名無しさん
NGNG問題ないと思うけど、頻繁に Create/Free? そいうコードはあまり経験ないなぁ。
多分、Free の方に何か問題があるのだと思うけど、ここから先はコードがないと何ともいえない。
0169デフォルトの名無しさん
NGNGアクションとか使って、そのアクションのターゲット自体が破棄される時、
ターゲット自体にまだ実行されるコードが残っているとAVが発生する。
これは仕様だ。唯一の回避方法は正しい使い方をすること。
Releaseなんてのがあるのはそういった問題の回避のためなんだよね。
0170デフォルトの名無しさん
NGNGなるほど、参考になりました。
AVが発生するというより、
アクションリストが破棄されてるのにアクションリストのキーチェック処理がレジストされたまま、
みたいな感じなんで、もしかしたら今回の件は若干違うかもしれませんが。
テスト結果は今日明日にこのスレに報告致します。
0171デフォルトの名無しさん
NGNG故にデストラクタから制御が戻らず困ってるのですが,原因として何が考えられるでしょうか。
0172デフォルトの名無しさん
NGNG0173171
NGNGとしています。純粋仮想なのでinheritedは書いていませんが。
デストラクタが呼ばれた時Terminatedを見てExecuteのループから抜けてるのは確認しています。
0174171
NGNGオーバーライドして,基底のデストラクタも呼んでます。
TThread.Destroyの
Terminate;
if FCreateSuspended then
Resume;
WaitFor;
この部分で止まってしまう訳なのです。
0175デフォルトの名無しさん
NGNGまさかデッドロックを引き起こす様なコードは書いてないだろうな?
WaitFor中にはSynchronizeの処理が行われたりするのだが、その時待機状態になるコードがある場合そこで止まる可能性がある。
いづれにしても、自分でトレースすればわかることだ。
0176デフォルトの名無しさん
NGNGオレの経験上w
0177171
NGNGfinalizationの中でスレッドを終了しようとした時,EndThreadが呼ばれてもスレッドが走行中のまま終了しなかった。
故にシグナル状態にならず,MsgWaitForMultipleObjectsのあたりのループをぐるぐるしてた。
対策
TThread派生オブジェクトのフィールドにExecute実行中かどうかを表すフラグを追加。
(イベントオブジェクトだとResetしてもWaitForSingleObjectが返ってこなかったから)
finalizationではTerminateを呼んだ後そのフラグを監視。
実行中フラグが外れたらTerminateThread呼んだ後Free。
finalization中ではカーネルオブジェクトの扱いはやめた方がいいのかな。
お騒がせしました。
0178デフォルトの名無しさん
NGNGTTestThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TTestThread.Execute;
begin
Sleep(3000);
end;
var
Thread: TTestThread;
initialization
Thread := TTestThread.Create(False);
finalization
Thread.Free;
現象を再現できない。バグの原因は違うところだと思う。もう一度自分のコードを見直せ。
0179デフォルトの名無しさん
NGNGMessageDlgでボタン[mbYes,mbNo]を使用しているのですが、
ダイアログが表示された際にフォーカスが必ずmbYesに当たっているので
これをデフォルトでmbNoにフォーカスを当てたいのですが、方法が分かりません.
どなたかご教授ください。
0180デフォルトの名無しさん
NGNGFindChildControl で 'No' {No ボタンの Name}
を取得して、SetFocusedControl で上のコント
ロールを TWinControl にキャストしてフォーカ
スし、 ShowModal で返り値を得る。
泥臭い方法の一つ。
0181デフォルトの名無しさん
NGNGこれが一番早い
0182デフォルトの名無しさん
NGNGTApplication.MessageBox使え。
flagにMB_DEFBUTTON2。
API直でもいいけど。
0183180
NGNGいつも感心するぜ。
0184171
NGNG失礼。説明が足りないばかりに話を長引かせてしまって。
解放するのはDLLファイルなのです。
ホストアプリとしてボタンを2個持つアプリケーションを作成,一方を
module := LoadLibrary('Project2.dll')
他方を
FreeLibrary(module);
を行うよう設定
DLL側はTThreadから派生するクラスTMyThreadでExecuteだけをオーバーライド
グローバルにMyThread: TMyThreadを確保してプロジェクトのbegin〜end;で生成
他は下に示すようなものを作って検証
procedure TMyThread.Execute;
begin
while not Terminated do
Sleep(100);
end;
initialization
finalization
if Mythread <> nil then
Mythread.Free;
結果同様の現象が起こりました
0185デフォルトの名無しさん
NGNG確認できました。そんでもって調べました。Windowsの仕様です。結論としてはそのような使い方をしてはいけない。
参考
ttp://www.numeric.co.jp/Win32.htm#Q0004
DLL_PROCESS_DETACHが呼ばれた状態でスレッドが存在しないようにしましょう。
まあ開始終了の関数をエクスポートしておけば無事解決。
0186デフォルトの名無しさん
NGNG実行すると、パネル2 からはみ出した、パネル1 内での位置っぽい感じで Edit1 が表示されます。
オブジェクトツリーでは Edit1 は間違いなくパネル2 の下にあります。
新たにパネル2 上に別の Edit2 を追加すると、そのように表示されるので、Edit1 が
何からおかしいようなのですが、その理由がわかりません。
何か思い当たることはあるでしょうか?
コードで位置を変更したりはしていません。
0187デフォルトの名無しさん
NGNGプロパティのWriteに使われているメソッドの書式を教えてください。
0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNGDelphi6 でも Doc ディレクトリに公開されているインターフェースのソースが公開されていますが
そちらは確認済みですよね?
0190デフォルトの名無しさん
NGNGもしくは、代替で実現できるコンポーネントはあるのでしょうか?
初心者すぎてすみません・・・
Delphi6使用です。
0191デフォルトの名無しさん
NGNGVBのListItemsにはそんな感じのプロパティがあった気がするんですが
Delphiでみあたりません、教えてください
0192デフォルトの名無しさん
NGNGTEdit
>>191
OwnerDraw
0193デフォルトの名無しさん
NGNGこういうこと?
procedure TCustomPanel.SetText(const Value: TCaption);
>>188-189
答える気がないならレスしなくていいよ。ここはそういうスレだから。
0194デフォルトの名無しさん
NGNGprocedure TControl.SetText(const Value: TCaption);
0195デフォルトの名無しさん
NGNGTPanel でフォームの領域分割をする場合はTPanet.Align を
片方のパネルを alBottom、alLeft、alRight、alTop のいづれか
もう片方を alClient とする。
0196デフォルトの名無しさん
NGNGレスありがとうございます。
どこで使えるのか探してみていますが、TEdit内で
「○○はここです \\サーバ名\フォルダ...」のように、
通常文字とリンクを混合させた場合でも、リンクははれるのでしょうか?
要は、コメント欄を作って、その中でファイルへのリンクを貼りたいのです。
クリックすると、ファイルが開くような・・・
0197デフォルトの名無しさん
NGNGClientSocketのHostプロパティに無効なURLを入力すると
OnErrorイベントが発生しないで
「'ASync Lookup' APIでWindows ソケットエラー:そのようなホストは不明です。(11001)」
というメッセージが表示されちゃうのはなんとかできないのでしょうか?
0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNGあ〜、DelphiはItemにそういう項目はなくてListViewのCanvasをそこでいじるんですね
解決しましたー、ありがとう
0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNGヘルプとか参照してみたんですが分からないです・・・orz
0202デフォルトの名無しさん
NGNGTRichEdit
0203デフォルトの名無しさん
NGNG> OnTerminate イベントハンドラは,メイン VCL スレッドのコンテキスト内で呼び出され,
> VCL メソッドおよびプロパティを自由に呼び出せるようにします。
とありますが、これは Synchronize を使用したときのようにスレッドセーフでないオブジェクトも気にせず扱えるということですか?
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNGもしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNGじゃ表示されないんだYO!
0208デフォルトの名無しさん
NGNG0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG回答の質のレベルダウンは目を覆うばかりだな。あちこちのBBSも同じ状況
0212デフォルトの名無しさん
NGNGForm.ManualFloat(Rect)
したくて、かつ、Formの位置を変えずに表示させたいんですが、
Rectには何を入れたら良いですか?
0213デフォルトの名無しさん
NGNG0214デフォルトの名無しさん
NGNGTextプロパティ
0215デフォルトの名無しさん
NGNGWinExec('IEXPLORE.EXE' ,SW_SHOW);
ShellExecute(0, 'OPEN', Pchar('http://www.yahoo.co.jp/'),nil, nil, SW_SHOWNORMAL);
このようにやっていて一応目的は果たせているのですが、
環境によってはブラウザ起動後ホームに設定してあるページが1,2秒表示され、やっとyahooへ飛ぶといった挙動になってしまいます
HTMLのリンクをクリックした時のように最初からURLをセットした状態で新規に起動したいのですが、何か解決方法はありますでしょうか?
0216デフォルトの名無しさん
NGNGん?1行目要るか?
0217デフォルトの名無しさん
NGNG一行目を入れないとすでに開いているブラウザにURLをセットしてしまいます
新規に起動させたブラウザにyahooをセットしたいのです
0218デフォルトの名無しさん
NGNGCommaTextつうのもある
0219ななしへたぐらま ◆XcB18Bks.Y
NGNGTClientSocket 11001 でぐぐってみたら一発目にこんなのが出てきましたよ.
http://www.talkaboutprogramming.com/group/comp.lang.pascal.delphi.misc/messages/242762.html
0220デフォルトの名無しさん
NGNGこれでは駄目ですか?
ShellExecute(0, 'OPEN','IEXPLORE.EXE' ,'http://www.yahoo.co.jp/', nil, SW_SHOWNORMAL);
0222デフォルトの名無しさん
NGNG0223デフォルトの名無しさん
NGNG0224初心者
NGNGテキストファイルに保存してある文字列を、
ComboBoxやMemoに読み込んで表示させたいのです。
テキストファイルの中身を、
a1,a2,a3,a4,a5,a6
b1,b2,b3,b4,b5,b6
c1,c2,c3,c4,c5,c6
と仮定して、
a1,b1,c1をComboBoxに
a2,b2,c2をMemo1に
a3,b3,c3をMemo2に
・・・
a6,b6,c6をMemo5に
というふうに、コンマごとに区切って表示させたいんです。
さらに、ComboBoxで選ばれた文字に対応するデータをMemoに表示させたいんです。
例えば、
ComboBoxで、a1を選んだとすると、
Memo1はa2、Memo2はa3、Memo3はa4、Memo4はa5、Memo5はa6が、
とこんな感じで。
LoadFromFileメソッドを使うってのは分かるんですが、
イマイチ良く分からないんです・・・。
よろしくお願いします。
0225デフォルトの名無しさん
NGNGそんな処理、かなり強引なコード書くしかないと思う
0226デフォルトの名無しさん
NGNG0227デフォルトの名無しさん
NGNG0228デフォルトの名無しさん
NGNG0229215
NGNG0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNG丸投げイクナイ
もう少しポイントを絞って質問しなよ
0232デフォルトの名無しさん
NGNG正直お勧めはしない
procedure TForm1.FormCreate(Sender: TObject);
const
TextFile = 'test.txt';
var
str : TStringList;
i,j,k : integer;
tmpstr,substr : string;
Control : array [0..5] of TWinControl;
begin
Control[0] := ComboBox1;
for i := 0 to 4 do
Control[i+1] := TWincontrol(FindComponent('Memo'+inttostr(i+1)));
str := TStringList.Create;
try
str.LoadFromFile(TextFile);
for i := 0 to str.Count-1 do
begin
tmpstr := str[i];
for j := 0 to 5 do
begin
k := pos(',',tmpstr);
if k = 0 then
k := Length(tmpstr)+1;
substr := Copy(tmpstr,1,k-1);
if Control[j] is TMemo then
TMemo(Control[j]).Lines.Add(substr)
else if Control[j] is TComboBox then
TComboBox(Control[j]).Items.Add(substr);
Delete(tmpstr,1,k);
end;
0233232
NGNGfinally
str.Free;
end;
0234デフォルトの名無しさん
NGNG0235デフォルトの名無しさん
NGNGprocedure TForm1.FormCreate(Sender: TObject);
const
TextFile = 'test.txt';
var
str,str2 : TStringList;
i,j : integer;
Control : array [0..5] of TWinControl;
begin
Control[0] := ComboBox1;
for i := 0 to 4 do
Control[i+1] := TWincontrol(FindComponent('Memo'+inttostr(i+1)));
str := TStringList.Create;
try
str.LoadFromFile(TextFile);
str2 := TStringList.Create;
try
for i := 0 to str.Count-1 do
begin
str2.Clear;
str2.CommaText := str[i];
for j := Low(Control) to High(Control) do
begin
if Control[j] is TMemo then
TMemo(Control[j]).Lines.Add(str2[j])
else if Control[j] is TComboBox then
TComboBox(Control[j]).Items.Add(str2[j]);
end;
0236デフォルトの名無しさん
NGNGfinally
str2.Free;
end;
finally
str.Free;
end;
end;
0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNG0239デフォルトの名無しさん
NGNG0240デフォルトの名無しさん
NGNGColsのCommaTextで読み出すのが一番簡単かな
0241初心者
NGNG出掛けていたもので・・・。
質問の丸投げなんてとんでもないです。
ほんとスイマセン。
確かに強引なのは分かっているんですけど、
237でおっしゃっておられるように、
ComboBoxのリストをセレクタとしてMemoに表示させる内容を変更させるのが目的なんです。
教えていただいた方法で試してみます。
で、238でおっしゃっておられるように、
ComboBoxのリストのセレクタを変更させる毎に、
Memoに表示させる内容を変更させたいんですよね。
240でおっしゃっておられる方法ですれば、上手くいくのでしょうかね?
試してみたいと思います。
また行き詰まったら、質問してもいいでしょうかね?
よろしくお願いします。
0242デフォルトの名無しさん
NGNGあとはどうとでもできる。既出の TStringList の CommaText の使い方を
覚えるのがポイント。
0243240
NGNGCドライブに>>224の内容をtest.txtいうテキストファイルを用意。
Buttonをダブルクリックしてイベントハンドラに以下を記述。
procedure TForm1.Button1Click(Sender: TObject);
var
SL,SL2: TStringList;
i: Integer;
begin
SL := TStringList.Create;
SL2 := TStringList.Create;
try
SL.LoadFromFile('c:\test.txt');
StringGrid1.RowCount := SL.Count;
SL2.CommaText := SL.Strings[0];
StringGrid1.ColCount := SL2.Count;
for i := 0 to SL.Count - 1 do
StringGrid1.Rows[i].CommaText := SL.Strings[i];
ComboBox1.Items.CommaText := StringGrid1.Cols[0].CommaText;
Memo1.Lines.Add(StringGrid1.Cols[1].CommaText);
Memo2.Lines.Add(StringGrid1.Cols[2].CommaText);
Memo3.Lines.Add(StringGrid1.Cols[3].CommaText);
Memo4.Lines.Add(StringGrid1.Cols[4].CommaText);
Memo5.Lines.Add(StringGrid1.Cols[5].CommaText);
finally
FreeAndNil(SL2);
FreeAndNil(SL);
end;
end;
0244240
NGNGprocedure TForm1.ComboBox1Change(Sender: TObject);
begin
Memo1.Lines.Add(StringGrid1.Cells[1,ComboBox1.ItemIndex]);
Memo2.Lines.Add(StringGrid1.Cells[2,ComboBox1.ItemIndex]);
Memo3.Lines.Add(StringGrid1.Cells[3,ComboBox1.ItemIndex]);
Memo4.Lines.Add(StringGrid1.Cells[4,ComboBox1.ItemIndex]);
Memo5.Lines.Add(StringGrid1.Cells[5,ComboBox1.ItemIndex]);
end;
あとは実行してみれ。
0246デフォルトの名無しさん
NGNGこういう手続きを宣言したとき引数の型を調べるにはどうすればいいのでしょうか?
0247デフォルトの名無しさん
NGNG0248デフォルトの名無しさん
NGNG無理
0249デフォルトの名無しさん
NGNG0250デフォルトの名無しさん
NGNGNew Dispose は難しそう。
0252初心者
NGNG■ このスレッドは過去ログ倉庫に格納されています