では質問をどうぞ。
前スレ
>>989から継続です。お願いします。
WinXP + delphi7(VCL)で開発します。
コンボボックスのコンポーネントで、なめらかな動きをしない
(スムーススクロールしない)ようなものはありませんか?
あるいは、作る方法はありませんか?
stackoverflow.com/questions/2968189/disable-mouse-scroll-wheel-in-combobox-vb-net
参考にして、WM_MOUSEWHEELを握りつぶすことはできました。
(ホイールが利かなくなりました。)
ただ、ホイールを無効化するのでなく、
ドロップダウンリストにスクロールバーが出ている状態においては、
リストを1行ずつスクロールさせたく思っております。
その際、スムーススクロールさせると、リストのスクロールが
目で追えなくなってしまうような描画をするので、それを対策したいと思っております。
コンボボックスに、StringGridにおけるTopRowプロパティのようなものがあれば、
対策できそうではあるんですけど、方法ありませんでしょうか?
完全に握りつぶさないでItemIndexを加減すればいいんじゃね?
TMainFormにアクセスするにはどうすればいいのでしょうか?
Application.MainForm
>>4 自分もコンボボックスに機能追加しようといろいろ研究してたので…。
前スレ975
>Windowsのパフォーマンスオプションで、「リストボックスを滑らかにスクロールする」の
>チェックを外せば、望み通りの動きなのですが。(マウスホイールによる動きが全然違います。)
それならいっそ SystemParametersInfoのSPI_SETLISTBOXSMOOTHSCROLLINGで外せば良いかと。
1つのコンボボックスのためにシステム全体を設定変更と、かなり強引ですが…。それがこちら。
http://pastebin.com/PmWkCB51 OnDropDown時にSPI_GETLISTBOXSMOOTHSCROLLINGで状態取得、その後外し、OnCloseUpで元に戻す。
>コンボボックスに、StringGridにおけるTopRowプロパティのようなものがあれば
あります。csSimpleにして ComboBox1.Perform(CB_SETTOPINDEX,50,0); すれば瞬間移動します。
ですが… csDropDownだと、どう使ったら良いやら? 難しそうです。
それに加えWM_MOUSEWHEELを真っ当に使わないでゴニョゴニョするのは、かなり大変かと。
THotKeyで設定したホットキーが押されたときの動作を設定するにはどうすればいいのでしょうか?
>>10 THotKeyのOnChangeイベント等で、HotKeyプロパティを以下のいずれかに設定します。
・ TActionList→TActionのShortCutプロパティ(実行内容はOnExecuteに記述)
・ TMainMenu→TMenuItemのShortCutプロパティ(実行内容はOnClickに記述)
ヘルプの「例」も見た方がいいけど分かりにくいかも。
13 :
4:2012/11/20(火) 01:30:53.63
>>9 コメントありがとうございます。
> それならいっそ SystemParametersInfoのSPI_SETLISTBOXSMOOTHSCROLLINGで外せば良いかと。
> 1つのコンボボックスのためにシステム全体を設定変更と、かなり強引ですが…。
1つの方法ではありますね。
ただ気がかりなのが、
1.ソフトが異常終了したときに、Windowsの設定が変わってしまう。
2.同様の設定をしているコンボボックスを画面内に複数載せる場合があることを考えると、
コンボAのOnDropDownとコンボBのOnCloseUpが同時に発生したときの処理順が気がかり。
です。
14 :
4:2012/11/20(火) 01:36:13.18
>>9 > csSimpleにして ComboBox1.Perform(CB_SETTOPINDEX,50,0); すれば瞬間移動します。
参考にして、以下のようなオーバーライドを入れてみました。
すると、生成して1回目のホイールだけスムーススクロールして、
2回目のホイール以降からは、スムーススクロールしないという不思議な動きをしています。
動きとしては、非常に惜しいです。
procedure MyCombo.WndProc(var Message : TMessage);
var
iIdx : Integer;
Rotation : ShortInt;
begin
if (Message.Msg = WM_MOUSEWHEEL) then begin
if (DroppedDown) then begin
Rotation := Message.WParamHi;
iIdx := Self.Perform (CB_GETTOPINDEX, 0, 0);
if (Rotation > 0) then begin
iIdx := iIdx - 1;
end else begin
iIdx := iIdx + 1;
end;
Self.Perform(CB_SETTOPINDEX, iIdx, 0);
exit;
end;
inherited WndProc(Message);
end;
TEditでhoge...○○と続く文のhogeの部分があれば実行されるようにしたいのですがどうすればいいのでしょうか?
その質問の文章、自分で理解可能なのかよ?
それはともかくエスパーしてみると、
if Pos('hoge',Edit1.Text) = 1 then
で判定かな?
>>16 すみません・・・
そのコードで試してみたところできました!
ありがとうございます!
もう1つだけお願いします・・・
hogeから10文字までの文字を引数に格納するにはどうすればいいのでしょうか?
引数に格納?? 変数に、のことかな。
hogeから? hogeを検索してってこと? それとも先の質問と同じくhogeは先頭にあるのか?
10文字まで?? 10文字なのか、インデックスで10文字目までなのか。
hogeを含むのか、含まないのか?
私のESP能力を全開にして導き出した回答。
Edit1からhogeを検索し、その位置からhogeを含んで10文字取り出す。
var
Str: String;
begin
Str:=Copy(Edit1.Text, Pos('hoge', Edit1.Text), 10);
Delphiもいいけど、日本語をがんばれ。
>>19 ありがとうごいます!
日本語のほうも勉強したいと思います・・・
超初心者の内容かと言われれば疑問ですが、ひとつ質問をしたいです。
INetCfgインタフェースなど、NetCfgX系の資源を利用できるDelphi用の定義ファイルってないでしょうか?
もしご存知の方は教えて下さい。探しても見つかりません…。
if文に2つの条件をつけるにはどうすればいいのでしょうか?
if (A=1) and (B=1) then
if (A=1) or (A=9) then
>>19 hogeが2個以上あったらどうする?
こういう処理はマッチングでやるしかないと思う Posでは物足りない
今足りても将来どうかな 先を見越した設計をしないと
String型を安易に使ってるのも危険な匂いがするんだけど DELPHIのバージョンで扱いが変わるし
さっさとコード出せよks
>>18を単純に解釈すると
hogeから始まる文字列の頭から10文字分を別の文字列に
コピーするにはどうしたらいいですか?
になるんだけど、これであってるかな。
30 :
26:2012/11/21(水) 12:27:26.43
>>29 >15 の続きで >18 の流れだから
1.TEdit 文字列 [ hoge...○○ ] の中に「hoge」が入った文があれば実行する、にはどうするか?
2.上記の条件を満たした場合、「hoge」から10文字までの文字を変数に格納する、にはどうするか?
>17 でOKな返答がある為、Unicode 以前なら結果的にどうってこともないかと
var
Str : String;
begin
if Pos('hoge',Edit1.Text) > 0 then
begin
Str := Copy(Edit1.Text, Pos('hoge', Edit1.Text), 10);
// 処理
end;
end;
Edit1.Text → 結果
hoge0123456789 → hoge012345
012hoge0123456789 → hoge012345
01234hoge01 → hoge01
hogeあ1いうえ → hogeあ1い
質問者はとうにいなくなってるのに周りの池沼共がギャーギャーうるさいな
こういうのよく見るけど何がしたいのかね?知識自慢?
delphixe2のListViewの横スクロールバー表示はどこで設定するの?
ListViewのスクロールバーは勝手に出たり消えたりするから設定は無いんじゃない?
レスありがとうございます。
スッキリしました。
6の時みたいに無償化イベントないかなぁ
37 :
4:2012/11/23(金) 07:14:21.87
ComboBox1.Perform(CB_SETTOPINDEX,*,*)
を使用する方向でやっていましたが、結局改善しきれませんでした。
そのため、SPI_SETLISTBOXSMOOTHSCROLLINGのシステム設定を
変更する方法で回避することにしました。
ちなみに、私が懸念していた点について。
> 1.ソフトが異常終了したときに、Windowsの設定が変わってしまう。
プロファイルへの書き込みをしなければ、
Windowsを再起動したときに変更前の設定に戻るみたいですので
想定よりはましでした。
> 2.同様の設定をしているコンボボックスを画面内に複数載せる場合があることを考えると、
> コンボAのOnDropDownとコンボBのOnCloseUpが同時に発生したときの処理順が気がかり。
通常のマウス操作では、コンボAのDropDownとコンボBのCloseUpを同時発生できないので、杞憂でした。
ありがとうございました。
HTMLファイルのURLの部分のみ(複数のURL)を抜き出してlistboxに反映するにはどうすればいいのでしょうか?
「<a」が出てきたら次の「>」までを抽出する
>>39 そこまでは辿りついたのですがでどういう風に書けばいいのか分からず・・・
PosExを使うのでしょうか?
正規表現ライブラリとか使うと幸せになれるよ
URL抽出用のクラスを自作すりゃいい
procedure TForm1.Button1Click(Sender: TObject);
var
MS_Base :TMemoryStream;
Buffer : array[0..MAX_PATH-1] of Byte;
BinarySize,Address : Int64;
Bytes : Integer;
Str : String;
Check1,Check2 : Boolean;
begin
MS_Base := TMemoryStream.Create;
MS_Base.LoadFromFile(ExtractFilePath(Application.ExeName) + 'subback.html'); // 保存してると思いねぇ
Check1 := False;
Check2 := False;
Str := '';
Bytes := 3;
Address := 0;
BinarySize := MS_Base.Size;
while Address < BinarySize do
begin
MS_Base.Position := Address;
MS_Base.Read(Buffer,Bytes);
if Check1 and Check2 then
begin
if Buffer[0] = $22 then
begin
Check1 := False;
Check2 := False;
ListBox1.Items.Add(Str); // <a href=" ~ 中の部分 ~ "
Str := '';
Bytes := 3;
end else Str := Str + chr(Buffer[0]);
end;
if Check1 and (Check2 = False) then if Buffer[0] = $22 then Check2 := True;
if (Check1 = False) and (Buffer[0] = $3C) and (LowerCase(chr(Buffer[1])) = 'a') and (Buffer[2] = $20) then
begin
Check1 := True;
Bytes := 1;
end;
Address := Address + 1;
end;
MS_Base.Free;
end; // ここまで
>>43-45 出来ました!
本当にありがとうございます
これで自分が思い描いたソフトが作成できそうです
LOOP1:
if (DATA[i] = $3C) and
(DATA[i+1] = $61) and
(DATA[i+2] = $20) and
(DATA[i+3] = $68) and
(DATA[i+4] = $72) and
(DATA[i+5] = $65) and
(DATA[i+6] = $66) and
(DATA[i+7] = $3D) and
(DATA[i+8] = $22) then
begin
i:=i+9;
while (DATA[i] <> $22) do
begin
str:=str+chr(DATA[i]);
Inc(i);
end;
ListBox1.Items.Add(str);
str:='';
end;
Inc(i); if i>length(DATA) then exit;
goto LOOP1;
Delphi XE3にてDeleteが使用できません。
while Pos('hoge', str) > 0 do Delete(str, Pos('hoge', str), 1);
以下の内容で実行すると
'Integer' と 'string' には互換性がありません
実パラメータが多すぎます
とでます
どうすれば実行されるようになるのでしょうか
>>48 自己解決しました
ListBox1.Items do
の中に入れていたのでエラーが発生したみたいです
System.deleteで解決できました。
WMI Delphi Code CreatorとかMicrosoftのWMI Administrative Toolsに入っている
CIM Studioを使うと幸せになれるかも
54 :
51:2012/12/04(火) 20:27:08.89
>>53 規制で書けませんでした
OS は XP sp3 です。
Delphi は D6 です。
HardwareID は array なんですね。
HardwareID 部分を別アレイにするとしても変動する行数をどう取得するのやらさっぱり
その後 各USB 機器やWindows の HardwareID を調べていった結果
どうやら機器そのものの ID ではなくて
その機器に使われている I/O 部分の ID だということが判りました。
結局ドライバレベルの(他メーカーでも同一のチップによるひとくくりな)大まかな振り分けしかできないようで
質問は取り下げします。 スミマセン
?
取得以前に、Win32_PnPEntityの場合HardwareIDは存在しないのでは?
Windows Server 2003, Windows XP, Windows 2000, Windows XP, and Windows NT 4.0:
This property is not available.
大事なことだから、二回もWindows XPと書いてあるけど。
56 :
51:2012/12/05(水) 03:14:00.05
>55
PnPEntity で取れるかどうかは別として
デバイスマネージャ上のプロパティ > 詳細 > ハードウェア ID
で OS から見たりした結果です。
XP でも項目と値は入っていますよ
58 :
51:2012/12/05(水) 21:48:09.23
>>57 目的が「機器名を個別に関連付けする」です。
その為に機器個別のメーカーが振ったローカル情報があれば取得したかったわけです。
A社の機器B 使われているI/O のチップF
C社の機器D 使われているI/O のチップF
で、この場合、共通の「I/O のチップF」しか取得できないようで
異なる通信接続手順などを自動設定できないな・・・
USB Web カメラなどは接続の(画像サイズなど)リストが出る方法があるようですが
振り分けのターゲットは、USB 接続
CP210x USB to UART Bridge Controller
の先にいる機器です。
あきらめました
>>56 なんかすれ違うなぁ。
いやXPではHardwareIDが無いなんて言ってないし、別の方法で確認したことは理解してましたよ。
>HardwareID 部分を別アレイにするとしても変動する行数をどう取得するのやらさっぱり
って書いてあったから、
arrayとかの問題以前に、XPでWin32_PnPEntityの場合はHardwareIDの取得は無理なのでは、と言ったつもり。
分かってるなら私の読解力不足。失礼。
質問です。
FindFirst(), FindNext() で開いているディレクトリの中のファイルを操作すると何か問題ありますか?
画像ビューアを作っています。ウィンドウにドロップされたフォルダを開き、ファイル一覧を得て、順番に表示し、必要に応じて画像を移動したり削除したりするものです。
60 つづき。
フォルダの中の画像が多いとファイル一覧を得るのに時間がかかるので、差し当たり百枚くらいリストを作ったら最初の画像を表示し、ユーザに待ち時間を感じさせないようにしたいのです。
FindNext() は TThread か Application.PrecessMessages で GUI と競合しないように継続するので、FindClose() する前に、ファイルにアクセスすることになります。
よろしくお願いします。
試しにどうでもいいデータでテストしてみればいいだけでは。
時間がかかるって、ファイル何個で何秒?
FindNext以外の処理で重くなってる気がする FindNext自体は高速だろう
エクスプローラ的なUIの画像ビュアーか いかにも面倒臭そう
そういうソフトだったVixってソースが何十万行もあったような・・・
65 :
60:2012/12/18(火) 07:00:40.64
>>62 旧バージョンではフォルダを閉じずにファイル操作していましたが別に不都合は感じませんでした。
でも本当にそれでいいのか気になって一旦ファイル一覧を作ってフォルダを閉じてから操作するようにしました。
すると今度は待ち時間が発生するのでどうしたものかと。
66 :
60:2012/12/18(火) 07:09:37.06
>>63-64 *.* で全てのエントリを拾って拡張子を調べて BMP, GIF, JPEG, PNG を選び TStringList に Add() しています。
ExtractFileExt(), LowerCase(), AnsiPos() をエントリの数だけ繰り返します。
コードの行数は三桁もないと思いますが while ループがあります。
実際にかかる時間は画像千枚くらいで十秒くらいでしょうか。
Win限定ならFindNext使って列挙せずに、シェルAPI使おうぜ。そうすりゃ、エクスプローラとの
見た目の一貫性とかある程度取れる。
>>60 FindFirst,FindNextももちろんだが、ディレクトリのファイルを操作する
APIの呼び出し時にもちゃんと戻り値をチェックして行儀のよくプログラミング
しておけば別に問題ないと思うけど。
68 :
60:2012/12/18(火) 09:42:46.02
>>67 ShellAPI ですね、調べてみます。
戻り値にも気を付けます。
いっそ、全てのファイルを取得してフォルダを閉じてから画像ファイルを選べばいいんじゃないかと思い当たりました。
70 :
60:2012/12/18(火) 16:41:59.29
>>69 ありがとうございます。
それも参考にしてなんとかしてみます。
delphi6を使用しています。
var
Time : TDateTime;
str : String;
begin
Time := Now;
DateTimeToString(str, 'h時n分s秒',Time);
Label1.Caption := str;
とすると、時、分、秒が表示されず数字のみの表示になってしまいます。
どうすれば時、分、秒が表示されるのでしょうか?
>>71です。
'h''時''n''分''s''秒'で解決することができました。
つ FormatDateTime
そっちも問題は一緒ですけど
procedure TForm1.FormCreate(Sender: TObject);
var
ini : TIniFile;
ExePath: String;
begin
ExePath := ExtractFilePath(Application.ExeName);
ini := TIniFile.Create(ExePath + 'settings.ini');
if ini.SectionExists('Settings') then
このようにして、settings.iniのセクション'Settings'があった場合の動作を指定しようと思ったのですが、どうもうまくSectionExistsが働いていないようで、
SectionExistsがTrueになってくれません。
settings.iniに'Settings'のセクションはあります。
解決策をどなたか教えて頂けないでしょうか?
デバッグ版DCU使ってSectionExistsの中にステップインしてみたら?
>>75 根本的な解決にはならないけど代替案。
var hoge: Integer;
hoge := ini.ReadInteger('foo', 'bar', -1);
if hoge = -1 then
begin
// invalid
end
else
begin
// valid
end;
>>76さんのやり方は出来ないことが判明したので、
>>77さんの代替案を使用させて頂きます。
ありがとうございました!
>>78です。
言葉足らずでした。
>
>>76さんのやり方は出来ないことが判明したので
性格には
>>76さんのやり方は私の環境では出来ないことが判明したので
でした。
はぁ
tがひとつ多いとかsが足りないとかいうしょーもないオチだったりして・・・
出来ないだけじゃ分からん
出来ないのは彼女です
こんなアホそうなやつでも遭遇するバグだったら他の誰かがとっくに気付いてるし
無償、もしくは非常に安価なバージョンは用意されていますか?
Starter Editionってのがあったと思う。色々制限はあるだろうけど。
何もないフォームに PaintBox を一つ貼り付けて、プログラムも OnPaint に
procedure TForm1.FormPaint(Sender: TObject);
begin
with PaintBox1.Canvas do begin
Brush.Style := bsSolid;
Brush.Color := clWhite;
FillRect(ClipRect);
end;
end;
と書いただけの時、フォームのダブルバッファが True だと表示されないのはなぜ?
前はちゃんと出来ていたと思うのだけど・・・
88 :
87:2013/01/19(土) 01:50:44.31
あ、バージョンは XE Starter です。
事故解決しました・・・
Windows 7 (32-bit/64-bit) 環境で Delphi 6 は、インストールと動作は可能でしょうか?
XP モードというものを入れないと使えない?とかありますか?
>>90 今使ってるが問題なく使えている(win7 pro 64bit)
XPモードは使っていない
開発頑張ってね
>>90 Delphi5Pro だけど Win7 32/64bit でちゃんと動いてるよ。
ただしプロジェクトファイルは Delphi 本体からでないと開けない。
F9 で実行中のウィンドウはファイルのドロップを受け付けない。
ヘルプファイルの挙動が時々不審。
この三つ以外は特に問題ない。
>>91-92 ありがとうございます。 安心して機種移行するまで今のXP環境を使います。
最近の(64-bit)機種でXPのドライバが無いものなどがあるようなので
今使っているパソコンが壊れたら開発環境崩壊? かと
Lazarusあかんの?
横から便乗質問なんですが(私も Win7 64bit Delphi5Pro です)
最近急に .hlp の起動が遅くなりました
数ヶ月くらい前から急にです
秀丸から開いたりするとタイムアウトエラーになるほど遅いです
おそらく何かきっかけがあったんでしょうがググってもあまり良い情報は得られませんでした
>>92 さんはそんなことは起きていないですか?
96 :
デフォルトの名無しさん:2013/01/25(金) 23:33:29.77
Delphi関係だけが遅いのですか。
ファイルのコピーとかは遅くないですか。
>>95 92 です。
うちでは起動が遅いということはありません。
うちの不審な挙動とは F1 でヘルプを開こうとしたときに、クラスではなくプロパティやメソッドの名前にカーソルがあると開かないというものです。
Windows 7 Pro 64bit に Delphi 7.1 をインストールして快適に使っています。
唯一、F1 キーによる状況検知ヘルプだけが有効に機能しません。
「C:Delphi7Helpd7.hlp ファイルが見つかりません。このファイルを自分で探しますか?」
というメッセージダイアログが出てしまいます。ヘルプファイルのパス名から \ マークが
消えています。Windows 7 側の問題だと思いますが、このスレに解決方法をご存じの方
いらっしゃいますか?
99 :
95:2013/01/26(土) 11:06:48.62
>>96-97 どもです
WinHelp は他に API32WH.HLP くらいしか使っていなかったのですが
今ほかの昭和なソフトで確認したら問題なかったです
秀丸に登録してみてもすぐに開きました
D5、D6、API32WH.HLP はドライブもフォルダも異なるので HDD の問題でもないと思うのですが
うまく開いていた頃はたまにオブジェクトインスペクタから開いた時に「追加情報はありません」と
出ていたくらいでその時はフォームのコンポーネントで F1 押せば正常に開いていました
Dという言語がある。D1, D2があるから、
D5, D6なんてかかないほうがいいとおもう
その弩マイナーな言語よりDはDelphiが先なんで
DelphiをDなんて言う人滅多に見ないな
滅多にってか見た記憶がなかったわ
だから何なの。D5,D6という記述は普通だけど。
Delphiである前提条件下では普通だな。tipsやvclの対応表記とか。
ここもそうならそうでいいんじゃないの?
厳密に正否なんてないがDelphiスレでおかしいと思うのもどうかと思うが
普通とか言っちゃってるのも相当おかしい。
検索のノイズになることを懸念しているのであれば、「D言語」で検索すれば問題ないんじゃない?
107 :
95:2013/01/29(火) 20:39:57.31
D言語が存在するのは承知していますが
パソ通時代から現在まで Delphi スレでのバージョン明記の目的でしか D5、D6 という書き方をしたことがありません
とかどうでも良いんですが
Help 問題は俺環みたいですねお騒がせしました
ふぁっきんじゃっぷ
Delphi のバージョン略を 他言語 D と混同するとか難癖つけるやつは
スレタイ100回音読しやがれ!
何の開発言語のスレだ ボケっが
____
/⌒ ⌒\ ホジホジ
/( ●) (●)\
/::::::⌒(__人__)⌒::::: \ はいはい
| mj |ー'´ |
\ 〈__ノ /
ノ ノ
pascalのくせに生意気だ
あるテキストを読み込み空行があれば
行を詰めて書き直したい
----------------------------------
ファイルから一行読み込む
最初の一文字が<>空欄でなかったら
書き込む
----------------------------------
元のテキスト
aaaa
bbbb
cccc
結果
aaaa
bbbb
cccc
こんなプログラム書いてくれる親切な人いたらお願いします。
昔 turbo pascal (わかるかな?)というので数行で書けたのですが
by後期高齢者
>>113 sl: TStringList;
i: Integer;
// Create して LoadFromFile
for i := sl.Count - 1 DownTo 0 do
if sl[i] = '' then sl.Delete(i);
// SaveToFile して Free しておしまい。
たぶんこんな感じ。
var
fr,fw:textfile;
s:string;
begin
assignfile(fr, "ファイル名");
assignfile(fw, "ファイル名");
reset(fr);
rewrite(fw);
while not eof(fr) do
begin
readln(fr, s);
if s = '' then writeln(fw,s);
end
116 :
デフォルトの名無しさん:2013/02/18(月) 09:36:59.86
最初の一文字が<>空欄でなかったら書き込む
この条件見落としてる人ばかりw 0点。<と>の判定を忘れてる
>>117 は何か勘違いしているな。
依頼主の表現も悪かったが、それを読み解く能力の有無で
>>114-115 と差がついてしまっているようだ。
コミュニケーションスキルは大事だということが理解できる事例。
WindowsXPsp3、Delphi6 personalですが
アプリ起動時にアプリ本体のあるディレクトリにデータ保存用のフォルダを作っているのですが
そのフォルダの中にファイルストリームでテキストファイルを生成して
そのファイルをTStringListで読み込むにはどうすればいいですか?
アプリ本体と同一フォルダにファイルストリームでテキストファイルを生成してTStringListで読み込むことは出来ています
検索してもフォルダ内にファイルを作る方法がよく判りません
>>119 作成も読み込みも、実行ファイルが置かれているディレクトリ + 'hoge\'で指定出来ない?
>>119 実行ファイルのディレクトリはExtractFilePath(Application.ExeName)で
取得出来るよ。
「最初の一文字が<>空欄」ってどういうことか。
<や>で始まる一行を削除したいんだろう もっといえば「複雑な削除条件を持たせたい」ってのが
本件の主軸。しかもその削除条件は変動的だろうさ EXEでやるのは間違い、PerlやRubyスクリプト
でやるべきだ それなら依頼主が言うようにたった数行でできるしいつでも変更できる
初心者が理解しがたいDownToの逆順ループとかやってるアホがいたけどw それで保守できるの?
いかにも仕様変更時に勘違いやバグが起きそうだ
>>120-121 何と、あっさりと出来てしまいました
本当にありがとうございましたm(_ _)m
ParamStr(0) も忘れないでください
GetModuleFileNameも忘れないで
>>122 いろいろと痛々しいから大人しくしていたほうがいいよ。
これ以上の議論はスレ違いなんで、あと一回捨て台詞吐いて消えな。
それについては反論しないから安心していいよ。
最後はお前さんの勝ちってことでいいからね。
Ran ちゃん、ご苦労さま。
>>122 依頼主が「多謝」っていってんのに何いってんのこいつ?
依頼主が何をいってるかわからないなら勝手に読み解くんじゃなくて
依頼主にたずねるのが常識だろ?
これだから引きこもりは嫌なんだよ。
コミュ障なんだろ
ほっとけよ
> 初心者が理解しがたいDownToの逆順ループ
Delphiの定石だと思うんだけど。
StringListでDeleteするならDownToの方が安心だよね。
定石とか安心とか、中級者がハマりがちな勘違い 上級者ほど基本に立ち返る
削除時のdowntoは基本中の基本だけど?
会社でDelphi7使うことになって、勉強のために家のPCにもDelphiをインストールしたいです。
ただ、Delphi7はバージョンが古いようで、手にはいりません。
Delphi7と同じ感覚で使えるバージョンはありますか?
>>136 Delphi6が無償で配布されているがそれじゃダメかな
コードの練習と各々の機能の理解はどのバージョンでも出来ると思うよ
>>137 そのキャンペーンはとっくに終わっている
現在、無償の Delphi は存在しない
>>138 そうだったのか
ならLazarusはどうかな?
短発の仕事の為だけに1万くらいの最新の奴買う訳にはいかないよなw
XEでも似たようなモンだろ? 体験版あるよ
えーと7とそっくりだったのは2010だっけか 6と7は文字コードの差とか内部的には違いが大きいはず
見た目は近いけど。複数のバージョン試して驚いたのがコンパイラがまったく進歩せず、6のソースが
ほとんど高速化しなかったこと その点を踏まえれば古いバージョンのままでも正解だと思う
うちも未だに仕事では7なんだけど7ってやっぱ優秀なの?
何を持って優秀というかは自分でもわからんけど自宅では趣味性で最新版入れてるけど
特に顧客要件も関係ないのに頑なに7なんだよねぇ
5が最強らしいけどユニコードががが……。
>>143 優秀っていうより7からXP モードが搭載されて見た目がXPライクに作れる
それまでのは 画面のテーマで「Windows クラシック」なウィンドウ。
吐くコードが Windows 2000 でも動作可能で Win32API に気をつけて組めば
Win95 でも動くものを作れるので、雑多に混ざっているクライアント環境に渡すには強い。
MS visual studio は上位バージョンになっていくと過去OSで動かないコードになってく
>>136 XE3買えば全てのバージョン使えるじゃん。
未だに会社でDelphi7の環境ってことは、ライセンスに関してはゴニョゴニョって感じなのかな。
ロングファイルネームや感じがダメなら hogeho~1.dbf とかの短縮名で
アクセスしちゃダメ何かね? MLの話題なんだけど...。
ほっとけよ。>148
質問者も回答者も隠し球ばかり。
あの手のバグは FileMon つかって実際に開こうとしているファイルを「知る」のが最短の対応。
150 :
デフォルトの名無しさん:2013/03/01(金) 00:16:17.49
すみません、実はかなり初歩的なことなんだろうと思うんですけど、
ゴチャゴチャやってるうちにわけわかんなくなっちゃいました。
function HOGE(bmp: TBitmap): boolean
var
tmpBMP: TBitmap;
begin
tmpBMP:=TBitmap.Create;
try
で、tmpBMPにいろいろやって、
最終的に、
bmp.Assign(tmpBMP);
なんてことをやる場合、
end;
この関数の引数であるbmpは var とかにしなきゃダメなんですか?
はっきりは分かりませんが、これでも動いてることは動いてるみたいなんです。
HOGE の引数、 bmp を誰がいつ用意するか。を意識してみてください。
この場合の用意は、TBitmap のコンストラクターを呼ぶのは誰か。と言うことになります。
アホでごめんなさい。ほんとにごめんなさい。
コンストラクタ、あたりの言葉の意味が・・・???程度のアホです。
大雑把にいうと以下のような使い方をしています。
var
MyBMP: TBitmap;
begin
MyBMP:=TBitmap.Create;
try
MyBMP.LoadFromFile(strFile);
if ある条件を満たしていたら
if HOGE(MyBMP)=true then
begin
MyBMP.SaveToFile(strFile);
end;
end;
finally
MyBMP.Free;
end;
呼び出し先で値が変わっちゃうものは、今まで判で押したようにvarにしてたんですけど、
今回たまたまvar書き忘れてたことに気づいて、え、これでも動いてたの、と。
HOGE の引数 bmp は、HOGE 実行中には「変更」されませんね。
bmp はオブジェクトを指していて、オブジェクト自身の持つデータ(プロパティやフィールド)は
変更されますが、オブジェクト自体は書き換わっていません。
だから HOGE の引数宣言に var は必要ありません。
これが、HOGE 内で bmp に新しいインスタンスを設定する場合には、HOGE の引数宣言に var が必要になります。
より内部的な説明をするなら、Delphi のオブジェクトインスタンスはポインタだから、インスタンスを新規に
割り当てないのであれば var は必要ない。となります。
うーん、分かったような分からないような、で御免なさい。
>>HOGE 内で bmp に新しいインスタンスを設定する場合には
bmpは、HOGEが登場してきた時点ですでに、どこかでCreateされたTBitmapなわけですよね。
それをたとえばHOGE内でbmp.Freeなんてやっちゃうとか、HOGE内であらためてbmp=TBitmap.Createやっちゃうとか、
そういうときにこそvarにする、ということでしょうか?
もしかしたら完全にトンチンカンなこと言ってるかもしれません。
アホな話持ち出して、まったくすみません。
155 :
154:2013/03/01(金) 03:21:38.95
ちょっとだけわかったような(勘違いかもしれないけど)
TImageを引数にしてそこにBitmapを押し込む関数をいくつかつくったことがあるんです。
このときはvarにしてません。
この関数によってTimageの「値」はたしかに変わるんですよね。
でも、理屈云々の前に、varにしようなんて考えはまるで浮かばなかった。
だってこれ、ただそこにある箱じゃん、と。
それと同じように考えて(・・・本当にいいのかな?)
とりあえずおやすみなさい。
>それをたとえばHOGE内でbmp.Freeなんてやっちゃうとか、HOGE内であらためてbmp=TBitmap.Createやっちゃうとか、
> そういうときにこそvarにする、ということでしょうか?
やってみそ。
クラスは何もしなくても参照(アドレス渡し)なので、varをつけなくてもそのインスタンスの内容を
変えることができる。varをつけるとインスタンスを格納するためのポインタのアドレスが渡されるので、
インスタンスそのものを変更することができる(コンストラクタを呼び出して生成したインスタンスを
設定したり、デストラクタを呼び出してnilに設定したり)。
要はクラスをパラメータで渡すときは暗黙にvarがついていると思えばいいってこと。
bmp: TBitmap って引数で渡すとbmpはポインタだから varもポインタ渡しで同じ意味になる
暗黙もへったくれもない常識だが・・・?
ポインタのポインタだって。呼び出し元のbmpの参照先を
書き換えることができ、違うTBitMapにすることだってできる。
そこにポインタを持ち込むと、分かる人と分からない人が出てくるから、
説明するときは考えちゃうんだよなぁ。
ネットだと、質問者の持ってる知識が分からない場合が多いから
いくつか実験してみました。
基本がわかっていないので貧しいイメージしか出来ませんけど。
varをつければ製造元までさかのぼって変更できる、というひとまずの納得の仕方。
stringとかintegerとかは、初めて代入されたところが事実上の製造元。
TbitmapみたいなのはCreateされたところが製造元であとは飾りみたいなもの。
飾りというよりはコンテンツか。
それを変えるだけなら製造元まで遡る必要はない。
なんかまたバカまるだしなこと書いてるかも。
お騒がせしました。
何度も面倒な話題ですみません。
下の関数の引数、varにしなくても、関数内で何度でも生まれ変われるみたいです(激しく混乱状態)
procedure TForm1.GEHO(objFile: OleVariant);
begin
objFile:=unassigned;
objFile:=CreateOleObject('Scripting.FileSystemObject');
if objFile.FileExists('C:\test0.txt') then
begin
ShowMessage('OK');
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
MyFSO, MyFile: OleVariant;
begin
MyFSO:=CreateOleObject('Scripting.FileSystemObject');
MyFile:=MyFSO.CreateTextFile('C:\test0.txt', true);
MyFile.Write('test-test-test');
MyFile.Close;
GEHO(MyFile);
MyFile:=unassigned;
MyFSO:=unassigned;
end;
ただ現実の話として、こんな関数使うことがあるとは思えないんで、
ウザかったら放置してくれていいです。
クラスはポインタで渡されるってことだ OleVariantもクラスだろ
StringやIntegerはデータ型であってクラスではないから別物
通常var渡しはサブルーチンから複数の戻り値を得るために使うもので、1個だけでいいなら
普通のfunctionで済むはず
クラスがいつCreateされるかよく考えないとメモリリークに悩まされるよ
C++で作成されたDLLをDelphiで使用するにはどのように定義すれば良いのでしょうか?
DLLのソースにはextern "C"はついており、defファイルも存在しています。
165 :
164:2013/03/05(火) 15:09:31.68
VC用のDLLでした
VC++です・・・
何度もすみません
'String'.Uppercase; ==> 'STRING'
3.Odd; ==> True
みたいにどうにかして順序型でメソッド呼べるようにする方法ないですか
独自なStringクラスを作りゃええやん
Delphiという言語の質問じゃないんですが、使い方で。
実行時にIDEが勝手に最大化されますよね?
これを止める方法をご存知のかたいますか?
現在使っているのはXE2です。
よろしくお願いします。
今時のIDEは最大化してしまうのかよ
俺の知ってるDelphiは昔から
「環境オプション」→「コンパイルと実行」→
「実行時に最小化」&「実行時にデザイナを隠す」
といった遠慮がちな設定しかできないがw
あ、もしかしてデスクトップスピード設定たらいうやつの
「デバッグ時のデスクトップに指定」で記憶してしまってるのかな?
コミュ障プログラミング言語ってDelphi2009で作ったのな…
すげい。
すみません教えてください
知り合いにプログラミングを誘われて、ずいぶん前にDelphi2010を購入しました。
最近までほおっておいたのですが、手元にあったDelphi2005プログラミングテクニック
を読みながら勉強を始めました。
Vol4にある5.4ディレクトリボックスのサンプルプログラムを見ながら
Imageにp.14の倍率とScrollBoxと倍率の選択をRadioGroupにしています。
わからないところですが、
1.Image1.Picture.Bitmapとありますが、Bitmapを消さないとjpgが表示されませんが、これは普通なのでしょうか?
2.最大に表示させてもフォームは最大になりますが、ほかのコンポーネントの表示サイズは変わりません。
フォームサイズのほかのコンポーネントを追随させる方法
3.RadioGroupを2行2列で表示する方法。
4.選択した項目を取得させる方法。ItemIndex ofで取得させる方法でよいのでしょうか?
ItemIndex ofで返ってきた値を変数に代入しても検出できません。
ダイアログで表示させても値が空白になっています。
ヒントだけでもかまいません。よろしくお願いいたします。
2.Anchors
3.Columns
4.ItemIndex
>>171,172さんありがとうございました。
172さんの言われたことが参考になりました。
結局、開発時にウィンドウの大きさとか変えても、
デバック時にわざわざ呼びなおしてくれるということですね。
DefaultLayoutというやつが元々最大化されている状態なので、
いつも最大化を解除していたのですが、解除した状態で
保存してやる必要があるということでした。
あとは好みの問題ですかね。
ちょっと お知恵を拝借したいです
Delphi6
これまで比較的小さいバイナリデータを処理するのに
TMemoryStream で
MS_Base.LoadFromFile(FileName); // メモリ上にファイルを読み込んでから
MS_Base.Position := Address;
Bytes := 4;
MS_Base.Read(Buffer,Bytes);
という感じで開始ポインタと読み込みサイズを指定していたのですが、
今回、動画データなどの巨大ファイルから直接部分データを読み込むことをしようとしています。
(300MB 越えのデータを複数連続で読み込むと負荷が大きい為)
178 :
177:2013/04/09(火) 22:46:50.25
例:
0000 : 52 49 46 46-7E B4 FD 0F-41 56 49 20-4C 49 53 54 : RIFF AVI LIST
0010 : 4E 01 00 00-68 64 72 6C-61 76 69 68 38 00 00 00
function TForm1.Analyze(FullFileName: String) :Boolean;
type
IntFile = file of Integer;
var
Byte : Integer;
AData: IntFile;
begin
AssignFile(AData,FullFileName);
try
Reset(AData);
Read(AData,Bytes);
Memo_Debug.Lines.Add('0 = ' + IntToHex(Bytes,2));
Read(AData,Bytes);
Memo_Debug.Lines.Add('1 = ' + IntToHex(Bytes,2));
Read(AData,Bytes);
Memo_Debug.Lines.Add('2 = ' + IntToHex(Bytes,2));
Seek(AData,4); // どこに飛ぶ?
Read(AData,Bytes);
Memo_Debug.Lines.Add('3 = ' + IntToHex(Bytes,2));
Read(AData,Bytes);
Memo_Debug.Lines.Add('4 = ' + IntToHex(Bytes,2));
finally
CloseFile(AData);
end;
end;
179 :
177:2013/04/09(火) 22:53:45.20
結果
0 = 46464952
1 = FFDB47E
2 = 20495641
3 = 14E (前項から4バイト飛ばして読み込み)
4 = 6C726468
てっきり1-byte づつかと思えば、
4-bytes 分づつ読み込んでいるようなのですが、
① 2-bytes や 8-bytes など読み込む量を指定して変える方法
② アドレスを直接指定する方法
ありますか? あればその方法を知りたいのです。
情報データが動画に埋め込み方式の機械があって・・・必用な部分は量が知れているのですが
そこにたどり着くまでが大きいので
TFileStreamを使わない理由がわからない
181 :
177:2013/04/10(水) 00:08:52.56
>>180 もしかして TMemoryStream を TFileStream に変えたら使い方殆ど同じ?
ぶっちゃけ 「TFileStream」 という存在を知らなかった訳で
ちょっと調べてみま~・・・
よく分からんが IntFile = file of Integer; だから1レコード四バイトで
アクセスしているだけだな。
ファイルを array of Integer でアクセスしているのと同じ。
バイト単位で処理したければ file of byte / file of char または file で。
183 :
177:2013/04/10(水) 00:39:20.45
ヨメ ━━ Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。) タ ━━ ッ !
184 :
177:2013/04/10(水) 01:28:06.36
ありがたう
>>174 どうもです。
やっと理解できてソフトに実装できました。
もう1つ教えてください。
scrollboxにimageコンポーネントを組み合わせています。
イメージコンポーネントのサイズをマウスで
左右や上下に変える方法というのはどうしたら良いのでしょうか?
本を見たりしましたが、どこにもなく困っています。
ウインドー左側にfilelistboxで右側にimageを貼り付けていますが、
imageのサイズを変えると、左側のfilelistboxの大きさが皮得る方法はありますか?
OnMouseDown/OnMouseMove/OnMouseUp
188 :
186:2013/04/19(金) 16:37:57.65
>>187 >>186宛でしょうか?
やりたいことと言うのは、例えば、joytokeyの
左側設定ファイル選択の枠と右側のキー割り当ての枠の真ん中にある
マウスを近づけるとカーソルが←|→なようになる部分です。
名前が今ひとつ分からないので探しようがない状態です。
Windowsのマウスのプロパティーには、左右の拡大縮小とありましたが、
この言葉で調べてもヒットしませんでした。
189 :
186:2013/04/19(金) 16:54:55.46
カーソルですが、
エクスプローラーのフォルダーとファイルエリアの境目とかの
←→な感じのものです。
Splitter
TPanelにファイルリストとイメージコンポを貼り付けるだけのことじゃないの?
計算式の置き換えで質問です。
地点A(経度x1, 緯度y1) から 地点B(経度x2, 緯度y2) の方角を導く。
Aの経度(x1) = lon="140.14055"
Aの緯度(y1) = lat="36.01708"
<trkpt lat="36.01708" lon="140.14055">
Bの経度(x2) = lon="140.14043"
Bの緯度(y2) = lat="36.01726"
<trkpt lat="36.01726" lon="140.14043">
↓
http://keisan.casio.jp/exec/system/1257670779 方位角φ= 90-atan2(sin△x,cos(y1)tan(y2)-sin(y1)cos△x)
△x=x2-x1
↓サイトの結果(正解の答え)
方位角φ= 331.665281
図:AからBの方角: NW と N の間
194 :
193:2013/04/24(水) 06:22:48.57
93.0678420663619
↑結果(間違え) Delphi への三角関数式の置き換えでどこが間違っているのでしょう?
uses
SysUtils,Math;
function PointToDegree(Ax,Ay,Bx,By: String; Limit: Byte; North: Boolean): String;
var
x1,y1,x2,y2,Degree : Extended;
begin
Degree := 0;
x1 := StrToFloatdef(Ax,0); // 地点A(経度x1)
y1 := StrToFloatdef(Ay,0); // (緯度y1)
x2 := StrToFloatdef(Bx,0); // 地点B(経度x2)
y2 := StrToFloatdef(By,0); // (緯度y2)
if (X1 <> 0) and (y1 <> 0) and (x2 <> 0) and (y2 <> 0) then
begin
// 方位角=90 - atan2(sin(x2-x1) ,cos(y1)tan(y2)-sin(y1)cos(x2-x1))
Degree := 90 - ArcTan2(Sin(x2 - x1),Cos(y1) * Tan(y2) - Sin(y1) * Cos(x2 - x1));
// Degree := Trunc(Degree * Power(10,Limit));
// Degree := Degree / Power(10,Limit);
// if North then Degree := 360 - Degree;
end;
Result := FloatToStr(Degree); // FormatFloat('0.00',Degree);
end;
ラジアンって習うのは高校生だっけ?中学?
じゃあラジアン分からないんだね
まずはそこから勉強しよう
Won'tYouStayForMe
Delphi の三角関数は、ラジアン単位を引数としているので
度で表記された座礁は、変換が必要。
ラジアンという言葉の意味/定義を確認した上で、Math ユニットの DegToRad とかを
組み合わせてごらん。
180度=1.0ラジコンだっけ?
お帰りください
Degree := 0;
x1 := DegToRad(StrToFloatdef(Ax,0)); // 地点A(経度x1)
y1 := DegToRad(StrToFloatdef(Ay,0)); // (緯度y1)
x2 := DegToRad(StrToFloatdef(Bx,0)); // 地点B(経度x2)
y2 := DegToRad(StrToFloatdef(By,0)); // (緯度y2)
if (X1 <> 0) and (y1 <> 0) and (x2 <> 0) and (y2 <> 0) then
begin
Degree := ArcTan2(Sin(x2 - x1),Cos(y1) * Tan(y2) - Sin(y1) * Cos(x2 - x1));
Degree := 360 + RadToDeg(Degree);
end;
一応こんな感じで数値が合うようになりました。
感謝
DelphiXE4&FireMonkeyなんですが、
MediaPlayerControlってウィンドウサイズに合わせて映像を拡大できないのでしょうか?
delwiki.infoどうなっちゃったの?
XE2で
bds -r main
とかやって別プロファイルで起動するとGExpertsが起動しないんですが
どうやればプロファイル指定してGExperts組み込めるんですか
最悪レジストリのキー入れ替えてからインストールすれば
できそうな気もするんですがもうちょっとまともなやり方あったら教えて下さい
別のログインユーザー作成
207 :
186:2013/05/05(日) 09:16:37.44
>>190 どうもです。基礎的なコンポーネントだったんですね。
ただ、位置の制御に苦労しました。
>>191 Delphiでは、VCLを積み重ねても下のものとは原則干渉しない
と言うことを言葉では知っていましたが
>>191を見てその意味を知りました。
サイトでは、Spliterで苦労している人は多いみたいで頭を抱えていましたが
Panelで弁当箱のように仕切れば良いんですね。
>>192 サンプルプログラムありがとうです。
非常に高度な技術が積めてあるのが判りました。
高度すぎて完全には判りませんでしたが、さらに勉強します。
今は、既存の構成を使ってmp3の再生に取りかかっています。
medeiaplayerを使っていますが、wavでは簡単に再生できますが、
mp3ではオブジェクトインスペクタのプロパティのFilenameでファイルを直接
指定すれば再生できますが、それ以外ではEMCIDeviceError発生します。
上手くファイル名が渡せていない感じがします。
これを解決する方法はありますか?
MediaPlayer1.TimeFormat:=tfHMS;
MediaPlayer1.DeviceType:=dtAutoSelect;
MediaPlayer1.FileName:=FileName;
MediaPlayer1.Open;
209 :
186:2013/05/06(月) 10:56:36.48
>>208 動きませんでした。
ただ、MediaPlayerを扱っているサイトのように
with MediaPlayer1 do
begin
FileName := filelistbox1.FileName;
Open;
Play;
とやったら動きました。
やっていることは同じのように見えますが…。
MediaPlayer1.FileName:=FileName;
を
MediaPlayer1.FileName:=filelistbox1.FileName;
こうすればよかったんじゃね?
211 :
209:2013/05/07(火) 09:45:27.59
それで動きそうな物なんですが、ダメだったんです。
Delphi2005プログラミングにあったような
画像ビュアーだったのでextractfileextで拡張子で
処理を分けています。bmp,jpg,pngはイメージに飛ばして
wavはsndPlaySoundで処理していましたが、mp3は扱えないそうなので
MediaPlayerを使って処理を試みましたが、
ただMediaPlayer1.FileName:=filelistbox1.FileName; としただけでは、
ファイル名や拡張子からはデバイスを判断できませんでしたと出てて
コンパイルすら出来ませんでした。
ただ、wavだけは簡単に再生できました。
これで、一週間くらい悩み続けました。
これでとりあえず動いていますが、with文を理解していないので
トラブルが起きたときに対処できません。
エラーメッセージで原因分かってるじゃん
自動でデバイスが判断できないなら手動でやればいいだけの話でしょ
プログラミング言語の前に日本語の理解をできるようにしないと
213 :
209:2013/05/07(火) 17:03:16.17
その、手動でやる方法が判らなかったんですよ。
肝心の日本語メッセージが抽象的すぎてわかんねーよ
mci周りのエラーだと言われてもmciのラッパーのmediaplayer
使ってんのにそんなこと言われても困る。
そんな感じ
wavだと
>>211の方法で鳴らせるのにmp3だとエラー
>>212は馬鹿にしたいのだろうが
日本人なんしバカじゃないんだから、コンパイラの言っている意味はわかるよ
with文を理解していないって、冗談でしょw
>>209 おれ、192,208 だけど( with 文知らないということで)
もしかして「動きませんでした。」って
MediaPlayer1.Play;
をしてないだけだったんではないよね?
>>207 で EMCIDeviceError が出るっていうからこれでも出る?って意味で
208 を書いたんだけど
追記
>>209 は↓と同じ事を書いてるんだよ
MediaPlayer1.FileName := filelistbox1.FileName;
MediaPlayer1.Open;
MediaPlayer1.Play;
218 :
209:2013/05/08(水) 05:26:07.46
>>214 Delphi2010を持っていたけど、4月くらいにふと思い立ってソフトを作り始めました。
今でもif文で'.'が必要だけどELSEがありましたとか言われてなんでだと思うとかそんなレベル。
文法そのものを完全理解していないので手探りでやっています。
>>216 元々は、wavを再生するために
sndPlaySound(Pchar(filelistbox1.FileName),SND_ASYNC) ;
を入れてました。
PlaySoundはmp3は鳴らせないよと言うことを聞いて
mediaplayerが一番簡単そうなので使い始めました。
MCIが使えれば言うことないのですが、いまいち判りませんでした。
そのときに入れていた物は、
mPlay.filename:=filelistbox1.FileName;
mPlay.open;
mPlay.Rewind;
mPlay.Play;
mPlayはMediaplayerのnameを変えたもの
この命令だけで再生されそうな物なんですが…。
DCCエラーでコンパイルされませんでした。
DeviceをdtWaveAudioにすればエラーは出なくなりますが
そうするとmp3が再生されないという…。
当時mp3を再生させるには、filenameプロパティに直接ファイルを指定しないと
無視されてました。
ダメじゃんと言うことがあればお願いいたします。
219 :
210:2013/05/08(水) 05:35:50.40
いま、
>>209 のコードで動くと書いていることと、
>>217 のコードで動かないと書いていることが
矛盾していること。
「ファイル名や拡張子からはデバイスを判断できませんでした」
というメッセージは実行時のエラーメッセージで、
「コンパイルすら出来ませんでした」
というのは、実行前のコンパイルエラーのことだと推測するので、
混同している可能性があるということ。
そして、実行時のメッセージなどからは、
>>208 の先頭2行のコードの追加を
Openの前に実行すれば状況が変化するか?
という、「いまどこ?」的な質問に対する実験結果の報告がないので、
このままでは現状打破できず、さてどうしようか。ということ。
他は省略
DirectXを経由したほうが簡単に音を鳴らせる気がする
こんなソース発見 delphi.about.com/od/multimedia/l/aa112800c.htm
222 :
209:2013/05/08(水) 09:51:58.69
>>219 mPlay.TimeFormat:=tfHMS;
mPlay.DeviceType:=dtAutoSelect;
mPlay.filename:=filelistbox1.FileName;
mPlay.open;
mPlay.Rewind;
mPlay.Play;
でも、EMCIDeviceErrorがモジュールview.exeの0x000EA7F2で発生しました。
指定したファイル名拡張子からデバイスの種類を判断できませんと表示されます。
でF9で走らせても、コンパイルしても
上記アプリケーションエラーが出てOKボタンを押すとIDEに戻ります。
コンポーネントとプロパティーをソースで指定することで
オブジェクトインスペクタの項目を書き換えることが出来るという
理解で間違っていないでしょうか?
せっかく教えて頂いたのに申し訳ありません。
>>220 この系統のソフトはDirectShowを使うのが一般的だという話を聞きましたが、
そこまでのスキルがなかったのでMediaPlayerを使いました。
>>221 ないわけがないと思って探していましたが、やっぱりあるんですね。こういうソフトが。
どうやってこういうサイトを探すんでしょうか?
日本語のサイトを探すだけじゃダメなんでしょうか。
223 :
222:2013/05/08(水) 09:56:49.66
mPlay.DeviceType:=dtWaveAudio;
にするとコンパイルされますが、
wavは再生されますが、mp3は反応しません。
ファイルをダブルクリックしても何も起きません。
mPlay.DeviceType:=dtAutoSelect; で
FileNameプロパティに例えばc:\a.mp3
という感じで指定すると実行したときに即座に再生されます。
この後に他のmp3を選択すると再生されました。
dtAutoSelectにしたってコンパイルはされるだろ
用語の使い方がおかしい
基礎から学び直せ
コンパイルオプションの最適化を外して再構築しなおせばどうか
>>224 基礎を学んでいる最中なんですが。
失礼しました。
>>228 Delphi2010って支援機能ついてるよね?(. 入れて待つとか Ctrl+Space)
Delphi 使いならパスカル表記しようよ、読みにくいから
で、最小限に切り出してテストしたんだけど(FileListBoxって何年ぶりに使ったろう…)
DeviceType無くてもあってもエラーは出ないね(XPで実行しても問題なかった)
if CompareText(TheExt,'.mp3')=0 then
//↑とか↓こうやれば大文字の拡張子も判別出来るよ
// if LowerCase(TheExt)='.mp3' then
「エラーが発生」は今までのように「デバイスを判断できませんでした」?
それともコンパイルエラー?
別の新しいプロジェクトを作成してとりあえず
MPlay: TMediaPlayer;
とボタン一つだけ貼り付けて
IDE でボタンをWクリック
procedure TForm1.Button1Click(Sender: TObject);
begin
with mPlay do
begin
FileName:='ここに実際のファイル名をフルパスで書く';
Open;
Rewind;
Play;
end;
end;
まずこれでちゃんと再生されるのかどうか確認する
IDE から F9 で実行してエラーが出ても exe 単体(Project2_b2.exe だっけ?)
をエクスプローラからWクリック実行ではエラーが出ないことがあるのでそれも確認
それでもエラーが出てここにまた報告するならその内容を正確に書くこと
エラーダイアログで Ctrl+C したらコピーできるときもある
DeviceTypeはPCの環境設定に依存するからお前のPCで問題ないから他でも問題ないとは限らない
>>229 入力支援機能教えていた秋ありがとう
今までめんどくさいなとか思っていたのでかなり助かります。
拡張子の判断もありがようです。
これは、Delphi2005プログラミングテクニックからそのまま
持ってきた物なのでより効率の良い方法ですね。使わせて頂きます。
肝心のFileNameですが、
オブジェクトインスペクタでFilenameプロパティでファイルを直指定して
今回の場合だとwith文内で指定して
そのファイルを再生した後だとエラーが発生することもなく他のmp3ファイルも再生できます。
エラーについてはロダにあげた以外の物では、
FormにFileList一式とMediaplayerだけを貼り付けて
同じコードを書いてもコンパイル中にアプリケーションエラーが出ます。
ソースとバイナリ、エラーメッセージをキャプったものをロダに上げました。
お手数ですが、また見て頂けないでしょうか。
http://www1.axfc.net/uploader/so/2897278
TMediaplayerではなく
TWindowsMediaPlayer(wmp.dll)を使えばいいのに
ずっと多機能だし、使いやすいのに
>>233 WindowsMediaPlayerも考えて、ActiveXモジュール組み込みましたが、
どう使ったら良いのか判りませんでした。
playlistもどう扱ったら良いのか??な感じでした。
今、キーワードを変えて検索したら簡単なサンプルが判って
ファイルを固定することで再生することが出来ました。
使いこなしの方法がちょっと判りません。
初心者というのが免罪符になるとは思いませんが、
本当に勉強を初めて一月とかです。
不快に感じる方がいらっしゃると思いますが、ご容赦ください。
TMediaplayerControlって、オリジナルのビデオサイズより拡大表示できないの?これ
236 :
229:2013/05/10(金) 19:07:21.64
>>230 そーなのかありがとう
じゃあ配布目的とかでは使えないんだ
まあ俺はTMediaPlayer使わんけどな
237 :
229:2013/05/10(金) 19:22:08.94
>>231 前は pas ファイルを読んだだけでレスしたが今度はちゃんと開いてみたよ
で、今度のエラーは手抜きのせいではないか?
TFileListBox.OnChange イベントというのはリスト内のファイルをクリックしたり
フォルダが変わったりしたとたんに発生するから最低でも拡張子の判断は必要だぞ
procedure TForm2.FileListBox1Change(Sender: TObject);
begin
//一行目にこれ↓
if CompareText(ExtractFileExt(FileListBox1.FileName),'.mp3')<>0 then exit;
それに前回はちゃんとフィルタ(ファイルマスク)設定してたようだけど今度はそれもしていない
あと、例外処理を勉強しよう
if CompareText(ExtractFileExt(FileListBox1.FileName),'.mp3')<>0 then exit;
try
with mPlay do
begin
FileName:=Filelistbox1.FileName;
Open;
Rewind;
Play;
end;
except
ShowMessage('再生時のエラー');
end;
こう書いて出てきたエラーが↑で自分で書いたエラーなら try ~ except の間で起こったと判断出来る
でも except ってのは本当はこんな風に逃げるだけの手段ではないんだよ
>>237 レスどうもです。
>>231はFileListBox一式とMediaPlayerだけをFormに乗せただけの物です。
>>231は
>>229の
procedure TForm1.Button1Click(Sender: TObject);文以下の
以下のソースを反映させた物です。
私の環境ではコンパイルが終わってアプリが起動するときにエラーが出ます。
出来たバイナリを起動しても同じです。
>>232は
>>229のFileNameに直接ファイルを指定したものです。
アーカイブ中にmp3ファイルが入っています。
この二つについてはフィルターをかけていません。
フィルターをかけたものを再アップします。
err2+filterフォルダーの物はうちではエラーになってしまう物
snd1フォルダーは添付のmp3ファイルを直うちした物です。
pathが判らないのでc:\000.mp3にしてあります。
http://www1.axfc.net/uploader/so/2897729 >>228の物は制作中の物なので拡張子での処理を分岐させるようにしてあります。
OnChangeについてはこのような変化が起きたときに発生する
プロパティ項目がないわけがないと思って探していました。
例外処理についても必要性を感じていました。
画像部分を作っていたときには処理を確認するために
デバッグ用の表示を作っていましたが、音声の方はそれ以前の出来だったので
何もしてありませんでした。
suggestionありがとうございます。勉強させて頂きます。
239 :
229:2013/05/10(金) 20:54:25.95
わかったよ~(ヒントは今まで俺がレスしてきた中に全てあったよ)
「err2+filter」の方でエラーが出るのはアプリケーション起動時に TFileListBox.OnChand イベントが起きるから
(当然だよねコンポーネントが生成された時にはリストは空なんだから起動すれば DriveComboBox1 のドライブの
DirectoryListBox1 フォルダに移動して FileListBox1 のリストが更新される→ TFileListBox.OnChand 発生)
(あくまでも IDE で表示されているリストは IDE 上だけのもので起動時(生成時)は空だからね)
>>237 で(抜けてるよって)書くように指示した「拡張子の判断」がないから移動先の最初のファイルが mp3 じゃないのでエラーとなる
TFileListBox.OnChand 発生した時に選択されていなかったら FileListBox1.FileName は空文字になるし(あ、こっちか)
>>237 でもうひとつ「OnChange はリスト内容の変化で発生する」とも書いたね
オマケだけど
>pathが判らないのでc:\000.mp3にしてあります。
こういったときに便利な書き方
FileName:=ExtractFilePath(Application.ExeName)+'002.mp3';
↑~~~~~~~~~~~~~~ ↑~~~~~~~~~~~~~~~~~~
後ろに\がつく「パス」 実行ファイルのフルパス
実行ファイルが「C:\Delphi\Project1.exe」なら「C:\Delphi\002.mp3」になる
これくらいでいいかな?
>>239 仰ってる意味が分かりました。
拡張子を画像かどうかを評価して
違う場合にはwavかmp3なら強制的に
MediaPlayerに回しますが、FileListBoxの中身が空なので
MediaPlayerでは解釈できないと言うことで良いのでしょうか。
>>237の一行目にと言う命令を書き足したら
エラーを吐くことがなくなりました。
例外処理についても意味を体で覚えました。
おまけもありがとうございます。
やっぱりちゃんと言語ガイド読まなくてはなりません。
ありがとうございました。
241 :
229:2013/05/10(金) 23:42:57.67
>>240 解決して何よりだ
ここまで付き合った甲斐があった
ひとつだけ
>MediaPlayerに回しますが、FileListBoxの中身が空なので
日本語的な問題なのかも知れないけど
最初にこのイベントに来た時は空からリストにファイル名が入った時なので
「FileListBoxの中身が空」ではない
あくまでも FileListBox1.FileName プロパティが「空文字」になっている(未選択状態だから)ということ
説明するより早いから新規プロジェクトのフォームに Memo1 FileListBox1 の二つを置く
フォームをWクリックして
procedure TForm1.FormCreate(Sender: TObject);
begin
FileListBox1.Directory:='e:\';
with Memo1.Lines do
begin
Clear;//メモをクリア
Add('01━━FormCreate ここから');
Add('02━━起動時のリスト:'+FileListBox1.Items.Text);
Add('03━━選択されたファイル名:'+FileListBox1.FileName);
Add('04━━FormCreate ここまで');
end;
end;
つづく
242 :
229:2013/05/10(金) 23:43:51.91
FileListBox1 をWクリックして
procedure TForm1.FileListBox1Change(Sender: TObject);
begin
with Memo1.Lines do
begin
Add('05━━FileListBox1Change ここから');
Add('06━━OnChange 起動時のリスト:'+FileListBox1.Items.Text);
Add('07━━OnChange 選択されたファイル名:'+FileListBox1.FileName);
Add('08━━FileListBox1Change ここまで');
end;
end;
FileListBox1 を選択した状態でオブジェクトインスペクタのイベントタブを開く
OnClick の右側の空欄をWクリックして
procedure TForm1.FileListBox1Click(Sender: TObject);
begin
with Memo1.Lines do
begin
Add('09━━FileListBox1Click ここから');
Add('10━━OnClick 起動時のリスト;'+FileListBox1.Items.Text);
Add('11━━OnClick 選択されたファイル名:'+FileListBox1.FileName);
Add('12━━FileListBox1Click ここまで');
end;
end;
これでメモの内容を見ればイベントの起こっている順番とか内容とかがよく分かるはず
空文字がわかりにくいので↓にしても可
if FileListBox1.FileName='' then
Add('03━━【何も選択されていない】'+FileListBox1.FileName) else
Add('03━━選択されたファイル名:'+FileListBox1.FileName);
エラーが起きるところでステップ実行をしなかったの??
FileNameがヌルになるならすぐわかりそうなものなのに
デバッグの仕方が根本的に変
くだすれDelphi(超初心者用)
>>241 サンプルソースありがとうございます。
mp3再生部を入れてからエラーが出て
一週間位悩んで質問しました。
最初はファイル名に絡むエラーだったので
ファイル名が上手くコンポーネントに渡していないなと言う
予想は立ちましたが、ネットでDelphiのmp3関係を扱っている
サイトで出てくるUnicodeが原因なのかと思って困ってました。
サンプルソースのおかげでFileListBoxの挙動がよくわかりました。
あらかじめFileListBoxのfilenameプロパティで適当なmp3ファイルを
設定しておくとエラーが発生せずに他のmp3ファイルを再生できたことの
理由がよくわかりました。
当然filenameプロパティを設定しないと起動時のフォルダー内にある
ファイル名は表示されていますが、選択していないので
>>243のnullが入っているのでエラーが出ていたという解釈で良いのでしょうか?
何を勉強しないと行けないのかが明確になりました。ありがとうございました。
246 :
245:2013/05/11(土) 22:53:48.08
デバッガーのステップ実行のやり方が判ったので
値を監視してみたところエラーの出る寸前で
拡張子(theext)が''になっていてselfとsenderが
この位置からは参照できないと出ていました。
勉強になりました。
247 :
229:2013/05/11(土) 23:59:15.22
自分のレベルも Delphi のバージョンもちゃんと最初に書いてるし
こうしてみろといわれたら素直に実行するし
質問者としては良質だと思ったよ
どんどん作って今後も Delphiライフを楽しんでくれ(^.^)/~~
Delphi 全角になってた恥ずかしい
ffmpegで全部出来る
mp3の再生ができるなら音をキャプチャすればいいんじゃないか
>>251 >>252 MP3 のフォーマットが複数あって難解なので、既存の dll を利用したかったのです。
午後のソースも見てみましたが、お手上げですね。
デコード機能があればと残念です・・・ lame_enc.dll とか
一応、>249 のソースで
VBMP3 使用の MP3 -> Wave 変換保存は出来るので、
サンプリングレートなど細かな指定が出来れば良いのですけど。
一時ファイルとして(wav-stereo)出力 -> PCM 44.100kHz 16ビット ならば、読み込んで モノラル化して抽出
で、お茶濁し やってみます。
XP 付属のサウンドレコーダーをソフトから操作できれば楽なんですけどね
WAVE MPEG Layer-3 22050Hz Stereo を読み込んで -> WAVE PCM 44.100kHz 16ビット モノラル
wav での形式と属性変換が単体操作できるのですが、コマンドラインオプションが無さそうで。
>>254 ソースと実行ファイル上げた方が良い?
素人趣味の1つなんで実装の無駄がちとハズカシイ(というか自分に解る限界だから仕方ないというか)
・現在
ListView にファイル情報のあてはめ (PCM/WAVE/MP3)
PCM/WAVE/MP3 音声再生
MP3 -> Wave 出力
>>249 と同じ VBMP3 手法のまま
モノラルWave -> 機器用の .pcm 音声ファイル用に抽出ファイル化
・次の着手予定
MP3 -> 作業フォルダにWave ファイル出力 -> Wave 読み込んで PCM ファイル化出力
元のMP3 が 128Kbps : 44100 Hz : Monaural だった場合、目的の.wav 物に VBMP3 がそのまま変換してくれるようで
変換後がステレオだった場合、チャンクのLRをゴニョって擬似モノラルにして抽出。
ps.
>>249 で一部訂正
誤:*.WAV (無圧縮 WAVE ADPCM ) モノラル
正:*.WAV (無圧縮 WAVE PCM ) モノラル
>>255 ffmpeg -i input.mp3 -ac 1 -ar 44100 -f s16le -acodec pcm_s16le output.pcm
出力ファイルを"-"にすれば結果が標準出力へ吐き出されるのでプログラムからパイプで受け取れる
>>256 ども
コマンドラインで一発変換できますね
2バイト文字のファイル名にも対応しているようで
ShellExecute でいけるかやってみます。
>出力ファイルを"-"にすれば結果が標準出力へ吐き出されるのでプログラムからパイプで受け取れる
? 意味不明
クリップボードにバイナリファイルが格納される という意味ですか?
ファイル実体として出力はいるので
とりあえずフロントエンド?という利用方法で組んでみます。
ありがとう
>>256じゃないけど、標準出力とかパイプとかせめて検索してほしいなぁ
XE4&FireMonkeyで、FormのFullScreenがMacだと有効にならないんですが、
Macでフルスクリーンにする方法はありますか?
260 :
デフォルトの名無しさん:2013/05/26(日) 17:10:26.68
setparentのusesって何を指定すれば良いですか?
window.setparentみたいなのもあるみたいですが、やりたいことは親フォームに貼り付けたパネルに子フォームをロードするというものです。
window.setparentを記述したら、usesの中のwinapi.windowsに赤の波線が出て、何だか良く判らなくなっています。
usesに何を指定すれば良いか教えてください。
Frameでやれ
262 :
デフォルトの名無しさん:2013/05/26(日) 21:47:02.15
他の掲示板に行きます
裏技で派生先クラスから派生元のprivateメソッドを呼び出す方法ありませぬか?
1.同一ユニット上に置く
2.クラスヘルパを使う
3.新しいRTTIを使う
ん~あと何かあるかな
オーバーライドするだけじゃないの?
クラス設計やり直し。
WM_で始まるメッセージとCM_で始まるメッセージって何が違うの?
Windows のメッセージと
Control のメッセージ。
WM_ は OS が送ってくる。
CM_ は VCL が送ってくる。
CM_ は、単純なメソッド呼び出しに置き換えることが(多くの場合)可能だけど、
それをわざわざメッセージにすることで、WM_ に対応するメッセージハンドラと
同じ記述に統一することが出来る。
そうでもない。
TSplitterが置いてあるウィンドウがリサイズされるとき
変更前と変更後で分割率が同じになるようにするにはどうすれば良いんですか?
271 :
デフォルトの名無しさん:2013/05/30(木) 00:50:25.90
TADO関係のコンポーネントを使って、Microsoft Accessの
データーベース上のクエリーのSQL文の取得か、クエリーの実行って、
できるでしょうか?
>>270 FormのOnResizeで自前でコントロールのサイズを変更する
それたぶんうまくいかない
OnResizeはサイズ変更された後に発生するイベントだから
何らかの方法で変更前のサイズを覚えておく必要があるのと、
一度変化した内部コントロールのサイズをまた変更することになるので
適切な手を打たないと猛烈にちらつく事になる
分割率が同じならいいんだろ? 計算してポンだよ
ではその計算してポンのコード書いてみれ
276 :
どや:2013/05/31(金) 23:50:53.77
TForm1 = class(TForm)
Panel1: TPanel; //Align=clClient;
Splitter1: TSplitter; //Align=clRight;
Memo1: TMemo; //Align=clRight;
procedure FormResize(Sender: TObject);
procedure Splitter1Moved(Sender: TObject);
private
rp:Single;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
if rp <> 0 then
Memo1.Width := Round(ClientWidth * rp);
rp := (Memo1.Width / ClientWidth);
end;
procedure TForm1.Splitter1Moved(Sender: TObject);
begin
rp := 0;
end;
277 :
276:2013/05/31(金) 23:52:09.02
AlignプロパティはclXXXじゃなくてalXXXだった
それ分割率がちょっとずつずれていくよね
>>276のコードはちょっと変だと思うけど
OnResizeのタイミングでまったくちらつかないな
まあマシンに依るのかもしれんが
まあ、OnResize発生したらタイマー仕掛けて
一定時間OnResizeが発生しなかったら
画面を更新するっていう方法もあるだろうけど
>>276 分割率をFormResizeで毎回計算するのはおかしいね
分割率を計算するのは、Splitterを動かして、分割率が変化したときだね
それだと最初の計算はいつ行われる?
フォーム生成時にもリサイズイベントが起きるから厄介なことになりそう
そこまでわかってるなら、生成~リサイズの間、と導き出されるわけだが
>282
じゃあ具体的にコードとして書くと?
282 じゃないけど
TForm の Create() の前に、OnReSize()が発生することなんてあり得るの?
ないだろ
D7でIBXでFireBIrd2.5に接続しています
IBDataSetとIBQueryでFilterを使ってみたところまったく効果がありませんでした
IBTableに変えたところフィルターされました
IBDataSetとIBQueryではFilterは使えないのでしょうか
>>285 使えない。OnFilterRecordイベントに書かないとダメだったと思うよ。
>>286 やはり使えませんか
DataSetProviderとClientDataSetを介すと使えるようなのでそれでやってみます
>>287 >ClientDataSet
ライセンスに気をつけて。
D7でゼロ除算例外が起きなくなりました
あるプロジェクトで
var
a : Double;
b,c : integer;
begin
try
a := b / c ;
except
a := 0;
end;
end;
のようなコードを書いているのですがある時からaが0でなく-NANになるようになってしまいました
テスト用の簡単なプロジェクトを作ったらそっちでは例外が起きて0になっています
考えられる原因はなんでしょうか
プロジェクトのオプションはどちらも同じはずです
コンパイラ指令もいじっていません
時間ない、だれかフォロー
Set8087( default8087) を
>>290 計算前に
Set8087CW(Default8087CW);
といれて試してみましたが変わりませんでした
初期化していないローカル変数はゼロになるとは限らない。
いままで、たまたま動いてた。
>>292 データの中身は除算前に0であることを確認してます
試しに計算直前に0を代入してみましたがやはり例外は起きませんでした
以前コンパイルした物は同じデータで例外が起きてちゃんと0になるんですよ
だから何かの設定かと思ったんですが
まずはちゃんとエラーを捕まえて except on e で e.Message を見てみる
ゼロ除算をわざとやるなら cに0を代入してみればいい
>>294 だからエラーが起きないんです
もちろんcに0を入れても
たぶん最適化のバグだと思う 最適化を外して再構築してみな
最適化したままデバッグしているとドツボにはまるよ
a := b / c ; の行で生成される fdivp の命令の次の命令あたりで
ブレークポイントをかけて実行。そのとき
(1) コントロールワードの値にZeroDiv例外マスクがかかっているので、
(2) 例外が発生せず、浮動小数点スタックのトップの値が -NAN になった
という症状が発生しているのならば、Set8087CWで対応できるし、
そこでは停止せずに例外が発生して、どこかへ飛んで、-NAN を
浮動小数点スタックに積んでいるなら、それが原因。
もどった。
D7 だから、昔からある機能で解決しなきゃいけないな。Math ユニットってあったけ?
try に入る前のところに
Set8087($1332);
を入れて。
-NAN になっているのだから演算は正しく行われて、Zero-div 例外がマスクされているだけ。
それを元に戻せばよし
LoadLibrary 呼ぶと8087CWが変化することがあるので
前後にsave/restoreが必要という話か?
比較的最近のだと SafeLoadLibrary ってのがあって CW の再設定をしてもらえる。
D7 にあるかどうかは忘れた。
Default8087 を設定しても直らなかった。ってことからすると、MSVC-DLL による 80887 再初期化とは
別の話で、OpenGL とか D3D あたりのユニットを最近追加したりしてないかな?
色々テストしてみました
default8087cwをtryの外に出したら例外に飛ぶようになりました
ただまったく別のフォームに例外を起こすコードを書いてもやはりdefault8087cwを入れないと
例外にならなかったのでプロジェクトのあちこちにあるこの処理を書き直すことを考えると頭が痛いです
その場所だけでなくプロジェクトに新規追加したフォームでも起きるんで
プロジェクトオプションで何か設定があるのかもと思ったんですが
まったく同じコードを新規プロジェクトで実行すると例外になるんで
つ バファリン
原因判りました
IBXでIBQuery等をOpenするだけで例外をトラップしなくなります
例外を捉えていたテスト用のプロジェクトに単純なSELECT文のIBquery1つ置いてopenしたらダメになりました
何故だorz
同じexeファイルをコピーして試したところどうやらwinxpでは例外になるのにwin7ではだめなようです
頭痛いどころじゃなくなった
ちょっと教えてください。
Win7で開発しています。
TListviewで各行の高さの30程度にし、SubItemなどの
長目のテキストを半角スペース付きで指定すると
そのスペース位置でうまく改行されます。
ところがXPで同じコードを実行しても改行されず
テキストの後半が「...」に置き換わります。
まあ、これが従来の表示形式だと思いますが。
この挙動が変わったのはOSのバージョンで言うと
どのあたりなのでしょうか?
それと、XPで何らかの方法で改行できないでしょうか?
やっぱりCustomDrawしか方法はないですか?
再現手順がわりと丁寧に書かれているが?
手順のことを訊いているのではないのか?
>>307 すいません。
一部のコンポーネントのnameを変更したら、
後はコピペで行けるのでしょうか?
赤線だらけで、何度やっても上手く行きません。
もう少しやってみます。
片っ端にコピペをしたら無事コンパイルできました。
お騒がせしました。
>>281-284 今更ですが最近似たようなプログラムを書いたので。
フォーム生成の後にリサイズイベントは起きますので
フォームのコンストラクターかOnCreateイベントハンドラで
割合を計算して記憶しておけば大丈夫みたい。
(フォームの宣言の一部)
private
FMemoWidthRatio: single;
procedure MemoryMemoWidthRatio;
(実現部)
procedure TForm1.FormCreate(Sender: TObject);
begin
MemoryMemoWidthRatio;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Memo1.Width := round(ClientWidth * FMemoWidthRatio);
end;
procedure TForm1.MemoryMemoWidthRatio;
begin
FMemoWidthRatio := Memo1.Width / ClientWidth;
end;
procedure TForm1.Splitter1Moved(Sender: TObject);
begin
MemoryMemoWidthRatio;
end;
311 :
デフォルトの名無しさん:2013/06/17(月) 21:03:42.71
WinXP D6 で質問です。
TListviewで ViewStyle := vsReport;
なかのグリッドのマスにマウスでポイントしてグリッドX,Yの位置を知る方法はありますか?
そしてその方法。
今は
ColumsClick := True; で上部のカラムを押してX軸を指定
procedure TForm1.ListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
// 略(エラー回避)
ListSelectColumn := Column.Index;
end;
MultiSelect := True; で行にマウスを当ててY軸を指定
procedure TForm1.ListViewClick(Sender: TObject);
begin
// 略(エラー回避)
ListSelectIndex := ListView.Selected.Index;
end;
という方法を使ってX,Yを指定してからグリッドの項目に入力などをやっています。
何が聞きたいのかいまいちわからないんだけど、GetItemAtとかGetNearestItemとかが役に立たないかな?
313 :
デフォルトの名無しさん:2013/06/18(火) 00:33:54.71
>>312 空の項目に文字を入れる場合の現状
>311 でX Yを決めている。
ListView.Items[Y2 行番号].SubItems.Strings[X3 カラム番号-1] := 'Y2 X3 のグリッド';
ListView.Items[ListSelectIndex].SubItems.Strings[ListSelectColumn-1] := 'Yn Xn のグリッド';
つまりマウスで表のマス目を直接1回で場所指定したいわけです。
今は横縦指定してからプルダウンメニューやボタン操作で入れる処理にしています。
いやいや、日本語でおk
ええと、言ってる内容がイマイチはっきりしないけど
Listview内の任意の場所をクリックして、その位置にある
Item(行)とSubItemの.Index(列)を知りたいってことですよね。
VBなんかだとGetSubItemAt(かな?)みたいな関数があるけど
Delphiに類似の関数ってあったけ?
でも、各カラムの幅は分かってるんだから、マウス位置のXから
すぐに求められるでしょう?
これでどうよ
procedure TForm1.OnListViewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i,col,row: integer;
columnX: Integer;
begin
col := 0;
row := ListView1.Selected.Index;
columnX := ListView1.Columns[0].Width;
for i := 0 to ListView1.Columns.Count do
begin
if (X < columnX) then break;
columnX := columnX + ListView1.Columns[i].Width;
Inc(col);
end;
ShowMessage('col=' + IntToStr(col) + ' row='+IntToStr(row));
end;
めんどくさいことしなくても、
ListView_SubItemHitTest でOK
D7でIBXのTIBDataSetでApplyUpdatesを実行してもUpdatesPendingがtrueのままなのですが
何をしたらFalseに戻るのでしょうか
戻らないとしたら更新の有無は何で判断したらいいでしょうか
データベースへの適用はCommitRetainingで行っています
TIBCustomDataSet.ApplyUpdatesをステップ実行してみればわかるんじゃないかな。
ローカル変数のUpdateActionがuaSkipだとUpdatePendingがFalseにもどらないみたいだけど、
そうなる理由はOnUpdateErrorイベントハンドラに指定したコードによるみたい。
>>319 ありがとうございます
アフタースクロールイベントでフィールドが変更されてしまっているのが原因でした
アフタースクロールで日付を分解してEditに入れてたのですが
EditのOnchangeでフィールドに書き込んでいたというおまぬけなことをやっていました
>>316がバグってたので修正版
procedure TForm1.OnListViewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
col,row: Integer;
intX,columnX: Integer;
begin
if (ListView1.Selected = nil) then exit;
intX := X - ListView1.Selected.Position.X;
row := ListView1.Selected.Index;
columnX := 0;
for col := 0 to ListView1.Columns.Count-1 do
begin
Inc(columnX, ListView1.Columns[col].Width);
if (intX < columnX) then break;
end;
ShowMessage('col=' + IntToStr(col) + ' row=' + IntToStr(row));
end;
D7でDBGridでtabキーを押すと次のレコードに移動するにはどうしたらいいでしょうか
出来ればコードを書かずに済む方法が知りたいです
>>322 コードは書かなきゃ無理だろ。DBGridのOnKeyPressイベントに
if Key = #9 then DataSet.Nextってやればいいんじゃね?
>>323 ありがとうございます
いや、手元にあるソースでコードにそれらしきものがないのに次のレコードに移動するのがあるんで
やり方が知りたかったんですよ
それらしいイベント記述もプロパティの設定もないもので
何か見落としてるんだと思うんだけど
とりあえずそのやり方でやってみます
TDBGrid.Options
dgTabs 〔Tab〕キーおよび〔Shift〕+〔Tab〕キーを使って,グリッド内を移動できる
>>321さん
返事が遅れましてすみません、ありがとうございます。
ListViewで col row が取得できるようになりました。
322です
>>325 dgtabs=trueです
FalseにするとDBGrid内でtab移動せず他のコントロールに飛んでしまいました
DBGridのReadOnlyを切り替えているところをコメントアウトしたらタブで行移動しなくなったので
これが悪さしてるらしいが原理がわからん
当然編集中はReadOnly=Falseなのだがtabを押すとcolexitもColEnterも発生せずいきなりレコードが移動する
もしかしたら意図的にやってるのではなくDelphiのバグなのか?
rtl170.bplってどこにおちてるんでしょうか
System32
>>237 かなり前の話ですが、
if CompareText(ExtractFileExt(FileListBox1.FileName),'.mp3')<>0 then exit;
での<>0の0は何を指しているのでしょう?
色々な文献で、ファイルにまつわる処理で
=0だったりというのが出てきますが、
ファイル名は文字ではないよな?と悩んでいます。
すみません。教えていただけないでしょうか。
判りました。ありがとうございます。
勉強が足りないというレベルじゃないですね。
なんか根本的な物が分かっていない気がします。
大丈夫ですよ。
文字列をパラメーターに取る関数の戻り値は別に文字列型ではなくてもいい、それだけです。
おはようございます
いつもお世話になっております
TMainMenuの子にショートカットキーCtrl + +を設定したいのですがエラーがでて設定ができません
設定できる方法があればご教授願いたいです
ちなみにCtrl + Num +ではないです
[ALT}+[F12]でdfmをテキスト表示してShortCutプロパティに直接16427を指定するんじゃ駄目?
>>355 レスありがとうございます
試してみましたができませんでした・・・
他のショートカットに使われる数字だと指定できるのですが16427だと
ショートカットの欄には何も表示されず空白のままで、実際にショート
カットキーを押してみても反応がありませんでした
ちなみにバージョンはDelphi6です
>Ctrl + Num +ではない
って言ってももう一つの方なら「Ctrl+;」ではないのか?
或いは「Shift+Ctrl+;」
テンキーの方なら↓
Test1.ShortCut:=ShortCut($6B, [ssCtrl]);
Test1.Caption:=Test1.Caption+#9+'Ctrl + +'+#0;
テンキーでない方の[+]って日本語キーボードとUSキーボードでは違うキーでしたよね。
どちらでも動くように作らないといけないかと思います。
ちなみに手元のTurbo Delphiでは
[;](セミコロン)キーなら単純に"Ctrl+;"で行けました。
現在のキーボードで、文字に対応するキーコードを調べるにはVkKeyScanを使う。
code := VkKeyScan('+'); // code: SmallInt
key_code := LoByte(code); // key_code: Word
shift := [ssCtrl]; // shift: TShiftState
if (HiByte(code) and 1) <> 0 then Include(shift, ssShift);
menu_item..ShortCut := ShortCut(key_code, shift);
これでも設定できなかったら、OnShortcutとかOnKeyPressイベントで
キーを受け取って自前で処理することになるかな。
(メニューやHintの文字列も自分で追加)
皆様沢山のレスありがとうございます
こんなにたくさんのレスをいただけるとは驚きました・・・
>>337,
>>338さんのおっしゃる通りCtrl+;で実装できました
他のソフトだとCtrl++という表示が出ているという固定観念にとらわれてCtrl++を
表示させようと必死でした・・・
Ctrl++とCtrl+;の表示の違いについては気にしないのでCtrl+;で実装しようと思います
>>339さんの方法は今後もし同じようなことがあれば参考にさせていただきます
レスをして下さった皆様ありがとうございました
D7でプロジェクト全体で語句を一括置換したい場合どうすればいいでしょうか
IDEの置換だとunit単位でしかできないですよね
秀丸なりなんなり外部エディタで
delphiのかなり基本についての質問です。
使ってるバージョンは delphi 6 Personal です。
mp3プレイヤーを作りたいと頑張っていますが、”常にFormの状態を取得する”
というイベントがあるのか無いのか、またあるならばどのイベントかが分かりません。
どうすればできるでしょうか?
『常にFormの状態を取得する』ってなによ?自分用語じゃなくて他人に伝わるようにね。
すいませんでした。
自分じゃこれ以上の表現は難しいのでこの質問はやめにします。
スレ汚しすいませんでした。
TApplicationEvents.OnIdle
エスパー現る
イベントドリブンなDELPHIでもメッセージをフックして独自な処理をすることもできる
なんのイベント探してるのか知らないけどOSが渡してくるメッセージのどれかだろうから
フォームの状態を常に監視的なことはもちろんできる
この程度でエスパー扱いか
顧客様はもっと意味がわからん要求してくるけどな
そのレスに何の意味があるの?
お前が釣れたんじゃねぇの?
そのレスに何の意味があるの?
Delphi7 のユーザーなのですが、最新版の Delphi の TRichEdit は 7 に比べ格段に進化しているのでしょうか?
また TEditor 以外の 有力なテキストエディタコンポはありますか?
RichEdit も有力でかまいませんのでよいコンポがあったら紹介して下さい。
355 :
訂正:2013/08/06(火) NY:AN:NY.AN
> RichEdit も有力でかまいませんのでよいコンポがあったら紹介して下さい。
RichEdit も有料でかまいませんのでよいコンポがあったら紹介して下さい。
TMaskEditで日付を入力しているのですが
一度入力してしまうと消してブランクにしたいと思っても入力値が不正ですとなってしまって抜けられなくなります
この場合入力を取り消す方法はないのでしょうか
>>357 亀だけどサンクス。
TEditor を使っている TeraPad の作者がいまだに Delphi4 で開発を継続しているのにちょっとびっくりした。
OS は Windows 7 らしい。私の OS も Windows 7(64bit)なんだけど、Delphi 5 の動きは少し怪しい。32
ビット版の Windows 7 だったらいいのかな?
Delphi XE3とか既にインストールされてるのですが、今から、古いバージョンの
Delphi2009とかをインストールしても問題ないでしょうか??
ファイルの関連付けは変わりそうですが。
ご想像の通りあまりお勧めできないかなぁ。大丈夫かもしれないけど。
あとからXE3を修復セットアップかけてみるとか…?
やっぱ、おすすめできないですよね。
いざとなったら、仮想マシンの方で頑張ってみます。
問題になりそうなのはヘルプ、関連づけ、同梱されてるサードパーティ製品くらいかな。
でも動いてる環境に影響がありそうなことはしたくはないよね。
環境変数もあるか。
エンバカが Delphi 買ったのって、エンバカのツールが Delphi で書かれていたからなんだって。
すごいね
_人人人人人人人人人人人人人人人_
> そうなんだ、すごいね! <
´ ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
__、、=--、、 __
/ ・ ゙! /・ `ヽ
| ・ __,ノ (_ ・ |
ヽ、 (三,、, _) /
/ー-=-i'' (____,,,.ノ
|__,,/ |__ゝ
〉 ) ( )
初めまして
過去ログみてsystem32を見てみたのですがrtl170.bplが見当たりません
どこにありますか…?
>>368 いや、あんた使ってるDelphiのバージョンとか 、
何をしたらどんなエラーが出るとか書かないとエスパー降臨待ちになるで
>>368 すいません。
Delphi絡みというよりも、やっているPCゲームでrtl170.bplを要求されてしまって
ぐぐってもなかなかでてこないときに
>>328に辿り着いたので安易に質問してしまいました
そもそもrtl170.bplというファイル自体がよくわかりません…
ゲームメーカーに問い合わせるしかないんじゃね?
>>370 作者に連絡してリリースビルドかつランタイム同梱形式でコンパイルしてもらうか、
配布用ランタイムパッケージつくってもらえ
整数とかの変数名のあたまにマイナス符号つけるやり方って昔からあった?
ごめん、君の言ってることがわからない > 373
AnotherIntVariable := - IntVariable;
ってこと?
TPopupMenuを上に展開するのってどうやるのでしょうか
>>375 カーソルの上の方にということならそのように座標をを指定するだけ。
>>376 popupメソッドだと左上が基点になんですが、
デスクトップで右クリックしたときに出るメニューみたいに
左下や右下を基点にする方法はありますか?
PopupMenu1.Popup(0, 0);が左上だから
PopupMenu1.Popup(0, 768);で左下
PopupMenu1.Popup(1024, 768);で右下にならない?
> デスクトップで右クリックしたときに出るメニューみたいに
画面下にはみ出しそうだと勝手に上向きに調整されるだけ
逆に画面上につっかえるような指定すると、どう頑張っても下向きにされるはず
>>377-379 強制的に、またはデフォルトで左下や右下を基点にしたい、って意味なのかな?
どうしてそんな必要があるのか分からんけど。
381 :
375:2013/09/13(金) 18:17:19.80
フォームの下のほうに配置したボタンでポップメニューを出すようにしてるんですが、
通常はボタンの左下を基点に表示するようにしてるけど、
メニューが多くなって上に展開されたときにボタンが隠れてしまうので、
はじめからボタンの上方向に展開できればと思ったのです。
DephiにC++のコピーコンストラクタみたいな物は無いのでしょうか?
もしくは代わりになりそうな機能
ない
自分でoverloadしたコンストラクタを実装か、Assignを実装して内容をコピる
かなぁ。あとは高度なrecord型を使う
384 :
デフォルトの名無しさん:2013/09/15(日) 23:26:29.21
iPhoneをターゲットとした開発を考えています。
xcode(昔のVC6.0のようなRADとはほど遠い開発環境)に苦痛を感じています。
iPhone向けのDelphiはいわゆるRADなのでしょうか?
Windows版はDelphi6Personalの時に使っていたので
同じように開発できるならpro版を買おうと思っています。
iOSはPro版だけじゃ駄目だから気をつけて
iOS/Android開発するには最低おいくら掛かりますか?
個人的に触ってみるつもりです。(トライアル版は今落としてます)
XE5 Starter版でも「XE5 Starter ESD アップグレード」なるものを当てれば
iOS/Android開発できる??
とんちんかんな質問ですんません
あーあとiOSの場合はAppleにも冥加金を払う必要があるんで。iOSデベロッパプログラム、年8,400円だとさ。
ちなみにMac(OSX)とは別立てね。
>>388 Starterではまったくダメです。Mobile Add-On Packの要件外なので。
>「XE5 Starter ESD アップグレード」なるものを当てれば
いや、それが普通のStarter版ですよ。
(他の有償/無償の開発ツールユーザーが対象。インストール確認は特に行わないはず。だから…。)
しかし、、、目が飛び出そうな価格に驚いたでしょ(笑)
アイフォン用のアプリを登録するだけでも金がかかる、と アホ臭い
いつの時代から来たんだ…w
>>389-391 うーむ高いですねぇ、ひとまずiOS/Android開発は諦めます。
Delphi XE5 Pro単体でも10万円ってのも痛いっす(自分は新規購入です)
Starterは将来モバイル開発したくなったとき、ゴミと化してしまうので買うに買えませんしね・・・
ご親切に回答ありがとうございました!
少なくともまだ買わないのが正解。
買う場合はXE7あたりになってもっと安定してから。
396 :
デフォルトの名無しさん:2013/09/27(金) 20:32:06.35
Delphi の exe って無駄に大きいけど、小さくするのは難しいんですか。
ネット検索すると小さくする方法がいくつかあったけど、なんか面倒。
普通にコンパイルして小さくなるようなバージョンを開発してほしい。
基本的には無理
EXE自体にフォームなどのリソースを全部リンクする構造なんで
VBみたいにライブラリをランタイムとして提供すればある程度は小さくなるけど
トータルで見ればむしろデカくなる上配布が面倒になる
EXEパッカーという手もあるがセキュリティソフトの誤爆率が大幅上昇するのでお勧めしない
そうですね。
っていうか、今時サイズ気にします?
本当に動きに差異が無いなら、小さい方が良いのは理解します。
でも、それを検証するのも面倒だし、そんなこと気にしている暇があるなら、
もっと、他の事に時間を費やした方が宜しいかと。。。
まぁ、XE4で、空のexe作った時のサイズには、流石に驚愕しましたが。
Debugだからだったのね。Releaseにしたら、気にならないよ。
Delphi XE5 で人生初 Android アプリを作ったら 30M 超えてて泣いた
30Mなんて今どきジュースも買えんだろ
Androidアプリでも30MBはデカすぎ
402 :
デフォルトの名無しさん:2013/09/28(土) 12:37:49.15
昔と違って HDD 容量も大きくなったけど
やっぱり1本で 30 M超えると「ちょっと大きいよね」と思ってしまう。
業務用アプリだと1だけでは無いので余計困る。
403 :
デフォルトの名無しさん:2013/09/28(土) 19:34:27.02
MS: TMemoryStream;
MS.SaveToFile(FileName);
これって内部的にどうやってるの?
del6perでソース無いので教えてください。
405 :
403:2013/09/28(土) 22:04:52.38
㌧、DLしました。
色々研究できそうです。
android用のリリースビルドで30M?
なら確かに厳しい、、、
407 :
デフォルトの名無しさん:2013/10/05(土) 18:39:19.34
Debugビルドでないの?
Winの場合はDebugとReleaseで全然サイズ違うよ
408 :
デフォルトの名無しさん:2013/10/06(日) 16:52:58.64
デュアルモニタ環境で開発していて気付いたのですが
TPopupMenu.Popup(X, Y)でホップアップメニューを表示させるとき、
モニタ1(プライマリ)上では正常に表示されるのに
モニタ2上で表示させようとすると必ずモニタ1に表示されてしまいます。
何か設定が足りないのでしょうか?
どなたか何か情報お持ちでしたら教えてください。
バージョンくらい書けよ
スパンモードってことだよね
PopupMenu1.Popup(2000,100);で普通にセカンドモニタに出てくるけど
(X,Y)はどうやって計算してる?
TScreen.DesktopTop や TScreen.DesktopWidth とか
function DeskTop:TRect;
begin
//タスクバーなどを除いたデスクトップのワークエリアを取得
SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0);
end;
とかの組み合わせを間違ってないかな?
411 :
408:2013/10/06(日) 19:46:06.91
>>409-410 返信ありがとうございます。
バージョンはXE5で、FireMonkeyデスクトップアプリケーションで作ってます。
> (X,Y)はどうやって計算してる?
Screen.MousePosでX,Yもってきてます。
(数値の直入力も試してます)
私のモニタの配置が
[モニタ2][モニタ1]
というようになってまして、
配置を
[モニタ1][モニタ2]
としたところ正常に表示できました。
うーん・・・
ついでにOSも…
413 :
408:2013/10/06(日) 23:27:28.67
OSはWindows 7 Professional 64bitっす
ひょっとしてモニタ2の座標はマイナスかな
415 :
408:2013/10/07(月) 21:16:31.52
そういうのVCLならライブラリの中に潜っていって調べるのが当たり前だったけど、
Firemonkeyの中を見たらまるっきり構成が変わってて知らない土地に来たみたいな感覚だな。
マルチプラットフォームだしなかなか手が出しにくいな。
パーティションツールとかによくある、
サイズを拡縮できるバーみたいなのってどうやって作るの?
>>417 よくあるじゃ分からない。
本当にやりたいなら、詳しい説明画像とか作って示す手間をかけてくれ。
>>417 標準コントロールじゃないので自分で作れ
コントロールの縁付近でマウスを押されたら
カーソル移動移動に合わせてコントロール伸縮するように
作ればいいんじゃないかな
SplitterとPanelを並べれば似たような事が出来るかも?
標準にはないのね。ありが㌧
しょーがないんだけど、一般的な業務アプリで使わなさそうなGUIは
自分で何とかしないと駄目なんだよね
俺は今ビデオ編集みたいなタイムラインが必要で困ってる
そうそう、そんなイメージ。タイムライン
やっぱpanelとsplitterかな。
他にいいアイデアない?くだすれ思考で。
さっさとつくって公開してくれや。
描画とクリックだけでしょ。作ったほうが簡単
1
OnMouseDown で座標を記憶し OnMouseUp で座標を引き算してコントロールの位置や大きさを整える。
2
必要に応じてカーソルも変える。
3
ちょっと贅沢したければOnMouseUp での整形を OnMouseMove でやる。
TSplitter は扱いづらいので自作がお勧め。
>>425 うちもそう思いますが描画とマウス操作だけなら自分でコンポを書くほうが楽だと思います。
unit unko;
interface
uses
SysUtils, Classes, Controls, Graphics;
type
TUnko = class(TGraphicControl)
private
FDragging: boolean;
protected
procedure Paint; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
public
constructor Create(AOwner: TComponent); override;
end;
implementation
constructor TUnko.Create(AOwner: TComponent);
begin
inherited; //
Width := 128; Height := 128;
end;
(つづく)
>>427 文章がおかしかった、ごめんなさい。
おそらく何から手を付けていいかわからないと思いますので
クソみたいなサンプルを作ってみました。(以下、
>>427の続き)
procedure TUnko.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // マウスボタンが押された時に呼び出される。
begin
if Button = mbLeft then
begin
FDragging := True; // 「左ボタンでドラッグしてます」
Invalidate; // Windowsに「適当なタイミングで再描画してね!」とリクエストする
end;
inherited;
end;
procedure TUnko.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // マウスボタンが離された時に呼び出される。
begin
if Button = mbLeft then
begin
FDragging := False; // 「ドラッグはやめました」
Invalidate;
end;
inherited;
end;
(続く)
(
>>428の続き)
procedure TUnko.Paint; // ここで描画する
begin
if FDragging then // 「ドラッグ中?」
begin
Canvas.Pen.Color := clRed;
Canvas.Brush.Color := clYellow;
Canvas.Rectangle(ClientRect);
Canvas.Font.Color := clRed;
Canvas.TextOut(2, 2, 'ぶりっ!');
end
else
begin
Canvas.Pen.Color := clYellow;
Canvas.Brush.Color := clGray;
Canvas.Rectangle(ClientRect);
Canvas.Font.Color := clYellow;
Canvas.TextOut(2, 2, 'うんこ');
end;
end;
end.
(続く)
(
>>429の続き)
呼び出しサンプル…といっても生成するだけですが
uses (中略), unko;
type
TForm1 = class(TForm)
private
FUnko: TUnko;
public
constructor Create(AOwner: TComponent); override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
FUnko := TUnko.Create(Self);
FUnko.Parent := Self;
end;
>>427-429のうちコードのところだけをコピペ、
見やすくするために全角空白にしているところを半角空白かタブに置換して、
unko.pasで保存すれば使えるはず。
たいしたもんだ
家に来て妹をファックしていいぞ
高見盛似のな
ドラッグ中のESCキーとか、Alt+TABとか、
ウィルスバスター起動してフォーカス持ってかれたとか
この辺どうなの?
XE5で作ったAndroidアプリがデカすぎて、
実機での起動時のロード時間がえらいかかるらしいってほんまでっか?
デバッグビルドはね
厳密にはガセ
ADB / USB ケーブルによるファイル転送と APK ファイルの展開/デジタル署名の検証に
時間がかかるだけで、いったんアプリを転送して展開してしまえばネーティブコード(笑)なので
デバッグビルドでもリリースビルドでも差はない。
まぁデバッグ時には毎回(コードを変更していなくても)アンインストール、インストール、APK 署名検証、APK から
ファイルの展開/抽出をするので、おそいといえば遅い。
なる
なる
with文の式を指す予約語とかある?selfみたいな
式じゃなくてオブジェクトですね。
ないんです、すみません。
やっぱ欲しいよね、アレ
with TStringList.Create do とかした時に Strings 引数で他に飛ばす時とか
でもないんだよね
しかも今後は with 文自体が非推奨になっていくみたいだし……
Withはミスりやすいから仕方ない。
完全に被らないようにするか、Withしてない方にSelfだの付ければ良い
エディタの進化でwithはいらん子だわな
うちは逆にwithを使うようになってます。ただし
・使わないとえらい長たらしくてわかりにくい場合
・ピンポイントでのみ使う(長いbegin~endブロックでは使わない)
・パラメーターが1つ(つまり with Untara, Kantara do などとはしない)
のすべてを満たす場合だけです。たとえば
if opAruFlag in MainData.Untara.Kantara.Options then
MainData.Untara.Kantara.Options := MainData.Untara.Kantara.Options - [opAruFlag]
else
MainData.Untara.Kantara.Options := MainData.Untara.Kantara.Options + [opAruFlag];
を
with MainData.Untara.Kantara do
if opAruFlag in Options then
Options := Options - [opAruFlag]
else
Options := Options + [opAruFlag];
こうするような場合。
with ListBox do Selected[ItemIndex]:=True;
これは一番よく使うパターンだけど ItemIndex は入力支援で出てこないんだよね
with使うとブレークした時にカーソル合わせても値が表示されないからクソ
というか入力支援捨ててまで使おうとする奴はアホ
フラグを足し引きしてるのがすんごい違和感ある or,xor,andだろ
これは集合型ですから。
>>444 Include、Excludeを使うとさらに良くなるかな?
俺は全然、集合型を足しひきするのはOK
D7でボタンを押すとファイル選択のダイアログを表示する処理で
OpenDialog1.FileName := FName; //デフォルトのファイル名
if OpenDialog1.Execute then
begin
//処理
end;
といったコードを書いているのですが一部のwindows7でダイアログが表示されなっくて困っています
同じバイナリで表示されるPCと表示されないPCがあります
同様の現象に遭遇したことがある方、解決方法をご存知でしたら教えてください
最小限再現するコードがほぼそれだけなら
「表示されないPCが」おかしい
初めましてTurbo delphiで時たまプログラミング遊びしている者です。
今作成しているプログラムで壁にぶつかってしまったのでなにかヒントを頂けると嬉しいです。
特定フォルダ内のexeファイルのパスを拾って、ボタン1つで起動させるソフトを作っています。
メモ帳やペイント、その他多くのソフトは想定通り起動してくれるのですが、
JAVAで作られたexeソフト?だけ実行しようとしても
「アプリケーションの実行に失敗しました。」と出て実行することができません。
他のソフト起動に試した関数は以下の三種類です。
CreateProcess
ShellExecute
WinExe
ネット検索をしても上記3つの関数しか提示されていなくどういうアプローチで修正すればよいかわからず困惑しています。
似た事例を経験されて解決方法をご存じの方がいらっしゃいましたら是非ともご教示願いたいです。
どうかよろしくお願いします。
javaでexeってLaunch4jとかそんなの?
起動できないソフトの名前を書くように
>>453 正解は知らないけど、ShellExecuteに絞ってやったほうがいい。
ダブルクリックで起動できる = 「ファイル名を指定して実行」で起動できる = ShellExecuteで起動できる
…のはずだから。
ShellExecuteも様々なパラメータ指定のやり方があるから、あらゆる方法を試したら。
今はどうやってるの?
とりあえず、ワケ分からないで付けてる「既定のディレクトリ名」は外そう。
ただし、試してないよ。
ShellExecute(Handle, 'open', PChar(exedat), '', nil, SW_SHOWDEFAULT);
>>458さん
ありがとうございます。
第五引数をnilにしましたが残念ながら結果は変わらず「アプリケーションの実行に失敗しました」でした。
ご助言誠にありがとうございます。
普段使用しているランチャーソフトからはパスを拾って普通に実行できるので
外部ソフトからの起動ができないわけではないと思うのですが…
exedatの中身はどうなってるの?
それを「ファイル名を指定して実行」で起動する?
>>460さん
ありがとうございます。
ブレークポイントを置いて確認したところ想定通りのパスが入っていました。
加えて、試しにコピーして「ファイル名を指定して実行」を実施した所しっかり起動しました。
ご助言ありがとうございます。
では、これは?
ShellExecute(Handle, nil, PChar(exedat), nil, nil, SW_SHOWDEFAULT);
空文字が見苦しいからnilで統一した。どっちでも受け付ける…と思う。
難しいねぇ。
当該のソフトは軽い気持ちで入れたくない量(嫌な予感)なので、パスさせて。
お役に立てなくてすまぬ。
他、心当たりある人助けてあげて。
>>464さん
こんなに深夜遅くまでご教示くださり誠にありがとうございました
たった今無事に当該exeファイルを想定通り起動することが出来ました。
ttp://www.wwlnk.com/boheme/delphi/tips/tec0260.htm に記載のCreateProcessを用いて下記のコードで実行してみたところ
GetStartupInfo(SI); //他アプリの起動
CreateProcess (PChar(exedat), '', nil, nil, False, 0, nil, PChar('C:\Program Files\MOBWAYS\TimeManager\'), SI, PI);
無事目的のexeファイルを起動することが出来ました。
手持ちの参考書『カンタン!Delphiプログラミング』には第8引数に「 CREATE_DEFAULT_ERROR_MODE」と記載してあったのですが
上記のようにカレントフォルダを指定してあげると想定通りの起動を得ることが出来ました(まだ難しくて理解できていないです)。
まだまだわからないことだらけで情けない限りです。
繰り返し、
>>464さん夜分遅くまでお付き合い下さり
本当に、本当にありがとうございました。
スレを長レスで乱して申し訳ありませんでした。
皆様ありがとうございました。
>>465 ほー、そうなんだ。
無駄なことさせたようで悪かったね。ごめんなさい。
とにかく目的が果たせて良かった。
>>466さん
とんでもないです
問題点を精査するアプローチを学べました。
大変参考になりました。本当にありがとうございます。
>>449 Inludde/Exclude手続きが使えるのは集合型「変数」のみで
集合型「プロパティ」には使えません。
集合演算子に xor があったらありがたかったです。
469 :
デフォルトの名無しさん:2013/10/21(月) 17:39:48.66
初めまして。
VCLフォームアプリケーションで書いたプログラムをFireMonkeyモバイルアプリケ
ーションに移植しようとしているものです。
【症状】
PaintBox.Canvas.Pixels[x,y]のPixelsがエラーメッセージ E2003 未定義の識別
子を吐き出し、詰まっております。
【質問内容】
PixelsはVCLフォームアプリケーションでしか使用できないものなのでしょうか?
また、そうであるとすれば、PaintBoxに点を描画できる方法はあるのでしょうか?
何かご存知の方、ご教示頂けると幸いと存じます。
Googleってご存知でしょうか?
もしご存知であれば"FireMonkey Pixels"で検索することはできないのでしょうか?
471 :
デフォルトの名無しさん:2013/10/21(月) 20:07:15.70
個人情報抜かれるから無理ですね。
高橋(智)です
ソースは画像でうpしてます(笑)
高橋さんって嫌われているの?
遊ばれてるだけだろ。あまり愛想のいい人じゃないけど、嫌いじゃない。
じゃあ DEKO さんと Mr.XRAY さんは?
ネチネチ。
XE2のフォーマッタで
datetimetostr -> DateTimeToStr
というのをやるオプションってないんですか?
XE3以降では出来たりしますか?
ちょっと教えてください。
Win7(x64)上のXEで
TListviewのOnCustomDrawSubItemを使って
各行のSubItemに図形を描いています。
これ自体は正常に描けているんですが、
本来、Windowsに任せているハズのCaptionが
マウスを上に持ってくると文字背景が黒くなり
テキストを判別できなくなります。
で、Captionも自力で描こうとOnCustomDrawItemを使うと、
こんどはOnCustomDrawSubItemがまったく機能しなくなります。
OnCustomDraw...って、どうやって使うんでしょうか?
479 :
478:2013/11/02(土) 08:45:01.40
DelphiのTFormのLeftとかWidthって実際の値とは違うの?
Windows 7で2つのFormをピッタリ並べたいんだけど
LeftとWidthだけ使うと、Form同士が微妙に重なってる
実際に画面キャプチャして調べると、LeftもWidthも
設定した値と違ってるんだけど...
(外枠相当が数値に反映されてない?)
Formの位置やサイズを正確に調べる方法ってありますか?
left,top
width,height
>>480 重なってると思ってる部分は単なる影だろ
Aero切るかクラシック表示にして試してから言え
>>480 フォームを一つだけ最大化して、その値を半分にしてはどうかな。
Win32APIのAdjustWindowRectExが現実とは異なる値を返している(かパラメータが正しくない)んじゃないかな。
486 :
480:2013/11/06(水) 21:08:02.18
すばやい回答ありがとうございます。
>>485 試しに10足してみると2つのFormがピッタリ並んだ
APIとかまだ使ったことないけど挑戦してみる
ありがとう
Form.Widthはクライアント領域の幅で、枠は考慮しない これは常識だけど・・・?
常識だったのか…?
クライアント領域の幅ってForm.ClientWidthじゃなかったっけ?
そういえばScreenSnapをtrueにしてると
Formがスクリーン端に吸着するとき
枠が外にはみ出すんだよな
それ以来ScreenSnapは使わなくなった
Delphiの「Windows○○対応」は表面上だけだからな
本来はOSや状態による差をVCL内部で考慮するのが当然なんだが
>本来はOSや状態による差をVCL内部で考慮する
もう何年も前に、そういった思想は破棄されている
ただまぁ昔話は止めておけ
は?
ところでScreenSnapってどんな実装になってるの?
自分はStarterだからソースを参照できない
TFormを継承して、外枠の幅を考慮してスナップさせる
クラスを作るのって簡単そう?
簡単
WM_WINDOWPOSCHANGING
とかでぐぐれば、いくらでも例が出てくるだろう
>>495 汚いソースで恥ずかしいけど、Del7のを参考にしてみた
uses DWMAPI;
FSnapBuffer: integer FScreenSnap: boolean; FFrameSize: integer;
procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
function GetWindowFrame(Handle: THandle): integer;
var R1, R2: TRect;
begin
result := 0; try
if Win32MajorVersion >= 6 then begin
DwmGetWindowAttribute(Handle, DWMWA_EXTENDED_FRAME_BOUNDS, @R2, SizeOf(TRect));
GetWindowRect(Handle, R1);
result := Abs(R2.Left - R1.Left);
end; except end; end;
procedure TForm.FormCreate(Sender: TObject);
begin
FSnapBuffer := 20; FScreenSnap := true; FFrameSize := GetWindowFrame(Handle);
end;
procedure TForm.WMWindowPosChanging(var Message: TWMWindowPosChanging);
procedure HandleEdge(var Edge: Integer; SnapToEdge: Integer; SnapDistance: Integer = 0);
begin if (Abs(Edge + SnapDistance - SnapToEdge) < FSnapBuffer) then Edge := SnapToEdge - SnapDistance; end;
var fx, fy, fwidth, fheight: integer;
begin
if FScreenSnap and ((Message.WindowPos^.X <> 0) or (Message.WindowPos^.Y <> 0)) then
with Message.WindowPos^, Monitor.WorkareaRect do begin
fx := x - FFrameSize; fy := y - FFrameSize; fwidth := Width + FFrameSize + FFrameSize; fheight := Height + FFrameSize + FFrameSize;
HandleEdge(fx, Left, Monitor.WorkareaRect.Left); HandleEdge(fy, Top, Monitor.WorkareaRect.Top);
HandleEdge(fx, Right, fWidth); HandleEdge(fy, Bottom, fHeight);
x := fx + FFrameSize; y := fy + FFrameSize;
end; inherited; end;
498 :
497:2013/11/11(月) 05:41:55.66
>>497のを誰か添削してくれない?
Win7上でちょっと動きがぎこちないんだけど
4月に画像ビュアーで質問したものです。
立て込んでいた仕事が一段落したので
作っていたソフトの改良をしたいと考えています。
DirectoryListBoxでダブルクリックしないと
FilelistBoxにファイルが表示されません。
シングルクリックにする方法はありますか?
イベントにOnClickがあるのでできそうな気がしますが、
何を書いたらいいのか分かりません。
コンパイラはDelphi XE4です。
よろしくお願いいたします。
>>499 オブジェクトインスペクタで DirectoryListBox1.FileList:=FileListBox1 を設定してる
ということですか? 前提条件を書いてくださいね。
特にDirectoryListBoxやFileListBoxはWin3.1時代のコンポーネントみたいだから、
使ってる人がほとんどいないと思うので、なおさら。。。。
細かいこと言わないなら、OnClickに DirectoryListBox1.OpenCurrent(); でどうですか。
あと画像ファイルを開くなら、TOpenPictureDialogというのもありますよ。
シングルクリック時にダブルクリックイベントを呼べばいいんでわ
>>500-501 ありがとうございます。
DirectoryListBox1.FileList:=FileListBox1
は設定してあります。
インターフェースはListboxで十分で、
選択したjpg,pngファイルをImageに渡しているだけのソフトです。
wavとmp3のサポートしています。
元々はVecterにあるListというソフトを見本にして
勉強のためにDelphiで作っていました。
4月に発生していた原因不明のmp3が再生できないというエラーは
作り直していたら出なくなりました。
ロダにあげたので、もし良かったらアドバイスをいただけないでしょうか?
http://www1.axfc.net/u/3087170.rar よろしくお願いいたします。
以前もレスしたお人好しだが今回は時間がないので
ReadMeとUnit1_01.pasだけ目を通した
他の人も書かれたように「DirectryListBox」「FileListBox」は Windows3.1時代のもの
その当時はシングルクリックでフォルダ(ディレクトリ)を開くという考え自体がなかった
敢えてするなら
procedure TForm1.DirectoryListBox1Click(Sender: TObject);
begin
(Sender as TDirectoryListBox).OpenCurrent;
end;
もし他の人にも使ってもらうなら「シングルクリックで開く」と設定で選べるようにするべきだ
>mp3のタグ
「Delphi ID3Tag」でググれ
俺は自分用なので「AudioInfo」というコンポーネントを使ってる
「Delphi 関連づけ」でググれ
>次のファイルを自動で演奏
TMediaPlayer.OnNotify をヘルプで読むなりググるなり
以前も書いたけど人にソースを読んでもらうなら読みやすいように
filelistbox1.FileName→ FileListbox1.FileName;
コード補完機能を使ってちゃんと書いてくれ
TMediaPlayerだけMPlayに名前を変えてるけどw
TButton何個も載せるならわかりやすい名前を付けよう
ZoomButton とか UpdateButton とか
格段に読みやすくなる
>>503 ありがとうございます。
以前お世話になりました。
大文字の問題は教えていただいた後に
拡張子のエラーなどの問題を解決するため
3~4回作り直しています。全部作り直ししました。
知人にインターフェースがわかりにくい
と指摘され作り直していたらコンパイルすらできなくなって
消しちゃったので教えていただいた頃のソースです。
ゴールについてですが、私がソフトに盛り込みたい内容で
私の宿題だったので、この点についても教えていただき
ありがとうございました。
タグについても、全部手打ちしなければならないと思っていたので
AudioInfoの情報ありがとうございます。早速調べてみます。
関連づけについては、コマンドラインオプションの実装と
フォルダー内のファイルを全て検出して読み出す必要があると考えています。
>>503 ただいま確認できました。
onClickを選択してもonChangeになって
原因が分かるまで時間がかりました。
>TButton何個も載せるならわかりやすい名前を付けよう
コード補完と併せて勉強させていただきました。
ありがとうございました。
必要な機能を実装できるよう更に勉強いたします。
506 :
デフォルトの名無しさん:2013/11/17(日) 19:36:38.02
十数年前までVB6で業務アプリを作っていました。
その頃delphiも少しやっていました。
最近になってまた業務アプリ(windows)を定期的に作ることになりました。
delphi、vb.net、python、java、c#、rubyなど、どれを使おうか悩んでいます。
皆さんのお考えをお聞かせください。
ちなみにvb6ではスパゲティープログラムを作ってしまう程度のスキルです
>>506 業務アプリがどのようなものかによります。
社内で使うものでコマンドラインでいいなら適当なスクリプト言語を。
スクリプトでは都合が悪いなら Delphi がコンパイルも動作も速くてお薦めです。
売り物として作るなら GUI が必要になってくると思うので C# が一番。VB でも可。
.net を嫌う向きには VC++ のアンマネージドコードか Delphi の二択になります。
プラットフォームが Windows 限定ならわざわざ Java を選ぶことはありません。
私なら Perl と Delphi と VC# を適宜使い分けます。
スキルなんて少しでもやる気があればいくらでも伸びるので気にせず選びましょう。
業務アプリ向けでこだわりが無いなら今ならC#一択でしょ?
509 :
デフォルトの名無しさん:2013/11/18(月) 18:06:28.92
>>507,508
ありがとうございます。
C#はMS社の新技術にこれからどんどん付いていく自信がありません。
.net frameworkにも抵抗があります。
その点delphiはwinアプリは枯れているような印象があります。
oleオートメーションでwordやexcelを操作する予定です。
delphiはすべてのoleオートメーションの機能を使えるでしょうか?
また近年マイナーになっているのが気になります。
510 :
507:2013/11/18(月) 19:10:01.10
>>509 お使いの Delphi がどこまで ole オートメーションに対応しているのかは存じませんが、そういう業務ならば Delphi でやってみれば良いと思います。
しかし MS 純正ソフト同士の方が色々と都合が良いのではないかと思うので、少しずつ C# にも触れて慣れていってはいかがでしょうか。
.net は近頃のマシンパワーならもたつきは気になりませんよ。
511 :
デフォルトの名無しさん:2013/11/18(月) 21:04:59.02
>>510 ありがとうございます
その線で行きたいと思います
ただMS社のC#研修を受けたときにチンプンカンプンだったので苦労してもおぼえられるかなと思っています
また、.netは新しいWindowsが出るたびに.netのバージョンを上げないといけないようなイメージがあります
ところで今後のモバイル開発を考えた場合delphiがまた人気が出るような気もしますがFireMonkeyの完成度が高くないようであまりメジャーにはなっていないようですね
人気が出そうですかねぇ?
512 :
507:2013/11/19(火) 00:45:16.67
>>511 うちの Delphi は 5Pro なので最近のことはわかりません。
ウェブ用にはメモ帳で Perl で CGI を書くくらいですね。
>506
迷わずC#と言っておく。業務ソフトは性能よりも生産性重視すべきだから
OLEオートメーションとの相性も良好
VCLをある程度知ってるなら.NET Frameworkはすぐに身につく
…事情知らない奴はパクリにしか見えない位そっくり
Delphiがマイナーになっていくのも同じ事情
>.netは新しいWindowsが出るたびに.netのバージョンを上げないといけないようなイメージがあります
むしろそれはやらない方がいい。VS2005であと15年は戦える
>>513 以前C#でexcel操作するサンプルコード見たことあるんだけど
オブジェクトの階層たどっていくのにいちいち
try{・・・}finary のネストが必要でこりゃ面倒だなと思ったんだけど
その辺は解消されてるの?もしくはそれがあってもC#のほうがいいの?
excelとか扱うならVBのほうがいいんじゃねえのと思ったりもするんだけど。
C#ならusing?
VB.netはやめとけ
>>503 レスありがとうございます。
wav再生系統を分離してちまちま作っていました。
TMediaPlayer.OnNotifyですが、
MediaPlayerに対して何かのイベントを起こして
そのイベントが正常に終わったときに
NotifyValueに成功の値が設定されるという
理解でよろしいでしょうか。
正常に終わったときにFileListBox内の
上下方向への移動をソフト内部でできるでしょうか?
無理矢理キー入力されたことにして動かす引かないのでしょうか?
ファイルをあげています。
http://www1.axfc.net/u/3097406 DLkey:delphi
またアドバイスをいただけないでしょうか。
よろしくお願いいたします。
Notifyイベントで再生終了を知るためには、再生前にMediaPlayer1.Notify := false; しておく
Playの後でNotify := trueにすればいい そうじゃないとPlayイベントも受け取ってしまうから
with MediaPlayer1 do
begin
FileName := FileListBox1.FileName;
Notify := false;
Open;
Play;
Notify := true;
end;
で、Notifyイベント側で次の曲をFileNameにセットすればいい
>>518 ありがとうございます。
海外のNotifyの使い方を説明しているところを見ても
今ひとつ分からなかったのですが
解説していただいのでよくわかりました。
これが分かったので、今まで今ひとつだった
TMediaPlayerのプレイリストの意味が分かりました。
あらかじめカレントフォルダ内のファイルをプレイリストとして
読み込んでおいてトラックが終了したらNotifyを検出して
Nextすると言うことでいいでしょうか。
>>518 ずっと次に渡すファイルを取得する方法を考えていましたが、
Notifyイベントを取得したらTMediaPlayerからFileListBoxの
カーソルを下にずらすようにすればいいのでしょうか?
ヘルプ見ても半分くらい空白なので困ってます。
新規のテスト用のプロジェクトを作っておいて
新しいことを試すときはそちらでやってみるんだ
procedure TForm1.Button1Click(Sender: TObject);
begin
if FileListBox1.ItemIndex=FileListBox1.Items.Count-1 then
FileListBox1.ItemIndex:=0 else FileListBox1.ItemIndex:=FileListBox1.ItemIndex+1;
end;
>>521 ありがとうございます。
ボタンの前曲、次曲の操作を実装することができました。
上下キーでFileListBox内のカーソルを動かす機能を
入れたときに何かから-1(+1)すればいいことは分かっていましたが、
ItemIndexはヘルプになかったので分かりませんでした。
このプロパティは一般的な命令なんでしょうか?
TComboBox、TListBox、RadioGroup に共通のプロパティだ
Delphi5 か Delphi6 あたりのヘルプなら調べやすいんだけどね、どこかで手に入らんかな
で↑のヘルプなら「TFileListBox プロパティ」を開くと「TCustomListBox からの継承」で分類されて「ItemIndex」がある
「TFileListBox」でググると一番上に docwiki.embarcadero の「Vcl.FileCtrl.TFileListBox - XE2 API Documentation」がでる
そこのプロパティを見ても TFileListBox 固有のものしか書かれていないがコンポーネントってのは継承元のプロパティも使えるので
最初の Vcl.FileCtrl.TFileListBox ページの継承元のひとつである「TCustomListControl」を開いてみる
Vcl.Controls.TCustomListControl のプロパティにぽつんと一つだけ ItemIndex が出てくる
まぁこれじゃあ探せんわなぁw
リストビューのコンポーネントにもあるよ つかリストにインデクスがあるのは当然の話で
インデクスのプロパティがあるはずだって探していくのがまっとうな手順
初心者に当然とか言われましても…
とあるリストのの禁書目録
>>523 遅くなってすみません
>>522を投稿した後にRadioGroupにもItemIndexあったよなと思い
しばらくいじっていました。
意味は分かりますが理解するには時間が掛かりそうです。
若い頃に比べてやっぱり頭が固くなっているのを実感しています。
>>522で分かりましたと言ってから、そのファイルがなく
昨日までFileListBoxのカーソルが移動し続けて
タスクマネージャからソフトを止めないと終了できなくなったり
MCIのエラーが出てたりして途方に暮れていました。
ずっと4月の頃のログと最近のログを見ながら
いじり回してやっと
>>239の意味が理解できました。
本題なんですが、いろいろいじってやっとボリュームコントロールが
実装できるところまで行きましたが、mp3だとボリュームコントロールが
できますがwavだとできません。
たぶんmp3で出ていたエラーの逆のことが起きているのではないかと思いますが
絞り切れていません。
もう一度ロダにあげます。ご指導いただけないでしょうか?
http://www1.axfc.net/u/3115934.zip passはdelphiです。
よろしくお願いします。
続き
delphi4からdelphi2010でもかなりインターフェースが変わって戸惑いましたが、
XE4になって更に分かりにくくなりました。
>>525 書き込みしていただいたときに見ました。
ほかの本だと結構苦労している部分でしたが
シンプルに書いてあるので分かりました。
理解するには自分でVCLを作らないと分からないんだろうなとは思います。
530 :
デフォルトの名無しさん:2013/12/15(日) 13:37:04.11
Delphiってなんて読むんですか?
>>530 「でるふぁい」。エンバカの人は「る」のとこにアクセントがくる読み方をしてる。
Google 翻訳で発音してみる
すまん、Delphi は ~Delphi5、2005、2007、2009 しか持っていないから
そのプロジェクトは開けない
sound.pas
Unit1.pas
をサラッと観たけど sound.pas はそのまま流用してる?
以前書いた「AudioInfo」はタグ表示くらいにしか使っていないがそこに入っていたのかな?
んで Wave の音量調節も最低限動くソース
(Vista 以前と以降ではちょっと条件が違うから XP ではダメかも知れない、いけるかも知れない)
・行数制限があるから二つに分ける
・半角空白二つを全角一つに置換してるので了承してくれ
MediaPlayer: TMediaPlayer;
TrackBar: TTrackBar;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure TrackBarChange(Sender: TObject);
---------------------------------------------
implementation
{$R *.DFM}
uses MMSystem{waveOutSetVolume に必要};
//続き
var
WaveDevID: Word;
//実際にVolumeをセットする手続き
function VolumeChange(Pos: Integer):Boolean; //Posはパーセント
var
LV,RV: Word;
dwVolume: DWORD;
begin
LV := ($FFFF*Pos ) div 100;
RV := ($FFFF*Pos ) div 100;
dwVolume := (DWORD(LV) shl 16) Or RV; {LとRの値を代入}
Result:=waveOutSetVolume(WaveDevID, dwVolume)=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with MediaPlayer do
begin
FileName:='E:\DATA\wave\KAYOWAI.WAV';//実際に存在するファイル
Open;
Play;
end;
end;
procedure TForm1.TrackBarChange(Sender: TObject);
begin
VolumeChange((Sender as TTrackBar).Position);
end;
>>533 何度もお伺いして申し訳ありません。
hUnit1.pasはいつの間にか勝手に作ったファイルです。
本体はsound.pasです。
このファイルは以前見ていただいたソースから
3~4回作り替えています。
MCIのエラーやスキップするとカーソルが
勝手に動くようになったりしてました。
Delphi2010からXE4に移行したときにUsesが全部書き変わっていて
互換性がない(ように見える)とヘルプがVCLとFMXが混在していて
VCLが異常に少ない感じです。
エラーの発生が新しく作り直すと出なくなったり。
ソースありがとうございます。
早速試してみます。
AudioInfoはしつこく探しましたがないようです。
ttp://yakki.digi2.jp/vobaudioinfo/でしょうか?
タグに関しては、record型で作るという方法もありますが、
一回ソースを見ましたが途方に暮れています。
複数のユニットからインスタンスを共有したいときって
そのインスタンスをグローバルで生成してusesで参照するだけでも良い?
それともどこか基準になるユニットで生成してそれぞれのユニットに渡すほうが良い?
好きなようにすればええ
グローバルで作ったインスタンスは
他から参照する場合それっていう保証はないんじゃまいか
お、おう
LogList:TStringList
みたいなのなら普通にグローバル
そのLogListを他unitから参照したときに、生成されたものだという保証があるのか知りたい
ご冗談を(笑)
initialization ?
ALogList: TStringList;
function LogList: TStringList;
begin
if not Assigned(ALogList) then ALogList:= TstringList.Create;
Result:= ALogList;
end;
インスタンスが生成されたかってのはAssignedでいいけど
例えば”何枚も同時表示することがあるForm2”のグローバルでLogList作ったら
どのLogListを指してるか分からないよね?
それは設計がおかしい、という話にはならないの?
それぞれのForm2のアドレスを保持しておいてTForm2(SaveP).LogListとかって
アクセスする。
そもそも特定クラスの下にある変数をグローバル変数とは呼ばない
1個のTStringListを使いまわすなら簡単な話だけど、「インスタンスを共有」の意味がわからない
継承とか参照はオブジェクト指向の用語だけど共有なんて聞き覚えがないぞw
>>551 普通にある、君に知識がないだけだ。
「インスタンスを共有」と聞いたら
SingletonパターンやFlyweightパターンなど
少し知識がある人なら思い浮かべると思うが。
>>546 >インスタンスが生成されたかってのはAssignedでいいけど
クラスを生成したものがインスタンス。
インスタンスを生成することはない。
なら最初からパターン名で伝えればいいじゃん
少し知識があるならそっちの方が伝わるでしょ
あとインスタンスが生成されたなんてのは逆に普通の言い回しで、そこに突っ込んでる意味が分からないけど?
ひょっとして馬鹿なの?
>クラスを生成
これ、意味違わね?
『クラスから(クラスの)インスタンスを生成』とは言うが、『クラスを生成』とは言わんな
クラスのインスタンスを生成
インスタンスの生成
かと
クラスの生成
は変
>>552 君の知識は少し足りなかったようだね^^;
>>552 クラスを実体化したものがインスタンス。
クラスを生成することはない。
>>552 はいいとして
>>546 みたいなことが想定されるなら
グローバルで共有はやめておけってことでおk?
というか似たようなソフトのソース見つけてコピペってポンだろ。速攻できそう
>>559 そんなことが想定されるようでは設計の段階でおかしい
あ、うん…
なんか触れちゃいけないところに触れちゃったみたいでごめん…
バーーーーーカ
そうですね
頭の悪いレスって引くわw
一人で何を興奮してるんだ?
>>569 お前は自分のレスにも引いてるってことか
大変だな
>お前は自分のレスにも引いてるってことか
"にも"って、「自分も頭の悪い」という自覚はあるのか?
的外れな質問を書き込む初心者の方が数段ましだよな。
概念とか定義とかいいから具体的にどうコードを書くのかと言う話をしようぜ。
ALogList: TStringList;
function LogList: TStringList;
begin
if not Assigned(ALogList) then ALogList:= TstringList.Create;
Result:= ALogList;
end;
>>574 VCLがやっちゃってるからこういう書き方する人多いけど、実はLogList.Freeとされてしまった場合、
その確認もできない、インスタンスの再生成もできない、欠陥コードなんだよね
implementation内でTStringListを継承して、そのDestroyでALogListをクリアするように直せば多少はましになるよ
>>VCLがやっちゃってるからこういう書き方する人多いけど、実はLogList.Freeとされてしまった場合、
>>その確認もできない、インスタンスの再生成もできない、欠陥コード
そんな事みんな気付いてるだろ。現状、そこまで厳密にやらなくてもいいと思ってるから、
上のコードですましてるだけで。
listの使い回しとか持ち主がわからない作り方が欠陥
CreateやFreeした相手が知りたければそういうクラスを作れば済む話
何事も適材適所だよ。
1つのコードが全てのニーズに答えられるということはまずないし、
全てのニーズに答えられないからといって悪いコードというわけでもない。
ちょっと教えてください。
ポインタの有効/無効を判定する関数にAssignedってありますけど
これって (P <> nil) と同じですよね。
ポインタ変数自体が有効なデータを指しているかどうかを
判定する方法ってあります?
通常のポインタであればAssignedと<> nilは同じ。
でもポインタが示している場所が有効かどうかを知る方法は一般的には存在しない。
Delphiならバッファオーバフローとかでポインタ変数の中身を吹っ飛ばしてしまったりしない限り
無効な場所を指すことはないしな。解放済のメモリへのアクセスはFastMMで検出できるかもしれん。
>>575 これいいな
基本生成しちゃったらアプリケーション終了までメモリを占有されるけど、
これなら好きな時に解放してもいいまた必要になれば使えるし
>>581 そんな判定が必要になる方がおかしいので、
判定方法より設計を見直すことの方が大事
Delphi6を使っているのですが、最新版のものがどれほど進化しているのか
気になっています。
(購入検討中)
1.VCLは充実してきていますか?
2.オンラインヘルプは親切になっていますか?
3.開発環境(IDE)はサクサク動きますか?
知っている方おりましたら教えてください。
>>581 有効なデータとは何かをまずは定義してくれ。
>>585 30日間フル機能のトライアル版があるから試してみたらいいじゃん
そうですね。そうします。
最新版はAndroidのネイティヴコード(ARM)が吐けるっていうからすごい進歩だと思う
ようつべにプレゼンの様子がある
ただ動くのと実用的に使えるかは大違い。
おっと、Xamarinの悪口はそこまでだ
てか、オレなんか高くてProさえ買えない
いまだXE Starterでフリーソフト作ってる
Androidアプリを作るにはPro+アルファだろ
とても手が出せない
え?なんか出んの?
オレなんか高くてXE Starterさえ買えない
Lazarus(FPC)でフリーソフト作ってる。
オレのやりたいレベルでは、機能的にほぼ不足はない。
パフォーマンスにはやや不満があるが。
>>596 Lazarusはどのバージョン使うのがおすすめ?
うちで1.0.14とか1.2.0RC1使おうとするとまともにデバッグできんのよ。
>>597 デバッグって、Andoroidのデバッグ?
ならAndoroid用の開発はしてないんで、わかりませんが。
こちらのいまのWin32用の開発環境は1.0.6(FPC2.6.0)です。Lazarus自体も安定してます。
別にこのバージョンにこだわってるわけじゃなくて、特に不具合もないので使ってるだけですが。
Win7に移行したあと、J++ランタイムとか入れるのが嫌だったのでTurbo Delから乗り換えて、
0.9.30辺りから常用していますが、私用であれば十分使いものになると思いますよ。
すごいなこれ
Delphi使いです。
Win32のGUIアプリを作る場合、Lazarusに対するDelphiのアドバンテージは何?
Wikiで調べる限り、Lazarusで十分でありDelphiのアドバンテージは無いように
思えるのですが・・・
じゃあ実際に作ってみればいいんじゃない?
インストールして学習して作成するのが大変なので、
識者にお聞きしているんですよ、クソガキ君。
Delphiのアドバンテージは日本語の情報が多いということぐらいかな
>インストールして学習して作成するのが大変なので、
答え自分で出してるじゃん
自分の考えてることが自分で分からないとか病院行った方がいいんじゃないかな?
>>603, 604
レスありがとう。
Webで拾ったソース付きのDelphi用コンポーネントをLazarusに
インストールすることはできるのでしょうか?
>>606 そのままではほぼできないと思って良いよ。
移植して腕を磨くのが吉。
>>607 そうですか。
移植したのがどっかのサイトに集まっていれば良いのにね。
XE3 を買ってみました。
7 からの移行なので戸惑ってますが、
コードウインドウとフォームのウインドウは並べて表示って、出来無くなったんでしょうか?
フローティングデザイナでググれ
それよりなんでわざわざ2世代も前のXE3なんかを買ったのかが知りたい
単にXE5のtypoでしょう
XE3ってまだ買えるの?
パッケージならまだ普通にあるんだが
Amazonでも売ってるし
>611
どもども。
何とかなりました。
XE3 は ずいぶん前にヤフオクで、安かったので買いました。
Por が 4万弱でした。
ぽぅっ!
4万が安いとかいう金銭感覚
貧乏人はMSの無料環境でも使ってればいいんじゃないすかね?(鼻ほじ
ちょっとTPageControlのTTabSheetの色について教えてください。
TTabSheetの色って、昔はclBtnFaceだったと思うんですが
今は白色ですよね(Windowsのテーマに依存してる?)
TPanelなどのほとんどのコントロールは上に配置しても透過されて
背景が同じ色になるんですが、一部のもの(TLinkLabelとか)は
背景がclBtnFaceのままで、かなり違和感があります。
で、今はテーマのOn/Offを調べてColorプロパティを適当に
設定してますが、その時点でのTTabSheetの本当の色って
どこかから取得できます?
619 :
デフォルトの名無しさん:2014/02/05(水) 12:05:53.54
質問です。
VB6のソースコードをDelphiのソースに変換してくれるいいツールをご存じな方はおられないでしょうか?
有料でもかまいません。
もちろん変換後に作業がたくさん発生することはわかっています。
VBto Converterを使ってみましたが、文字コードの影響か、ソースが途中で切れてしまいます。
書き直した方が早いというのももっともだと思いますが・・・
書き直したほうが早い
そういうツールをVBで作ればええやん
623 :
デフォルトの名無しさん:2014/02/06(木) 07:44:34.44
624 :
デフォルトの名無しさん:2014/02/06(木) 07:48:35.80
>>621 VB6で?
スレ的にはDelphiでなのでは?
っていうか、コンバーターは誰も使ったことないの?
…馬鹿なの?
626 :
デフォルトの名無しさん:2014/02/06(木) 12:48:23.16
>>619 コンバーターを利用するのもなかなか捨てたもんではないぞ。
VBto Converterの以前のバージョンは途中で切れていたが、最新版は途中で切れたりしなくてなかなかよい。
トライアル版は600行までっていう制限があるが、VB6のソースファイルを分割して別々に変換して後で連結すれば問題なし。
もちろん後で作業がいくつもあるのだが、スクラッチから始めるよりも楽だと思う。
まさかの自演
規模は?
ロジックが長いプログラムだったら、コンバーターを使う意味もあるかもな
630 :
デフォルトの名無しさん:2014/02/06(木) 20:41:46.64
delphi to vb は有るが
bv to delphi 無い
今時ベンダーが依頼しない
個人の趣味はあるかもしれないが
631 :
デフォルトの名無しさん:2014/02/07(金) 04:40:09.93
死ねゴミ
>>631 VBに移行するにしても普通書き直した方が早いな。
移行しないという選択肢があるならそのままVB6にしておけば?
つうかVBスレで聞けよ
プログラムなんてTK-80 BS BASIC以来なんで、今時の言語見てもじぇんじぇん分かりません。
そんな俺の野望はNゲージの電車をPCで動かすことなんですが、(DCモーターを
チョッパ制御するだけです)、DELPHIでUSBを制御するのはどうしたらいいんでしょ?
637 :
デフォルトの名無しさん:2014/02/12(水) 17:33:58.54
>>630 Delphi10年以上前にやってた者だけどDelphiってそんなに厄介者になってるのか…
VB.NETなんかデプロイがたいへんそうなんだけどな
638 :
635:2014/02/12(水) 18:32:23.49
>>636 ありがとうございます。
でも、なんだか難しそうですね。上のは英語だし、下のは有料かぁ。。。
僕の想像では、Cの fprint の書式をうにゃうにゃするみたいな感じで、テキトーにI/Oにアクセス
できるのかなと思っていたのですが、ドライバを別に用意しないといけないのですか。
ハードル高いです。
>>637 delphiかっこいいと思うんですけどねぇ。なんで流行らないんだろ。
CSDさんのは使うだけならただですが…(ソースは有償)。
VB6はどっちに行くにも変換じゃ済まないので不良資産化してますな。
Delphiはバージョンアップだけで基本的にそのまま動くけど。
640 :
デフォルトの名無しさん:2014/02/13(木) 00:18:30.15
>>637 いいか悪いかという問題ではなく、VBを使える人間はいるがDelを使える奴がいないからVBに変換したいって会社があるってことだな
641 :
デフォルトの名無しさん:2014/02/13(木) 00:35:29.93
>>638 Delphiが流行らないのは値段が高いし、迷走したし、知名度低いし、VB6ほど気軽に使えないし、コードの見た目良くないし。
>>641 お前馬鹿? Delphi ほど美しいコードは他にないだろ?
いまさらVB6とか老害すぎて乾いた笑いしか出ない
644 :
デフォルトの名無しさん:2014/02/13(木) 07:36:30.72
とりあえずCの
i =2;
で代入はおかしい
キチガイアンチは頼むからエンバカスレに引きこもってろよ
お前がいくら屑でも、最低限のルールくらい守れるだろ?
それともスレ違いかどうかも理解できないほど判断力が低下してるのか?
647 :
デフォルトの名無しさん:2014/02/13(木) 13:35:33.89
>>646 なぜ流行っていないかということは超初心者の疑問だから扱ってもいいんじゃない?
質問です
FireMonkeyのTFlowLayoutは横に並べるのはわかったんですが、
縦に順に並べるにはどうしたらいいでしょうか?
バージョンはXE5です
というか流行る必要ってなくね?
むしろ流行ってほしくない
流行りものをありがたがる男の人って…
651 :
635:2014/02/13(木) 18:59:12.40
>>639 そうでしたか。じゃぁ、それを使ってみることにします。
>>641 素人さんなんで、CもPASCALも似たようなもんと思えてしまう^^;
プロから見れば違うんだろうけど。
とりあえず、Cの { } がヤなんですね。ミミズののたくったみたい。
652 :
デフォルトの名無しさん:2014/02/13(木) 20:20:41.03
>>649 初心者としては個人や企業で使っている人が余りにも少ないと他の言語を覚えた方がいいのではないかと不安になります
杞憂でしょう
そうですか、安心しました
利用者が少ないから使わないってくだらん
知名度を理由に貶す奴は頭弱そう
656 :
デフォルトの名無しさん:2014/02/13(木) 23:19:17.08
>>652 その感覚は重要
使われてないのにはそれなりに理由があるからね
□産み出されたばかりで知名度が低くて使われていな場合
ドキュメントが少ない
□それそのものが糞だから使われていない場合
糞
他にもあるだろうけど、良いものならみんなが使ってるよ
なるほどね
じゃあ間違いなくこのスレのみんなが使ってるDelphiは良いものってことか
Delphiは良いもの。はっきりわかんだね。
そうですか、安心しました
みんなが使ってるものだから安心感がある
理由なんてそれ以外全部後付け
661 :
デフォルトの名無しさん:2014/02/14(金) 00:19:47.57
DelphiってWindows向けのソフトウェアしか開発できないんですよね?
これからはマルチプラットフォームの時代だと思うので、他の言語を覚えた方がいいのではないかと不安になります
>>661 その感覚は重要
でも今はWindows以外にMac OS XやiOSにAndroidと、複数の環境へのクロスコンパイルに対応しているからね
□各OSで用意されている言語を使う場合
それぞれの言語を習得する必要あり、OSごとにアプリケーションを作り直さなくてはならない
□Delphiを使う場合
FireMonkeyというマルチプラットフォームに対応したフレームワークのおかげでワンソースでOK
他にもあるだろうけど、良いものだからみんなが使ってるよ
マルチプラットフォーム対応=もっさりアプリだから使いたくない
Javaのことですねわかります
Cのソースきったなすぎて目が腐る
あの構文に何の疑問も感じない人間は美意識どうかしてる
>>663 JVMはダメだよね
やっぱりネイティブじゃないと♪
>>662 > 良いものだからみんなが使ってるよ
「良いもの」には同意だが、「みんなが使ってる」にははげしく同意できない。
668 :
デフォルトの名無しさん:2014/02/14(金) 05:03:38.96
>>655 仕事で使うとなると、自分が異動した後のことを考えて、マイナーな言語は上司が避ける傾向にありますので不安です。
669 :
デフォルトの名無しさん:2014/02/14(金) 05:04:40.22
>>656 Delphiはどういうことが原因で使われていないのですか?
結局、Microsoft、Sun、IBMのように、開発ツール以外もビジネスをやっている会社が、
C#、VB、javaを推奨するものだから、総合力でDelphiはビジネス的に不利になったということですか?
ヘジルスバーグ引き抜き
Standard Pascal は糞だけど Object Pascal は最強
プログラマにとって重要なものは言語ではなくセンスだ。
Delphiが使われていないのは良さを理解できない世の中が悪い
また変な人が痛いDel厨を演じてるようですな
C言語厨よりマシ
677 :
デフォルトの名無しさん:2014/02/14(金) 11:01:16.56
Microsoftの資本が入ったときに落ちぶれていく施策を採用させられたからですか?
678 :
デフォルトの名無しさん:2014/02/14(金) 11:03:54.79
ネイティブアプリは業務アプリには危険という認識が広まったというのも一因かな。
679 :
デフォルトの名無しさん:2014/02/14(金) 11:31:37.50
iOS/Androidの同一ソース開発が安定するようになると、もう少しメジャーになるのでしょうか?
今のところ、モバイル開発者がDelphiをやり出したという話はほとんど聞きません。
やっぱり会社が変わりすぎたのが敗因かな
多プラットフォーム対応も方針が変わりすぎた
MSが.NET以降に手間取ってる隙がチャンスだったんだけど、
.NET版Pascalとか出しちゃうしチャンスを逃してる
複数のPCに導入する予定のプログラムで、
自作フォーム上にPDFを表示したいのですが、何か方法はありますでしょうか?
わかる方がいましたらご教示願います。
>>682 adobe readerインスコしてTWebBrowser(もしくはTEmbeddedWebBrowser)
684 :
デフォルトの名無しさん:2014/02/14(金) 16:47:30.43
>>682 PDFの操作をしたかったり、Adobe Readerに依存したくなければ、
Active PDFのようなフリーのコンポーネントを使う手もあります。
ありがとうございます。683さんの方法で何とか実現できそうです。
もうひとつ質問なのですが、PDFの1ページ目のサムネイルを得る方法はないでしょうか?
Acrobatや有料コンポーネントなどを買えば可能なようですが、
予算的に厳しいため、できれば無料か、高くても数千円で済むようだとありがたいです。
TWebBrowerに一度表示させてスクショを取るとか(キャプチャはWinAPIで出来る)
687 :
635:2014/02/16(日) 22:44:03.94
素人な質問でごめんなさい。
あの Type というのは一体どういうものなんでしょう?
Var とかぶってるところもあるし、なんかイマイチ分からないですね。
型宣言と変数宣言
689 :
635:2014/02/16(日) 23:03:36.67
>>688 ありがとうございます。
でも、その 型宣言 というのがイメージが湧かないんですよ。
解説本見てもちゃんとした説明がないですし。
Varが 変数を宣言するのに使う。
Typeが、型を宣言するのに使う。
構造体や配列、レコード型など
ユーザーが型を作ることが出来る。
692 :
デフォルトの名無しさん:2014/02/17(月) 22:19:19.71
Delphiって関数を使うときにその関数の記述部分が前にないといけないと聞いたのですが本当ですか?
定義か宣言のいずれかが必要です。Cのように暗黙に関数を仮定することはできませんが、
(Cのプロトタイプ宣言に相当する)前方宣言を用意しておけばOKです。
Cでいうところのヘッダーファイルがひとつにくっついてる感じ
forward宣言はpascal本来の文法にもある
unitのinterface部のところはDelphi/Turbo Pascalの拡張じゃなかったかな
>>692 宣言が前方にある必要があるだけで、実装の記述が前方にある必要はないよ
ついでに言えば、実装の方は下記のように引数や戻り値を全部省略して書いてもいい
function Test(A, B: Integer; C: string = 'test'): string; forward;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Test(1, 2, '3'));
end;
function Test;
begin
Result := 'hoge';
end;
>>696 誰もhoge荒らしにきいてないんだからさっさと消えろよ
698 :
635:2014/02/18(火) 19:51:53.15
>>690 うーん。なんだか分かったようなわかんないような(←ほとんど分かってない)
ま、構造体も配列もまだ使う予定ないから、わかんなくても良しとしよう!
それにしても、みんな何であんなの簡単に使いこなせるんですかねぇ。
>>691 これは良いモノを教えていただきました。ブックマークしときますね^^
消えるのはお前だな > 697
はい…
C#のusingみたいな機能ってありませんか?
つ try...finally
C#使いが今頃Delphi触り始めるっていうのは、モバイル向けか?
悪い事言わんから、やめといた方が良いと思う
>>702 C#のtry-finallyとusingは等価ではないんですが、Delphiでは同じなんですか?
>>703 そうなんですか?
資料は少ないですが、例えばHello wordlを作ってデプロイして起動するまでは
他の環境よりかなり楽だったので、普及して本とか増えてくれたら結構いいとこいくと思います
707 :
デフォルトの名無しさん:2014/02/21(金) 16:16:05.13
エンバカと一部ユーザー?が喧伝してる夢物語が実現するとは到底思えないから
Delphi,VCL,C++Builderは本当に素晴らしい物だと思うが、エンバカになってからの
状況見てると何も明るい材料が無い
俺はVCL,C++Bulder使いだから知らないだけかもしれないが、Delphiの方はそんなに良い状況なのか?
エンバカスレは別にあるからそっち行ってくれ
WindowsとLinuxで同じ事が出来なかった人達に、
iなんたらとAndroidなら同じ事が出来ると思うのか?
今のIDEの出来も、もうEclipseには置いて行かれている
712 :
デフォルトの名無しさん:2014/02/21(金) 22:10:23.17
適材適所。
714 :
デフォルトの名無しさん:2014/02/21(金) 23:02:57.95
荒らしが何か言ってる
初歩的な質問で申し訳ないですが...
スレッドの Create や Destroy はもしかして
メインスレッドで実行されるんですか?
スレッドが、TThreadクラスの実装で使われてるOSのスレッドの事を意味するなら、
ソースを見るとスレッドの生成はTThreadのCreateコンストラクタで作成されているよーな。
つまり、君がTThreadのCreateを呼ぶタイミングで・・
>>717 ちょっと疑問に思ったのは、TThreadのconstructorなどで
メインスレッドの要素(VCLオブジェクトなど)へ直接アクセス
してもいいのか、それもとSynchronizeを使うべきかってことです。
それで、メインスレッドからTThreadをCreateする段階で
constructorもメインスレッドで実行されるのであれば、
constructor内でVCLオブジェクトに直接アクセスしても
問題ないですよね。
逆に呼ぶだけで別スレッドで実行されるコンストラクタの作り方を知ってるなら教えて欲しい
>メインスレッドからTThreadをCreateする段階で
>constructorもメインスレッドで実行されるのであれば、
>constructor内でVCLオブジェクトに直接アクセスしても
>問題ないですよね。
だ。問題ない。
別スレッドで実行されるのはoverrideするexecuteメソッド。
デストラクタはFreeOnTerminateの設定しだい
>>720 ありがとうございます。
以前より疑問に思ってたことで
これでスッキリしました。
>デストラクタはFreeOnTerminateの設定しだい
メインスレッドから明示的に解放する場合は
メインスレッドでdestructorが実行されるってこと?
FreeOnTerminate=trueは実質的に使い道がないからあまり悩むな
使い道かなりあるだろ
お前が使いこなせてないだけ
>>723 冗談だろw
マジで行ってるならバグの元だからやめたほうがいいぞw
>>723 「かなり」はないな。
「わずか」に完全非同期のスレッドに使えるけどそれほど必要じゃないし
仮に必要としてもexe別にした方がいい事のほうが多い。
必死の自演もむなしく…
自演なら時間空けた上ID変えるはw
>FreeOnTerminate=trueは実質的に使い道がないからあまり悩むな
プログラムで書くならFreeOnTerminate := true;なんだが。
>>724 >マジで行ってるならバグの元だからやめたほうがいいぞw
バグというよりコンパイルが通らないが...
:のあるなしとかそんなくだらない部分にしか反論できなければ無理してレスしなくていいんじゃ?見ててしらける。
例えばここ
http://wiki.lazarus.freepascal.org/Multithreaded_Application_Tutorial/ja のサンプルの中でFreeOnTerminate=trueにもかかわらず
procedure TForm1.FormDestroy(Sender: TObject);
begin
MyThread.Terminate;
// FreeOnTerminate が true であれば、以下の記述は必要ありません。
// MyThread.Free;
inherited;
end;
などと平気でやっている。
MyThread が先に終了してたらMyThread.Terminateはアクセスバイオレーションだ!
つまりFreeOnTerminate=trueの時はメインスレッドからサブスレッドを制御するのは
サブスレッドの実体をメインスレッドに持っているだけではできないのだ。
そしてFreeOnTerminate=trueの唯一のメリットは「処理が終わったら余分なメモリが空くこと」だが
それはFreeOnTerminate=falseでもスレッドリストを作りガベージコレクトを適切に行うことで解決できる。
これらのことからするとFreeOnTerminate=trueは実質いらない子なのである。
ちなみに「スレッドリストを作りガベージコレクト」とは
単に、適当なタイミング(新しいスレッドを作るときとかタイマで10分毎とか、どうするかはプログラマの自由)で
if MyThread.finished then MyThread.Free;
とするだけのことである。
サブスレッドが複数なら
for i:= 0 to thredlist.count-1 do
if thredlist[i].finished then thredlist[i].Free;
とかね。
初心者スレなのでさらに正確に書くと
if Assigned(MyThread) and MyThread.finished then begin
MyThread.Free;
MyThread:= nil;
end;
か。
なお以前は
MyThread.Free;
MyThread:= nil;
を
FreeAndNil(MyThread);
にするとなぜかうまく行かなかったが今はどうか知らない。
なお、もちろん「少量のメモリ使用なんて気にしない」という
ならガベージコレクトは不要だ。
仮にサブスレッドが大量のメモリを使うとしても、executeの
最後でそれらを開放してやればいいだけの話なので
眠ってるスレッドが消費するメモリなんてたかが知れている。
まぁ初心者スレなのでFreeOnTerminateは普通Falseだろ、といわれりゃそうだけど、
>FreeOnTerminate=trueは実質的に使い道がないからあまり悩むな
は乱暴すぎるな。せめて"わからないうちはFalseで十分"くらいにしとけ。
自論を守ることに必死になって本来使われるべき場面すら否定してるだけでしょ
バカはほっとけ
子スレッドを使う基本 = やらせて放置、終わったら「終わったよ」報告(1)をさせる
メインから終わらせたければ「終わってくださいお願いします」フラグを立てる =
AThread,Terminate; を呼ぶなど。
(1)の旗はメイン側の場所に作っておく、旗が立ったら次へ。
インスタンスの破棄は子スレッドに任す
TThread のつくりがこういう使い方を想定して作られてるので、それに従うのが紛れがなくていいぞ。
>>735 「本来使われるべき場面」とは?
ちなみに私がバカというのはあたってますが、
ガベージコレクトを標準搭載している言語ではごく普通の手法なので「自論」ではないです。
>>736 それだとメインの旗を立てる際にsyncronizeしないと
いけないので私の提示したた手法より複雑になります。
そして「TThread のつくりがこういう使い方を想定して作られてる」というのは誤解と思われます。
738 :
デフォルトの名無しさん:2014/03/19(水) 22:17:04.02 ID:VkMj3BIA
ちょっと教えてください
Delphi7で作成した32ビットアプリケーションをx64のWOW64環境で動かすのですが
プログラムからProgram Files(64ビット用),SYSTEM32のリソース用EXE,DLLをロードする必要があり
SYSTEM32の方は"%WinDir%\Sysnative"でいけるのですが
Program FilesはProgram Files (x86)にリダイレクトされてしまします
Wow64DisableWow64FsRedirectionやリンクを使わない方法ってありますか?
動作環境の方はNT系のx86(NT4以降),x64(XP以降)サーバーOSも含みます
>>729 だったら無視すればいいのにw
>>731-732 >MyThread.Free;
>MyThread:= nil;
Freeしてnilする間に呼ばれたらどうするの?
こんな馬鹿の為にFreeOnTerminateは必要なのかなw
>738
64のプログラムがProgram Filesに、
32のプログラムはProgram Files(x86)、
で良いのでは?
>>739 Freeにはスレッドが終了するまで待つ処理が入ってますから問題無いですよ。
調べずに書く人はバカな私よりバカだと思います。
そういうこと考えないでいいのが FreeOnTerminate
>>742 まあそうですが、その代わり
>>736さんが適切に指摘されているような機能を実装する必要がありますから
結局面倒ですよね。
あと、考えるのが面倒、調べるのも面倒、でも心配というのなら
mythread.WaitFor;
mythread.Free;
mythread:= nil;
とすればよいだけの話です。
それスレッド使う意味なくね?トンデモすぎてもう本末転倒だよ…
お前の糞コードには文句言わないから、せめて何も知らない初心者は巻き込まないで
>>741 >Freeにはスレッドが終了するまで待つ処理が入ってますから問題無いですよ。
えっ?本当に馬鹿なんだw
マルチスレッドの意味が分からないのかな?
Freeとnilの間と言う意味が分かってないんだね、こんな馬鹿が作ると
タイミングによって出たり出なかったりするバグを作りだして非常に迷惑するんだよな。
そもそも初心者がマルチスレッドなんてやるの? そんなのできたら中級以上だよ
なんかあれだな 基本的に親スレから子スレをいじるのはご法度だよ
さわらぬスレにたたりなしって、知らんのか?
ところで、
>>741が言ってる
「Freeにはスレッドが終了するまで
待つ処理が入ってます」って本当なの?
>>750 なるほど
ほとんどTThreadとか使わないんだけど
改めてHelpを見ると書いてあるね
てか、自分でFreeするんだったら
MyThread.Terminateなんか不要じゃん
いや、それはまた別。Terminateのヘルプに書いてあるけど、
途中で処理をキャンセルしたい場合に使う。
でも途中キャンセルしたらほとんどの場合はそのままFreeするからやっぱりいらないよね
いちどWinAPIだけでスレッド書いてみれば良い
意味がよく分かる
>>746 終了したスレッドが勝手に動き出すとかないですから問題無いですよ。
あなたスレッドの動作や意味を間違えたますよね完全に。
多分Delphiしかできない人なんでしょうけど他言語も触ってみると良いですよ。
>>748 それで顧客が納得してくれれば苦労はしないのです。
あなたが親子という概念を既に導入していることからも分かる通り
親側でクローズボタンが押されても子が終了するまで待つという
ようなプログラムではダメ出しされるのが通常だからです。
そこで
Mythread.terminate;
や
Mythread.free;
が必要になるわけですが
FreeOnTerminate=trueだとMythreadが終了してたらアクセスバイオレーションになるから
工夫が必要だよさあどうするというのがメインの論点です。
まさか仕事でマルチスレッドプログラム書いてて
同期オブジェクトやスレッド間通信用のメッセージングの仕組みを
用意してないとか言わないよな?
ひとつの解決方法は
>>736さんの提示された
FreeOnTerminate=trueのまま工夫する方法です。
もうひとつは私が提示したFreeOnTerminate=falseにして
必要ならガベージコレクト機能を組み込むという方法です。
あとは具体的解決方法も示さずバカだのアホだ
のいうだけの人が約1名いるという状況です。
>>757 スレッド間通信もひとつの手ですね。
ただそこまで必要ないことのほうが多いです。
DelphiのThreadクラスの優秀さはスレッド間通信を使用しなくても簡単に
マルチスレッドアプリができるというところにあると思います。
なお、758は756の続きでありあなたへのレスではありません。
>>757を受けてここまでの状況をまとめ直しました。
Q 親子型スレッドを作るにはどうればいいの?
A1
>>736さんのようにFreeOnTerminate=trueでサブスレッド側からメイン側のフラグを操作する。
A2
>>757さんのようにFreeOnTerminate=trueで同期オブジェクトやスレッド間通信で処理する。
A3 FreeOnTerminate=falseにして、必要ならスレッドマネージャ(≒ガベージコレクト)機能を組み込む。
番外 具体的解決方法も示さずバカだのアホだのいうだけの人が約1名。
Delphiハックで有名な人らがFreeOnTerminateはTrueのほうがよく使うと発言してる件
>>761 730で示したとおりLazarusのWikiでさえ間違ってますから
FreeOnTerminate=trueの方が多数派の可能性は十分あるでしょうね。
私も最初はFreeOnTerminate=trueから始め、A1やA2を採用しておりました
(なお、同期オブジェクトやスレッド間通信は今でも必要に応じて他の目的のために使うことがあります)。
スレッドマネージャ型に気づいたのは、他のガベージコレクション標準搭載言語でのスレッド処理や
ゲームプログラミング(擬似マルチスレッドですが)で最近?流行のオブジェクト管理方法に触れた時です。
眼から鱗でした。
初心者の方は、A1~A3型すべての親子型スレッドのサンプルを作ってみると勉強になると思います。
Delphiと関係ないLazarusのwikiを持ち出して間違ってると言われましても…
それ以外に自分の意見を補強できる資料が無かったんだろうけどw
>>755 >終了したスレッドが勝手に動き出すとかないですから問題無いですよ。
誰もそんなことを問題にしていない。
Freeしてnilする間に使われたらどうするんだと言っている。
そんなプログラムを組んでいたらAccess Violationになるぞ。
こいつ本当にマルチスレッドのプログラムを作ったことがあるのか疑問だ?
複数スレッドから読まれることを前提としてたら普通は一時変数に取ってnil入れてそれから解放するわな(FreeAndNilの実装)
まぁ、技術レベルが低くて代入演算子に:がないからコンパイルできないとか
本題と関係のない事にしか突っ込むしかできな奴が「マルチスレッドのプログラムを作ったことがあるの?」
と言ってもジョークにしか聞こえないけど。
>>764 「使われる」とはどういう意味ですか?
例えば以下のプログラムで誰がFreeしてnilする間に使うのですか?
TForm1=class
button1: TButton;
timer1: TTimer;
private
mythread: TMythread;
end;
TForm1.Button1click;
begin
if Assigned(mythread) then mythread.Free;
mythread:= TMyThread.create;
end;
TForm1.Timer1Timer;
begin
if Assigned(mythread) and mythread.finished then begin
mythread.Free;
mythread:= nil;
end;
TForm1.FormDestroy;
begin
if Assigned(Mythread) then mythread.Free;
end;
こいつ本当にマルチスレッドのプログラムを作ったことがあるのか疑問だ?
ちなみに上のプログラムは端折って書いているのでコンパイルできません。
初心者の方には申し訳ないですが是非自分でプログラムしてみてください。
なお、既に述べたとおり、ガベージコレクト部分(上のプログラムのTForm1.Timer1Timerメソッドの部分)
は必ずしも実装する必要はありません。
だからさあ メイン側で余計なことする必要なんぞない
タイマー持ち出すとか正気の沙汰じゃない
サブスレッドは仕事終わったら結果残して (残す必要もない場合だってある)
ひっそりと自ら消えていけばいいだけだよ。
>>769 今後必要になった時に「そういえばあんな議論があったな」と思い出して
いただければ結構ですよ。A1~A3どれもやる必要がないのであれば
用いる必要がないのは当然です。
(あまりにも当然過ぎてあなたを除き誰もそこには疑問を持っておりません)
また、上のプログラムはあなたを含めた初心者宛ではなく
「本当にマルチスレッドのプログラムを作ったことがある」764さん宛のものですので
参考にしないでください。
なお、ガベージコレクトは必須ではないですし、タイマーでやらなければいけないという
ものでもありません(既に書きました)。ですから「タイマー持ち出すとか正気の沙汰じゃない」
という感想も全くマトハズレです。
>>763 出所(ソース)不明なだけでなく「Delphiハックで有名」という威光をバックに
自分の意見を補強するよりはだいぶマシかとw
つまりどっちもどっちってことか
2chに書くような屑の言葉を信用するなってことだなw
>>763 あと、よく読めば分かると思いますが
自分の意見の補強ではなくむしろ相手の意見の補強に使ってるのですが・・・
自分の望み通りの動作でバグ無く動きゃいいんだよ
ていうかスレッドの質問って初歩的な質問なんですね。
私は業務でDelphiのプログラムを作ってますが、マルチスレッドの
プログラムなんぞ作ったことがありません。
最近の初心者のみなさんは素晴らしい技術をお持ちですね。
そうですね!
自分は初心者だけど、ネット関連のアプリ作ってて
スレッドは多用するな
ちなみに、スレッドの解放にFreeは使わない
理由は、解放中、メインスレッドが停止するから
最悪でも1、2秒の停止時間に文句を言う利用者がいるからね
>>775 それで質問はなんですか?
どうでもいい感想はチラシの裏にお願いします。
>>779 あなたが死ねば、色々まとめて消えます。
バグと共ににっちもさっちも往かず
沈みます
さようなら
このスレには質問と回答以外は書いちゃダメらしいぞ。
>>777 ネット系はスレッド必須っすよね。初心者で対応できるとはさすがです。
でもどこかでTerminate使うなら結局一緒では?
Free内部でTerminate呼んでるとこでその停止は生じてると思うんで。
Terminate使う必要のないプログラムならFreeも使う必要ないし。
>>767 764さんが言っているのは、mythread.Free;とmythread:= nil;の間に別のスレットがmythreadを使うとAccess Violationになるということだと思います。
785 :
777:2014/03/28(金) 02:40:29.80 ID:sGxVzfHB
>>783 自分のTThreadの理解が不十分なのかもしれないけど
明示的にFreeすると、メインスレッドでTThreadの解放まで
待たくちゃならないでしょ
たとえば、Terminateを実行したとき、たまたまアクセス中で
さらにサーバの状況が悪くてIndyがタイムアウトを消化中だと
ワーカスレッド内でTerminatedを評価するまで、かなり時間が
かかるケースとかない?
それがイヤで、明示的にFreeで解放はしないんだけど、
自分の理解不足かな?
>>785 いやおそらく理解は十分だと思いますよ。
おそらくA3型を前提とした質問だと思うのでそうとして答えますね。
(もしそうでなかったら無視してください)
まず 767 の
TForm1.FormDestroy;
begin
if Assigned(Mythread) then mythread.Free;
end;
というFreeは、「親が子より先には死んではいけない」という親子型の基本理念を実現するものですので
ここでウェイトが生じうることは我慢して下さい。
逆に言えば FreeOnTerminate=true だとその理念が無いために A1型やA2型ではいろいろ苦労されてい
るはずです。
子が親の予想より早く死んでしまったためアクセスバイオレーションとなることは既に書きましたが
親が子の予想より早く死んでしまったためアクセスバイオレーションとなることもあるというわけです。
次に 767 の
TForm1.Timer1Timer;
begin
if Assigned(mythread) and mythread.finished then begin
mythread.Free;
mythread:= nil;
end;
という部分での Free ですがここはmythreadが処理を完了していますので
Freeでウエイトが生じることはないはずです。
最後に 767 の
TForm1.Button1click;
begin
if Assigned(mythread) then mythread.Free;
mythread:= TMyThread.create;
end;
という部分でのウェイトですがここはサブスレッドを1つだけに制限しているため
Freeして使いまわしているだけです。複数のサブスレッドを作るようにすればここでのFreeは不要です。
例えば、HTTPサーバーでリッスンするスレッドに接続要求があった時は接続可能な数まで
サブスレッドを作成するだけでいちいちFreeはしないと思います。
>>784 「別のスレットがmythreadを使う」というプログラムがよくわからないので
具体例を示していただけると幸いです。
FreeOnTerminate=trueだとそういうプログラムでも問題が生じないという
ところまで示していただけると多分今後スムーズに話が進みます。
>>784 なお、「別のスレットがmythreadを使う」がもし「子スレッドが複数いて子同士での通信」を意味するなら
mythreadを使うのではなくsyncronizeや同期オブジェクトやスレッド間通信を使ったほうがよいと思います。
それはFreeOnTerminate=trueでも同じのはずです。
うん、なんかファイト。
スレッドの管理は、スレッドリストっていう便利なものが用意されてるから使えばいい
問題の大半はこれで解決
793 :
デフォルトの名無しさん:2014/03/28(金) 10:41:40.30 ID:MhBcNb1x
>>767 TForm2 = class(TForm1)
private
function Gatmythread: TMythread;
public
property mythreadA: TMythread read Gatmythread;
end;
function TForm2.Gatmythread: TMythread;
begin
Result := mythread;
end;
これで理解できるか、それとも意味がわからないか?
しかし、いきなりスレッドをprivateフィールドにるすろとは必死すぎるだろう。
オブジェクト指向は継承されても大丈夫なように作るのがわかっていないようだ。
オブジェクト指向のプログラムもろくに理解出来ないとは。
あとフィールドは頭文字はFだ、Delphiの常識的なルールもしらないとは。
>768
>なお、既に述べたとおり、ガベージコレクト部分(上のプログラムのTForm1.Timer1Timerメソッドの部分)
自慢げにガベージコレクト、ガベージコレクトとうるさいが、その仕様は
ガベージコレクションじゃないと分かっていないのが痛いほど悲しい過ぎる。
>756
>それで顧客が納得してくれれば苦労はしないのです。
>親側でクローズボタンが押されても子が終了するまで待つという
>ようなプログラムではダメ出しされるのが通常だからです。
お前が顧客に信用されていないだけだと思わないのか?
顧客も馬鹿じゃないんだから、必要なら待つ。
まっ普段から駄目な技術者は本当に必要なことをいっても信用してもらえないからな。
つまりお前は
・マルチスレッドのプログラムが作れない。
・オブジェクト指向が理解出来ていない。
・Delphi の基本的なルールもわからない。
・客に信用されていない。
と言うことの、駄目駄目の三流技術者でいいんかな。
>>794 >>795 えーはい、適当なプログラム、適当な命名、申し訳ありませんでした。
今後気をつけたいと思います。
「Freeしてnilする間に使われるからおかしい!」という主張は撤回された
ものと受け止めさせていただきます。
どうでもいいがここは初心者の質問スレじゃなかったのかね?
まあ、今更Delphiやろうって奴も少ないだろうけどな。
あ、それから、別に承継しなくても同じUnit内ならprivate内の項目でも自由に使えますよ。
釈迦に説法でしょうけど。
>>797 質問者のレベルが高いと話のレベルも高くなるので難しそうに感じるかもしれませんが、
(質問者のレベルが低くすぎてもポイントがずれまくって難しそうに感じるか)
スレをたどってもらえればわかるように根っこはTThread初めの一歩!みたいな話ですから
初心者向けの話だと思いますよ。
ようは、「FreeOnTerminate=trueが便利そう!」と思ってそこからスタートするとはまるよ、
大したメリットもないんだからFreeOnTerminate=falseで十分だよ、という話です。
多分この話題はもう秋田という感じなのでしょうけど、
初心者を助けたいと思っているだけで自説を押し付けるとかそういう意図ではないので
質問等が消えれば消えますので少しだけ我慢を
善意でやってくれてるのは了解した。
ただこの先スレッドの話題がずっと続いたら本当に初歩の初歩の質問がしづらいかなと思っただけ。
昔は質問スレが複数に分かれてたが、現在はスレタイの「超初心者用」に意味はない
>ただこの先スレッドの話題がずっと続いたら本当に初歩の初歩の質問がしづらいかなと思っただけ。
>>795みたいに一人だけ煽ってる奴はいるが、これぐらいで質問できなくなるって、
そんなんじゃ世の中生きていけねぇだろ。配慮の仕方が間違ってるわ。
>>786 >親が子の予想より早く死んでしまったためアクセスバイオレーションとなる
レベルの低い初心者の質問者で申し訳ないけど
このエラーって、どんな感じのエラー?
子が親をアクセスしたときのエラー?
子が親をアクセスしないでもエラーが出る?
>>803 いえいえ「分かる人にはこれだけでわかるだろうけどわからない人も多いかもな・・・」
と思いながら書いた部分を指摘された的確な質問です。
例えばA1型で行こうと決めて(また適当なプログラムですみません)、
procedure TMyThread.execute
begin
Form1.MyThreadFinish:=false;
try
:
finally
Form1.MyThreadFinish:=true; (1)
end;
end;
とかやっただけだと(1)の部分でご指摘のエラーが発生する可能性があります。
そこでこれを避けようと、真っ先に気づくのは既出のように
procedure TForm1.destroy
begin
Mythread.terminate;
end;
とかやることですが、これだけではダメなことは既に指摘したとおりであり、
もうどうしていいかわからなくなりパニクる(私だけかもしれません)と
いうわけです。
805 :
803:2014/03/30(日) 00:49:20.37 ID:wYL9BvPj
>>804 説明、ありがとうございます
実は、このスレッドの話題の発端となった
>>716の質問者でもあります
実は初心者なのにネット関連のアプリを公開してしまって
今頃になって基本が分かってないことに気づき慌ててる...
アプリ内でFreeOnTerminate := Trueで作ったワーカスレッドが
10近く常時動いてます
終了ボタンをクリックすると、終了を示すグローバル変数をセットし
それ以降はワーカスレッドからメインスレッドへアクセスすることはない
で、聞きたかったのは、親(メインスレッド)が子(ワーカスレッド)よりも
早く終了した場合(もしそんなことが内部的にあるのなら)、
やっぱマズイことがあるのかなってこと
今んとこ終了時にエラーが出たとか聞かないけど、ただ運が
良かっただけってこともあるし...
>>805 おそらく Form1、mythread などというDelphiレベルの話ではなく OS レベルでの話ということですよね。
私は調べたことがないので、直感でしかありませんが多分メインスレッドが先に終了することなどない
のではないでしょうか。有識者の解答をお待ちください。
いずれにせよそういう疑問を生じさせてしまうのは、死期がはっきりしないという
FreeOnTerminate := Trueの功罪だと私は思います。
>>807 意味は・・・また話がこじれそうなのでやめときます。
この話まだ引っ張ってたのか
頭の固いキチ○イがいると大変だな…
ちょっとお知恵をお貸しください
アプリで二重起動防止とか、よくありますが
たとえば自分のPC(開発環境)だけは
二重起動を可能にする方法とかあります?
できれば、まったく同じ実行ファイルで実現したい
>>810 適当にテキストファイルでも何でもいいからファイルかフォルダを用意してそれがあれば二重起動可能にするとか
どうとでもなる
>>811 すばやいレス、ありがとうございます
その方向ですよね
あとは起動オプションを使うかですかね
ミューテックス
>>814 ありがとうございます
ちょっと事情があって、開発環境のあるPCでは
Delphi IDE内で実行するときだけでなく
そのPC上で実行するすべての場合で
アプリの二重起動を可能にしたいので...
最近のDelphiはドットネットというのに乗せないと動かないとききました。
現状 Windows8.1 64bit の上でD6がいちおう動くようなのでとりあえず使ってるんですが、
やっぱり新しいのにしないとまずいことがあるのですかね?
機能的にはD6で十分なのです
>>816 2004年くらいからタイムスリップしてきましたか?
818 :
デフォルトの名無しさん:2014/04/03(木) 21:14:58.98 ID:e0k67vMi
おれもRAD XE2まで持ってるがDelphi7,CBuilder6ばっかり使ってるな
6ではUnicodeにしかない文字を含むパスを渡されるとデフォルトでは読み込めないから
わざわざUnicodeに対応した処理を自分で実装しないといけないってのは面倒
自分専用ならパス側を書き換えて対処すればいいけど、外に出すアプリでそれは強要できないし6は正直無い
あと言語の拡張を考えると6と2009以降では生産性が倍以上は違うと思う
ただIDEの出来は6の方がよかった
すみません、Delphi側でフォームを用意し、そこに入力した文字列を、ボタンを押す事によりFirefoxなどのブラウザの、例えば通販での個人情報入力フォームに反映させるようにしたいのですがどんなメソッドが必要でしょうか?
質問が下手で申し訳ありません
ちなみにDelphi7をWindows7で使っています
よろしくお願いします
>>820 FireFoxのことは知らないけど
TWebBrowserを使って、Formなどの要素に書き込んだり
ボタンを押す動作を制御することはできる
検索すれば、いろいろと出てくると思う
>6ではUnicodeにしかない文字を含むパスを渡されるとデフォルトでは読み込めないから
>わざわざUnicodeに対応した処理を自分で実装しないといけない
一発変換かますだけだろ
自分で実装する必要はないわな
え?「c:\☑\☒.txt」っていうファイルを D6 の TMemo に読み込むのに「一発変換」という
簡単な方法があるんですか?
そういうわながあるのか。。 しかしまあ困るというほどではないかも。
>>823 一発変換って何?
SJISに変換できない文字があったらVCLのLoadFromFileじゃ絶対読めないけど。
例えば自分で実装せずにTStringList.LoadFromFileする一発変換ってどうやるの?
仮にファイル名に使われている文字がSJISの仕様内におさまっても、
ファイルの中身がSJISに変換できないUnicodeテキストだったらどうやって表示するの?
これも一発変換で表示できるの?
すでにツッコミが入ってるだろーが
おまいらマジに
GetShortPathName
で変換することを知らんのか
ってかここは超初心者用だったな
なんであんなに必死なんだ
>>828 もしかして今は短いパス名をサポートしない環境があるのを知らない?
ってここは超初心者用だったな、すまん
とりあえずそんなおかしな名前付けるな で済む
他国とのやりとりをしていると平気で出てくるんだよ
ファイル名もテキスト内容も>うにこ
ファイル名はWideStringに入れて、CreateFileWでファイルをオープンして、THandleStreamで扱う、ってことになるわな。
831にとってはおかしな名前でも、その国の人にとっては常用する普通の文字だしな
まさに井の中の蛙だねぇ…
あのー、ちょっと聞きたいことがあるんですが
TRadioButtonのOn/Offを自分で制御することはできます?
やりたいのは、2つのボタンで、両方ともOnだけは不可だけど
いずれかかがOn、または両方ともOffは可としたいんですが...
>>835 すべてoffという特性は、TRadioButtonには適していないと思う。
複数のTSpeedButtonのGroupIndexを同一にし、かつAllowAllUpをTrueにしたほうが良い気がする。
procedure TForm1.Button1Click(Sender: TObject);
begin
RadioButton1.Checked:=not RadioButton1.Checked;
end;
TRadioGroup も考えてみて
procedure TForm1.Button2Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex<0 then
RadioGroup1.ItemIndex:=0 else
RadioGroup1.ItemIndex:=-1;
end;
ラジオボタンってなんでそう呼ばれるのか、若い人にはわからないよなぁとか思ったり
>>836-837 やっぱラジオボタンだけじゃ無理っぽいですね。
チェックボックスのほうが無難かな...
ちょっと文字情報付のボタンが欲しかったんで
どれか1つのボタンだけOnで、そのOnのボタンをクリックすると
それもOffになって、全部Offを許容するって感じで
ちょっとコンポーネント調べたんですが、そんなのないですね
>>838 昔のラジカセのボタンみたいなもんでしょうか?
そういえば、カーラジオも選局ボタンがそんなんだったような
質問です、
Windows7でRAD Studio XE5を使用し、FMXの練習をしています。
ttpwww.gesource.jpweblogp=6214
このページの下にあるサンプルアプリケーションのソースをそのままコピーしたのですが
DrawBitmapの部分で中身が空として扱われてしまいImageLargeが表示されませんでした
ImageSource,ImageSmallは正常に表示されます。
どのような原因だと思われるでしょうか。
こちらの環境はWindows7,lazarus1.2です。
「デスクトップの表示」をしても消えないウインドウをつくりたいです。
昔は、TForm.createのなかでParentWindow:=FindWindow('Progman',NIL)という定番のやり方があったのですが、仕様が変わったらしくうまくいきません。
(窓が表示されない)
ネットで調べて、ProgmanのかわりにSHELLDELL_DefViewやWorkerWをいれてもだめでした。(デスクトップの表示できえる)
ParentWindow:=GetDesktopWindow();も試したのですがデスクトップの表示できえました。
ガジェットみたいに「デスクトップの表示」をしても消えないウインドウを作るにはどうしたらいいのでしょう。
ここはDelphiスレです
Lazarusは専用スレがあるのでそちらへどうぞ
つかWin32の質問だよな
844 :
デフォルトの名無しさん:2014/04/22(火) 00:33:15.43 ID:1mdNhLZv
Delphi使いは心が狭いな
心の面積とは関係ないような…
デスクトップの表示ってすべてのアプリを最小化してるのか?
なんらかのmessageが飛んできてるからそれを無視すりゃいい
マッピングからはずしてる。
ParentWindow:=nilにしてるという感じ。
教えてくれないと入金催促画面が作れません!!!
849 :
デフォルトの名無しさん:2014/04/22(火) 13:47:00.21 ID:0UJjYfLY
天才現る
>>841 WM_MOVEを監視して常にデスクトップ領域内に入るよう監視・調整する
>>847 マッピングをいじるわけではないだろう。
アエロなしだと'Progman'、アエロだと'WorkerW’の管理する窓が一番前にきて他の窓を隠す。
XE2で#20以下の文字をエスケープ、アンエスケープする関数が(なるべく標準で)あったら教えて下さい
'aaa'#13#10'bbb' <-> 'aaa#13#10bbb'
>'aaa'#13#10'bbb' <-> 'aaa#13#10bbb'
これはあくまで例で、書式の指定は特に無いです
書式はなんでもいいから「#20以下だけ」ってことか・・
そんなものないと思うけどな
XE6でLiveBindingをしているのですが
NumberBoxのValueなどを双方向にバインドすることは可能なのでしょうか
859 :
857:2014/04/29(火) 11:27:25.81 ID:mwSTMqLJ
860 :
857:2014/04/30(水) 19:50:18.37 ID:IRsEECXr
>>858 自分はNumberBox(数値設定用コンポーネント)のValueのように、LiveBindingデザイナにデフォルトで表示されないメンバから
DBのフィールド等の値を変更したいと思っていまして、貼っていただいたURLの内容では目的が達せられませんでした。すみません。
ベタにコーディングするしか無いでしょうか。
Delphi XE5 で Android アプリを作っています。
TMainMenu/TPopupMenu/TMenubar はモバイルに対応していないようですが、メニューボタンに対応させるにはどうすれば良いでしょうか。
ホント、素人な質問で申し訳ないんだけど。。。
フォームにコンポーネント(って言うのかな。ラベルとかエディットとか)を貼り付ける
というとこまでは分かったんですが、そうするとDELPHIが自動的にプログラムを
書いてくれる。で、やたら(sender:tobject)というのが出てくるのですが、これって
何なのでしょう?
senderは送る者、tobjectはルートクラス? 何が何やら・・・
多態性について学習するよろし。
型宣言が増えまくるのを抑止する手段>継承元クラスで一緒くたに扱う
>>863 なかなか奥が深いですねぇ。
田舎住まいでしかもインターネットができないので調べるのも一苦労ですが、
今日は都会に来ているので本屋さんに行ってきます。多態性をキーワードに
すればいいわけですね。ありがとです^^
最近は本屋行かなくなっちゃったから分からないけど
あんまり本は頼りにならないというか
そもそも売ってないと思うよ
当時でさえそうだったんだから今はますます(略)
本屋より図書館の方がいいかも
まぁ置いてあればの話だけど
やっぱりネットが一番だと思うけどね
昔はDelphiの入門書が結構あったのに最近見かけないね
入門する人がいなくなったのかな
で、技術評論社の「Delphiオブジェクト指向プログラミング」ってのに
お世話になった。もう15年以上も前の話だけど
漫画喫茶でもテキトーに入れば入門の情報はいくらでもある
要は自動生成されたコードの意味がわからんってことだろう
>>866 当時 Delphi 関連書籍は流通を押さえてたソフトバンクの策略により書店から姿を消した
代わりにソフトバンクは全国の書店に VB 関連書籍をバラ撒いた
なんでソフトバンクはそんな策略をしたの?
MSからお金を貰ったとか?
>>869 当然、日本マイクロソフト社との裏取引があったのだろう
とりあえず、PDFで転がってるOh!No!のDelphi3 Q&A150選でも見とけ
古すぎてアレだがw
FMX.Grid.TStringGrid を使っていて2つほどわからないので教えてください。
Delphi XE5 です。
1.文字列がちょうどおさまるようにセルの幅、高さを変えたい。
SG.RowHeight := SG.Columns[0].Canvas.TextHeight('W');
SG.Columns[0].Width := SG.Columns[0].Canvas.TextWidth('99/99 99:99');
とやっていますが、高さは半分、幅は2/3ぐらいになってしまいます。
マージンは0でやっているはずですが、確認することがあればおしえてください。
2.行毎に背景色を指定したい。
いろいろググったのですが、OnDrawCell(XE5では見つかりませんでした)を使う方法や、すべてのセルを変更する方法しか見つけられませんでした。
SG.Columns[0].Canvas.Font.Name:= "ほにゃらら";
SG.Columns[0].Canvas.Font.Size:= ほにゃらら;
>>873 レスありがとうございます。
Font.Name は無かったので、Font.Family に親フォームと同じ値を入れ、
Font.Size にも親フォームと同じ値を入れて試しましたが結果は変わりませんでした。
>>868 これ本当なの?
マイクロソフトがそこまで脅威として見ていたのか
876 :
デフォルトの名無しさん:2014/05/06(火) 17:46:19.19 ID:mrCqoALn
MSがその程度のことをしてもまったく不思議とは感じないのは確かだな
昔から脅迫にちかいことやりまくってるしな
SB主導の方がしっくり来るな
ソフトバンクはその昔「一太郎」時代にも
えこひいきして他社製ワープロを奈落に突き落としたからな
>>868が事実かは知らないけど、SBはMSからマニュアル類を請け負ってたので
独断で便宜を図っても不思議ではない
気になる人は電脳曼陀羅事件を調べるといいかも
880 :
デフォルトの名無しさん:2014/05/07(水) 10:53:06.57 ID:weHfcyWe
英語のキンドル本だけど
Delphi XE2 Foundations - Part 1~3
プロモーションで1冊分の料金しかかからなかったよ
>>872 1はTStringGridの各セルにデータを表示した後で、
ループ最も幅の長いセルを見つけてそれに合わせればどうだろう
iColWidth := StringGrid1.Canvas.TextWidth(StringGrid1.Cells[i, j]);
if StringGrid1.ColWidth[i] < iColWidth then
StringGrid1.ColWidth[i] := iColWidth;
2はonDrawCellイベントを使えばラクに実現出来る
Cell内にチェックボックスやゲージなんかも表示できる
onDrawCellイベントが無いなんて有りえない。見間違い。
>>881 固定長のものでも幅が合わないので質問しました。
1.はどうやらモバイルアプリケーション開発では正確な TextWidth が返ってこないことが原因のようです。
デスクトップアプリケーション開発では以下の内容でほぼぴったりになりました。
ただ、'+8'もどこかのマージンだと思うので、参照で求めたいのです。
str := 'あいうえおかきくけこ';
StringGrid1.RowHeight := StringGrid1.Columns[0].Canvas.TextHeight(str) + 8;
StringGrid1.Columns[0].Width := StringGrid1.Columns[0].Canvas.TextWidth(str) + 8;
StringGrid1.Cells[0,0] := str;
onDrawCell ですが、やはり見つかりません。'onD'まで入力して補完しようとした画面です。
ttp://i.imgur.com/sXyDyk7.png モバイル/デスクトップ共に同じでした。
Delphi-MLの3751から3757の流れを見ろ。Canvas.Font.Assign(Font)としてからでないと
Canvas.TextWidth/TextHeightが正しくならないらしい。
>>883 アドバイスありがとうございます。
ですが効果が無いようです。
フォームにButton1を貼り付け、次のコードを実行しました。
Button1.Text := 'あいうえおかきくけこ';
Button1.Canvas.Font.Assign(Button1.Font);
Button1.Width := Button1.Canvas.TextWidth(Button1.Text);
デスクトップアプリケーションの方は'あ'と'こ'が欠けた状態になりました。
これは枠の分を考慮していないので当然の結果です。
モバイルアプリケーションでは'あいうえお…'となりました。
ん?ボタンの枠のサイズを知りたいってこと?これはスタイルに依存することになりそうなんだが…
>>885 モバイルアプリケーションで、文字を描画するのに必要な幅(高さ)が間違って取得されるので、
正しい幅(高さ)を求めるにはどうすればよいかって質問です。
元の質問は
>>872 です。
TListViewでGroupViewを使用してグループ表示したいのですが、カスタムドローすると、描画がおかしくなります。
というより、各アイテムの描画する矩形を正しく取得できません。
OnCustomDrawItemや、OnAdvancedCustomDrawItemに渡されるパラメータに描画する矩形の
情報が渡されなくて、代わりに、TListItem.DisplayRectで取得しろ?みたいな感じがすべての元凶のような気がします。
Windowsメッセージレベルでは矩形の情報は含まれてるのに、それを全く使わず(TListItem.DisplayRect内部で呼ばれてる)ListView_GetItemRectを使うとかどんな設計なんでしょうか。
助けて下さい。
>>886 いやだからなんでボタンで試してうまくいかないっていってるの?StringGridで試したらどうなるのさ。
>>888 同じです。
TButtonに変更したのはTStringColumnがおかしいのではなく、Canvas.TextWidth / Canvas.TextHeight がおかしいというのを、最も標準的なコントロールで試したからです。
そんなことをするよりは具体的にTextWidthが何を返したか等を記述した方がいいよね
ライブラリのソースを読むことはできても、実機で試せない人もいれば他の環境では再現しない可能性だってあるんだし
少なくとも効果があったかなかったかは問題を解決できてないあなたが勝手に判断したらまずいでしょ
TButtonでどうだったかを示されたところでTButtonはTButtonであってTStringGridじゃないし
てぇかここじゃなくてMLかフォーラムで聞いたほうがいいと思う。できれば最小限の再現コード付きで。
>>887 TListviewのcustomdrawは自分も結構悩まされるな
色々検索しても、これはって言う回答はなかなか見つからない
最近は色々試行錯誤して(偶然)うまくいったのが回答だと考えてる
>>890 デスクトッププロジェクトとモバイルプロジェクトを作成し、双方にTStringGrid/TButtonを貼り付け、
TStringGridは項目の追加でTStringColumnを1つ追加しています。
コードは同じで
procedure TForm2.Button1Click(Sender: TObject);
var
str:string;
begin
str := 'あいうえおかきくけこ';
Button1.Text := str;
Button1.Canvas.Font.Assign(Button1.Font);
Button1.Width := Button1.Canvas.TextWidth(str);
StringGrid1.RowCount := 2;
StringGrid1.Columns[0].Canvas.Font.Assign(Button1.Font);
StringGrid1.Columns[0].Width := StringGrid1.Columns[0].Canvas.TextWidth(str);
StringGrid1.Cells[0,0] := str;
StringGrid1.Cells[0,1] := StringGrid1.Columns[0].Canvas.TextWidth(str).ToString;
end;
結果が以下の画像です。(左がデスクトップ、右がモバイル)
ttp://i.imgur.com/wxIk829.png フォントが違うにもかかわらず、双方ともTextWidthは82.01123046875を返しています。
モバイルプロジェクトでは、TextWidthはあてにならないということなのでしょうか・・・
偶然同じ値になるなどまずありえんわな。
そこを追求してかないと。
仮に違うフォントが使われているとしたら、偶然同じ値になるなどまずありえんわな。
そこを追求してかないと。
単位がピウセルじゃないから…
?
FireMonkeyよく知らないけど、そもそもコントロールのフォントとスタイルのフォントは別物だから当然じゃないの?
ちゃんとスタイル適用しないように設定変えてる?
勤め先はPC関係でもなんでもないのですがdel7proがあります。
ネットで調べたらwin8の64bitでもインストOK、動作OKと書いてあるサイトがありました。
ウィンドハンドルとか調べるツールも動作するんでしょうか?
32bitのwindowsなら動く気がするのですが、64bitだとどうでしょうか?
インストールして自分で調べればいいのですが、会社のPCには気軽にソフトを
インストールしてはいけないので、教えてください。
>>899 Windows 7 64bit に Delphi 7 Pro を入れてバリバリ使っています
F1 キーの状況感知ヘルプが上手く動作しない以外は不都合を感じません
Turbo Delphi Explorerを古本の付録でインストールしてみましたが、許諾ファイルが手に入りません
何とか使う方法は無いですか?
>>899 そういえばどうなんだろうと昔 Delphi5 で作成した Handle、Caption 取得するソフトを動かしてみた
64bit ソフトの情報も問題なく取得できました
ちょっと教えてください。
自分で開発したアプリを人に上げるとき
含める必要のあるファイルは何でしょう?
*.pas、*.dfm、*.dpr、*.resファイルは必要ですよね
*.dprojファイルも必要ですか?
その他、不足してるファイルがありますか?
なんで exe以外が必要? ていうかインストーラでまとめてリリースするやろ
ソースもつけるのなら、できたファイル全部だし、
>>905 レスありがとうございます。
実行ファイルではなく、ソースを配布したいと思いまして...
で、コンパイル等で生成されるファイルには、パス情報とか
個人情報が含まれてるのもあるみたいで、ソース配布には
最低限、どのファイルが必要なのかと思いまして。
resは自分でリソース含めたりアイコン作ったりしていないのであれば
無くてもIDEが自動生成するからいらない場合もある
ソース部分は基本的に最初に挙げた3つでOK
>>906 D6 だけど、*.dprojファイルはいらない。
*.dpr
*.pas、*.dfm、*.res
この4つで良いと思う。
特別な外部コンポーネントを使ってるのなら
それの入手方法を知らせるなり、仲間内ならそのコンポーネントをセットで
>>907-908 リソースには何も登録してないので
*.pas、*.dfm、*.dprファイルのみにします。
ありがとうございました。
Delphi XE6のVCLでスタイルを適用すると、TEditのColorなどが全て統一されてしまうようなのですが、
個別に変更することは可能でしょうか?
912 :
デフォルトの名無しさん:2014/05/18(日) 13:19:59.16 ID:OIeu8RRW
DelphiでHTMLタグをエスケープする関数とかありますか?
< --> <
> --> >
& --> &
" --> "
こういう変換をしたいんですけど、自前で書くしか方法はないんでしょうか。
HTTPApp.pasにHTMLEncodeとHTMLDecodeがあるけど。
>>912 regular expression実装されてるからそれでやればいいと思うよ
なんと PeaZip は Lazarus製ではないですか!
以前メディアプレイヤーで質問した者です。
色々調べた所MediaPlayer系をいじるのには
MCIを直接いじらなければならいようだという
ことが分かったのですが、
MCIについて勉強するに適したものはありますか?
WindowsMediaPlayerもボリュームコントロールを出来ないようでした。
もし、示唆等いただけましたらよろしくお願いいたします
>>919 ありがとうございました。早速印刷しましたので勉強させていただきます。
はるか昔に非推奨になって後は死に行くのみのAPIを今更勉強するの…?
それ以前にMCIじゃ個別の音量設定なんてできないし
delphiでオーディオ再生だとNewACってのがいいと思う
コンポーネント貼り付けて簡単に再生できるし
再生できるには*.wav、*.mp3、*.wmaなどなど
ボリュームや再生速度も簡単に指定できる
自作のフリーソフトで使ってるけど結構いいよ
難点はDirectSound終了でNewACの開発も終了しちゃったこと
...って、動画も再生するんだっけ? じゃ、ダメだね
WMPとかFlashPlayerとかVLCとかをActiveX貼り付けで使えるけど、だめなん?
あとは html 吐いて、ブラウザで表示させるのが楽かも
>>921 そうなんですか?
手持ちのソフトやサンプルソースが
MCI使っていたので…
他に良い制御系があるのでしょうか?
便乗して質問するけど
Media Foundationを簡単に扱える
コンポーネントって出てる?
931 :
918:2014/05/29(木) 06:05:02.27 ID:FkL52Gv9
932 :
929:2014/05/29(木) 18:23:52.12 ID:U5vZ2NRt
>>930 英語を読むのは平気だけど
アプリの中で効果音的にちょっとオーディオ再生するだけのために
Microsoftのサイトを読んでゼロからプログラミングするのは
少し効率が悪いかも
933 :
918:2014/06/04(水) 17:34:52.13 ID:9Ld+1Bja
NewAC 2.61やっと見つけました。
使用方法とか説明しているサイトとか有るでしょうか?
やりたいことは、wavとmp3のコントロールです。
recordと暗黙のキャスト使えば
s: TString;
s := 'hello';
if s.pos('e')>0 then...
とか書けそうだけど
TString, TInteger, TDoubleといった基本型のラッパーライブラリを
気合と根性で作ったものって無いの?
>>934 2010以降なら、record helperを使ってがんばって自前で用意、
XE3以降なら、各種recor helperが標準で用意されてるけど、
これらよりも前のバージョンでの利用を考えてる?
>>933 NewAc261でWavやmp3を再生するだけだったら
デモアプリが参考になると思う
newac261.zip\newac261\demos\Players\AudioPlayer
あとはヘルプがhtmlファイルになってるので
index.htmlファイルから適当に
最新の XE6 で作成したプロジェクトのソースをサンプルとして配布したいのですが、
XE5 以前(~2009 あたりまでを想定)で正常に読み込みできるのでしょうか。
使用しているコンポーネント等は標準的なものです。
そんなの内容にもよるから何とも言えないし、自分で試してみればいいだけのような
XE6持ってるならライセンスあるんだし
>>938 おおせの通りなんですが、わざわざそのために昔のバージョンをインストール
するのもなあというのもありまして。
まあ Unicode 対応の 2009 と 64bit 対応の XE2 あたりを入れて試して
みます。
>>935 サンクス
XE6Trial落としてみたけどいちいちTStringとか作らなくても
showmessage('hello'.length.tostring)
とか普通にできるように拡張されてるんだね
しかもXE3からとか
XE2買っちゃったのが悔やまれる…
XE6安いから買っちゃおうかな
UTF16めっっちゃおせぇぇぇぇぇぇ
Delphi7です
リッチエディットで任意の場所にある文字列の文字装飾を知るためには必ず選択状態にして
SelAttributesを見るしか方法はないのでしょうか?
例えば太字になっている部分を検索したり、書き換えたりするときに
プログラム内部で一文字ずつ選択して調べるのでしょうか?
長い文章だと相当時間がかかりそうです
943 :
918:2014/06/09(月) 13:01:16.65 ID:K7gwbRPX
>>936 でもアプリをコンパイルしようとすると、コンポーネントが無いとか出てきてしまうんです。
コンポーネントが無いなら入れたらいいじゃない(高慢な感じで
>>943 無いと指摘されたコンポーネントがNewACだったら
NewACが正しくインストールされてないんじゃないかな
一度アンインストールして、再インストール
それでもインストールできなかったら...\newac261\srcを
検索パスに追加する...
946 :
918:2014/06/09(月) 16:42:00.32 ID:K7gwbRPX
>>945 英語がさっぱり…
何をしたら良いのかさっぱり分かりません…
エラーメッセージも書かずに質問とな
英語くらいgoogle先生とかexcite先生に訳してもらえ
codesite.exe -send hello
みたいに使えるCodeSiteLoggingのラッパーツールって無いですか
949 :
918:2014/06/10(火) 06:15:23.34 ID:DxaG/FAR
プロジェクトを呼び出すと
クラスTVorbisInが見つかりません。エラーを無視して実行しますか?
注意:エラーを無視すると、コンポーネントまたはプロパティが失われる可能性があります
とでます。
NawAC6.1をインストールするにも解説しているサイトが無いのでどうしたら良いか…
>>949 てか、コンポーネント/パッケージをインストールする方法をまず調べたら?
インストール方法は共通だよ
type
TMyClass = class(TMyBaseClass);
...
initialization
RegisterMyClass(TMyClass);
この手の登録処理を省きたいんですが
RTTI使って全クラスを列挙してTMyBaseClassの派生クラスを抽出する方法ないですか?
TRttiContext.GetTypesで型を列挙して、それぞれのTRttiTypeのTypeKindがtkClassかどうかで
クラスかどうかをチェックして、Handle.Nameでクラスの型名を取得して、TypeData.ParentInfoで
継承元クラスのTypeInfoを取得して、それをずっと辿って継承元にTMyBaseClassが出現するか、ってな
手順になるかな。もし具体的なコードが欲しければここじゃなくて公式フォーラムかMLにどうぞ。
列挙はともかく親までわざわざRTTIで辿らなくてもクラス参照取り出してInheritsFrom呼ぶだけでいいんじゃないの?
それもそうだね
// TStringsを乗っ取るサンプル
type
TStringsHelper = class helper for TStrings
procedure Add; overload;
procedure Add(s: String); overload;
procedure Add(fmt: String; args: array of const); overload;
end;
{ TStringsHelper }
procedure TStringsHelper.Add;
begin
Add('');
end;
procedure TStringsHelper.Add(s: String);
begin
Add(s); ← ここでオリジナルのTStrings.Addを呼び出すのってどうやるの?
end;
procedure TStringsHelper.Add(fmt: String; args: array of const);
begin
Add(Format(fmt, args));
end;
Self.
inherited;
または
inherited Add(s);
inherited
はうまく行きませんでしたが(実行できたものの何も文字が入らなかった)
inherited Add(s);
はうまく行きました。ありがとうございます。
初心者でとんちんかなことを言ってるかもしれませんが教えてください
TGifImage.Bitmap.ScanLineを使いたいんですが、
このときの色深度はどうなってるんでしょうか?
TGifImage.Bitmap.PixelFormatを調べればいいのですか?
それともPixelFormatを明示的に、たとえばpf24Bitにすればいいの?
Gifだから本来pf8Bitだと思うんですが、得られた値を
パレット色で変換するのですか(GlobalColorMap.Colors[]など)?
効率のいいピクセル値の取得法を教えてください。
よろしくお願いします。
GifだろうがJpegだろうが内部的にはBitmapでしょ
>>960 そうですね。
ダウンロードしてGif.LoadFromStream(TMemoryStream)後、
PixelFormatはpfDeviceになってました。
で、ScanLineで試したところ、pf32Bit相当のフォーマットでした。
pfDeviceって機種依存だと思いますが、1Pixelが何バイトかは
どこから分かるんでしょうか?
2回のScanLineして得たアドレスの差を画像の横幅で割る?
> TGifImage.Bitmap.PixelFormatを調べればいいのですか?
これじゃねーの?
>>961 何か勘違いしてるがDDBを直接操作する手段は無いからScanLineでは当然触れない
ソースを見れば分かるとおりScanLineを呼び出した時点でDIBに変換されてる
>>963 >勘違い...
大いにありえます。DDBとかDIBとかはじめて聞きました
最終目的はネットからダウンロードしたGif画像を高速に
スキャンすることです
どうすれば高速に任意のピクセルの色情報を取得できるでしょうか?
>ソースを見れば
残念ながらStarter使用者です。ソースは参照できません
>>963が言うには、ScanLineを呼び出せばDIBに変換されてるというらしいから、
ScanLineで1,2バイト適当に読んだ後に、PixelFormatをチェックしてみれば?
そしたらお望みのDIBのフォーマットになってるってことじゃね?
つか、TGifImageで適当な画像読んでもPixelFormatがpf8bitになってるけど。
どんな画像読んだんだ?
>>966 たぶんアルファチャンネルの有無による違いかと
>>965 なんでそんな無駄なことするんだ
「お望みのDIBのフォーマット」が欲しいなら最初からPixelFormat弄ればいいだろ
ScanLineする前にbitmap.PixelFormat := pf24bit で統一しておけばよさそう アルファチャンネルはいらないでしょ
970 :
918:2014/07/01(火) 19:13:32.79 ID:PUCNylXr
すみません。以前wav再生ソフトのボリュームコントロールの
すみません。以前wav再生ソフトのボリュームコントロールの
質問した物です。
WindowsMediaPlayerコンポーネントを使おうかと思っていますが、
日本語のSDKって手に入るのでしょうか?
ボリュームコントロールは簡単にできる物でしょうか?
よろしくお願いいたします。
ActiveX使えば簡単
SDKとか必要ない
ActiveXでプロジェクトに取り込めばOK
でもSDKの資料がないと使い方が分からんね
WMPの資料はWindows7 SDKの資料の中にWMP SDKというのが入ってる
もちろん全部英語