くだすれDelphi(超初心者用)その46 at TECH
[2ch|▼Menu]
1: ◆XcB18Bks.Y
08/03/12 21:09:39
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を
勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが
お礼はDelphiの布教と初心者の救済をお願いします。

<前スレ>
くだすれDelphi(超初心者用)その45
スレリンク(tech板)

<過去スレ>
DelWiki避難所(Delphi 関連の過去スレッド)
URLリンク(delwiki.info)


2: ◆XcB18Bks.Y
08/03/12 21:10:09
<関連スレ>
【Delphi】 Indyコンポーネント 【C++Builder】
スレリンク(tech板)
Delphi初心者のための寺子屋
スレリンク(tech板)
delphiで作った有名ソフトって何があるの?
スレリンク(tech板)
Delphi持ってるならGLSceneを使え
スレリンク(tech板)
【Delphi互換!?】FreePascal【GPL】
スレリンク(tech板)

【Delphi】 ゲームつくるぞ(゚Д゚)ゴルァ 2【Delphi】
スレリンク(gamedev板)
Delphiでアクションゲームが作りたい!! Part2
スレリンク(gamedev板)
ネットワークゲーム作成のお勉強(Delphi専用スレ)
スレリンク(gamedev板)
delphiでMMO
スレリンク(gamedev板)


3:デフォルトの名無しさん
08/03/12 21:17:05
>>1乙です

前スレの991ですが引き続きよろしくお願いします

991 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/12(水) 16:55:10
現在勉強の一環としてVCLを使わずにAPIだけでプログラムを書いているのですが、
IEコンポーネントのブラウザは作成可能でしょうか?
CreateWindowで「AtlAxWin」と「Shell.Explorer.2」を指定してみたのですが作成されていないのかフォームは灰色のままです
また、Navigateの方法も教えてくださると光栄です

4:デフォルトの名無しさん
08/03/12 21:53:20
>>3
Delphi固有の問題ではないような。

5:デフォルトの名無しさん
08/03/12 23:13:06
>>3
そりゃ可能でしょう。
VCLで作れるなら、VCLのソース見ればいいだけ。

>前スレ989
> Delphiには未来があるんでしょうか?
未来は自分で作るもの。

>990
> 実行時パッケージを使用してコンパイルしたいのですが、
>特定のpasファイルだけは静的リンクするにはどうしたらできますか?
ユニット名を変えれば出来る。 変えずにできるかどうかはやってみて。
でも、パッケージ内のユニットを実行時に置き換えることは出来ないと思うよ。





6:デフォルトの名無しさん
08/03/13 09:41:14
DelphiのADOQueryでSQLServerへ以下のことをしています。
・Select文を投げる
・Query内をループし帳票へ書き出す

最近帳票が遅いと言われたので、SQLServerのテーブルへインデックスを貼ったところ速度が速くなったのですが、
なぜか「Select文の実行」時間ではなく「Query内を参照し書き出す」時間のほうが早くなっていました。
インデックスでQueryに結果を格納した後の参照時間も変わるものなのでしょうか?

7:デフォルトの名無しさん
08/03/13 10:05:16
変わるよ。
たいてい?のデータベースはSELECT文を実行して、最初の数行が決定された
段階でクライアント側に応答を返す。で、クライアント側がカーソルを
使ってフェッチしながら、その裏でデータベースサーバーは続きの行を一生懸命
求めている。つまり、君の言う「Select文の実行」時間とは、サーバーから
応答が返ってきた時間であって、サーバー側ではまだ処理は終わってないんだよ。

8:デフォルトの名無しさん
08/03/13 10:19:54
後、文章から判断するとCursorLocationプロパティがclUseServerのサーバーカーソル使ってそうだね。
サーバーカーソルならデータベースのカーソルと同じと考えていいけど、
clUseClientのクライアントカーソルに設定すると、ADOがSELECT文を実行し、
すべての行をクライアントのメモリをフェッチするまで、応答を返さないから
君の測定もまた変わる。その変わり、君の言う「Query内を参照し書き出す」時間
はインデックあろうとなかろうと、返される行数が同じならほぼ一定時間になると思う。




9:デフォルトの名無しさん
08/03/13 10:28:03
いや、クライアントカーソルの時「Query内を参照し書き出す」時間が一定になると
書いたが嘘かもしれん。むしろ、嘘っぽいかも。

10:6
08/03/13 13:31:32
>>7-9
CursorLocationプロパティはclUseClientになってました。
予想外のところが速くなって混乱していたので、レスみて納得しました。
ありがとうございます。

11:デフォルトの名無しさん
08/03/13 14:29:34
>フォームからマウスが外れた時に、
>ある処理(例えばbeep)を行いたいのですが、
>どう記述すればいいでしょうか?
SetCaptureControl/ReleaseCaptureを使ってみては?
OnMouseMoveでSetCpatureControlを使用するならフラグで多重起動
させないように管理する必要性があるけど。

12:デフォルトの名無しさん
08/03/13 15:18:19
Delphi の
 TFoo<T,S> = class
  ...
 end;
 TFooInt<R> = TFoo<R,Integer>;
の TFooInt<R> って、C++ の template だとどういう風に宣言するの?


13:デフォルトの名無しさん
08/03/13 17:58:32
PascalってもしかしてCのreturnに相当する処理って無い?
途中で抜けるのって出来ないとか?

14:デフォルトの名無しさん
08/03/13 18:15:15
>>13
Exit Break Continue Abort

15:デフォルトの名無しさん
08/03/13 19:37:10
マウスの検出は↓で出来る
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;


16:デフォルトの名無しさん
08/03/14 15:05:08
>>13
抜けるだけなら可能だが、Resultにぶち込んでからExitしなけりゃならない

そんな話題が前スレにもありました

17:デフォルトの名無しさん
08/03/14 17:34:37
C++で作られたDLLファイルをDelphiで使用したいのですが、
C++で次のように定義されている関数は、Delphiでどう定義すればいいですか?

int Test(const char *str1, int &a, int* a, char** msg, int* len);

char** が特にどうしていいのかわかりません。
どうかお願いします。

18:デフォルトの名無しさん
08/03/14 18:42:54
char** は PPChar。 (PPChar = ^PChar)
呼び出し規約も合わせるように。

19:デフォルトの名無しさん
08/03/14 21:48:55
EditでCtl3DプロパティをFalseにすると外枠が立体的ではなく平面的になりますが
Comboboxの場合はCtl3DをFalseにしても外観が変わりません。
ComboBoxを平面的な表示にすることはできますか?
Delphi4です。よろしくお願いします。

20:デフォルトの名無しさん
08/03/14 23:59:12
フラットComboboxみたいのを昔どこかでみたことがあるなあ

21:デフォルトの名無しさん
08/03/15 00:44:32
>>19
これは?
URLリンク(www2.big.or.jp)

22:デフォルトの名無しさん
08/03/15 02:06:50
こことか
URLリンク(www29.atwiki.jp)

23:デフォルトの名無しさん
08/03/15 08:06:31
バグだらけのDelphi4よく使ってんな

24:デフォルトの名無しさん
08/03/15 11:35:06
>>23
どのバージョンもバグだらけ
URLリンク(qc.borland.com)
ここを見て
Msより潔い

25:デフォルトの名無しさん
08/03/15 12:17:23
>>24
そりゃバグのないソフトなんて皆無だし。
Del3とDel5〜Del7はよいと思うよ。

26:19
08/03/15 15:51:05
>>21
>>22
情報ありがとうございます。
でも面倒なので逆にすべて3Dで統一しようとおもいます・・・

27:デフォルトの名無しさん
08/03/15 17:06:32
Delphi7ですが、最近割りと大きなプログラムを扱うようになりまして、
VCLもIndyやらサードパーティのものやらがたっぷり入っていまして、
コンパイルに10分くらい掛かってしまい、やる気を無くしています。

これはPCのスペックを上げねばと思うのですが、現在はCeleronの600MHzで
512MBのメモリですが、どの程度にすればいいものでしょうか。
(自作PCで、HDDなどはそのまま使いたいと思っています)

28:デフォルトの名無しさん
08/03/15 17:20:24
俺Del5Entだけどセレ500MHz、RAM128MBでコンパイル一瞬だよ

29:デフォルトの名無しさん
08/03/15 18:44:04
Delphiのバグが突出して多いのは、有名な話だよ。


30:デフォルトの名無しさん
08/03/15 18:51:45
>>27
OSによる。 
コンパイルって再構築?
タスクマネージャで開きメモリやCPUの使用率調べる。

31:デフォルトの名無しさん
08/03/15 20:01:06
OSはWindows XP Home です。タスクマネージャではDelphi32.exeが100%です。
メモリの使用率は見方が分かりませんでした。(情けない、スミマセン)

ちょっと調べてみてCPの良い感じのAMDのにしようかと思っています。

32:デフォルトの名無しさん
08/03/15 21:42:18
再構築にしても、10分はかかりすぎ。 
XPHomeで512MBなら十分。 チューンアップしていなくても、200MBぐらい空いているはず。
メモリが足りないときは、HDにガーッってアクセスするから分かる。

考えられる原因は、
他に重たいアプリが動いている。 ウィルスかも。
HDが壊れている。 エラーチェックしよう。

コンパイル状況ウィンドウはどう? プロジェクトに関係なく遅いの?
コンポーネントを沢山インストールしてから遅いの?

33:デフォルトの名無しさん
08/03/15 21:47:08
大きいプログラムをフルビルドするならそのくらいはかかるんじゃね?
その場合、それ以上早くするのは CPU 上げるしか方法はないと思う。

34:デフォルトの名無しさん
08/03/16 01:18:38
>>31-32
ウイルスという線もあるけれど、ウイルス対策ソフトがネックになることも多々あるよ。

35:デフォルトの名無しさん
08/03/16 08:44:34
>>27
毎回フルビルドしてんの?
それかincludeしてるファイルを頻繁に更新するとか?


36:デフォルトの名無しさん
08/03/16 10:22:53
皆様色々なレスありがとうございます。
ウィルス関連ですが、ウィルスバスター2007です。検知はされませんでした。
それから10分というのは再構築の場合です。
また、他の人から引き継いだ(コピーした)ものです。
足りないVCLはインストールしたのですが、その後も他の軽めの
プロジェクトなら数秒で終わります。
近いうちにCPU換装しようかと思ってます。マザーとメモリもか…

37:デフォルトの名無しさん
08/03/16 13:04:52
>>36
換装よりももう一台追加した方がいいと思うぞ

38:デフォルトの名無しさん
08/03/16 13:50:22
>27
いまどきのPCにしたほうがいいとは思うけど、どうしてもというならまずメモリを上限(3GB)まで増設。
次にCPUを交換。あとはIDEがATA66だったりしたら増設ボードでATA100/133に。

39:デフォルトの名無しさん
08/03/16 15:30:51
>>38
既に最大である512Mなのでわ?
自作PCどころかPCについて詳しく無いみたいなんだけど、メモリやCPUは
世代が変わると互換性が無くなるし、古い世代のパーツを中古で手に入れよう
と思った場合、現行品に比べて遥かに高くつきますよ

40:デフォルトの名無しさん
08/03/16 17:18:26
dfmファイルがテキスト形式で、画像データや音データがどっさり入っている場合、
dfmファイルがべらぼうなサイズになるから、コンパイルが遅くなるかも。

41:デフォルトの名無しさん
08/03/16 18:21:26
ATA66→ATA100/133って…なかなかひどいアドバイスだ。

42:デフォルトの名無しさん
08/03/16 18:41:39
ちょっとDelphiの技術的な話からずれてきたので恐縮してます。
が、もうだめです。イラっときてキーボード叩き壊しそう。ちょっと修正して
確認ってときに数分… 昔の汎用機のTSSでのコンパイルじゃあるまいし。
明日CPU、メモリ、マザー買ってくる。それから最近はS-ATAが主流らしくて
PCIもExpress何とからしくて(もう昔の人みたいす)、色々変換のパーツも
買わないといけないみたい… HDDはVCLインストールなどなどが死ぬほど
面倒そうなので使いまわしたいです。ちなみに現在のマザーはASUS CUSL2です。
レスくれた方々、本当にありがとうございました。

43:デフォルトの名無しさん
08/03/16 18:45:57
ちょっと待て。CPUやマザーボード換えてOSの再インストールなしでいけると思ってる?
悪いこといわんから普通に1台組み立てて環境も全部入れなおせ。

44:デフォルトの名無しさん
08/03/16 19:05:35
それが再インストールなしでも結構いけたりする。
再インストールは覚悟して不具合出るまで様子見もあり、と無責任なことを言ってみる。

45:デフォルトの名無しさん
08/03/16 19:08:44
あれ?
俺開くスレ間違えた?

46:デフォルトの名無しさん
08/03/16 19:13:51
Cele600というのが泣けるねw

特殊ハードを使ってないのなら、一式組み立てて
OSまでインストールしてから、VMWareComverterで
古いHDDの内容を丸ごと吸い上げて、それを
VMWarePlayerで動かしても多分5倍は速いw

47:デフォルトの名無しさん
08/03/16 19:15:33
>>45
dephi超初心者の自作スレになりました。
シングルコア→デュアルコアにしたら射精した。

48:デフォルトの名無しさん
08/03/16 21:24:11
それよりも毎回フルビルドすんのはなんでかという点に誰か突っ込めよ

49:デフォルトの名無しさん
08/03/16 21:50:56
>>47
良く分からないけど把握した

>>48
>>35で突っ込んでるぜ

50:デフォルトの名無しさん
08/03/16 22:11:05
ややこしいデータを表示するためにVirtualListViewというものを初めて使ってみたのですが
CheckboxesをTrueにしてもボックスが描画されません
自分でCanvasに描くものなのでしょうか?

51:デフォルトの名無しさん
08/03/16 22:23:31
XPスタイルでステータスバーが凹んでいる(?)ように見えないのですが
何か設定がいるのでしょうか?
クラシックスタイルでは普通です・・・

52: ◆XcB18Bks.Y
08/03/17 00:15:46
>>31
コンパイル前からCPU使用率が100%ということですか?
Delphi 7は使ったことはありませんがもしかしたら統合環境のバグかもしれません。
(Delphi 5のときはCPU使用率が100%になる不具合が複数あって結構悩まされました)
ともあれ遅い理由が本当にマシンパワーなのかきちんと検証した方が良いと思います。

(そしてマシンに手を付けるなら今ならすべて一新した方が高速で安いです)

>>46
Celeron 600MHzというCPU自体はそんなに遅くないのではないかと思います。
当時のHDDの方がボトルネックだったかもしれません。
(Celeron Mが630MHzで稼働するEee PCだとTurbo Delphi Explorerの起動するのは結構早いです)

>>50
仮想リストビューだとチェックボックスがうまく使えないみたいです。
リストビューの代わりにヘッダーコンポとチェックリストボックスの組み合わせなどを
検討してみてください。


53:50
08/03/17 00:44:32
>>52
ありがとうございます
やはりダメなんですね
作り直しは厳しいですが考えてみます

54:デフォルトの名無しさん
08/03/17 16:59:38
継承元のフォームForm1上のコンポーネントにTCollection型のプロパティがあり、
それを継承したフォームForm2上でそのTCollection型プロパティをいじると、
実行時にそのForm2のTCollection型プロパティはどうリソースから読み込まれるのでしょうか??
Form1のプロパティ値を読み込み、そのコレクション要素を「すべてクリア」して、
Form2のプロパティ値が読み込まれる??
TReaderのソース見たけど理解が追いつきません。



55:デフォルトの名無しさん
08/03/17 18:16:38
クラスと実体とがごっちゃのような

56:デフォルトの名無しさん
08/03/17 18:45:57
ブレークポイントを設定して確認したほうがいい。

57:|Д゚彡 ◆A6VzDeLphI
08/03/17 19:41:19
・・・・・・・・・・・・・・・・

URLリンク(hpcgi1.nifty.com)


58:デフォルトの名無しさん
08/03/17 22:39:45
全部止めるとはまた豪快なw

59:デフォルトの名無しさん
08/03/17 23:27:45
コンパイル中にウィルスバスターのCPU使用率が上がってるのか?
タスクマネージャ見てれば解るぞ。

60:デフォルトの名無しさん
08/03/18 01:51:32
>>54
継承の下位クラスで public プロパティーをいじると、それが実行時直後に
反映されるのは、どんなコンポでもいっしょ。TForm2 が TForm1 を継承してる
からといって、TForm1 のインスタンスがいったん読みこまれるわけじゃないから、
質問自体が無意味。

61:デフォルトの名無しさん
08/03/18 05:55:46
>>60
うーん。
>>TForm1 のインスタンスがいったん読みこまれるわけじゃないから
質問ではTForm1のインスタンスが生成されるとは一言も言ってません。
継承フォーム作成すると、派生フォームでは、変更したpublishedなプロパティだけが
差分情報としてフォームファイル(*.dfm)に記録されるんですよね?
そして実行時には、RTTIから継承フォームのプロパティを読み込んだ後に、派生フォームの差分情報だけがプロパティ
に再設定されるんですよね?で、TCollection型の場合は、どうなるのかな?という質問です。


62:デフォルトの名無しさん
08/03/18 05:58:12
54=60です。
>>54ではしっかり実体とクラス使い分けませんでした。すみません(>>55)。

63:デフォルトの名無しさん
08/03/18 06:03:57
and すみません(>>60)。

64:デフォルトの名無しさん
08/03/19 06:14:05
Edit1、Edit2、Edit3…のように連続した名前の物を
ループ処理でTObjectListに突っ込む事はできませんかね?

65:デフォルトの名無しさん
08/03/19 07:47:20
できます

66:デフォルトの名無しさん
08/03/19 08:11:54
コンポの名前とは限らないぜ

67:デフォルトの名無しさん
08/03/19 08:49:40
DelWiki - Tips/添字を使ってコントロールを処理する
URLリンク(delwiki.info)

68:デフォルトの名無しさん
08/03/19 15:57:29
>>67
おお!ドンピシャリだ。どうもありがとうございます

69:デフォルトの名無しさん
08/03/20 06:48:25
ボタン押したりメニューの設定を選んだりすると
それ用の別ウィンドウが出るようにするにはどうしたらいいんでしょうか?

70:デフォルトの名無しさん
08/03/20 08:20:09
ファイルメニューの新規作成で、それ用のフォームを作る。
アプリ起動時に自動作成してる場合、
モーダルダイアログなら、Form2.ShowModal;
ウィンドウなら、Form2.Show;
自動生成していないなら、事前にCreateする必要がある。
閉じたときどうするかも決める。

71:デフォルトの名無しさん
08/03/20 12:29:04
type
    TTask = class(TAction)
        property OnBeforeExecute;
        property OnAfterExecute;
        ...その他いろいろ..
    end;
   
    TTaskList = class
        Items: TObjectList;
       
        procedure Add(Task: TAction; RemoveOldTask: Boolean = False; DelayMSec: Integer = 0; RepeatCount: Integer = 1);
        function Exist(Task: TTask): Boolean;
        procedure Remove(Task: TTask);
        procedure Execute;
    end;

procedure TForm1.Button1Click;
begin
    TaskList.Add(ActionLoadData);
    TaskList.Add(ActionProcessData);
    TaskList.Add(ActionPrintData);
end;

procedure TForm1.ApplicationIdle;
begin
    TaskList.Execute; // 登録タスクをひとつ実行
end;

みたいなタスク(アクション)スケジューラを導入したらスパゲッティなイベントの流れがとてもシンプルになった。
今まではイベントハンドラ中からイベントハンドラを呼び出して更にApplication.ProcessMessagesが他のもの呼び出して・・・と依存関係やタイミングに起因するバグの温床になってたのがかなり減りそうな予感。
こういうクラスって既によく練られたものがどこかにあったりする?
Executeイベントハンドラをサブスレッドで実行できるTaskとか作ったらかなり便利になりそうだな。

72:デフォルトの名無しさん
08/03/20 12:42:00
>今までは...バグの温床になってた
この部分の改善方法が分からないようじゃ何使ってもバグだらけでしょう

73:デフォルトの名無しさん
08/03/20 14:14:43
はははは、こりゃセンスなさすぎだ

74:デフォルトの名無しさん
08/03/20 14:37:34
よろしくお願いします。

Form1でメタファイルの元データを作って
Form2上のPaintBox上に表示するとともに
meta.wmfという名前で保存しています。
うまくできていれば、Form2上のボタンを押して
meta.wmfを読み込んで印刷させたいのですが、
procedure TForm2.Button2Click(Sender: TObject);
var
Print_MF:TMetafile;
begin
Print_MF:=TMetaFile.create;
Try
Print_MF.LoadFromFile('d:\gazou\meta2.wmf');
Printer.BeginDoc;
Printer.Canvas.StretchDraw(Rect(10,10,3000,3400),Print_MF);
Finally
Print_MF.free
end;
close;
end;
としても、すぐには印刷されず、Form1も閉じないと印刷できません。
Form1を閉じずにForm2だけ閉じたら印刷するようにするにはどうしたら
いいでしょうか??


75:デフォルトの名無しさん
08/03/20 14:52:05
EndDoc

76:デフォルトの名無しさん
08/03/20 15:56:02
>>71
久しぶりに将来有望そうな奴を見た。

77:デフォルトの名無しさん
08/03/20 17:32:19
> 75
ありがとうございました。
Printer.endDoc
で無事印刷されました..

78:デフォルトの名無しさん
08/03/20 18:07:00
>>70
できました!どうもありがとうございます

79:デフォルトの名無しさん
08/03/22 01:58:26
よろしくお願いします。
TMemoやTRichEditで[CTRL]+[I]キーを押すと、タブ文字が挿入されますが、
この操作を無効にするにはどうすればいいでしょうか?


80:デフォルトの名無しさん
08/03/22 02:43:20
キーダウンメッセージ捕まえてCtrl+Iだったときはデフォルトハンドラに渡さなければいいんじゃね?

81:79
08/03/22 03:51:12
>>80
ありがとうございます。
今回は、キーダウンのメッセージをKeyPress内で捕まえればいいことがわかりました。

ただ、今度はKeyPress内で[CTRL]+[I]の同時押しを判断する方法が分かりません。
どうすればいいでしょうか?

procedure TMemoEX.keyPress(var key: Char);
begin
 if ((getAsyncKeyState(VK_CONTROL) and $8000) <> 0) then//CTRLキー判断
  if (key = 'i') or (key = 'I') then
   key := #0;//↑これだと上手くいかない
end;

82:デフォルトの名無しさん
08/03/22 10:31:34
>>81
Delphi2の記憶で申し訳ないが、
KeyDownには、KeyPressにはないShiftStateがあって
ssCtrlみたいなのを見ればよかったような。

83: ◆XcB18Bks.Y
08/03/22 11:58:06
>>82
私もそれで行けるかなと思ったのですが念のためにテストしてみたら駄目でした。
もし単にタブ文字入力を禁止したいのでしたら
単にタブ文字かどうかを調べてもしそうなら文字を消すようにすればいいと思います。

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
 //// タブ文字が入力されたら取り消す ////
 if Key = #9 then // 9はタブを示す文字コード
 begin
  Key := #0; // #0を代入すると文字入力がキャンセルされる(らしい)
  Beep; // 取り消しとは関係ないけど「おっと、ここではタブキーは無効なんだぜ」とユーザーに伝える
 end;
end;

そうではなくてもし

 [Ctrl]+[I]によるタブ文字入力を禁止したいが[Tab]キーによる入力は許可したい

というのでしたらすいませんがちょっとわかりません。


84:デフォルトの名無しさん
08/03/22 13:55:01
つダミーAction作成

85:デフォルトの名無しさん
08/03/22 16:38:48
FormのOnShortcutで if (Ctrl+Iだったら) then Handled:= trueにするとか

86:デフォルトの名無しさん
08/03/22 20:35:56
>>83
Delphi2で申し訳ないが、
たしかに素直にやろうとしてもだめだった。
で、スマートじゃないのと
winのバージョンでタイミングの問題が気になるが
FlagをたててKeyDownでssCtrlを見ておいて、
KeyPressで
if Flag and (Key = #9) then
としたら、いちおう↓これもできた。
> [Ctrl]+[I]によるタブ文字入力を禁止したいが[Tab]キーによる入力は許可したい

87:デフォルトの名無しさん
08/03/23 15:42:06
Delphi 7ですが、コンボボックスにキーボード入力がわかりません。
itemになかった場合はキーボード入力したいのですが、Styleを
csOwerDrawVaiableとかいろいろ変更してもキー入力できないか
EaccessVilationがでます。今は、itemに項目があってそれを選択する
にはOnChange イベントで取り出しています。よろしくお願いします。


88:デフォルトの名無しさん
08/03/23 16:22:19
まずcsDropDownでダメだったことを詳細に書いて。

89:デフォルトの名無しさん
08/03/23 16:22:32
AutoCompleteはFalse、StyleはデフォルトのcsDropDownに。OnChangeで処理ってのはユーザ入力を
許してる状況ではどうなんだろ?

90:デフォルトの名無しさん
08/03/23 16:29:05
入力化なコンボボックスってかっこ悪い

91:デフォルトの名無しさん
08/03/23 16:51:28
考え方が逆だ。入力するものが選択可能なエディットだと。

92:デフォルトの名無しさん
08/03/23 16:56:20
>>87
Comboboxをただ貼り付けただけでその動作になってると思うんだけど
デフォルトの動作から具体的にどう変えたいって事?

93:デフォルトの名無しさん
08/03/23 19:23:57
皆様、ありがとうございました。
OnChangeで
Case ComboBox1.itemindex of
  1:
  2:
とかしていたのですが、キーボード入力をするとここのところでエラーになる
ようでした。しょうがないので、ComboBox1.textの値で分岐させることに
したら解決?しました。お騒がせしました。
でも、この方法しかないのでしょうか?後学のためにどなたかキーボード
入力も許すとき、どういう方法で選択されたのを知るのが常套手段なのか
教えてくださいませんか?


94:デフォルトの名無しさん
08/03/23 20:00:12
>>93
そのコードだけではエラーになるところが見当たらない
大方-1を考慮してないだけとかそんなだと思うが

95:デフォルトの名無しさん
08/03/23 20:39:44
Vistaのデスクトップは、ctrl+マウスホイールでアイコンの大きさを
自由に変えられるけど、DelphiのListView で同じ様な表現をするには
どうしたらいいんでしょうか?

96:デフォルトの名無しさん
08/03/23 21:20:58
>93
ItemIndexは0から始まる。該当アイテムがなければ-1だ。というか >91 だ。

97:デフォルトの名無しさん
08/03/23 21:33:43
>>93
いまいちよくわかってないんだけど

idx := ComboBox1.Items.IndexOf(ComboBox1.Text);
ってやればTextがItemsの何番目かがわかる。-1ならそれ以外。

98:デフォルトの名無しさん
08/03/23 22:36:31
>>87
onchange呼ばないでonselectでやれ。
それでキー入力はできるだろ


99:デフォルトの名無しさん
08/03/25 15:58:32
delphiで簡単にRSSやAtomフィード作るコンポってありますか?

100:デフォルトの名無しさん
08/03/25 20:24:53
MSXML

101:デフォルトの名無しさん
08/03/25 21:08:47
ミリ秒を時間とか分とか秒とか込みで文字列化する関数ないですか?

102:デフォルトの名無しさん
08/03/25 21:12:13
FormatDate

103:デフォルトの名無しさん
08/03/25 22:48:48
TPageControlの枠を消すにはどうしたらいいんでしょうか?

104:デフォルトの名無しさん
08/03/25 22:52:00
PageControl1.Style := tsButtons;

105:デフォルトの名無しさん
08/03/25 23:00:04
それだと無駄な余白が出来るから
PageControl1.Visible := Falseにして
表示用にTabControl1配置してHeight := 20くらいにして
その下にPanel配置してタブの切り替えのタイミングでで
TabSheet.Parent := Panel1;
TabSheet.Align := aliClient;

と面倒なことをやると枠も余白も消せる。

106:デフォルトの名無しさん
08/03/26 00:57:42
StringGrid := [goRowSelect, goRangeSelect] として、
1〜3行目を選択後に2行目をクリックすると、選択行は2行目のみとなります
これを選択範囲内をクリックした場合、新たに選択せず
選択範囲を維持するというふうにするにはどうすればいいでしょうか?

107:デフォルトの名無しさん
08/03/26 13:24:09
GetIndex('漢a字', 1) => 1
GetIndex('漢a字', 3) => 4
というような関数ありますか?

108:デフォルトの名無しさん
08/03/26 13:33:28
>>107
読解力のない俺はアフォなのか・・・

109:デフォルトの名無しさん
08/03/26 13:44:21
俺もだ。すまん、アフォでごめん。

110:デフォルトの名無しさん
08/03/26 16:04:27
アフォな俺にはこれぐらいしか…
function GetIndex(s: String; i: Integer): Integer;
begin
Result := Length(AnsiLeftStr(s, i - 1)) + 1;
end;

111:デフォルトの名無しさん
08/03/26 16:52:30
2バイトで考えた文字数目が1バイトで考えた時に何バイト字目になるかを返す関数ということでFA?

112:デフォルトの名無しさん
08/03/26 16:53:19
function GetIndex(Str:String; Index:Integer):Integer;
begin
if Str='漢a字' then
begin
 if Index=1 then
  Result:=1
 else
  Result:=4;
end else
 Result:=0;
end;

俺って天才かも!

113:デフォルトの名無しさん
08/03/26 17:21:06
こうか?

function GetIndex( ws: WideString; index: Integer): Integer;
begin
Result:= Length(String(WideString(copy(ws, 1, index-1))))+1;
end;

114:デフォルトの名無しさん
08/03/26 17:35:05
>>107
俺は読めたよ

function GetIndex(test:string;num:integer):integer;
begin
if test = '漢a字' then
begin
if num = 1 then result := 1;
if num = 3 then result := 4;
end;
end;

後は自分で工夫してくれ

115:デフォルトの名無しさん
08/03/26 17:47:45
> 97様、98様
お返事ありがとうございました。試してみたいのですが、来週まで
時間がとれそうもないので、まずはお礼だけさせてください。
また、よろしくお願いします。

116:デフォルトの名無しさん
08/03/26 19:54:12
StringList遅すぎる…
Capacity多めに設定したらそこそこ改善されたけどまだまだ遅い。
Clear, Add, Stringsの列挙くらいしかやらないんだけど代替ライブラリはないものか。
MemoryStreamでも使うか。

117:デフォルトの名無しさん
08/03/26 21:20:57
遅いコード晒せ

118:デフォルトの名無しさん
08/03/26 21:26:48
MemoryStreamを引き合いに出している時点で明らかに使い方が間違っている

119:デフォルトの名無しさん
08/03/26 21:47:26
FastMM使ってなかったら、>>116はメモリマネージャ交換した方がよさそうだな。


120:デフォルトの名無しさん
08/03/26 21:49:55
FastMM って3年前からだよ。それまでStringListって遅かったのか?

121:デフォルトの名無しさん
08/03/26 21:49:57
ほんとにClear,Add,Stringsだけしか使ってない?それで遅いって、100万件ぐらい
データ突っ込んでのかな。


122:デフォルトの名無しさん
08/03/27 03:42:15
TMemoでしたって落ち?

123:デフォルトの名無しさん
08/03/27 08:18:10
自分の無能さをライブラリのせいにするな

124:デフォルトの名無しさん
08/03/27 09:03:40
配列の宣言にpackedがついている場合を見かけますが、これ何か意味あるんですか?

125:デフォルトの名無しさん
08/03/27 09:07:08
メジャーになれなかった理由の一つがまさにこういった事。
比較的多用しそうな事がいまいちで滅多に使わなそうな事がすげー便利。

126:デフォルトの名無しさん
08/03/27 09:29:16
>>124
たとえば3バイトのメンバーを持つ構造体の配列とか?

127:124
08/03/27 09:36:45
>>126

type
 THoge = packed record
  A: array[0..2] of Byte;
 end; // 3バイトの要素を持つ構造体

 THogeArray = array[0..9] of THoge;
 TPackedHogeArray = packed array[0..9] of THoge;
begin
 WriteLn(SizeOf(THoge)); // 3
 WriteLn(SizeOf(THogeArray)); // 30
 WriteLn(SizeOf(TPackedHogeArray)); // 30
end;

違いが分からないんです。

128:デフォルトの名無しさん
08/03/27 09:46:15
配列についているんじゃなくて、構造体についているのよ。
packedをつけないと、アライメントされるかどうかはコンパイルオプションによる。
常にpackedつけておけばOK。

>>127
packedを外してコンパイルしてみ。

129:124
08/03/27 09:50:48
>>128
> packedを外してコンパイルしてみ。

TPackedHogeArrayのpackedをですか?

130:124
08/03/27 09:54:58
THogeとTPackedHogeArrayのpackedを外してみましたが、
出力は変わりませんでした。
ちなみにコンパイラオプションは{$A8}です。

131:デフォルトの名無しさん
08/03/27 09:55:01
>>129
何が起こるか想像がつかないなら、やってみる価値はある。

132:131
08/03/27 10:57:08
ごめん、勘違いしてた。
混ざらないと駄目みたい。 そうなると、packed配列は意味ありませんね。

procedure TForm1.Button1Click(Sender: TObject);
type
 THoge1 = record
  A: Byte;
  B: Byte;
  C: Byte;
 end;
 THoge2 = record
  A: Byte;
  B: Byte;
  C: Byte;
  D: Word;
 end;
begin
 Caption := Format('%d, %d', [SizeOf(THoge1), SizeOf(THoge2)]);
end;

133:124
08/03/27 11:16:28
ありがとうございます。
構造体のメンバのアラインメントは他の言語にもあるのでわかるのですが、配列のpackedは謎です。
VCLのソースの中でも配列の宣言にpackedがついていたりいなかったりで、
何か使い分けがされているような気もするのですが、挙動の違いが分からないので釈然としません。
とりあえずつけておけば問題はなさそうですが・・・

134:デフォルトの名無しさん
08/03/27 11:52:13
>>133
Delphiでしか使わないなら気にしない。


135:デフォルトの名無しさん
08/03/27 15:14:18
Vista対応ってしとく必要あんのかな

136:デフォルトの名無しさん
08/03/27 16:52:40
TTabControlで質問です。

タブを選択した時に、その番号に関連付けられてるオブジェクトが
条件を満たさないときはそのタブを選択させないようにするにはどうすればいいんでしょうか?

OnChangingイベントでいけるかと思ったんですが
これから選択しようとしているタブ番号の取得方法がわかりません。
クリックの時はマウス座標を取得する事でどうにか出来ない事もないんですが、
キーボードの時に詰まってしまいます。

137:デフォルトの名無しさん
08/03/27 20:51:54
Delphiクイックリファレンスによると配列のpackedは標準Pascalとの互換性のためで
Delphiでは何の意味もないそうです

138:デフォルトの名無しさん
08/03/27 21:50:08
StrToIntをAPIで書くとしたらどうなるんですかね?
SysUtilsはあまり使いたくない性分です・・・

139:デフォルトの名無しさん
08/03/27 21:52:42
どう考えても意味不明だろ、それ。

140:デフォルトの名無しさん
08/03/27 21:57:55
>>138
APIは知らんけどSystem.Val

しかしこのスレ無内容な一行レスばっかりだな。彼らは一体何がしたいのか。

141:デフォルトの名無しさん
08/03/27 22:07:38
>>140
こんな関数があるとは・・・
勉強になります
ありがとうございます

142:デフォルトの名無しさん
08/03/27 22:12:26
関数ではなくて手続きでしたね、すみません

143:デフォルトの名無しさん
08/03/27 23:06:08
いやだってSysUtilsは使いたくないって意味不明じゃん。ValもStrToIntも変わらないでしょ。

144:|Д゚彡 ◆A6VzDeLphI
08/03/28 02:16:29
>>107
CharToByteIndex

なんだって。


145:デフォルトの名無しさん
08/03/28 05:27:30
1文字目は1バイト目から始まり、
3文字目は4バイト目から始まるって意味か。

>>138
こんなんでどうだ?(未チェック) 16進数が必要なら自分でやって。

function StrToInt(const Str: string): Integer;
var
 I: Integer;
 P: PChar;
 Minus: Boolean;
begin
 Result := 0;
 Minus := False;
 P := PChar(Str);
 if P^ in ['+', '-'] then
 begin
  Minus := P^ = '-';
  Inc(P);
 end;
 while P^ <> #0 do
 begin
  if not (P^ in ['0'..'9']) then raise Exception.Create('変換エラー'); // EConvertみたいなのあったかも。
  Result := Result * 10 + Ord(P^) - Ord('0');
  Inc(P);
 end;
 if Minus then Result := Result * -1;
end;

146:デフォルトの名無しさん
08/03/28 06:05:11
Result := Result * 10 + Ord(P^) - Ord('0');
ここおかしくない?


147:デフォルトの名無しさん
08/03/28 06:05:56
やべ、スレあげちまった。

148:デフォルトの名無しさん
08/03/28 07:09:17
123の場合、
Result := 0 * 10 + '1' - '0' → 1
Result := 1 * 10 + '2' - '0' → 12
Result := 12 * 10 + '3' - '0' → 123
であってると思うけど。

149:デフォルトの名無しさん
08/03/28 07:43:32
ああ、あってるね。ごめんなさい。


150:デフォルトの名無しさん
08/03/28 09:51:44
+,-,#0の一文字だけのとき、0になるわ。

151:デフォルトの名無しさん
08/03/28 10:01:22
URLリンク(delwiki.info)
この GetInteger10を呼び出してる GetIntegerみたいに好みの仕様を追加したらいいんじゃないの?


152:デフォルトの名無しさん
08/03/28 15:17:15
TreeViewで特定の項目だけVisible:=Falseにできますか?
または代わりの方法があれば教えてください。

153:デフォルトの名無しさん
08/03/28 17:15:01
Canvasにウィンドウ右上の_ □ ×ボタンをレンダリングする方法ないですか?
ビットマップで用意するとテーマの変更に追従できないので。

>>152
たぶん無理。Add/Deleteするしか。

154:デフォルトの名無しさん
08/03/29 00:26:03
>>153
WinAPIのDrawFrameControl


155:デフォルトの名無しさん
08/03/29 10:18:18
DrawFrameControlってテーマに対応してるの?

156:デフォルトの名無しさん
08/03/29 10:37:32
Win32APIだし、内部的にそれらのAPI使ってWindowsはウィンドウ描画してるんじゃ?

てか、それぐらい自分で試せるだろ。


157:デフォルトの名無しさん
08/03/29 10:39:03
いや、テーマAPI別にあるから対応してねぇかも。


158:デフォルトの名無しさん
08/03/29 10:45:44
Win32のスレで聞きな。そっちの方が知ってる人多いと思う。


159:デフォルトの名無しさん
08/03/29 13:26:10
TRegExprでtr演算子の置換をするにはどうすればいいですか?
たとえば「tr/abc/ABC/」見たいなのです
英語とか良く分からないしググッても出ないし・・・
よろしくお願いします

160:159
08/03/29 14:48:57
今頃ですがTRegExprでなくてもDLLを使わないようなものでなければ大丈夫です

161:デフォルトの名無しさん
08/03/29 15:53:24
TRegExprの使い方
URLリンク(delwiki.info)

PCRE使ったの
URLリンク(cc.codegear.com)

162:デフォルトの名無しさん
08/03/29 17:47:55
鬼車ベースのライブラリってないの?

163:159
08/03/29 17:54:41
>>161
> TRegExprの使い方
これを読んでみて分かりませんでした・・・
何かサンプルをいただけないでしょうか

164:デフォルトの名無しさん
08/03/29 18:08:56
ぢゃ日本製使え
URLリンク(homepage1.nifty.com)

165:デフォルトの名無しさん
08/03/30 02:33:50
DirectoryListBox で、今選んでいるフォルダの深さが何階層目かを知る方法ってありますか?

166:デフォルトの名無しさん
08/03/30 02:40:05
それ16ビットUIの名残り。使わない方がいいよ。

167:デフォルトの名無しさん
08/03/30 03:00:55
>>166
そうですか、今後なるべく使わない様にします。
じゃあ、変数に入ってるパスが何階層目かを知る方法ってありますか?

168:デフォルトの名無しさん
08/03/30 04:05:07
デリミタの数を数えるとか

169:|Д゚彡 ◆A6VzDeLphI
08/03/30 04:23:47
URLリンク(delfusa.main.jp)

俺も自作のを使ってしまうなあ。


170:デフォルトの名無しさん
08/03/30 06:13:30
StringReplaceで\を\_にでも変換して、
長さの差を取れば\の数は分かるんじゃないのか?

171:デフォルトの名無しさん
08/03/30 06:19:44
\の数だけだとUNCパスで誤動作するんじゃね?

172:デフォルトの名無しさん
08/03/30 09:42:07
はぁ・・・Del7買ってから出来たものはボタンクリックして画像表示
それから2Dのスクロールと3Dモデルの回転のみ・・・

変数宣言めんどくせー
コンパイラ時に自動作成して後で修正させるようにしてくれりゃいいのに

173:167
08/03/30 10:01:31
>>168-171
やはり文字系で処理するしかないですか
なんかディレクトリの命令であるかなと思ったんで
すいませんでした、なんとかやってみます
ありがとうございましたw

174:デフォルトの名無しさん
08/03/30 10:03:40
ExtractFileDriveしてExcludeTrailingPathDelimiterしつつExtractFilePathできる回数を数える

175:167
08/03/30 11:19:06
>>174
あっ、そういう方法でも出来るんですね
なんか出来そうな感じがしてきました
試しにやってみます、ありがとうございましたw

176:|Д゚彡 ◆A6VzDeLphI
08/03/30 12:03:39
作ってます。
URLリンク(delfusa.main.jp)

function PathLevel(Path: String): Integer;
procedure testPathLevel;

ご参考ください。

こういうのって、つくづく、実装よりも
テストコードが大事って思う。

177:デフォルトの名無しさん
08/03/30 12:06:29
>172
そういうのが苦手な人にはDelphiは向かないのかも。Delphi2007ならリファクタリングで変数宣言を
追加する機能もあるけど、ちょっと違うな。昔のVBなら変数宣言不要なモード(Option)もあった気が。

178:デフォルトの名無しさん
08/03/30 12:55:00
>>177
というかコンパイラって手抜きで進歩無さ杉
変数宣言なんか同じソース上に表示させる意味もなく、プロパティのように別窓か別ファイルでソート可能な表形式で管理・表示でいい


179:デフォルトの名無しさん
08/03/30 13:11:59
BASICでもやってろ

180:デフォルトの名無しさん
08/03/30 13:54:06
そもそもプログラミングに向いてない。

181:167
08/03/30 14:15:03
>>176
WordDecompose.pas 頂きました
色々参考にさせていただきます、ありがとうございましたw

182:デフォルトの名無しさん
08/03/30 16:20:24
ありとあらゆる変数をグローバル変数で宣言しておいたらどうだろう?

183:デフォルトの名無しさん
08/03/30 18:47:34
>>178
IDEの恩恵しか受けたことないとこういう風に育つのか

184:デフォルトの名無しさん
08/03/30 19:10:06
いや、何となくわかる。変数宣言のUI。でもソース上に書くってのに
慣れてるしプログラム書いてるって感じするし、よくよく考えてみると
GUI にするのってローカルだとかナンだとか面倒そうじゃん

185:デフォルトの名無しさん
08/03/30 20:35:28
妄想するだけでで宣言文を書けたらいいのにね。
それは冗談として、アドインで作れないの?

186:デフォルトの名無しさん
08/03/31 00:25:08
GUIで表示や追加くらいなら作れると思うが、
そんなので喜ぶのは初心者だけだし、
そういうのを作れるレベルの人は逆に生産性下がって不要なので
結果として誰も作らないってことになってるんじゃないかと

187:デフォルトの名無しさん
08/03/31 00:39:57
SpeedButtonみたいなのがいくつか5個くらい並んでて、一つは常にへっこんでて、一つを押すと他の全部が上がるってタイプのボタンはどうやってるんですか?

188:デフォルトの名無しさん
08/03/31 00:48:22
SpeedButtonをグループ化するんだ

189:デフォルトの名無しさん
08/03/31 00:54:37
できました。
どうもありがとう!

190:デフォルトの名無しさん
08/03/31 10:50:14
データベースでBlobに入っているバイナリファイルを少しずつダウンロード
したいのですが、良い方法はないでしょうか?
現在TBlobStream.CreateでそのStreamから少しずつ読み込んでいるのですが、
Createメソッドを実行した時点ですべてのデータを読み込んでいるようです。
要は少しずつReadしてプログレスバーにその状況を表示したいのです。
上の方法だとCreateを呼んだところでプログラムが一次停止したようになってしまいます。


191:デフォルトの名無しさん
08/03/31 12:19:44
それについて深く考えたことない事を始めに断っておくけど、
昔調べた記憶と今、ちょっとソース見た感じだと、少なくとも新しい独自のBlobStreamクラスと
それを返すようにADOならTCustomADODataSet,dbExpressならTCustomSQLDataSetの
CreateBlobStreamメソッドをオーバーライドして独自BlobStreamを返すようにしないと
厳しそうだな。

192:デフォルトの名無しさん
08/03/31 12:22:49
まぁ、読み込むBlobの最大サイズは設定できるようだから、それを設定して、
一次停止したようになるのを避けることはできる。根本的な解決ではないが。
それが嫌なら上記の方法以外ぱっと思いつかない。


193:デフォルトの名無しさん
08/03/31 17:29:09
d6perなんですがdialog.pasがC:\Program Files\Borland\Delphi6\Source\Vclに存在しません・・・
ちょっと修正したい箇所があるのですが誰かうpしていただけないでしょうか?

194:デフォルトの名無しさん
08/03/31 19:37:21
そのためのプロ版だ。プロ買え。

195:デフォルトの名無しさん
08/03/31 20:49:51
DBGrid1のOnDrawColumnCellで、DBGrid1の上にUpDownを描くやり方で、UpDownでフィールドの値を変えることにチャレンジしています。

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin

 // DBGridをFColorDBGrid1とFColorDBGrid2の縞々にする。
 if not (gdSelected in State) then
 begin
  if Table1.RecNo mod 2=0 then
  begin
   DBGrid1.Canvas.Brush.Color := FColorDBGrid1;
   DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end else
  begin
   DBGrid1.Canvas.Brush.Color := FColorDBGrid2;
   DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
  end;
 end;

196:つづき@
08/03/31 20:50:48
 // UpDownの描画
 fView := False;
 if gdSelected in State then with DBGrid1 do
 if SelectedField is TIntegerField then
 with TIntegerField(SelectedField) do
 begin

 if Table1.Active then
  updownDBGridInt.Position := Table1.FieldByName('Int').AsInteger;
  fView := true;
 end;
 updownDBGridInt.Visible := fView;
 if updownDBGridInt.Visible then
 if not CompareMem(@oldRect, @Rect, Sizeof(Rect)) then
  with Rect do begin
  updownDBGridInt.Top := Top;
  updownDBGridInt.Left := Left;
  updownDBGridInt.Height := Bottom - Top;
 end;
end;

197:つづきA
08/03/31 20:51:36
// updownDBGridIntのOnChangingEx
procedure TForm1.updownDBGridIntChangingEx(Sender: TObject;
var AllowChange: Boolean; NewValue: Smallint;
Direction: TUpDownDirection);
begin

 if (Table1.Active=true) and (0<Table1.RecordCount) then
 begin
  if not fView then exit;
  AllowChange := DBGrid1.SelectedField.CanModify;
  if AllowChange then
  begin 
  with DBGrid1 do
   if SelectedField is TIntegerField then with TIntegerField(SelectedField) do
   begin

   //Table1.DisableControls;
   Table1.Edit;
   Table1.FieldByName('Int').AsInteger := updownDBGridInt.Position;
   Table1.Post;

   DBGrid1.Refresh;
   //Table1.EnableControls;

   end;
  end;
end;
end;

こうすると、Tableにフィルターをかけてないときは、値の増減ができ、うまくいくのですが、フィルターをかけた場合、UpDownを増減すると、カレントレコードが先頭にいったり、最後にいったり(updownDBGridIntもそれにあわせて移動します)増減できなくなってしまいます。
一般的な話でなくて申し訳ないですが、原因のわかる方いらっしゃいませんか?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4926日前に更新/238 KB
担当:undef