1 :
高島彩 :
2007/04/18(水) 12:42:16
>>
http://pc11.2ch.net/test/read.cgi/tech/1172844367/966 「基礎からわかるDelphi6」で基本的な使い方を覚えて、あとはVCL等を真似して
コンポ作ったり、公開されてるコンポを研究して使いこなせるように試行錯誤。
ヘルプ見てよくわからなかったらググるととりあえずなんかコードが出てくるのでそっから学ぶ。
日本語でなくても英語やロシア語、中国語でそれを使ったコードが出てくることが多い。
最後にHalbow資料館でWinAPIを使いこなせるようになればWindowsでできないことはなくなる。
あとこのスレは非常に役立ちます。Delphiの生き字引がいっぱいいますw
前スレ954です なんとなくDelphiとC++Builderの違いがつかめてきました。 Delphi ・VCLはDelphiで作成されているため拡張が容易 ・Object PascalのコンパイラしかないためBCBのコードは使えない ・BCBよりはメジャーなため、サンプルや インターネットで公開されているコンポーネントは多い C++Builder ・Object PascalとC/C++の両方のコンパイラがあるため C++の記述もそのまま使え、Delphiのコードも取り込める ・Delphiよりも知名度では劣るため、 資料や公開されているコンポーネントは少なく Delphiとは完全に互換性があるわけではないので Delphiで作成されたコンポーネントでソースがないものは 使用出来ない。 そのため使えるコンポーネントは限られてしまう。 といったところでしょうか。 私みたいにC++の知識がない場合は C++Builderを始めてもコンポーネントを拡張する場合は Object Pascalで記述しなければいけないため、 両方の言語を覚えなければならないみたいですので Delphiを始めたほう習得はしやすそうですね。 色々と教えて頂いてありがとう御座いました。
×Object PascalのコンパイラしかないためBCBのコードは使えない BCBやフリーのBCC55でObjを吐かせれば DelphiにリンクしてCのコードも利用出来る 実際、Zlibなんかは objで提供されてるよ
>>6 DelphiでもCのソースは取り込めるんですか。
なおさらDelphiを勉強して損はないですね!
Cのソースは取り込めない。 Cのソースをコンパイルして出来る .objの状態で利用出来る。 ただし、CのCRTが必要になるようなコードを使ってるとCRT自分で用意しないと 利用出来ないので注意。 たとえば浮動小数点演算とか除算とか、
Delphi暦11年の俺も今でも使ってるが、これから始める人にDelphiはすすめない。 働き蜂のプログラマを目指してるならともかく、センスのよいプログラミングに いまや時代遅れなWin32べったりのVCLとか、中途半端なOOPLであるDelphi言語を これからやるなんてあまりにも悲惨。 Python、Java、Ruby、C# なんかのほうがずっとおすすめ。
どれもインタプリタ型だねえ・・まあ今は人も道具も使い捨ての時代だから・・・
.NETとかは起動が遅くなるからイヤなんだけど他にいい言語ある? Delphiは簡単にできて起動も早いから好きなんだけど
誘導ありがと。 せっかくDelphiやり始めたんだしもうちょっとやってみるよ。
すいません。ちょっと話が難しくて わからなくなってきてしまったのですが 特殊な処理をするような場合にCより出力された オブジェクトファイルをリンクして関数を 使用するようなイメージでしょうか。 (VB6でいうAPIを使用する場合にLIBを宣言するような感じ?) 私はまだ入門者なのでまだそれを利用する ことはないと思いますが 慣れてきたころにまた勉強したいと思います。
そんなきわめて特殊なことは、知らないほうが幸せ
別に特殊な処理とか関係ない。 再利用できるというだけ。
18 :
デフォルトの名無しさん :2007/04/19(木) 11:50:42
VBとDelphiどっちが優れてるか教えてください
言語の優劣は使用者の優劣を覆せないから無意味。
自信を持って「Delphiの方が優れてる」とは言えないんだな
D7でOracle9iのBLOBフィールドに保存したBMP画像をDBImageに表示しようとしたのですが TTableを使用するとちゃんと表示されるのにTQueryを使用すると画像の一部分しか表示できません。 SQLは単にSELECT * FROM TABLEで全件SELECTしているだけです。 なにかやり方が悪いのでしょうか。 接続にはBDE5.01を使用しています。
Oracle 使ってるならOracle に聞いた方が速いんじゃない?
Orcale使うならVBの方が相性いいですよね!
それは絶対に無い。 ブビはブビアプリ内でメモリ不足エラーを発生する。 ブビはDBアプリに不向き。
どーも荒らすための自演っぽいな。 次はVBがどーのこーの自演するのだろうか?
28 :
デフォルトの名無しさん :2007/04/19(木) 12:44:58
VBはWin64対応済みですがDelphiは64bitで使えますか?
VBはUNICODE対応済みですがDelphiはきちんとUNICODE使えますか?
せっかくの良スレが……('A`)
平日の昼間から仕事にあぶれたVB厨が沸いてるのか。
>>28-29 なんて普通のDelphiの質問だろ。何で過剰反応してるの?
ヒント:質問の内容に反応してるんじゃない
将来性のない言語を初心者に騙して使わせるのがどこが良スレなの? VBやった方がいいじゃん。
>>24 =25=28=29=34=35
NGWord:VB, ブビ
37 :
デフォルトの名無しさん :2007/04/19(木) 13:55:40
読んでもらう為に「V」と「B」を離してるwwwwwwwww
ブビ注がV B Expressに乗り換えるとはwwwwwwwww
NGWord: V\s*B, ブ\s*ビ
くだらない質問で申し訳ないんですが、 自分で書いていいるクラスから導出クラス(というのかな?)を作る予定がない場合には、 privateもprotectedも同じですか? あと、クラスをdllとかにするつもりがない場合には publicもpublishedも同じですか? 以前自分で書いたコードのはずなのに、見直してみるとなんだか無駄に混在してて、 本当のところはどうなのか気になったので質問してみました。
>>42 えーと予定があるないじゃなくて、守りたい、守らなくて良いのを考えて設計するんですよ?
>>34 正直、言語なんて何でもいいんだが……。
その時によってVBも使うしJAVAも使うしな。
たまたまDelphiを使う時はここで聞くまでであって。
>>42 クラス設計もできないのはDelphi使わないでください。
ユーザーの質が下がります。
>>24 =25=28=29=34=35=37=40=45
NGWord: V\s*B, ブ\s*ビ, ユーザの質
>自分で書いていいるクラスから導出クラス(というのかな?)を作る予定がない場合には、 >privateもprotectedも同じですか? 導出クラスって派生クラスのこと? なら同じだお。 >あと、クラスをdllとかにするつもりがない場合には >publicもpublishedも同じですか? publishedって初期値をdfmファイル持てるってやつじゃなかった?ちょっと自信無い。
>>42 基本的に道具なんで、使い手次第。 好きに使えばいいのでしょう。
実際、自分が作って自分が使う分は、手直ししては必要があれば移動という感じですね。
継承する予定が無いなら 全部privateにして、
後から要求が出てから移動という事でも十分です。
publicとpublishedはDLLの有無ではなく、実行時型情報を使うかどうかという差になります。
列挙型を文字列で列挙したり、文字列から変換したりを
使いたい時に publishedを使うととても便利ですよ
>>49 >列挙型を文字列で列挙したり、文字列から変換したりを
具体例はどんなの?
コンポーネントを作るときにオブジェクトインスペクタに表示 したいプロパティだけpublishedにするのかと思っていた。
>>50 uses TypInfo すると GetEnumName / GetEnumValue
GetEnumProp / SetEnumProp で出来るよ
使い方はgoogleで検索すれば判るでしょ
あと、TObject 直下だと、 published だけでは実行時型情報は作られないので注意ね
詳しい事は
"パブリッシュメンバー"でヘルプ検索してね。
具体例は、 procedure GetEnumNameList(TypeInfo: PTypeInfo; str: TStrings); var i: integer; T: PTypeData; s: string; begin T := GetTypeData(GetTypeData(TypeInfo)^.BaseType^); for i := T^.MinValue to T^.MaxValue do begin s := GetEnumName(TypeInfo, i); if s <> '' then str.Add(s) else break; end; end; として GetEnumNameList(TypeInfo(型名) ,コントロール.Items); で、ドロップダウンに一覧を出して、 SetEnumProp で文字列をそのままプロパティに代入すればOK みたいな使い方
>>53 publishedにあるメソッドの実行って出来るの?
メソッドは published に出来るし、 それを名前文字列からGetMethodPropでメソッドポインタを検索する事も出来る。 簡単なスクリプトなんか作るのに便利だね
Delphi6からTurboDelphiへの移行を考えているんですが(現在は両方インストールして使用中) Delphi6で作っていたプロジェクトをTurboDelphiに移すことのデメリットってどんなことがありますか? とりあえず、貼り付けるタイプのカスタムコンポーネントを使ってると そのコントロールが消えてしまうのは理解しました。 他にもあれば教えてください。 また、.dskファイルにさえ気を付ければTurboDelphiのプロジェクトをDelphi6で編集することも可能だと考えていますが 正しいでしょうか?
Del6でdfmファイル使えなくなると思うよ。 確か、Del7以降からdfmがバイナリからテキストに変った。 バージョンが高い方は両方扱えるけど、Del6がバイナリのみ対応。
>>56 Delphi6→TurboDelphiは、全然可能なはずだけど。
外部コンポーネントをはっつけないようにすれば。
※動的生成に変える
ていうか、消えるのか
>>55 古いバージョンだと GetMethodPropが動かない場合がある
var method:TMethod;
method.Data:=Me;
method.Code:=Me.MethodAddress( 'Hoge');
TNotifyEvent(method)(Self); ここで呼び出し
の方がいいかも
そうじゃないや。 GetMethodProp はイベントを取得する obj.MethodAddress がメソッドアドレスの取得だから
シッタカの気が済んだか
ひといないだろ・・
64 :
デフォルトの名無しさん :2007/04/20(金) 03:22:15
>>18 一般的には、VBプログラマとDelphiプログラマでは、
Delphiプログラマの方が優れていると思われている。
それに、Delphiで作られたアプリの方が良く出来ている。
一般的にはDelphiなんて誰も知らないだろ。
69 :
56 :2007/04/20(金) 13:14:41
>>57 >>58 >>68 ありがとうございます。
他に致命的なデメリットはないようですね
とりあえずDelphi6のプロジェクトをコピーして残しておいて移行して
TurboDelphiでどうにもならない問題にぶつかったら泣く泣くDelphi6に戻ることにします。
>>57 Delphi6でテキスト形式のdfmの読み込み・編集できましたよ。
VBは1.0(US版)の頃から使っている。 Delphiは2.0から使っている。 Delphiは良くできている。優れたコンポーネントも数多い。 良質なOOPの設計方法が自然に身につく。 EXEも軽くて、スピードもまったく問題ない。 DBからゲームまで何でも、Delphi1本でいける。 VBにはウンザリだ。 初心者がVBから入ると、クソ設計が身についてしまう危険が高いと思う。 EXEの動作速度が遅いためゲームは作れず、かといってDBまわりを いじるビジネスアプリにも向かない。 良質なソフトは生き残る。将来を危惧する心配はない。 特に開発環境を選べる職業プログラマ以外の人にはDelphiを オススメする。
そんなVBなんかと比べても・・・ ひどいのよりマシとか言われてもぜんぜん食指が動かん。
VB1ってDOS版の? パッケージは見た事あるけど
VBの話をここですると荒れやすいからやめようぜ
function A(const S: String; P: PChar):PChar; var len, n: Integer; pa: PChar; begin n:= Integer(s); (略) len:= PInteger(n-4)^; pa:= p+len; Result:= pa; とか p:= p+len; Result:= p; end; paやlen/nがローカル変数だけど こんなふうに戻り値に返すのは問題ないですか?
それはおkだけど、 > len:= PInteger(n-4)^; len := Length(s); でいいんじゃない 一々Intergerにしてるあたり何か妙な事やってるのかも知らんけど
>74 DelphiではResult(またはfunction名と同名の変数)は暗黙に宣言されているローカル変数。 function終了時にこの変数の値がfunctionの戻値となる。 というわけで、そもそも > paやlen/nがローカル変数だけど > こんなふうに戻り値に返すのは問題ないですか? という考え方は成立しない。それよりも>75の指摘のとおり、 > n:= Integer(s); > len:= PInteger(n-4)^; はやめとけ。
77 :
74 :2007/04/21(土) 22:11:33
ありがとう Length()はインライン非対応の旧バージョンとで 生成されるコードが変わっっちゃうのがいやんなので。 まあ、気にする程でもないですけど
Lengthって旧バージョンでは関数呼び出しなの?
ハマってしまいました。 Delphi2005で、CDからAUTORUNで実行されるタスクトレイ常駐型アプリを 作成しました。 このアプリは、起動時およびユーザ操作によりウィンドウを表示し、 ウィンドウのOKとCancelのボタン処理の最後で Application.Minimize; を使ってウィンドウを非表示とするようにしました。 このOKもしくはCancelボタンを1回押した後、プログラムを常駐させたまま PCを休止状態にし、その後復帰したらCD-ROMへのアクセスが失敗し、 "External Exception C0000006"が表示されるようになってしまいました。 試行錯誤の結果、ウィンドウの非表示処理を Visible := false; に変更したところ、休止後もCD-ROMへアクセスできるようになりました。 …最小化手続き、休止復帰、CD-ROMドライブと、それぞれ全然関係ない ように思えるのですが、Delphi2005でこのようなIssueがあるかご存じの方は いらっしゃいませんか?
日本でDelphi2005 Personalが出ると聞いたんですが、いつ出ますか?
空耳だろ。ことしはもう2007だし。
>>79 ・AUTORUNで、CDから起動
・常駐
・Application.Minimize;
・休止状態→復帰
これから導き出される答えは・・・
なんだろう・・・ね?
Delphi6で作ったアプリケーションで稀に(条件がよくわからない) 右上の最小化ボタンで最小化するとタイトルバーが残ることがあるんですけど 何か情報をお持ちのかた居られませんか?
84 :
83 :2007/04/22(日) 16:57:27
このタイトルバーは消し忘れみたいな感じで その領域を再描画すると簡単に消えます。
>>83 今まで、Delphi6でアプリ一杯作ってきたけど、そんな症状にあったことがないな。
・グラフィックカードのドライバを最新にする
う〜ん・・・
まあ、タイトルバーが残ったって事は、その裏の再描画指示が出てないのだから Windowsのバグなんだろうな。
87 :
83 :2007/04/22(日) 17:46:25
>>85 >>86 う、うちだけなのか・・がーん。ちょっとショック。
自作のDelphi6アプリ以外ではこの症状をみたことがないので
勝手にDelphi6のせいだと思っていました。
検索しても全然でてこないし、やっぱりうちだけなのか・・
とりあえずOSとかグラフィックボードとかドライバのバージョンくらい書けよ
89 :
83 :2007/04/22(日) 17:58:58
OSはXP pro Sp2 グラボはWinFast PX6600 GT ドライバのバージョンは・・よくわからないけど「6.14.10.7777」だろうか
90 :
83 :2007/04/22(日) 18:01:01
ドライバのバージョンは「7.7.7.7」でした。ドライバファイルのバージョン見てた
Geforceだな。nVidiaのドライバは、最新の派、ForceWare Release 90 バージョン: 93.71 になっとるが、入れてみたらどうか? # Radeonなら、最新入れろとは言えんがw
92 :
83 :2007/04/22(日) 18:23:23
いろいろありがとうございます。 これらの情報を元にちょっといろいろやってみます。 ただ、症状の発生条件がわからないのですぐに結果を確かめられないのがネックですが
俺んところも残ることがある。
ソフトは D5 製で bsNone の上に ApplicationEvents.OnDeactivate で
Application.Minimize;
と
ShowWindow(Application.Handle, SW_HIDE);
とかやってる。
Vista にする前はそんなこともなかったから、OSのせいか、
ソフトの特殊性が原因だとあきらめていたんだが、やっぱビデオカードかな。
カードは、オンボードの nVIDIA GeForce 6150 なんだが、最新ドライバは、
インストールに失敗するんだな。これが。
ttp://www.asusjp.com/mb/vistadriver.html V9.6.8.5 2007/01/30 アップデート
NvidiaDisplay9685_Vista.zip
94 :
83 :2007/04/23(月) 02:52:32
自分なりに再現手順を考えてみました。
Delphiを起動して新規作成。
ボタンを1個貼り付けてクリックイベントを作成する
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to 5 do
begin
Application.Minimize;
Form1.Top := Form1.Top + 30;
Application.Restore;
end;
end;
コンパイルしてEXEを作っておく。
インターネットエクスプローラを起動し以下のページを開いて最大化しておく
http://homepage2.nifty.com/Mr_XRAY/Halbow/Chap08.html 先ほどのEXEを起動し、
インターネットエクスプローラの画面上で、Button1をクリックする。
アプリケーションが最小化・復帰を繰り返しながらちょっとずつ下がっていくが
この時にタイトルバーが残る。
3回ぐらいボタンをクリックしても1個もタイトルバーが残らなかった人は多分大丈夫な人。
うちの環境では3回もクリックすると12個は残像が残る。
95 :
83 :2007/04/23(月) 02:59:43
ドライバも入れ直して、91のやつも入れてみましたがダメでした。 Virtual PCの環境下では再現しないので、グラボやドライバが原因の可能性は高そうです。 それでもDelphi6、TurboDelphiで作ったソフト以外では再現しないようです。
ちゃんと嫁 >OSはXP pro Sp2
rect:=Self.BoundsRect; InvalidateRect(0, @rect, true); Application.Minimize; と、無理やり再描画させたらどう?
Radeonに買い換えると描画も直ってさらに人生が明るくなるよ!
100 :
79 :2007/04/23(月) 10:16:16
>>82 ぜんぜんわかりません><
現象を再現するミニプログラムを作成している途中なのですが、追加条件が
ありました。
・AUTORUNで、CDから起動
・常駐
・Application.Minimize;
★1回以上CD-ROMに対するアクセスを実施
・休止状態→復帰
しかも、★で実行しているCD-ROMへのアクセス処理は、VC6で作成した
DLLの呼び出しで実現されています。
…この現象は一般化できなさそうですので、ここまでとさせていただきます。
お騒がせしました。
101 :
83 :2007/04/23(月) 19:59:18
>>98 procedure TForm1.MyMinimize;
var
rc: TRect;
pWnd, cWnd: THandle;
begin
Application.Minimize;
rc := BoundsRect;
pWnd := WindowFromPoint(rc.TopLeft);
Windows.ScreenToClient(pWnd, rc.TopLeft);
cWnd := ChildWindowFromPoint(pWnd, rc.TopLeft);
rc.Bottom := rc.Top + GetSystemMetrics(SM_CYCAPTION);
rc.Right := rc.Left + Width;
InvalidateRect(cWnd, @rc, true);
end;
こんな関数を作って
TForm1.WMSysCommandと、Application.OnMessageのSC_MINIMIZEの箇所に組み込んだところ、残らなくなりました。
この現象が起こるのはインターネットエクスプローラやHTMLヘルプといった
IEコンポーネント上だけのようなので一概にDelphiのせいだけではないようです。
とりあえず、これでこの質問はクローズさせていただきます。
ありがとうございました。
Delphi使うのって大変だな・・
不具合多し、ウィンドウ構造が特殊、ヘルプが腐ってる、本がない 初心者にやさしいDelphiなんていうのは嘘だな
それぐらいでくじけるやつはいらないね
ドトネトとWin32でDrawコマンドの使い方って違うのでしょうか? Drawが未定義識別子といわれて困っております。
>>106 同じだよ。
WinFormアプリケーションならまた話は別だが・・
Canvas.を書き忘れてるんじゃない?
チクショーまだページ直らないのかよ
>>104 いらないっていうか、このごろは初心者にも相手にされてないけど
>>109 高感度アップしたとかいってたヤツは逃げたのか?
どうでもいいマルチレスですが.
>>57 ,69
●フォームファイル(.dfm)の変化
・〜Delphi 4
バイナリ形式のみ.文字列はShift-JISで格納.
・Delphi 5
テキストファイル形式でも読み書きできるようになり,テキストファイル形式がデフォルトになった.
・Delphi 6
文字列の記録形式の変更
(2バイト文字を実体参照(数値文字参照)で格納するようになった…みたい)
※以後は知りません(すいません)
>>72 初代VBはWindows用です(たぶんWindows 3.1).
最初に開発したのは他社でMSが権利を買ったみたいです.
その後,DOS版のVBが作られました.
DOS用のQuickBASICを元に作られたようで,
BIOS画面みたいな文字ベースのウィンドウアプリを作ることが出来ました.
113 :
デフォルトの名無しさん :2007/04/24(火) 13:04:24
教えてください。 MDIアプリで、 子でファイルを開いた時、 スクロールは表示されるのですが、 スクロールがアクティブならなず、 親のフォームのフレーム(アプリの外枠)を広げたら、 このスクロールがアクティブなるのですが、 ファイルを開いた時から、スクロールがアクティブになるにはどうすればいいでしょうか?
コード無いと手がかりが乏しいが、といってコード書いてといわれて何レスにもコピペされてもアレだから 適当に想像で答えると、 ファイルを開いてるというのは、TListViewか何かを使ってるのかな? で、自動的にスクロールバーが付くのだけど、それがサイズの関係で表示出来ないと だったら 設計時はAlign:=alNoneで余白があるようにしておいて、 実行時に Align:=Clientniしてみてはどうかな
今日、Borland Developer Studio 2006を 8万近くも払って買った俺は恐らく負け組み。 来週からdelphi始めるんでお前らよろしくな!
>>114 ありがとうございます。
それだっ!と思い試したところ、うまくいかなかったです。・・・。orz
子にsoneditを乗せています。
ちょっと外枠をドラックしてやればスクロールがアクティブになるのですが。
何かよい方法があれば、どうかご教授お願いします。
Delphiを始めようと思うのですが、無償版はVer.6だけでVer.7は試用版ですか?
無償版はTurboDelphiが最新
>>119 ありがとうございます、Delphiはじめの一歩を買ってきたんですが、
Ver.6のシリアルがもらえなくて困ってました。
VBみたいなもんですね、これ。
ですです
>>113 何だかよくわからないけど、
TForm.AutoScroll := False;
TSonEdit.HorzScrollBar := True; // 好きな値を入れる
TSonEdit.VertScrollBar := True; // 好きな値を入れる
とか。
>>121 ビジュアル開発環境だからとっかかりはいいでしょう。
上級者になってもVC++に引けをとらないアプリを作れますよ。
問題は会社の存亡だけ。そこが一番問題なんだけどね。
会社はなくてもDelphiは残るのでは。Lazarusという手も。
>>117 >>123 レスありがとうございます。
結局、親と子の間にを入れて消したり付けたりでごまかせました。
.i\ /i < '´  ̄ ヽ __彡ノメノノlノリ〉 \ `ソリ!゚ ヮ゚ノi Delphi for PHPの話はここでいいのかしら? ><(つ!>つ / ,く//_|l〉  ̄ l.ノl.ノ
PopupMenuのMenuItemをクリックして移動させることは出来ませんか?
MDIアプリを作っています。 親フォームから子フォームのsoneditをコントロールしたいのですが、 今日一日ぐぐったのですがまったくもって操作できず、 TMDICHild(MDIChildren[0]).ShowLineNumber := True; TMDICHild(MDIActiveChild).ShowLineNumber := Tuee; などなど と、 このようにするのはわかったのですが、どちらもうまいくいかなく、 どのようにすればアクセスできるでしょうか? どなたか教えてください。
>>131 あー、これです、これ!
メニューデザイナでやっているこれと同じことを
プログラム動作中にしたいんです。
>>133 メニューデザイナはPopupMenuを使っていない。
そういうの自分で作る。
>>134 TMDICHildを子フォームのクラス名(TForm2とか)に変更すれば動くと思う
ふとしたことからDelphiで作成されたソフトで構築されているサイトを 引き継いでいるのですが 鯖をLINUXに移そうと考えています もちろんDelphiで書かれたexeファイルはLINUXで動かせませんよね?
Wineとか特別な事しない限りは。
Winで動かしてる.exeなCGIってことならもちろん動かない。 古いバージョン使ってるならKylixに移植できるかもな。
>>138 >>140 wineとLazarusについてググってみました
これでなんとかしてみようとおもいます
できなかったらフリースペースでもとって他のウインドウズPCで動かそうかと思います
ありがとうございました
>>132 です。
>>135 レスありがとうございます。
それだっ! と思ったのですが、残念ながらTMDICHildがクラス名でした。orz
何か解決さくはないでしょうか? どうかよろしくお願いします。
>>143 一度、その現象が出てくる最小のプログラムでを作ってここでうpしてみ。
>>144 ありがとうございます。 で、できました。
MDIを新規作成して、ツールボタンで
procedure TMainForm.ToolButton13Click(Sender: TObject);
begin
TMDIChild(ActiveMDIChild).Memo1.Lines.Add('test');
end;
で、あっさりできました。 作り変えてみます。
ありがとうございました。
Printerオブジェクトを使って画像の印刷、文字列の印刷、などができるようになりました。 で、よく工場や事務所などで多量の顧客達への領収書やらをガチャコン、ガチャコンと連続印刷してるのを見ますが、 あれって、専用のハード(汎用系?)でないとできないんでしょうか? Delphiで実現できそうな方法があったら教えてください。
専用の用紙とかないと難しいんじゃねーの
必要なのはプリンタと用紙だな 用紙は、複写紙だと、あらかじめ2枚目3枚目に会社名とか印刷しておいた用紙じゃないとダメだしな
>>145 です。
MDIでアプリを作ってます。
>>145 で解決したかと思ったのですが、
>>132 の原因がpanelの上に子フォームを乗せる
Child.Parent := Panel3;
このようにすることで、子フォームを
>>132 の方法で操作できなくなっていました。
Panelをparentした状態で、子フォームを操作する方法はありますでしょうか?
どなたか教えてください。
151 :
デフォルトの名無しさん :2007/04/27(金) 11:17:08
定義されている関数に一発で飛ぶ方法(ショートカットキー等)は ないでしょうか。 ------------------------------------ procedure aaa(); procedure bbb(); ←【※】 procedure TForm1.aaa(); var x : integer; begin x := 1; bbb(); ←【ここにカーソルがある時に】 end; procedure TForm1.bbb(); begin Self.Enabled := True; ←【ここへ一気に飛びたい】 end; ------------------------------------ 「定義の検索」や、[Ctrl]を押しながら bbb(); をクリックすると、 ※の部分に飛んでしまうので・・・。 いつも関数名を検索してひたすら[F3]連打で不便です。 プロジェクトマネージャのような感じで関数が一覧に出ていて、 そこをダブルクリックして飛ぶ形でも構わないのですが、 何か簡単に実コードのところへ飛ぶ方法があれば嬉しいです。 宜しくお願いします。
※の位置に仮に飛んでも、そこから ctrl+shift+↓ で実装部に飛べるない?
>>151 環境をかけ。
Delphi6personal以外ではジャンプ機能が標準で付いてる。
オレはそれらの機能だけのためにTurboDelphiに乗り換えたと言っても過言ではない
154 :
151 :2007/04/27(金) 11:45:11
>>152 そのショートカットキーは知りませんでした。
それで行けました。他に方法がなければこれで行ってみます。
ありがとうございます。
>>153 うっ……焦りすぎて超基本的なことを書いてなかったです。
申し訳ないです。Delphi2005、OSはXP(SP2)です。
欲しいと思っているのは、VB6の
[Shift]+[F2] (現在のカーソル位置にある関数等の定義位置へ移動)
[Ctrl]+[Shift]+[F2] (上で移動する直前の位置に戻る)
と同じ機能です。
>>149 Formの管理下をはなれるんだからあたりまえ。
Componentsでも調べて走査すればいい。
>>155 で、できました。(`・ω・´)
TMDIChild(Application.Components[3]).Memo1.Lines.Add('test');
ありがとうございました。
ネトゲのツールを作成しようとしてパケット関係を調べているのですが 何かよい参考になるサイト等はございませんか?
>>150 サンクスです。
ちょっとあきらめますorz
160 :
17 :2007/04/28(土) 00:51:30
MemChkとかいうモジュールを組み込んでみたところ、 アプリの終了時にいくつかコンポーネント側の メモリリークがあるのでEAccessViolationになるみたい。 だが、どのコンポーネントがリークの原因になっているか までは漏れの技量では掴めない。。。
TForm.Createをするとき、AOwnerに何いれてますか? Self? Application?
Application.CreateForm(TForm1, Form1); とやれば自動的に Applicationになるな
Formを自分でCreateする利点って何かあるの?
リソースの節約とか同じフォームを何個も表示するときとか。
167 :
17 :2007/04/28(土) 14:33:20
>>162 レス、ありがとうございます。
その線で追跡してみます。
168 :
162 :2007/04/28(土) 16:14:35
>>167 TSchItem.Destroyの最後に↓を書くとよいかも?
inherited Destroy;
ちょっぴりマルチですが・・・ Delphiを使用してVBMP3.dllを利用した音楽プレーヤーを作っていたのですが、問題が起きました。 "vbmp3_getState"(以下getState) 関数を使おうとすると、エラーが起きます。 コンパイル時ではなく、getStateを実行するステップに入った瞬間エラーが起きるのです。 元来VB用なのでエラーを出しているのか、私の書き方がおかしいのかもサッパリです。 READMEには"引数 : sec = 再生時間取得用"との記述もありますが、これが何を示すのかもサッパリ分かりません。 再生経過時間を取得する関数に何を渡せばいいのかが・・・ 使用不可能なのか、可能だが私が間違えているのか。 宜しくお願いします。環境は以下の通り 使用DLL : VBMP3.DLL(v1.3.1.0とv1.6.1.5両方で試行) 開発環境 : BorlandDelphi6 Personal この関数の宣言文(これがおかしい可能性大) : function vbmp3_getState(sec:LongInt):LongInt;stdcall;external 'VBMP3';
拡張子書かなくていいの?
まず、そういうの聞くならVBの定義も書いてくれ。 元の定義はこうだ。 Declare Function vbmp3_getState Lib "VBMP3.dll" (sec As Long) As Long LongはIntegerかLongInt相当、これはいいけど、 ByValが付いてないので、参照渡しという事になる。 つまり、これに成功すればSecが書き換わる だから、 function vbmp3_getState(var sec:Integer):Integer;stdcall;external 'VBMP3' あるいは値を返す為だけに使ってるみたいだから function vbmp3_getState(out sec:Integer):Integer;stdcall;external 'VBMP3'
>171 申し訳無い。実を言えばVBの定義すら分からなかった。 ググれば分かるし、ただの言い訳なんだけど。 マジでdクス、解決出来た
>173 恥ずかしい。LongIntの存在を完全に忘れていたもので・・・
恥ずかしいのはマルチしたこと
DelphiでMIDIメッセージを送信してMIDI音源の設定を操作するプログラムを自作しようかと思っているのですが、 Delphiを使ったmidi関係のプログラミングについて解説している参考書で何かオススメはないでしょうか? midiOutなどのプログラミングの基本的な部分から勉強したいので初心者向けの内容のものを探しているのですが、 midi関係のものはなかなか本が見つからないのです・・・
トラックバーのドラッグを解除した時の処理は、どうすれば良いのでしょうか? TrackBarのイベントは全部試したのですが・・・書き方を間違えてるのかな・・・
>>176 Delphiに拘らない事だ。
低レベルオーディオAPIの解説があれば、 他の言語で書かれていてもそのまま利用出来る。
あとMidiの基本は押えているんだよね?
>>177 良く判らないのだが、マウスを放した時の処理なら
type
TMyTrackBar = class(TTrackBar)
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
end;
procedure TMyTrackBar.WMLButtonUp(var Message: TWMLButtonUp);
begin
with Form1 do Memo1.Lines.Add(format('%5d',[TrackBar1.Position])); //単なるサンプルコード
inherited;
end;
////////////////
// 登録してあるものと置き換え
procedure TForm1.FormCreate(Sender: TObject);
begin
ChangeComponent(TrackBar1, TMyTrackBar);
end;
ChangeComponentはここ
http://delwiki.info/?%A5%B3%A1%BC%A5%C9%C1%D2%B8%CB%2F%A5%B3%A5%F3%A5%DD%A4%CE%C9%D5%A4%B1%C2%D8%A4%A8
2つのフォルダ内に同一ファイルがあるか検索をかける処理を教えてほしいのですが。
findfirst findnext
>179 thx、しかし良く分からないな・・・
.
>>182 何をやりたいのか書いてくれればと思う。
・マウスの左ボタンを離した時の処理なら、TTrackBarにはイベントが無いので
それを継承して追加しなければいけない。
一番簡単なやり方が
>>179 だ。 追加コードは
with Form1 do Memo1.Lines.Add(format('%5d',[TrackBar1.Position])); //単なるサンプルコード
の部分。
でも、このままだと、コードで生成して自分で位置あわせとか面倒。
で、貼り付けたコンポーネントと置き換えると簡単なのでそれをするのが
ChangeComponent(TrackBar1, TMyTrackBar);
>183 勉強がてら簡単なプログラムを作ってるのですが・・・そうですね。 WMPの再生位置を変えるツマミ、あのような部品を作りたいのです。 トラックバーを使わない方法もあるのだと思いますが、思い付かなかったのでトラックバーで実装したんですが、 Changeイベントでトラックバーをドラッグして再生位置を変える、と実装したがために再生位置をトラックバーに自動反映する他のメソッドとぶつかって、 再生位置が進むごとにChangeイベントが発生し、再生位置がどんどんずれていくのです。 分かり辛い説明です。すみません・・・
>>184 オレはこんな感じで回避してる
TrackBar1.OnChange := nil;
TrackBar1.Position := (ここで位置変更)
TrackBar1.OnChange := TrackBar1Change;
俺は、主にフラグで回避だな OnChangeで if fGate then exit; と逃げて fGate:=True; try TrackBar1.Position := (ここで位置変更) finally fGate:=false end
>185-186 マジで助かった。解決出来たよ・・・ありがとう
今の今まで同等のコードを書いて使ってたけど IncludeTrailingPathDelimiter 関数という関数が標準であることを今日はじめて知った。 こういう関数の存在はどうやって知ればいいわけ?
>>188 パス関係でヘルプ検索。
それに関係するものを調べれば出てくる。
ChangeComponentいいね
FList : TList; とか変数の命名規則について質問です。 このFって何の略なんでしょうか?ハンガリアン記法とはまた 違うもののような気もしますし…よくわかりません ><
AHogeってのは、Argumentのことじゃないかな… こんな感じで。 function EnsureRange(const AValue: Integer; const AMin: Integer; const AMax: Integer): Integer; overload;
Delphi2007が届いたけど、全く話題になってないな。
>>195 使ってみた感じどう?
D7よりも軽い?
最近はハンガリアンのように型ではなく スコープ毎にプレフィックスをつけるのが流行り。
>>194 すみません(´д`)よく見たら A は Argumet の A みたいでした。
AValue: Integer とか同じような箇所がある時点でArrayではないと
気がつくべきだよ漏れ orz
this is a pen. の a かと思ってた
設計時はD7の方が軽い。 実効速度はあまり差を感じない。 IDEは重いけど、D7に比べると機能が充実してて、結構便利ですよ。
202 :
デフォルトの名無しさん :2007/04/30(月) 05:30:13
ちょっとお聞きしたいのですが、 Application.ProcessMessagesをwith文で挟むと、 [エラー] 未定義の識別子:ProcessMessages となってしまいます。 withを使わなければいい話ですが、もし原因がわかれば教えて欲しいです。
>>202 ん?
with Application do
ProcessMessages;
でやってみたけど正常にコンパイルできたよ。
なにでwithしたの?
おそらくApplicationというプロパティかメソッドを持つクラスでwithしたんだろう。 で、そのクラスのApplicationプロパティかメソッドの戻り値はProcessMessageというフィールドを持ってないんだろう。
205 :
デフォルトの名無しさん :2007/04/30(月) 06:19:37
新規でMDIを開いた時、子フォームにはMemoが付いています。 それをRichEditに変えても別に変化ないのですが、 TEditorに変更したら、切取り コピー 貼り付け が動かなくなります。 Memoの時は、コピー 切取り 貼り付け する関数もなく 動いています。 これはどうしてこうなるのでしょうか?
>>205 TEditCut, TEditCopy, TEditPasteのExecuteTargetで使われてる
GetControlがTCustomEditにしか対応してないから。
(TEditorはTCustomControlから派生してる)
207 :
202 :2007/04/30(月) 06:47:00
204さんの言うとおりでした。orz で、Forms.Application.ProcessMessages と直すことで Applicationプロパティを持つクラスをwithで指定してもエラーが出なくなりました。 ありがとうございます。
あー、DirectXを標準コンポでつけてくれないかなぁ。 そしたら速攻で乗り換えるよ!
>>206 ありがとう
memoとかとは別物なんですね。
ManagedDirctXやっとけ
管理辞書X に見えた俺は…orz
212 :
デフォルトの名無しさん :2007/04/30(月) 13:27:13
よろしくお願いします。Delphi 6 Personalです。 PCのリカバリを行ったあと、DelphiとIndyをインストールして 過去に作ったプログラムを開こうとしたら、 「IdHTTP.MaxLineActionの読み込み中のエラー:プロパティが存在しません」 というエラーが出て、無視して開いても 「異なるSystem.RTL.Versionによりコンパイルされています」 というエラーが出てコンパイルできません。 もしかして自分が過去に使っていたのと違うバージョンのIndyを入れてしまっている というエラーなのでしょうか? そのバージョン等を知る方法はありますか?
Delphi6 RTLアップデート当ててないんじゃないの?
>>213 うわー! それっぽいです!
今から当ててみます! ありがとうございました!
215 :
214 :2007/04/30(月) 14:33:26
喜び勇んでRTLアップデートを落としに行ったら配布終了してました…OTL 検索しまくっても配布されてるページが見つかりません。 どこかで再配布は行われていないでしょうか?
NS Lookupかけたら「www.borland.co.jp」だといわれた・・どういうこと? www.borland.co.jp指定でアドレス移動するとsupport.borland.comにすっ飛ばされるんだが・・
218 :
214 :2007/04/30(月) 14:47:19
>>216 すごい! ありがとうございます。入れてみます。
自分、検索ヘタなのかな…
Del6は非公式パッチも山ほどあるし再セットアップはほんと泣ける
ListBox1.Items[1] := ''; とすると、エラーが出るのでしょうか。 先ほどからListBoxの処理でエラーが出てるのですが、どこがおかしいのか分からなくて・・・
>>220 ListBoxに行が2行以上あればエラーにはならない。
コード晒せ。これだけの情報でどこがおかしいのか指摘するのは無理だ。
221の言う通り、行がないのでエラーになってるキガス。 エラーメッセージを晒せ。 行が無い場合、ListBox1.Items.Add(''); で。;
223 :
222 :2007/04/30(月) 18:14:18
ふと思ったんだけど、もしや1行目に何か既に文字が入っていて、それを消そ うと思ってる? その場合、1行目は[0]なので、ListBox1.Items[0] := '';になるお。
1行目代入して、2行目以降すっ飛ばしていきなり10行目を書き換えようとしてた・・・ ありがとう、解決した気がする
itemindexとかcount使わなきゃ危ないよ
226 :
214 :2007/04/30(月) 21:37:02
delwikiに手順が書いてあった気がする
大変だな・・・いちいちネット検索しないと満足に使えない環境・・・
FORTRANならネット検索しなくても使えるのにね
RTLのバージョンが違うだけならIndyを再構築すれば問題ないと思うけど
http://i-get.jp/upload500/src/up2879.png こんな感じの見た目ソフトについて質問です
○とか☆がボタン代わりとして動作する予定です
これを作るために画像を用意し
イベントを受け取るのはどうにかなりそうなんですが
透過したい部分をどうすれば設定できるのかがわかりません
どこらへんの情報を探せばよいのかわからず困っております。
どうすれば良いかご存知の方教えていただけませんか?
232 :
デフォルトの名無しさん :2007/05/01(火) 10:19:00
新規でMDIアプリを開いて、 ファイルを複数開いて、ウィンドウ 水平に並べて表示 と 垂直に並べて表示 クリっくで、 3ファイルまでは並ぶのですが、4つ以上になると乱れます。 どうすれば正常な状態に設定できますでしょうか?
>>231 透過する部分は マウス座標のピクセルを見て透過色なら無効にすればいいのでは?
透過する部分に別のボタンがあるなら、そっちに再度メッセージを送らねば
>>232 水平に並べるのって、どういうコードでやってるの?
MDIは流行過ぎてしまって最近やらないから
>>232 それは仕様です、としか言いようがないけどな。
別にDelphiに限らず、どのMDIも同じ動作をするもんだが・・。
どうしても気に入らないなら、自分でコードを書くしかない
ドッカブルなマルチタブをきっちり実装してるのが一番使いやすいな。
>>233 >>232 どうもです。
ただ気持ち悪かったので使用なら仕方ないです。
MDI流行ってないかも?しれないけど、
MDIが当たり前に付いてるご時世なのでMDIでいきますう。
238 :
デフォルトの名無しさん :2007/05/01(火) 19:19:21
procedure incint(var n: integer); begin inc(n); end; function incint(n: integer): integer; begin result := n + 1; end; といった引数を変更するものと戻り値で返す2つの関数を作る場合 一般的VCL的な命名ってありますか? (上のコードはただの例で無意味なものです)
>>238 自然に付けたら違いが出ると思うのだが、
たとえば、
increment は 参照渡しには適当だけど、下の例には違和感がある。
あと、同じような処理するならどっちかに統一した方がいいと思うよ
>一般的VCL的な命名ってありますか? ない
>>226 RTLアップデートだけど
先に#2入れてから#3入れた?
これ順序正しく両方入れてないと駄目よん
indy君は
indyって、ただインストーラを実行すれば使えるんですか? 正しい順序で入れてるのに使えないです。このあと何か作業が?
超初心者です。 プログラムの画面にテキストボックスがあって、 そこに y=x^2+2 等と入力すると その関数のグラフが描画されるというプログラムは簡単に作れますか?
>>243 作れる
けど簡単かどうかはあなた次第では?
'x^2+2' -> '0.5^2+2' -> 2.25 に変換するような電卓コードはそこら辺に転がってるから拾ってくればよし。 あとは Image1.Canvas.Pixels[0..Width-1, 0..Height-1]の領域と グラフの(-2, -2)-(2, 2)とかを相互変換するコードを書いてプロットしていけばよし。 グラフ描くだけならPowerCalcで十分って話もあるが。
>>233 TransparentColor,BorderStyle,bsNone,WMNCHITTEST
あたりを触ったらうまくいきました
ずっとAlphaBlendに引っ掛かって躓いておりました。
イベントの受取は画像を透過させた時点で自動的に解釈してくれるようです
Versionは 6.0 Personal Build 6.240 です。
ありがとうございました
248 :
243 :2007/05/02(水) 08:58:29
ちょうどFunctionViewに似たようなアプリを作りたいのですが、 こういうソフトは内部でテキストボックス内の数式をコンパイル(?)して、 数値計算部分も自分で作っているのでしょうか?
通常DLLのApplicationってnilみたいなんですが、 このときApplication.ProcessMessagesは違反なんでしょうか。
>>248 再帰下降のコードならそう難しくないよ。
浮動小数点?
>>249 DLLの呼び出し元もDelphiなら Application変数に親のApplication変数を入れてやる
そうじゃないなら、誰かがメッセージループを回してくれないと困る事になる。
誰も回してくれないなら自分で回さないといけない
そりゃ nil のオブジェクトのメソッドは呼び出せないだろうさ
某MLにはDLLのApplication.HandleにEXEのApplication.Handleを 代入してあげればいいようなことが書いてありましたが、 これだけではだめなんですかね。
Application 変数がnilでなければソレでいいけど nilならソレではダメだ uses Controls があればApplication 変数のインスタンスが作られている筈だけど DLLの場合 バージョンが古いと initialization が呼ばれていないのかもしれない でも、exe側にAppication変数があるなら代入した方がいいんじゃないのか?
>>254 俺もDLL作ったことがあるけど、Application.Handleの代入なんてしたことないよ。
何を作ってて何ができなくて困ってるの?
それを書かずに「これだけではだめなんですかね」と言われても・・
確かにDLLは自作アプリ用に使う事はあんまりないし DLLに必ずVCLが必要な設計にすると他のツールでDLLを作って貰えない事にもなる。 何かのアプリのプラグインとかを作るなら、まずは作ってみて それでメッセージループが回ってないとか、回ってるけど欲しいメッセージが飛んで来ないとか の問題が出たら、しょうがないから自前でスレッドたてて回すしかないけどさ
Application.ProcessMessages は、メッセージループとは直接関係ないよ。
259 :
243 :2007/05/02(水) 21:04:13
>>250 浮動小数店ではなく、固定の予定です。
再帰下降でぐぐってみます。
再帰下降だろうがなんだろうが、数式評価は2,3日がんばればできるとか、 そんなに簡単じゃないよ。
>>260 ヴィルト先生の本なり、コンパイラの作り方の本なり読めばすぐ出来ると思うが
「超初心者」 「簡単」 は人それぞれ感じ方が違うからな ほかにも Delphiは超初心者だがプログラミングは玄人 簡単だが半年程度の期間を要する作業 とか
>>242 使える
RTLアップデートすると当然RTLのVer.が変わるから
そのあとにIndy入れる
元からIndy入れてて違うVerのIndy入れたいなら、
Indy関係をすっぱり消してから違うの入れる
ポトベタで使わないなら単にソースの場所を指定するだけでもOK
なんだけどねぇ
Vistaでインストーラだと問題あるのかもしれんけど
数式入れてグラフ描きたいんだろ。平方根とか三角関数とかめんどくさそう。
平方根は x^(0.5) で計算出来るだろ
三角関数は
>>253 のなら簡単に追加出来るから、やりかた書こうか?
いやだから、GikoBasic と何とか猿とかを使うのがいちばん実用的。ってことを 言いたいわけ。再帰下降でうんぬんは、初心者じゃ事実上無理。
そりゃゼロから書くのは無理でも、 サンプルになるコードがあるんだから、それみて ステップ実行させたりしてコード追いかければ判るだろ 1文字先読みと、演算子の優先順位を付けるために関数を別け、 優先する演算子が右側にないか見て貰うために上位の関数を先に呼ぶこと。 演算子を見つけたら関数のローカル変数に保存しては再帰してゆく事 こんだけだ
270 :
デフォルトの名無しさん :2007/05/03(木) 01:49:16
271 :
デフォルトの名無しさん :2007/05/03(木) 03:16:01
TstringlistでObjects[i]の値がなぜかnilになってしまいます。 こういうことあるんでしょうか?
基本的にNil
273 :
デフォルトの名無しさん :2007/05/03(木) 03:36:07
objects[i]を変更した直後に確認するとnilでないのすが、違うところで確認すると nilになってるみたいなんです。 何かが悪さしてるのかなぁ。 ありがとうございました。
274 :
243 :2007/05/03(木) 08:14:55
三角関数と対数のやり方も知りたいです。
275 :
デフォルトの名無しさん :2007/05/03(木) 09:54:17
>>274 http://www.hamada-masahiro.com/products/default.aspx にある EasyGraph がソースコード付きで公開されている。
これは Delphi4 で開発されているが、俺の持っている Delphi5 では実行した
ときに
「不正な浮動小数点演算命令」
の例外が発生する。原因は unit EGUtils で定義されている TPairPoint 型(実
数の座標の対)にあるらしい。TPairPoint を自分流に書き換えればいいだろう。
当然これを使っている unit EGScreen も適切に書き換えればOK! 全体として
Delphi 初心者にはとても参考になるコードだと思われる。
WideStringってUTF8の事なんですか? C#の文字列と一緒? あとAnsiPosやTStringListのWide対応版ってないんですか?
WideStringってUTF8の事なんですか? ==> いいえ 16bit単位の入れ物です C#の文字列と一緒? ==> いいえ あとAnsiPosやTStringListのWide対応版ってないんですか? ==> 探すより作りましょう
277ではないが・・・ 279をさっそくDLさせてもらいますた。 家帰ったら試してみるお!
UTF8は文字のエンコードの種類で WideStringは文字列を保持する変数の型 AnsiStringはUTF8の文字列を保持できないが WideStringならUTF8の文字列を保持することが出来る。 で、あってる?
表示できないけどね
つかAnsiStringからの代入時に自動で文字コード変換までするのに ただの入れ物呼ばわりはねーだろ。 まるっきりの嘘ではないけど説明が雑すぎ。 まずはWideStringの説明読んでおくといい。
type UTF8String = string; で stringは for WIN32の場合 AnsiString だから AnsiStringはUTF8の文字列を保持できない というのは間違いかもね。
285 :
243 :2007/05/03(木) 15:13:52
みなさんありがとうございます。 頂いたURLにあるソースコードを見て勉強してみます。
286 :
デフォルトの名無しさん :2007/05/04(金) 01:17:29
MODALなShowMessageに似た機能はないでしょうか? デバッグで使うためにDelphiを一時中断させたいのです
ShowMessageでいいじゃn
288 :
286 :2007/05/04(金) 01:57:34
ひょっとしたら私がmodalの意味を間違えたかもしれないのでやりたいことを具体的に説明します。 TForm1.ApplicationEvents1Idleでループ毎にストップさせたいです。 そこで文字の表示と流れの中断が同時にできれば便利だと思い modalな機能=Delphiの処理を中断してくれるものという認識で質問しました。 ShowMessageをTForm1.ApplicationEvents1Idleループの中で使ってみると 次々とポップアップするのでこれはmodalじゃないなと勝手に思っています ・TForm1.ApplicationEvents1Idleループを中断できる ・中断する条件を決められる(例えばif文によって) ・再開できる といった機能を求めています 私の認識ではそれはModalなものであればよいという認識だったので先の質問になりました ブレークポイントでは毎回止まってしまうので機能不足です デバッガの機能も探しましたが条件にあうものを見つけられませんでした よろしくお願いします
>>288 ブレークポイント設定したら、赤丸右クリック。
或いは
if hoge then
Beep; // この行にブレークポイント
>>289 右クリックしたところブレークポイントが大変高機能だとわかりました
条件を指定して望みのタイミングで処理を止めることができました
まことにありがとうございます
ようするに OnIdle を呼ばないModalループがあればいいのね。 ShowMessage()に相当するAPIのラッパ関数があったはずだ。それつかえばいい。
Delphi の無料版をダウンロードして使ってみたのですが、 TChartは最新版では無くなってしまったのですか? 代用できるコントロールはありますか?
293 :
292 :2007/05/04(金) 16:26:12
TChartを何とか探し出してみました。 それで質問なんですが、 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart; type TForm1 = class(TForm) Chart1: TChart; Series1: TPointSeries; procedure FormCreate(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} function Func(x: double): double; forward;
294 :
292 :2007/05/04(金) 16:26:53
procedure TForm1.FormCreate(Sender: TObject); var x, y: double; i: Integer ; begin x := -5.0; i :=1 ; // グラフを描く while x < 5.0 do begin y := Func(x); x := x + 0.1; Chart1.Series1.XValue[i]:=x; Chart1.Series1.YValue[i]:=y; i:=i+1 end; end; function Func(x: double): double; begin Result := x * x; end; end. このようにコーディングすると、Series1が未定義というエラーになってしまいます。 上で定義しているはずなのですが、場所が間違っているのでしょうか?
>Chart1.Series1. ~~~~~~~~
296 :
292 :2007/05/04(金) 16:39:16
>>295 早速ありがとうございます。
type
TForm1 = class(TForm)
Chart1: TChart;
Chart1.Series1: TPointSeries;
procedure FormCreate(Sender: TObject);
このように変更すると、
':' が必要ですが '.' が見つかりました.
となってしまうのですが、何故でしょうか?
>>296 使い方が間違えているからだろう。
Chart1.Series1.XValue[i]:=x;
↓
Series1.XValue[i]:=x;
と、Chart1を外すべきだったろ
298 :
292 :2007/05/04(金) 16:54:54
>>297 修正してみました。
今度はリストがインデックスの範囲を超えているというエラーが出てしまいました。
何か初歩的なミスをしているみたいです。
299 :
292 :2007/05/04(金) 17:11:47
すいません、 リスト"の"インデックス"が"範囲を超えているでした。
それは報告してるの? それとも、質問なの? それとも、ヘルプ付いてないの? MaxValue プロパティは,リスト内の値の最大値を返します。 新しいポイントが系列に追加される際,TChartValueList オブジェクトは MaxValue,MinValue および TotalABS プロパティを計算します。 これは,XValues,YValues などのすべての系列の値リストに適用されます。 TChartValueList.RecalcMinMax メソッドを呼び出すと,MaxValue,MinValue および TotalABS の値を再計算します。
301 :
292 :2007/05/04(金) 17:49:05
>>300 質問しているつもりでした。
手始めにx^2のグラフをプロットしてみようと思ったのですが、
みなさんならどのように組みますか?
普通は PaintBox をフォームとかパネルに貼り付けて OnPaintに with PaintBox1 do begin x:=0 : Canvas.MoveTo( x , Height-x*x ); for x:=1 to Width do Canvas.LineTo( x , Height-x*x ); end;
自分でデバッグできないなら辞めちまえ
>>292 はこの調子ですべてのコードを誰かに書かせる気か?
他の言語はやったことあるけど Delphiは初めて触ります、みたいな初心者臭がする。 ま、そんな人のためのくだすれなんだけど
306 :
292 :2007/05/04(金) 18:19:02
>>302 このコードで描けました
何かものすごく遠回りしたけど一気に解決しました。
後は何とかなりそうです。
307 :
デフォルトの名無しさん :2007/05/04(金) 21:19:55
タブブラウザでTabControlとかTabSetってやっぱり使えないよな?w
309 :
デフォルトの名無しさん :2007/05/04(金) 22:10:11
よろしくお願いします。 Delphi 6 Personalです。 メインのフォームが出てる時、タスクバーに表示されている名前を 変える方法は、コンパイルのオプションでアプリケーションのタイトルを 変える以外にないでしょうか?
procedure TForm1.Button1Click(Sender: TObject); begin Application.Title := 'aiueo'; end;
311 :
309 :2007/05/04(金) 22:19:07
>>310 ありがとうございます。そういう方法でタイトルを変えることもできるんですね。
では、タイトルを変えずにタスクバーに出る文字だけを変えることはできないでしょうか?
>>311 ??
タイトルはForm1.Caption
タスクバーの文字はApplication.Titleじゃ納得できない?
>>311 その質問は意味不明だよ。
タスクバーの文字列以外 Application.Title は見えないだろ
314 :
309 :2007/05/04(金) 22:29:05
>>312 あ、なるほど! そうですよね。やってみます!
コンパイルのオプションでアプリケーションのタイトルを設定するのって project1.dprに Application.Title := 'タイトル'; が追加されるだけだろ?
316 :
309 :2007/05/04(金) 22:35:41
みなさんありがとうございました。無事できました。 Application.Titleという名前が、なんとなく大層な感じなので 触れてはいけないような気がしてただけでした。
>>151 ショートカットではないのだが、
GExpertsの Procedure List は使っとけ。
Ctrl+Gに割り当てて使ってる。
インクリメンタル検索できて、一発で関数に飛べるのに便利だよ。
GExperts: Programming Tools for Delphi and C++Builder
http://www.gexperts.org/index.html >>173-174 > 質問者からのコメント投稿日時:2007/04/28 18:21
>
> 締め切ります。
「 締め切ります」じゃねーよww
解決したら、解決策も向こうに書いておけよ。
せめて、このスレの該当レスにリンク張るとかよw
向こうの回答者はどういう気持ちか考えろ。
遅レスすぎないか
あるあるwwwwwww 「自己解決しました」とかw どうやって解決したか書いとけよwwwwwwww
__________ ∧,,∧ / 自分で質問した事について ミ ,,゚Д゚ミ < まとめを書いて ∬ (し, ミ_と)_ \ アップする /且 /||  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ || ̄ ̄ ̄ ̄ ̄|| さすれば、より成長できるでありましょうね。
( ) ( ) ( ) ∧=∧ ポゎ〜 ミ*゚Д゚彡 | ̄ ̄∪∪ ̄| | ┼─┼ .| | /\ .| | / ホ \| \____/ └─┘ ところで、質問、よろしいっすか〜 相変わらず漏れは、EmEditorPluginで、激しく楽しく文字列処理を行っているのですが (なじみのエディタに追加する文字列処理が、Delphiコードで書けるってのは、 素敵に心地よいものです) ソート処理として 通常の辞書ソート、、、は、CompareStringW で、やってていいんですが 数値でソートということもやりたくなってきました。 漏れの考えている数値でソートっていうのは ABC1DEF ABC2DEF ABC10DEF という順番で並ぶソートなのですが
( ) ( )
∧=∧ / ここで、ちょっと疑問が。
ミ,,゚Д゚彡∩ <
| ̄U ̄ ̄ ̄.| \
| ┼─┼ .|
ある文字列中に含まれているものから
数値を抽出するコードが悩ましいのです。
ABC+123.567DEF、から、+123.567を抽出したいし
ABC.567DE123F、から、.567と、123を抽出したい。
function(文字列): Extendedの動的配列;
という処理を書きたいのですが
『+-0〜9.,』(カンマ3桁区切りも数値として認識させたいから)
これらの文字を数値として認識し、
文字列から複数抽出するという
コードを、スタックマシン
>>270 参照
で、導き出したいと思ってます。
....誰か、こーいうコード、書くの得意で
教えるのも得意で、漏れにいろいろヒントくれる人
いませんですか....GWのパズル遊びがてら気分で。
・・・・なんか専門学校の宿題っぽいんですけど(w
EmEditorでは、辞書ソートPluginと数値ソートPlugin、
どちらも公開しているんですが
ソースは特に読んだことないっす。(C++だろうから(w
324 :
デフォルトの名無しさん :2007/05/05(土) 00:12:16
てかDelフサギコってまだいたのかよwww かなり懐かしいなwwwww
>>323 ほいほい、20年ほど前にFORTHで遊んでたおっさんが来ましたよ
GWはもうすぐ終わりだね
そこで言うスタックマシンって再帰的な構造の文字列(リンク先ではhtmlのタグのネスト)
を解析するために使ってるんだろ、
君が作りたいものに当てはめるのは、無理がないかい?
ぃょぅ、久しぶり!
そなの。FORTHで遊んでましたですか。素敵ですね。
再帰系には使えないの?スタックマシン。
いちおう、そのリンク先のコードはDelphiで置き換えられるくらいの理解はしたんだが、
応用がまだねえ。奥が深いわね、文字列パーサーは。
例えば
あいうえお2007/05/20
かきくけこ2007/4/30
こういうものも、日付順にソートするために
[2007][5][20]と
[2007][4][30]を、抽出したいんだよ。
できるかしら。
Regular Expression(Riue ちゃんの正規表現講座) - Index
http://www.sixnine.net/regexp/index.html 正規表現はここの内容で理解して、ページ自体はすばらしくわかりやすくていいんだけど
正規表現、それ自体が、
なんか、嫌いなんだよね。使えそうで使えなさそうで、わけわかな記号の嵐で
可読性の低いあたりが、、、
今回の件で使えるなら、教えてくださればうれしいっすー。
328 :
325 :2007/05/05(土) 02:26:08
>>327 >再帰系には使えないの?スタックマシン。
そうじゃなくてね、再帰的だからスタック使うわけで
君のやりたいことは再帰的じゃないでしょ?ってこと
頭からサーチして抜き出すだけじゃん
スタックマシンとか言ってるけど、リンク先の話はスタックを利用した
アルゴリズムであって、スタックマシンじゃないよね
ちなみにはじめのPascalコンパイラはスタックマシン用に実装されたそうだ
そのときのヴィルト先生の教え子の一人がフィリップ・カーンだったとか
pcodeインタプリタも仮想スタックマシンだったし、スタックマシンとPascalは縁が深いね
>>327 2007/05/20を
(\d)/(\d)/(\d)
で
$1…2007
$2…05
$3…20
が格納される。
正規表現は是非覚えるべきかと。
一日あれこれ試してたらすぐにある程度は使いこなせるようになるから。
ウインドウ右上の最小化ボタンをクリックした時の処理はどう記述すれば良いのでしょう?
>>331 Application.Minimize;
>>327 Ruby なんかだと、正規表現で、
"ABC+123.567DEF ABC.567DE123F".scan(/[+]?\d*\.?\d+/).to_a.each {|s| puts s.to_f}
みたいに一発でかけるんだが、Delphiだとちと面倒じゃの。(そんなに変わらんか)
334 :
その1 :2007/05/05(土) 03:12:49
ローカル変数(procedure内でvarした)のPItemはDisposeしなくていいのでしょうか。 ローカルだしいいのかな。 type { リスト が保持するデータ } PItem = ^TItem; TItem = record Item: pointer; { データへのポインタ } Prev, { 前のデータ } Next: PItem; { 次のデータ } end; { 双方向線形リスト } PList = ^TList; TList = object { private } Name: String[255]; Head, { データの先頭 } Current, { 現在のデータ } Tail: PItem; { 最後のデータ } { public } constructor Init; destructor Done; procedure Add(Item: pointer); function Get: pointer; procedure Rewind; procedure Delete(IndexN: Integer); procedure Swap(IndexA, IndexB: Integer); procedure Insert(IndexN: Integer; Item: Pointer); end; . . .
335 :
デフォルトの名無しさん :2007/05/05(土) 03:14:25
>>334 場合によりけりです。
Createして、責任があるのなら、Disposeすべきだし
参照しているだけなら、しなくてよい。
ローカルかどうかかは関係がない。責任の有無の問題。
336 :
その2 :2007/05/05(土) 03:14:56
{ A行目とB行目を入れ替える } procedure TList.Swap(IndexA, IndexB: Integer); var ProvA, ProvB, Prov: PItem; a, a0: Integer; begin New(ProvA); New(ProvB); New(Prov); Current := Head; if Current <> Nil then { リストが空でないなら } begin a0 := 1; if IndexA > 1 then { 2行目以降なら } begin for a := 2 to IndexA do { A行目まで進めて } begin if Current <> Nil then begin Current := Current^.Next; a0 := a0 + 1; end; end; end; if a0 = IndexA then begin ProvA := Current; end; end;
337 :
331 :2007/05/05(土) 03:17:22
言い方が悪かったのかな・・・訂正します。 ウインドウ右上の最小化ボタンをクリックした時に実行したい処理はどう記述すれば良いのでしょう・・・ 最小化をクリックしたらタスクトレイに格納する、という処理をしたいのですが・・・
338 :
334 :2007/05/05(土) 03:18:09
>>335 早速のレス感謝します。
Disposeしちゃうと遠隔操作でグローバルのデータ消しちゃったことになるのでしょうか。
339 :
その3 :2007/05/05(土) 03:19:36
// Current := Head; if Current <> Nil then { リストが空でないなら } begin a0 := 1; if IndexB > 1 then { 2行目以降なら } begin for a := 2 to IndexB do { B行目まで進めて } begin if Current <> Nil then begin Current := Current^.Next; a0 := a0 + 1; end; end; end; if a0 = IndexB then begin ProvB := Current; end; end; // prov^.Item := provA^.Item; provA^.Item := provB^.Item; provB^.Item := prov^.Item; // {これをコメントアウトしないとエラーになる。 Dispose(ProvA); Dispose(ProvB); Dispose(Prov); } end;
>>337 フォームの最小化ボタンはTForm1.WMSysCommandで
タスクバーのメニューから最小化を選んだときはApplication.OnMessageで
それぞれSC_MINIMIZEの時の処理を書く
341 :
340 :2007/05/05(土) 03:27:19
procedure TForm1.WMSysCommand(var Message: TWMSysCommand); begin if (message.CmdType and $FFF0 = SC_MINIMIZE) and (Application.MainForm = Self)then begin (処理) end; inherited; end; procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); begin case Msg.message of WM_SYSCOMMAND: case Msg.wParam of SC_MINIMIZE : (処理); end; end; (処理)は関数化しておくと楽。
タスクトレイに格納したいんだろ。質問がそもそも見当ちがいだが
TApplicationEventsコンポーネントをフォームに追加して
OnMinimizeイベント内にSelf.Visible := Falseの1行を追加すればOK
但し、フォームサイズが最小化された時全てにおいて発生するから
フォーム右上の最小化ボタンを押されたときだけにしたいなら
>>341 が書いてるようにSC_MINIMIZEを捕まえる必要があるが
>>323 >>327 なんでソレでスタックマシンだの正規表現が出てくるのかわからん。
やりたい事はあくまでも2つの文字列の比較だろ?
2つの文字を示すポインタか、2つの文字のストリームを
順に比較していって、双方が数値になったら比較するという処理になる。
ポインタでやるのか、ストリームでやるのか、どっちが好きなんだ?
>>336 その場合、 Newしてるのが間違い。
ProvA := Current;
ここでポインタが書き換わってしまっているので、
New(ProvA); した実体はポイント先が無くなり つまりメモリリークしてる
>>339 で Dispose(ProvA); したのは、 New(ProvA) した実体ではなく
ProvA := Current; で代入された リンク内の実体になってしまっている
>>322 まず、
ABCDEF
ABC DEF
ABC DEF
ABC 1DEF
ABC 01DEF
ABC01DEF
ABC10DEF
の場合、 どういう順に並べたいの?
まず空白を
文字に含めるのか、
数字に含めるのか、
あるいは文字や数字よりも順位を下にしたいのか
XPのエクスプローラのファイル名順と同じようにしたいんじゃないか?
正規表現覚えるより性技表現を覚えた方がいい人生になるよ
>>347 という事は
1、文字より数字が小さい
2、空白は文字
3、数字が連続していれば数字として比較
という事だね
4、数字において 01 と 1は同じ 5、01と1のように同じ数字が続いた場合は次の文字列で比較される 6、最後まで同じなら、なぜか文字列が長い方が小さいとなる こんなところか?
正規表現は使えなきゃ駄目だろ・・・ プログラミング以前にさ・・・
>>322 それは、普通に文字列を順に比較していって、両方が数字の時だけ
数字として切り出して比較するという処理でいいわけで
もしかして
AnsiChar なら
if (src[si] in['0'..'9']) and
(dst[di] in['0'..'9']) then begin と書けるけど
WideCharだとメンドクサイという話?
353 :
336 :2007/05/05(土) 10:45:29
>>345 レス感謝です。
なるほど、
なんでもかんでもNewすればいいというものではないんですね。
Newをコメントアウトしてみました。
コンパイルすると警告で「初期化されてない可能性があります」と出ます。
実行してTList.Swapを試みると、ダイアログで「書き込み違反がありました」と出ます。
現状ではNewだけいれてDispose無しの状態で実行していますが
これのせいでメモリにポインタ領域がたまりまくってしまうのではという心配があったので
質問しました。
他の手続きではNew無しで実行できているのもありますし、もうすこし研究してみます。
ありがとうございます。
>>353 Newを外してエラーが出るのは、その手続きに問題がまだあるから
リストの個数が十分にない場合とか、リストの参照が得られずに交換されてしまう
355 :
336 :2007/05/05(土) 14:22:02
>>354 作ってみてわかったんですがこれってAとBを入れ替えるだけです。
作りたかったのはBの位置にAを挿入(B以降は1ずつずれる)する手続きだったので
Bの位置にInsertして元の位置のAをDeleteするという方法でやってみようと思います。
うまくいけばそれらを1つの手続き(or関数)としてまとめらると思いますし。
ありがとうございます。
>>355 ええと、AとBを入替えるだけなら
Item へのポインタだけを入れかえる、今のスタイルの方がいいよ。
ただ、双方向リストで、何番目という情報を渡すのはどうかと思う。
俺なら
Type TAPItem = record arrays: array of PItem; end
function GetArrays: TAPItem ; // 現在のリストをアレイに固定する
という関数を用意して処理するけどね。
357 :
336 :2007/05/05(土) 15:27:32
>>356 ご親切、感謝します。
function GetArrays: TAPItem; についてですが、
今の私には運用方法がいまひとつ掴みかねるので
この方法は設計に取り入れられず申し訳ありません。
InsertとDeleteでなんとか組み立ててみました。
全てを関数内部で処理できていないのでややスマートさに
欠ける感じはありますが、InsertとDeleteは何回かのテストで
安心できるレベルでしたのでこちらでいこうとおもいます。
やはり双方向リストはインデックスで追跡することが
難しいですね。
GetArraysの方法も勉強します。
ありがとうございます。
generics 使えるとといとも簡単なんだがなぁ・・いまだ対応してないし
リスト構造の事? 336さんが嵌ったのはリスト構造の部分じゃなくてポインタについての部分。 この段階で理解せずにリスト構造使おうとすると、 Delphiは高級言語といっても今の基準からいうとローレベルな言語だから、 基本は自分で押さえないと、仮にgenerics あっても使えないのは C++と同じ事情になるだろう
ポインタなんかはgenericレベルじゃ意識しなくて済む。データ構造のアルゴリズムを 型セーフに継承できるから、項目の型を意識しなくてすむし、キャストも必要なくなる。
>340,343 マジ感謝。 学校で勉強させられてるのがcobol(笑)だから、こういう言語はどうにも不慣れで・・・
>>360 まあ、Delphiが唯一提供してるgenericである 動的配列だけで、なんとか後5年はガンバレるさ
363 :
デフォルトの名無しさん :2007/05/05(土) 18:31:57
> Delphiが唯一提供してるgenericである 動的配列だけで kwsk
そんな簡単に釣られるなよ。
mp3ファイルなど名前をリネームすることはできるんですが… wmpで表示される タイトル、アーティスト、アルバム、ジャンルなどの各要素を delphで任意に書き換えるにはどうすればよいでしょうか? 是非、ご教授よろしくお願いします
TFileStreamを使えば可能です。 なお、 タイトル、アーティスト、アルバム、ジャンルは ファイルの先頭にある場合と、ファイルの一番後ろにくっつけられてる場合があります 検索キーワードとしては RIFF ID3タグ
367 :
331 :2007/05/05(土) 20:05:36
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject); begin Self.Visible := False; TaskTrayMini1.SetIcon(KIND_ADD,Application.Icon,Form1.Caption); end; procedure TForm1.Undo1Click(Sender: TObject); begin Application.Restore; end; procedure TForm1.ApplicationEvents1Restore(Sender: TObject); begin Self.Visible := True; TaskTrayMini1.SetIcon(KIND_DELETE,Application.Icon,Form1.Caption); end; TaskTrayMiniと言うコンポーネントを使って、最小化をしようとした時にタスクトレイヘ、 元の大きさに戻す時にタスクトレイから消去という処理をこう記述しているのですが、 2回目以降の最小化で、何故かタスクバーから消えずタスクバーとタスクトレイ両方に表示されると言う現象が起きてます。 頼りっぱなしですが、宜しくお願いします。
>>367 Application.OnMinimizeはApplication.Minimize後に呼び出されるんやけど
Application.Restoreの実装の都合上、
Application.Minimize後にMainFormを非表示にした場合は
Application.Restoreを呼び出す前に、MainFormを表示状態に戻しとかなあかんみたい。
だから367のコードの場合
procedure TForm1.Undo1Click(Sender: TObject);
begin
Self.Visible := True; // ←追加
Application.Restore;
end;
にしとくと望みどおりに動作する、はず。
配布されてるDelphiの実行ファイルが、どのバージョンのDelphiで 作られたものか見分ける方法はないでしょうか?
知ってどうしたいの?
>368 解決しました。thxです。 ヘルプとグーグル先生だけでは限界があるなぁ・・・
>>366 とても参考になりました
ありがとうございます!
以下改めて質問です
kensaku_moji ←検索キーワード
honbun ←キーワードが含まれるか調べる任意の文字列
AnsiPos('kensaku_moji',honbun);
この時
任意の文字列にNull文字が含まれるか調べる場合
kensaku_mojiはどの用に設定したらよいのでしょうか
自分が考えたのは
'',ord(0),#0
なのですがどれを使うのが良いのでしょうか?
これが良いorそんなんじゃできないよ
どうぞ教えて下さいorz
※使用目的はID3タグの各要素の終端を調べる処理です。
(ファイルの各要素がもしNUll文字を含むならNull文字の1文字前までをCopy()したいのです)
質問がありますが、自己解決しました。 ありがとうございました。
375 :
デフォルトの名無しさん :2007/05/06(日) 06:22:35
>>372 AnsiPosは#0が入っているとそこで検索を打ち切る筈
だからヌル文字は終端として扱えばいいので考慮する必要はない
なお、
'',ord(0),#0
の3つでヌル文字なのは 3番目の#0だけ 。他の表現は char(0) とか AnsiChar(0)
またPChar型の変数からstringにコピーすると、ヌル文字を終端として打ち切ってくれるし
stringからPCharに型変換すると#0が付いてる
だから
文字列SにNUll文字を含むならNull文字の1文字前までをCopy() する処理は
S:=PChar(S); と書ける
つまり、 type TID3v1=packed record Signature: array [0..2] of Char; { Should be: 'TAG' } Title, Artist, Album: array [0..29] of Char; Year: array [0..3] of Char; Comment: array [0..29] of Char; Genre: Byte; end; var tag:TID3v1; var s:string; tag.Signature:='TAG'; tag.title:='abcdef'; s:= tag.title; length(tag.title) --> 30 を返す length(s) ----> 6 を返す 文字列型に代入した段階で、ヌル文字までのサイズになる
378 :
デフォルトの名無しさん :2007/05/06(日) 11:24:11
手持ちにDelphiのVer3、4、5、6、7、2006があります。 けっこうVer7をつかっていたのですが、最近不安になることがあります。 2006をいれたとき、7は消去しました。まだ大丈夫だと思うのですが、 何回も消去して再インストールすると認証しなくなるそうですね。 リナクスをマスターしようと思って何度もパーティーションを切ったりして OSごと再インストールを繰り返したので、もう10回ぐらい再インストールを 繰り返しました。後何回ぐらい大丈夫でしょうか? それから、5までは認証がないので5を使い続けるのもありかと思いますが BDEを強制インストールするのが嫌でたまりません。どうしたらいいでしょうか。
LinuxなんてVMPlayer+Ubuntuでも使っとけよ。 インスコするならHDD別にしてBIOSのブートデバイスで選択・起動がお勧め。
380 :
378 :2007/05/06(日) 11:27:50
私のマシンは富士通のノートパソコンでPenM1.7Ghzです。 メモリは1.5GBフル装備にしました。でも2006は起動が爆遅です。 マシンは当面買い換えることができません。もうすこし軽い環境と いうことでturboを考えていますが、2006と同居できないそうで、 アンインストールするのも認証問題であまりしたくないし。 どんなものでしょうか?2007がお勧めでしょうか?
>>378 CodeGearに電話しれ。回数リセットしてくれるから。
>>378 それは、ボーランドに聞いてみたらどう?
俺はD7の登録キー方式でそこまで複雑な管理が出来る筈が無いと思っているから聞かないが、
心配なら自分で確認すればいい。
383 :
デフォルトの名無しさん :2007/05/06(日) 11:42:44
>>280 2007は軽いらしいがどうだろう?
だれか、2007使っている人いる?
起動だけなのかな?
>380 Turboは別に軽くない(はず)。スタートメニューからたどってBDS2006のなかにC++Builderとか Delphiとか単一のパーソナリティのみのショートカットから起動することで若干軽くなるみたい。 Delphi2007は起動とか動作とかD7なみと公称しているが、まだ導入していないんで不明。 アクチの回数については確か10回で、Borland(CodeGear)のアクチ窓口に電話してリセットしてもらえる。
386 :
デフォルトの名無しさん :2007/05/06(日) 14:44:43
TBitmapの画像をTImageのDrawメソッドでコピーしたら、 TImageに設定していた透過色が有効でなくなってしまいました。 透過色はTImageのもののままで、TBitmapの画像をコピーするにはどうすればいいんでしょうか?
TBitmap を Draw する直前に、TBitmap の Transparent も True にしたら、無事透過できました。 m(_ _)m
388 :
デフォルトの名無しさん :2007/05/06(日) 14:59:22
389 :
386 :2007/05/06(日) 16:30:01
>>387 どなたか存じ上げませんが、TransparentをTrueにしたらできました。
ありがとうございました。
390 :
378 :2007/05/06(日) 18:02:44
>>379 〜
>>384 レスポありがとうございます。
アクチは10回ですか・・・。
CDケースについていたIDと現在の登録キーをTELすればよろしいですかね。
ボーランドのメールマガジンを解除しようと思ったら。アメリカのサイトに
飛ばされて、なんと現住所や勤務先名まで入力せよとのご命令。
あなた、最初の登録ではメールアドレスと名前と自分で決めたパスワード
だけだったやん。いやばい、米国からこれ以上スパムメールがくるのは・・・。
391 :
デフォルトの名無しさん :2007/05/06(日) 18:52:38
>>390 そうなん?
登録してるけど、メルマガとか一度も来たことないよ
むしろ、郵便物とか送ってほしいのにバージョンアップ時しかこねえし
おれはバージョンアップのお知らせさえ来なくなった。だから、以後絶対購入しないことにした。
393 :
378 :2007/05/06(日) 20:39:41
>>391 福岡の人間なのに東京のセミナーやカンファレンスの招待が
よく来ますよ。登録はTurboPascal6が最初だったかな。
Delphi1からもまめに登録しているからかもしれませんね。
というか、メール送っていい?って、登録のとき、問い合わせが
ありますよね。あのオプションたしか、デフォで「送る」だったと思う。
起動の早さからVC++に浮気しようかと思うこのごろ(最近MFCに目覚めた私)
394 :
デフォルトの名無しさん :2007/05/06(日) 21:02:07
_____ /::::::::::::::::::::::::::\〜プーン /:::::::::::::::::::::::::::::::::::::::\〜プーン |:::::::::::::;;;;;;|_|_|_|_|〜プーン |;;;;;;;;;;ノ∪ \,) ,,/ ヽ〜 |::( 6∪ ー─◎─◎ )〜 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |ノ (∵∴ ( o o)∴)〜 < 最近MFCに目覚めた私 | ∪< ∵∵ 3 ∵> \_____________ \ ⌒ ノ_____ \_____/ | | ̄ ̄\ \ カチャ ___/ \ | | | ̄ ̄| カチャ |:::::::/ \___ | \| | |__| |:::::::| \____|つ⊂|__|__/ / |:::::/ | ̄ ̄ ̄ ̄| 〔 ̄ ̄〕
395 :
378 :2007/05/06(日) 21:23:12
>>394 せめてAAは女にして、一応 私は
お ん な
せめて隔離スレでやれ
_____ /::::::::::::::::::::::::::\〜プーン /:::::::::::::::::::::::::::::::::::::::\〜プーン |:::::::::::::;;;;;;|_|_|_|_|〜プーン |;;;;;;;;;;ノ∪ \,) ,,/ ヽ〜 |::( 6∪ ー─◎─◎ )〜 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |ノ (∵∴ ( o o)∴)〜 < ずっとpascalしかできないオレ | ∪< ∵∵ 3 ∵> \_____________ \ ⌒ ノ_____ \_____/ | | ̄ ̄\ \ カチャ ___/ \ | | | ̄ ̄| カチャ |:::::::/ \___ | \| | |__| |:::::::| \____|つ⊂|__|__/ / |:::::/ | ̄ ̄ ̄ ̄| 〔 ̄ ̄〕
398 :
デフォルトの名無しさん :2007/05/06(日) 21:39:07
ネカマ隔離スレ
∧ ∧ レスありがとう
ミ ゚Д゚彡
〜ミ,,,,uuミ
>>328 さん
そうか、、、この場合は別に再帰的じゃないっすね。
ページで紹介されたやり方全部がスタックマシンかと
思ってしまったけど
第6回 上手なアルゴリズムの見つけ方:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20070313/264703/?ST=develop&P=2 Forthの例が出てる。これがスタックマシンか。
>>329 さん
すげーー、、ありがとう。参考にする!
>>320 さん
…んーーっと、、、カレンダー日付は適当に例で出しただけで
テキストエディタのソート機能だから
全然、予測不可能な文字を数値認識してソートするのですが
抽出出来るかなあ。
正規表現...ほんと嫌いなんだよなあ...
おかげでPerlも嫌いで...あんまりよくないと思うけどね。
>>333 さん
をーー。これは確かに言語機能としてすごいね。
こういう所、Delphiでも正規表現が標準で取り込まれて欲しいね。
たぶん、Delphiチームの人間も正規表現とか嫌いなんだぜ(w
違うかな...
だから進化が止まる?
>>344 さん
双方が数値になったら比較するという思考を俺もしてたんだが
どうにも限界がくるんだよね。
ABC+123DEF
ABC123DEF
ABC123.4DEF
ABC-123.4DEF
こうなってくると、人間はすぐわかるけど
実装すると、非常に大変でないかな。
だから、まず文字列から数値を切り出す。って方向で考えてみてるんだ。
TListのSort関数として実装するから
S1, S2:Stringに対して
-1と0と1とで値を返せばいいように実装するつもり〜
>>346 さん
んーーーと、、んーーっと
ABC DEF
ABC DEF
ABCDEF
まず、これは辞書順にしたい。数値が含まれないという理由。
ABC1DEFとABCDEFは、どっちが先かはどっちでもいいや。
数値が含まれる系の以下のものは
んとんと...これは難しいな...
ABC 1DEF
ABC 01DEF
ABC01DEF
ABC10DEF
スペースは無視するとしてよいのでこうかな。
>>349-350 さん
そそそ、そやそや!というか、まあ・・・
数字としては、先頭の+と-、
数値内のカンマやスペース、
小数点としてのピリオド
あたりも実装出来れば、すっげ〜〜〜、
ってな感じなのですが、贅沢っすかね?
>>351 さん。はいすいません。
>>352 さん、むぅ〜〜、2文字列を比較しだすとですな..
ABC 123DEF456GHI
ABC123DEF457GHI
この2つのことに頭を悩ますことになってくるのですよ。
...しかし、スレが流れるのが恐ろしく早い...みんな、素早いレスありがとん。
∧ ∧
ミ,,。_。彡
〜ミ,,,,uuミ
∧,,∧ まあまあ ミ,, ;彡 あんまり ミ ミつ AA使ってあらさんでも ミ〜,, ミ ∪ ∪ 餅つけよ ついつい、ホットゾヌで透明アボーンしちゃったじゃないか... ア レ ∧,,∧ エ? ,ミ ゚Д゚彡 ミ ∪ ミ〜,, ミ ∪ ∪ まさか、漏れの2chカキコミ人生すべてを自己否定?!
403 :
328 :2007/05/06(日) 23:16:44
>>401 君の想定している数値文字列の定義をBNFかなんかで書き出してみ
そしたら、開始と終了条件はおのずと明らかになるはず
あとは文字列の先頭からサーチして開始を検出したら終了まで切り出せばいい
つか初心者スレでコンパイラコンパイラ言ってる奴はもう少し説明の仕方を考えたほうがいい
_________
∧,,∧∩ /
ミ,,゚Д゚彡 < がんがれ! >>漏れ
ミつ旦.ミ \
@ミ ミ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∪''∪ そしてありがとうございます。
>>328 さん
・ 数値切り出しロジックは
[+-,.0〜9スペースタブ]を使って
・ これが文字列中に入ってきたら、数値認識処理開始
スタックに数値と思われる文字を載せていく
・ 数値認識処理の場合
・ スペースやタブは無視(スタックにつまない)
ただしカンマの前後にスペース、タブは許容しないので
数値認識処理終了
・ ,も無視(スタックにつまない)
・ 初回時以外に+か-が出現すれば数値認識処理終了
・ +-以外で最初には0〜9か.がこなくてはいけない。
・ .が2回出現すれば数値認識処理終了
・ ,が連続して出現すれば数値認識処理終了
・ スタックに積み重なった数値文字列と思われるものを
Extended変換して数値なら数値として認識させる
こんな感じでございましょうか!
とりあえずメモだけ書いてみましたが
今日はもう寝ませんと....すません。
文字列解析を自由自在にする。ってのは、漏れの長年の夢で...
そのわりには、大変正規表現は嫌いでという屈折してて...
おやすみなさい。
今回のフサギコは妙に必死で痛いなw
俺は嫌いじゃないぜこういう奴
まあ正規表現を覚えろとw VBScript_RegExp_55_TLBを取り込めばDelphiでWSHの正規表現ライブラリ使えるよ。 Jane派生はこれでゴリゴリ文字列を弄くってるはず。
>>405 一文字づつ読み出す関数を getA,getB として書いていけばいい
A:=getA;
B:=getB;
一方が数字列で、片方がそうでないなら、大小比較はそこで決着が付くのだから
先頭から比較していって、数字列同士の場合だけ 数値として比較すればいい。
A in ['+' , '0'..'9'] とは書けないので、検索関数を作っておこう
if FindCharW( A , '+-0123456789') and FindCharW( B , '+-0123456789') then というように書けるようにね。
スタックに載せなくても、数値は何10桁も普通はならんので、
切り出した数字は文字列変数に加算してゆけばいい
"." の個数は数えていけばいい
文字列から数値の領域を切り出すのは 1、文字列から切り出す関数を作る。 ・ 既に比較してしまった文字列を削除して渡す ・ 切り出した文字列を返す ・ どこまでが数値だったかも返す 2、TStringStream を渡して切り出す関数を作る ・ 現在文字を判定しては 1文字先読という方式で作る ・ 切り出した文字列を返す、 ・ Streamのポインタは次の文字位置を示させる と色々考えられるけど、2か、2のエッセンスである1文字先読みできるだけのクラスを作る方が応用が利く
>>410 便乗レスですが、
1の方法はよく使うのですが、2の方法はやり方もよくわからないですし、
有効な場面も思いつきません。
そこら辺をご教示していただけませんですか?
2の方法は、再帰下降とかの手法を使う時に便利なのと この手法で作ったものを組み合わせて使う場合に便利
2の方法はヴィルト先生の教科書に出てるね
現在文字 と 先読みするだけのクラス では悲しいので、それにメソッドを追加する TMyStringW = class private str: WideString; rdPos: Integer; public constructor Create(wstr: WideString); function NowChar: WideChar; //現在の文字 procedure Next; //次の文字 function ChkChar(s: WideString): boolean; //strのどれかの文字なら真 function GetNumStr: WideString; //数字が続く間 function UnCorresponds(s: WideString): WideString; //strのどれかの文字でない文字が続く end; constructor TMyStringW.Create(wstr: WideString); begin str := wstr; rdPos := 1; end; procedure TMyStringW.Next; begin if rdPos <= length(str) then inc(rdPos); end; function TMyStringW.NowChar: WideChar; begin if rdPos <= length(str) then Result := str[rdPos] else Result := #0; end;
//現在文字が strのどれかの文字なら真 を返す比較関数 function TMyStringW.ChkChar(s: WideString): boolean; var i: Integer; c: WideChar; begin c := NowChar; Result := True; if c=#0 then exit; for i := 1 to length(s) do if s[i] = c then exit; Result := False; end; //現在文字がstrのどれか、または終端の直前までの文字列を返す function TMyStringW.UnCorresponds(s: WideString): WideString; begin Result := ''; while not ChkChar(s) do begin Result := Result + NowChar; next; end; end;
function TMyStringW.GetNumStr: WideString; var DotCnt, sepCnt: Integer; begin DotCnt := 0; sepCnt := 0; Result := ''; if not ChkChar('+-0123456789') then exit; Result := NowChar; next; while ChkChar('.,0123456789') do begin case NowChar of #0 :exit; '.': begin inc(DotCnt); if DotCnt >= 2 then exit; Result := Result + NowChar; next; if NowChar=',' then exit;//ドットの後のカンマは終端 end; ',': begin inc(sepCnt); if sepCnt >= 2 then exit; next; if NowChar='.' then exit;//カンマの後のドットは終端 end; else begin sepCnt := 0; Result := Result + NowChar; next; end; end; end; end;
上のクラスを使って 比較関数は function CompNumW(A, B: string): integer; var strA, strB: TMyStringW; cA, cB: WideString; dA, dB: Double; begin strA := TMyStringW.Create(A); strB := TMyStringW.Create(B); result := 0; try while (strA.NowChar <> #0) and (strB.NowChar <> #0) do begin if strA.ChkChar('+-0123456789') and strB.ChkChar('+-0123456789') then begin dA := StrToFloat(strA.GetNumStr); dB := StrToFloat(strB.GetNumStr); if dA <> dB then begin if dA > dB then Result := 1 else Result := -1; exit; end; end else begin Result := ord(strA.NowChar) - ord(strB.NowChar); if Result <> 0 then begin if Result > 0 then Result := 1 else Result := -1; exit; end; strA.next; strB.Next; end; end; finally strA.Free; strB.Free; end; end;
1の方法は ・ 既に比較してしまった文字列を削除して渡す この時点で、メチャクチャ遅いだろ。コピーを渡すわけだから。1MB の中に100個 検索文字列がランダムにあったとしたら、平均して500k x 100 = 50MB の コピーが生じる。2の方法は逐次的に再帰下降していくので、検索文字列自身以外の コピーを作成しなくていいので速い。
Javaをちょっとかじってdelphiも駆け出しなのですが delphiにはstaticなクラスは定義できないのでしょうか。 Singletonなパターンをどうやって実装したらいいのか よくわからないのでお教えください。
>>419 class function xxx
だったかな
>>419 InitializationでCreateしてFinalizationでFreeしたら?
static なクラスは定義できないはず。 Delphi でも Clipboard や Printer は、ほんとは singleton にすべきなんだよね。 デフォルトのオブジェクトでなく。
コード上で音量を変えるにはどうすればいいですか? >サンプル: "RE:ボリューム(音量)を変える【訂正】"Delphi FAQ一覧 >サンプル蔵. FDelphi FAQ 16番会議室「玉石混淆みんなで作るSample蔵」に ↑ ググってもリンク切れでみつけられませんでした・・
426 :
デフォルトの名無しさん :2007/05/07(月) 11:33:42
よろしくお願いします。 今、文字列を渡して文字列が返ってくるdllの作成に挑戦してみたのですが、 dllを呼び出す側のPublic宣言に function hoge(pHuga: Pchar): Pchar; stdcall; external 'Project1.dll'; と入れたところ、「メソッドまたはプロパティ定義の後にフィールドを定義することはできません」 というエラーが出てコンパイルできません。書き方は合ってそうな気がするのですが、 どうしてエラーが出るのでしょうか?
んなもん、Delphiに用意されてるTParserクラス参考にすればいいだろ。 字句解析なんてコンパイラの初歩の第一段階だぞ。 エディタコンポーネントで強調表示をカスタムする場合には必須だろうが。 SynEditやTEditorのパーサークラス見てみろ。
>>426 クラスのメソッドに解釈されているという事は、
class 〜 end の間に書いてるんじゃない?
単なる関数として定義するなら、定義部では extern は書かずに、実装部に書かないとね。
windows.pas を参考にしたらどう?
>>428 レスありがとうございます。どういうことかまだわかりませんが、調べてみます。
単独のメソッドをインポートエクスポートしたいようには見えないので、 public宣言ではなく implementation に移動すれば解決するように思うな。 クラスをインポート・エクスポートしたいならCOM作るか パッケージ作るか
>>426 要するに書く位置を間違えているんじゃないの?
432 :
デフォルトの名無しさん :2007/05/07(月) 12:11:54
>>419 Delphiの定番Singletonパターン(VCLでも使われている)
interface
function Hoge: THoge;
implemetation
var FHoge: THoge;
function Hoge: THoge;
begin
if FHoge = nil then FHoge := THoge.Create;
Result := FHoge;
end;
initialization
finalization
FreeAndNil(FHoge);
433 :
426 :2007/05/07(月) 12:40:02
ありがとうございます! やっぱりわからなくて戻ってきましたが、 implementationに移動したらできました。 定義部じゃなくて実装部に書くっていうことなんですね。 「宣言しなきゃいけない」という言葉にとらわれてPublic宣言に入れてました。
436 :
423 :2007/05/07(月) 17:43:00
>>424 >>425 ありがとうございます。
学校いってたのでお礼が遅れました。
DDDDなどのコンポを使うと簡単にできそうですが・・
なんとかAPIかDirectSoundのヘッダーファイルだけで自分でできないか研究してみます。
Sound関係のアプリを作ってみたいんです。
>>433 いや、interface部でもいいはずだよ。
クラス宣言内に書いたらアカンてこと。
439 :
423 :2007/05/07(月) 18:05:20
>>437 わお、英語サイトですね。
3流私大の俺がかろうじて読める感じです。
基本的にusesにヘッダファイル名を入れて、該当関数を探して呼べばおkですかね?
まだボトペタしか使ったことがないし、APIとやらを直接使ったことないんですが、疲れてるし頭使うんで今から昼寝して夜中にとりかかってみます。
どうもありがとうございます(チュッ
Formの任意の場所に文字を表示するにはどうすればよいのでしょうか? TLabelを使えば簡単に出来るのですが、これを直接Formに表示する方法が知りたくて・・・。 以上、よろしくお願いします。
OnPaintイベントハンドラでCanvas.TextOut
>>441 レス、ありがとうございます。
頂いたヒントを元に頑張ってみたいと思います。
・・・ヒント?
Delphi 6 Personal と Indy10.1.5を使っています。 文字列をURLエンコードしたくて検索してみたのですが、 「DelphiでURLエンコードをするには、HTTPAppに含まれるHTTPEncode()を使う」 「HTTPAppはPro版以上にしか入ってない」 ということがわかりました。 Personal版ユーザに使えるURLエンコード方法は無いでしょうか? Indyやjconvert.pasを使えば何とかなるかと思ったのですが、よくわかりませんでした。 よろしくお願いします。
ようするに先頭から見ていって、怪しい文字を w:= w + IntToHex(ord(s[i]), 2) else w:= w+ s[i] とやるだけだから自前で作ればいいじゃない
>>444 Indy入れたのなら HTTPApp.pas ってついてこなかったか?
少なくともTurboDelphiにはついてきてるが・・
447 :
444 :2007/05/07(月) 19:56:39
>>445 何かすごく難しいことを言われてる気が…
>>446 いえ、ついてきてないみたいです。Indyのフォルダにもありませんでした。
448 :
447 :2007/05/07(月) 20:11:49
>>444 ごめん。Indyに付属するものじゃなかったんだな。
一応「Delphi URLEncode」で検索したらそれらしいのがいくつか出てきたが
これらじゃ不満なの?
すみません。448は446です
450 :
444 :2007/05/07(月) 20:17:03
>>444 漏れもDelphi6 Personalで、インストールしているIndyのバージョンは9.0.18だけど
IdURI.pasに、こんなのがあったので参考にどうぞ。
procedure TForm1.Button3Click(Sender: TObject);
var
IdURI: TIdURI;
Str: string;
begin
IdURI := TIdURI.Create('');
try
Str := IdURI.PathEncode('正規表現');
Memo1.Lines.Add(Str);
Str := IdURI.URLDecode(Str);
Memo1.Lines.Add(Str);
finally
IdURI.Free;
end;
end;
>>444 Janeに入ってるソースをコピペして使う
Indyに入ってるのは使い物にならないので放置しとけ
フリーの turbo delphi って、openSSL は無理?
455 :
デフォルトの名無しさん :2007/05/07(月) 22:42:27
Delphi6 Personalを使っています。 Proxomitronみたいに、ブラウザでプロキシを設定することで文字列を置換したり、 フィルタリングみたいなことをしたいんですけど、何をどうすればいいのかわかりません。 TCP/IPとは違うんですか?
>>455 TServerSocketでIEからの接続を受け付けてその内容を解釈して
TClientSocketでWEBサーバーに接続する
IEへ返すときは逆順の経路をたどる
>>456 感謝です。キーワードを元に勉強したいと思います。
ありがとうございました。
スレ違いになるかもしれませんが、ご容赦のほどを。 Del6 or7 Proエディッションを購入しようと思うのですが、 もはやオクにも中々出てこない有様でして。 店舗、ネットショプを問わず、販売している情報がありましたなら、 ご教示のほど、お願い申し上げます。
TTreeViewの複数のノードを自動で選択させたいのですが、 うまく動きません。 TTreeViewのMultiSelectをtrueにして、MultiSelectStyleを msControlSelectとmsShiftSelectにしました。 この状態でTTreeNodeのSelectedを何個かtrueにすると、 最後の一個だけが選択されて、他が選択されません。 何が足りないんでしょうか
TTreeViewのSelectメソッドを使う方法では何か問題ありますか?
462 :
460 :2007/05/08(火) 02:34:07
自己解決しました。 TTreeNodeのSelectedをtrueにするのではなく TTreeViewのSelectを呼び出せばできました。 第二引数にTShiftStateを渡しますが、一回目の呼び出しは 何も付けず、二個目以降のノードの呼び出しではssCtrlを付けました。
464 :
458 :2007/05/08(火) 06:07:46
>>459 価格コムにありましたか!(お恥ずかしい)
ありがとうございました。
OutputDebugStringモニタコンポないですか? Jediで見かけたような気もしたけど単品もので。
467 :
デフォルトの名無しさん :2007/05/08(火) 14:24:20
Del6Perです。ラベルやテキストボックスの背景色を、 「clwindow」や「clwhite」などではなく16進数で指定する 書き方はありますでしょうか?
469 :
467 :2007/05/08(火) 14:52:25
>>468 ありがとうございます。できました。
RGBの指定がHTMLなどで使われるのとは逆で、
$00 + BBGGRRって感じなんですね。
つか普通にインスペクタで適当な色を選択すれば表示されるだろ。
472 :
467 :2007/05/08(火) 18:22:04
473 :
デフォルトの名無しさん :2007/05/08(火) 21:46:13
FOX★公認!!!
俺たちのクリックで日本を一位にしようぜ!!
“30年は日本に手は出せないな”という勝ち方をしたい
http://wwwww.2ch.net/test/read.cgi/news4vip/1178602852/ 1. ポーランド 139,797,680
2. チリ 137,040,439
3. ★日本 86,475,213★
4. イスラエル 80,930,530
5. スロベニア 57,137,042
6. フィンランド 40,857,499
石を投げる戦争から人は進化・進歩を遂げ、剣や槍などの武器をもって戦うようになった
人間はさらに発展し兵器を使う戦争を始めた
そして今、指先一つを武器とした電脳戦争が勃発したのであった・・・
皇国を勝利へと導くには貴様らの参戦が不可欠である
・戦場
http://www.clickclickclick.com/default.asp ・まとめサイト
http://www33.atwiki.jp/clickvip/
コピペ君って馬鹿だな、まで読んだ。
475 :
デフォルトの名無しさん :2007/05/08(火) 22:16:02
リストボックスなんだけどさ、アイテムが例えば aaa bbb ccc abccdd bdfg cghs bqqqq とかあって一番上のaaaが選択状態(青くなってる状態)になってたとする。 で、リストボックスにフォーカスが当たってるときに一回 b 押すと、bbbが 青くなってaaaは白くなり、も一回 b 押すと、bdfg が青くなり、bbbは白くな る。 リストボックスってこういうもんだと思ってたのだが、Delphi 6 Personal で 普通にフォームに貼り付けたリストボックスは、b 押しても変化なかったり、 飛ばして選択されたり、たまーに普通に動いたりと、なんだか挙動がおかしい。 環境のせいかと思いC++で試した(VC++2005EEにて)んだけど、こっちは ちゃんと動いた。 これってどうなの? うちだけの現象? それともこんなもんなの?
>>476 んなこと言ってるってことは、おまいのところではきちんと動いているんだな。
常駐ソフトのせいかな。
>>477 でbってなにさ
もう少し日本語を混ぜてください
うろ覚えだが、たしか、VCLではタイマかけて一定時間キー入力無いと マッチングの文字列クリアしてたと思うんで キー押下のタイミングとクリアのタイミングの問題だと思うよ
>>479 そいうことか。
素早く bbbb... と打つと bbb bdfg bqqqq を順番通り巡回するから、
キーフックしてるソフトが悪さしてるのかと思ったが、VCLの仕様じゃどう
にもなんないな。
Ctrlキーを押しながらだと意図通りの動作するから、当面はこれで我慢するか。
ちなみに bq と素早く打つと、インクリメンタルサーチっぱい挙動をし、一番
下の bqqqq がセレクトされる。なんだかなあ。
>>478 ちゃんと理解してる人いるんだけど?
D5ではその現象は起きないな D7では確認した。 Format('%8.8x %8.8x',[ GetWindowLong(ListBox1.Handle,GWL_STYLE ), GetWindowLong(ListBox1.Handle,GWL_EXSTYLE)]); した結果は同じだから、やっぱり後付の処理みたいだね。
タイマーつけて、なんかいいことあんのかな。使い辛くなってるだけのような希ガス。 かといってAPI駆使する気にはなれんから、この程度の不具合なら許容範囲だけどね。
483 :
479 :2007/05/09(水) 21:32:39
ファイルエクスプローラの動きに似せたんだと思うよ 気に入らなければ、TCustomListBoxを継承して独自のListBoxを作るといい 僕は以前、自作アプリにDelphiのエディタみたいな入力支援機能付けるときそうしたよ まあ、PersonalだとVCLのソースついてないからつらいけど
いまどき、Explore 類似アプリに ListBox なんぞ使わんだろ・・
>まあ、PersonalだとVCLのソースついてないからつらいけど ついてるよ
Classesしかついてないよ
487 :
デフォルトの名無しさん :2007/05/09(水) 22:10:12
1 534 2 645 3 860 4 960 ・・・ 1024 593 のような区切りのテキスト形式のファイルを読み込み、 配列xと配列yに代入するコードを書きたいのですが、 良い方法はありますか?
>>489 なにを聞きたいのかもひとつよくわからない
xとyそれぞれになにを代入したいんだい?
>>490 わかりにくくて申し訳ないです。
とある測定のデータです。
測定するコンピュータから出てくる生データがタブ区切りのテキストで
上記の例だと1と534、2と645がそれぞれ対応しています。
配列を定義し、その配列にそれぞれ左の列と右の列を代入するにはどうしたらよいのかと…
>>491 こんな感じか?てきとーだがw
var
s : TStringList;
buf : string;
F : Text;
i : integer;
begin
s := TStringList.Create;
s.Delimiter := #9;
AssignText(F, filename);
Reset(F);
i := 0;
while not Eof(F) do
begin
ReadLn(F, buf)
s.DelimitedText := buf;
x[i] := StrToInt(s.Strings[0]);
y[i] := StrToInt(s.Strings[1]);
inc(i);
end;
CloseFile(F);
end;
493 :
492 :2007/05/10(木) 02:26:18
sのFreeが抜けてるな、あと適当にエラーチェックやら範囲チェックやらいれれ
494 :
デフォルトの名無しさん :2007/05/10(木) 07:38:32
TBitmap(キャラが描画されてある)からTBitmap(背景が描画されてある)へ、透過でCopyRectしたいんですができません。 キャラBitmapのTransparentをtrueにしておき、 Bitmap(背景).Canvas.Draw(0,0,Bitmap(キャラ));としたときはできるんですが… キャラBitmapから背景色抜きで背景BitmapにCopyRectするほうほうを教えてください。
できない、と思うよ。
AlphaBlend API で背景だけ透過できるの?
>マスク画像を作って ラスタオペレーションで AND/ORして透過させるか これは Canvas.Draw がやってることと同じ
>>495 です。
どうやらcopyRectではTransparentは効かないようですね。
AndやOr合成がよくわからないので、結局ワンクッションTBitmapをおいてそこにCopyRect→Drawすることにしました。
無駄だらけ、ってのがなんとなくわかるんですが、未熟な素人なもんでしかたない…
bitmapで色数は合わせてるんだろ? だったらscanlineで自前コピーした方が速度も出るし楽だぞ
TABitmapでは無理?
>>495 試してみた。
ColorKeyAlphaMMXで出来るっぽい。
TToolButtonでBTNS_WHOLEDROPDOWNスタイルはサポートされてませんか? 使ってるバージョンはTurboDelphiです。
BTNS_WHOLEDROPDOWN って何? TToolButton は TGraphicControl 継承で 窓ハンドルを持っていない
>>492 ありがとうございます。
いろいろ試してみます!
ID3タグについて教えて下さい type ID3v1 = Record Headert: array[0..2] of Char; //Shuld 'TAG' Titlet: array[0..30] of Char; Artistt: array[0..30] of Char; Albumt: array[0..30] of Char; Yeart: array[0..3] of Char; Comment: array[0..30] of Char; Genre: byte end; type ID3v1.1 = Record Headert: array[0..2] of Char; //Shuld 'TAG' Titlet: array[0..30] of Char; Artistt: array[0..30] of Char; Albumt: array[0..30] of Char; Yeart: array[0..3] of Char; Comment: array[0..27] of Char; separator: byte Track: byte Genre: byte end; ID3v1とID3v1.1を区別して処理するにはどうすれば良いでしょうか? IDタグ情報がある部分(ファイル終端128バイト)のうち 先頭から125バイト目がbyte型なのかChar型なのか判断できれば いけそうだと愚考するのですが ファイルのある特定の位置のデータが 何型のデータか判断するにはどうすれば良いでしょうか? またほかにやり方があったら教えて下さい
> 先頭から125バイト目がbyte型なのかChar型なのか判断できれば これは不可能。タグ規格はしらんけど Headert 部分で区別できないものなのか?
separator: byte で区別とか?
>>508 区別する方法は無い。
しいて言えば、トラック0というのは無いから
separatorが0で Trackが1〜30までは ID3v1.1 とやる事くらいだけど
これは完全ではない。
>>507 Header部分は両バージョンとも「TAG」の3文字のみですT_T
>>510 wikipediaによると
ID3v1.1では125バイト目がZero byte separator.となっていますが
これはbyte型で常に値が「0」ってことなんですかねぇ?
125バイト目をbyte型で読込む
if 値が0なら → 97〜124バイト目をコメント部と判断
else 97〜127バイト目をコメント部と判断
こうなるのかな?
俺マジ頭悪いorz
教えて下さいエロイ人…
>>512 常に ID3v1.1で読めばいいと思うよ。 ID3v1.1で読むけど トラックを表示するかどうかは
>>511 によると
Delphi6PersonalにSpTbxLibをインストールしたいのですがうまくいきません。 MultiInstaller.exeによるとTNTUnicodeControlsのコンパイル中に TntUnicodeVcl_R60.dpk(32) 致命的エラー: 要求したパッケージ 'vcldb' が見つかりません と出て止まってしまいます。 インストール方法をご存知の方は教えてもらえないでしょうか。お願いします。
515 :
17 :2007/05/10(木) 22:56:45
>>168 ダメでしたorz
D4だとLeakにならないけどD6だとLeakになる
書き方ってなんだろう?
∧,,∧ /
ミ,,゚Д゚彡 < まいつた。
U U \
うーん、、、数値切り出しが、、さっぱり理解できないな
それより、スレの速度についていけん...
とりあえず、下記のように並べたい。
人間なら、ABCは共通だから無視してすぐわかるんだけど
ABC-1 DEF
ABC +1 DEF
ABC 1 DEF
ABC1 DEF
ABC001 DEF
ABC 1.1 DEF
ABC2 DEF
ABC10 DEF
ABC20 DEF
ABC 20 DEF
>>417 さん、サンクス。コード実行してみたけど、微妙に動作が理解できていないから
望むものと違っても、改造できない...難しいね。ヒントありがとう。勉強してみる。
ABC +1 DEF
ABC 1.1 DEF
ABC 20 DEF
ABC 1 DEF
ABC-1 DEF
ABC1 DEF
ABC001 DEF
ABC2 DEF
ABC10 DEF
ABC20 DEF
Delフサギコってこんなにスキル低かったっけ?なんか幻滅
>>516 考えてもわからんだろから、本読んで勉強したら?
コンパイラの作り方の類の本が初心者向けにも色々出てるから
字句解釈の勉強してみ
以前もBNF書いてみろとアドバイスしたんだが、BNFとかってわかる?
また、コンパイラおたかよ・・・
>>519 じゃあ、お前がなにか的確なアドバイスをしてやれよw
BNF書いてみろとか、な。
Delphi 7 Personalが良さそうなら買ってみようかと思うのですが、 6Personalに比べてどこが良くなってるのか情報が全然ありません。 何かご存知の方がいらっしゃいましたら教えてください。
なぜ今、Del7のしかもPersonalなんだ・・。 TurboDelphiじゃダメなのか?
524 :
489 :2007/05/11(金) 04:58:31
コンマ区切りでやっています。 var Form1: TForm1; FileData: String ; x:array[0..1100,0..5] of Integer; procedure TForm1.open1Click(Sender: TObject); var SL:TStringList; SL2:TStringList; i,j:integer; nam:string; begin SL := TStringList.Create; SL2 := TStringList.Create; if opendialog1.Execute then begin nam:= OpenDialog1.FileName; SL.LoadFromFile(nam);// ここで止まる for i := 0 to SL.count-1 do begin SL2.CommaText := SL[i]; for j:=0 to SL2.Count do begin x[i][j]:=Integer(SL2[j]); end; end; end; SL.Free ; SL2.Free ; end; これで実行するとリストのインデックスが範囲を超えていますと出るのですが、 何故でしょうか?
>>524 for j:=0 to SL2.Count do begin
↓
for j:=0 to SL2.Count-1 do begin
>>518 の言うように。
BNF書くのが一番だよ。BNFでどういう文字の並びを数値とみなすか
自分でまず定義しなきゃ切り出せん。
MainFormをオーナーにして、TDataModuleとSubFormを表示したとき、 SubFormからTDataModuleの参照は普通にusesでいいのでしょうか。 それともMainFormからTDataModule(のアドレス??)を渡してあげないと いけないのでしょうか。
var Form2: TForm2; とか var DataModule1: TDataModule1; とかユニットのinterface部分に書いてあって 変数を参照できるようになってるからusesだけでOK。 もしメインフォーム内で mysubform := TForm2.Create(nil); とか独自にやっているならそれを渡す必要がある。
∧,,∧ おおぅ、 ,,ミ*゚Д゚ミ ありがdクス .とミ,,,,,U,,,,つ かたじけのうござる。 BNFってのは、ジェイコム男じゃあないよね.....
∧,,∧ / ミ;゚Д゚彡 < いきなり課題がわかりません。 ,;゙ ミ \_のですけれども。 ミ. ミ /゛゛゛゛ > 課題:eof メソッドを追加してみよう。 > 文字列処理(字句解析(lexical analysis))では、以下の 3 つの動作を基本にします。 > 1. まず、文字を 1 文字取り出す事 - NowChar (取り出しても読み出し位置は動かしません) > 2. その文字が終端である事 - eof (NowChar = #0 で代用) > 3. 文字位置を一つすすめる事 - Next ここの2の日本語が理解できんがな... 1.と3.はコードに落ちてるからわかるけど 日本語ってあいまいで...
文字列の終わりである事 と変更しておくよ。 これで判る?
533 :
528 :2007/05/11(金) 10:00:59
>>529 ありがとうございます。
ところで、MainFormではなくMDIChildだったとして、
同じ画面を複数表示するようにした場合は、
interfaceでTDataModuleを宣言するのって良くないですよね?
>>533 共通にするデータがあるのなら TDataModuleは一つでいいし
それぞれのフォーム毎に別のデータを持つなら、そのデータ構造だけのunitを作って
そのデータ構造をフォームのメンバーにしてしまうといい
535 :
528 :2007/05/11(金) 11:06:03
>>534 解説スマソ。
しつこくなってしまいますが、
MDIChild─DataModule
│
KoForm
│
MagoForm
だったとしてMagoFormからDataModuleの参照はusesでおk?
>>535 DataModule のインスタンスが1つならね。
そんだけ聞くって事は何か変な事やってる?
537 :
528 :2007/05/11(金) 11:26:37
特に変なことは。。。 参照がどうつながるのか知りたくて。 MDIChild毎にDataModuleを作るので DataModuleを子や孫に渡すのが正解ですね。 ありがとうございます。
Delphi2006のIDEのタブ位置っておかしくない? 日本語のある行と無い行で揃わないんだけど。
>>537 フォーム新規作成毎に DataModuleを作ってるのか
別に悪くはないけど、それならフォームに貼り付けてもいいように思うな
もっともDoc-Viewの分離性が悪い=再利用性が無いと言われるかもしれないが
XPManの日本語問題と関係あったりして
542 :
489 :2007/05/11(金) 14:29:59
>>525 ありがとうございます。初歩的なミスでした。
上のコードでコンマ区切りのcsvを読み込むと、
x[i][j]にあらぬ数値が入ってしまって困惑しているのですが、
SL2から数値を切り出す部分が間違っているのでしょうか?
SL2をウォッチしていると'423,5334'のようになっていました。
>>527 読んだけど実装がややこしくね??
おとなしく、位置(Run)を二つもたせればいいじゃん。
type
TTokenKind = Integer;
TCustomParser = class(TObject)
private
FText: WideString;
FOldRun: PWideChar;
FRun: PWideChar;
FTokenKind: TTokenKind;
function GetIsEOF: Boolean;
function GetToken: WideString;
function GetTokenKind: TTokenKind;
protected
function InternalNext(var ARun: PWideChar): TTokenKind; virtual; abstract;
protected
function CheckEof(ARun: PWideChar): Boolean;
public
constructor Create;
destructor Destroy; override;
procedure CheckNext(var AToken: WideString; var ATokenKind: TTokenKind);
procedure Next;
procedure SetText(AText: WideString);
property IsEof: Boolean read GetIsEof;
property Token: WideString read GetToken;
property TokenKind: TTokenKind read GetTokenKind;
end;
implementation
function TCustomParser.GetIsEOF: Boolean; begin Result := (FRun - PWideChar(FText)) = Length(FText); end; function TCustomParser.GetToken: WideString; begin Result := Copy(FText, FOldRun - PWideChar(FText) + 1, Integer(FRun - FOldRun)); end; function TCustomParser.GetTokenKind: TTokenKind; begin Result := FTokenKind; end; function TCustomParser.CheckEof(ARun: PWideChar): Boolean; begin Result := (ARun - PWideChar(FText)) = Length(FText); end; procedure TCustomParser.CheckNext(var AToken: WideString; var ATokenKind: TTokenKind); var TempRun: PWideChar; begin TempRun := FRun; ATokenKind := InternalNext(TempRun); AToken := Copy(FText, FRun - PWideChar(FText) + 1, Integer(TempRun - FRun)); end;
procedure TCustomParser.Next; begin FOldRun := FRun; FTokenKind := InternalNext(FRun); end; procedure TCustomParser.SetText(AText: WideString); begin FText := AText; FRun := PWideChar(FText); FOldRun := FRun; end; で、後はこのクラスを継承して抽象メソッドのInternalNextを実装して自分の都合にあった字句解析を どうぞ。
例としてTabを解析する例、それ以外は未定義のトークン。 // トークンの種類 const tkUndefined = 0; tkTab = 1; function TParser.InternalNext(var ARun: PWideChar): TTokenKind; begin case ARun^ of WideChar($0009): begin Inc(ARun); Result := tkTab; end else Result := tkUndefined; Inc(ARun); end; end; 使う時は while not Parser.IsEof do begin case Parser.TokenKind of tkTab: // Tabの処理 tkUndefined: // その他 end; Parser.Next; end;
547 :
デフォルトの名無しさん :2007/05/11(金) 16:38:10
TreeViewを使って 親:携帯 子:au,Docomo と設定して 親(携帯)を選択していた場合 子のauとDocomoを返す方法を教えてください
>>542 間違えて無いように思うけど、カンマが大文字とかではないのかな?
なら自前で
function SepInteger(var s: string): Int64;
var
minus: boolean;
n: Int64;
begin
if s = '' then raise Exception.Create('文字列が無い');
result := 0;
n := 1;
minus := false;
while s[n] in [#7, ' '] do inc(n);
if n > length(s) then raise Exception.Create('空白だけだった');
if s[n] in ['+', '-'] then
begin
minus := s[n] = '-';
inc(n);
end;
while s[n] in ['0'..'9'] do
begin
Result := Result * 10 + strToInt(s[n]);
inc(n);
if n > length(s) then break;
end;
while s[n] in [#7, ' '] do inc(n);
delete(s, 1, n - 1);
if minus then Result := -Result;
end;
548 の続き 呼び出し方は procedure TForm1.open1Click(Sender: TObject); var SL: TStringList; i, j, k: integer; nam, s: string; begin if opendialog1.Execute then begin SL := TStringList.Create; try nam := OpenDialog1.FileName; SL.LoadFromFile(nam); for i := 0 to SL.count - 1 do begin s := SL.strings[i]; for j := 0 to 5 do begin if s = '' then break; x[i][j] := SepInteger(s); if copy(s, 1, 1) = ',' then delete(s, 1, 1) else if copy(s, 1, 2) = ',' then delete(s, 1, 2) else break; end; end; finally SL.free end; end; end;
みんなこのスレのログとかって後学の為に保存してる? どうぞご勝手に言われるだろうけど、これからそうしよっかな
ム板でいつも見てるスレだけは全部保存してるな
553 :
162 :2007/05/11(金) 17:21:01
>>515 ExHeaderが原因らしい。
場所を特定してないが、HeaderControlとかに変えたらリーク消えた。
♪ ∧,,∧ ♪
ミ,,゚Д゚彡 ♪
ミつ[|lllll]). あいからわずスレ流れはやいなあ。
>>516 の件でレスくれたひと、ありがとう。
つーか、漏れも普通に出来てしまいまして
Sortロジックというか、文字列から数値切り出しの方。
んーー、なんか他の人がクラスでやってるんですが
俺は、状態を持って単にForループで回せばできたんだけど
こっちのほうが簡単そうに思うんだけどその
BNFとかいうのに慣れてないだけ?
思想は一緒だと思うけど
結局、文字列の区切り条件は自分で相当考え
定義しなきゃならん、ということなのかねえ。
ということで、ソースコピペが2chでは非常にやりやりづらかったので
ブログに書いたんだけど、リンク貼り付けすると
書き込めん....orz...
使い方が間違ってた
Parser.SetText('あいうおえ かきくけこ');
while not Parser.IsEof do
begin
Parser.Next;
case Parser.TokenKind of
tkTab:
// Tabの処理
tkUndefined:
// その他
end;
end;
で、最初に解析する文字をSetTextで設定して、IsEOFでなければ、Nextメソッドを呼び出し、
次のトークンを解析(パース)。解析されたトークンの種類とトークンはそれぞれ、
TokenKind,Tokenプロパティで取得。で必要に応じて処理。で、再びIsEOFでなければ、ループと。
CheckNextメソッドは位置(Run)を変えずに、更に次のトークンを先読みしたくなる時があるので
そのためのメソッド。なくても問題なし。
>>527 で主従関係とかなんかややこしいことしてたけど、
BNFと状態遷移できてれば、そんなことしなくても問題ないような気がする。
肝心の解析部分は前に書いたのあるので気がむいたらあげる。
>思想は一緒だと思うけど >結局、文字列の区切り条件は自分で相当考え >定義しなきゃならん、ということなのかねえ。 定義しなきゃいけんだろ。 その区切り条件みたいのまぁ、いわいるどういう文字の並びを数値とみなすかを 単に式で表現する方法がBNF。別に頭の中で表現できるなら別にいいけどさ。。 当たり前だけど、大抵の言語ではソースを先頭から解析し、変数名の先頭に、 数字使えないけど、もし使えるようにすると、その数字が変数名の一部なのか数値の一部なのか 判断できなくなるので、かぶらないように定義されている。 クラス作るか作らないかはご自由でいいんじゃ。
>俺は、状態を持って単にForループで回せばできたんだけど
Forループ使わないか使うかは単に実装の違いだけでしょ。
BNFは先も書いたように表現方法。ってBNFで一度もググッてないでしょ?
>>543 からグダグダクラス書いたけど、フサのソースみたけど、数値切り出すぐらなら
それでもいいと思う。ただ、本格的に色々文字列やら、なにやらコンパイラの字句解析
まがいのことをするつクラス作って使った方が、ソースも見通しよくなるくらいなだけ。
って長々書いたがこのへんで。
http://delfusa.blog65.fc2.com/ 比較に実際に利用するなら、やっぱり主従関係の逆転が必要
比較しないのに全部の文字をスキャンするのは無駄。
PickOutInt64FromStringVer3という関数の中でStrOutputNumericを呼び出してるが、
このStrOutputNumericの部分で実行中断させなければいけない。
関数を中断するとなると、その作業用の変数が必要になる。
だからクラス化してるわけだ。
あぁ、主従なんたらってのは、比較の話なのね。比較の話は興味なかったので しっかり読んでなかった。読んでみて何かあったらコメントします。 まぁ、俺が書いたクラスもトークン単位でなら途中で全部解析せずに、これ以上 比較する必要がなければ打ち切れるので。これは、実装者の実装次第になるので おまかせします。
フサギコさん とりあえず、コードを見た感じでは 1),[01234567890123456789]の1個以上の連続 2),1の間に[,,]が連続しないである場合はその文字を除く 3),[+-+−] の後に [ #7]の0個を含む繰返しの後に2 という定義みたいだけど、これでいいの?
WideStringだと、 '0'..'9','0'..'9' てな表現が出来ないから苦労するんだな。 '0'..'9',#65296{0}..#65305{9} : と書くしかない
うーん。比較での主従関係がようわからん。後は普通に、 // StrA = StrB なら0 StrA > StrB なら 1 それ以外-1 function CompareStr(StrA: WideString; StrB: WideString): Integer; var ParserA, ParserB: TParser; TokenA, TokenB: WideString; begin ParserA := nil; ParserB := nil; try ParserA := TParser.Create; ParserB := TParser.Create; ParserA.SetText(StrA); ParserB.SetText(StrB); // StrA, StrBを先頭から順にトークン単位に切り出して比較。 // 途中で大小が決定されれば、解析を打ち切り while not ParserA.IsEOF do begin // ごにょごにょ end; finally ParserA.Free; ParserB.Free; end; end; みたいな比較関数を用意して、後はこの比較関数を用いて文字列の配列を バブルソートなりして、ソートすれば終了かな。 文字列の解析・2つの文字列の比較・ソートを分けて実装すれば、見やすくシンプルな 設計になると思う。詳しい仕様はようしらんので、概略だけ。
564 :
デフォルトの名無しさん :2007/05/11(金) 20:41:33
なんかほかにおもしろいネタないのか?
>>547 procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
Lst:TStringList;
begin
if not TreeView1.Selected.HasChildren then exit;
Lst:=TStringList.Create;
try
for i:=0 to TreeView1.Selected.Count-1 do
Lst.Add(TreeView1.Selected[i].Text);
ShowMessage(Lst.Text);
finally
Lst.Free;
end;
end;
>>514 PersonalにDBは入ってないからTntとかからDB関係を消してインスコ
TurboDelphi無料版を使ってる人に聞きたいんですが、 トレイアイコンのコンポーネントは入ってますか? あと、Del6Perに無かったもので、便利なコンポーネントはありますか?
>>567 TTrayIconか・・こんなコンポーネントがあるなんて知らなかったな。
これがあればちょっと前の最小化時にトレイに表示とか簡単にできそうだ
TurboDelphiに入ってる
569 :
489 :2007/05/11(金) 23:32:58
>>548-549 ご丁寧にありがとうございます。
お陰様で読み込めました。
これをdouble型でやるとしたら大分改良が必要ですか?
Stringからdoubleに型キャストしようとするとエラーになるのですが…
∧,,∧∩ /にゃるにゃる
ミ,,゚Д゚彡 < ほどほど!!
U ミ \
@ミ ミ
>>556 さん、うん、一応、そなのよ。
今日はがんばった、2007/4/10
今日はつかれた、2007/04/12
今日は布団でぐっすりだった、2007/5/1
今日は雪が降りそうだった、2006/12/3
こんな文字列を、整数抽出ソートをしてみたくなってしまったのです....
>>557 さん
そかそか、ありがとです。
> クラス作るか作らないかはご自由でいいんじゃ。
なるほどな〜、頭がすっきりするね〜。
クラスをつくってやる方が、慣れてくれば考えやすいのかな。
>>558 さん
いやいや、BNFでぐぐったけど、
とりあえず思いっきり挫折しそうだったので
さっさと自分で書いたらかけちゃったので、ビクーリしたのよ。
>>561 さん
そんな所です。
りんご 1,000,000円
みかん 1,100,000円
こんなもののソートが出来るのですよ。
今日 + 120c
明日 - 2120c
こんなものもソート出来....
∧,,∧ /
ミ*゚Д゚彡 < ああ、素敵
ミ つ旦)~~ \ この実装感を
@ミ ミ 味わいながら。。。
>今日はがんばった、2007/4/10 (\d+)/(\d+)/(\d+) で一発なのに100倍時間かけて七転八倒しまくってでも絶対にやりたくないんだよな。 不思議不思議。
∧,,∧ /たぶん、きみは著しく
ミ,,゚Д゚彡 < 勘違いしているに
U つ \1万ペソ
>>572
今日はがんばった、2007/4/10
今日はつかれた、2007/04/12
今日は布団でぐっすりだった、2007/5/1
今日は雪が降りそうだった、2006/12/3
りんご 1,000,000円
みかん 1,100,000円
今日 + 120c
明日 - 2120c
これらの文字列を一気に指定してソートしたいなら話は別だが、
これらを個別にソートしたいなら
>>572 だと思うが。
りんご 1,000,000円
みかん 1,100,000円
([\d,]+)で抽出後,をリプレイス
今日 + 120c
明日 - 2120c
([+-])?(?: )?(\d+)
とかじゃね?テストしてないから正しい表現化わからんけど。
_________ ∧,,∧ / ミ,,゚Д゚彡 < えっと・・・ ミつ旦(ミ~~ \ @ミ ミ  ̄ ̄なんつ〜か、、、、 ソートするための正規表現を記載することが必要なソートではなく エディタのソートプラグイン処理なので、 なぞった範囲をソートするっていう処理になるので おのおので正規表現で表せても目的には使えないのっす。 Blogから流用しますが 『ABC123DEF- 456,789GHI123,,456 2007/05/11 17:12JKL』という文字列から 123 -456789 123 456 2007 5 11 17 12 を数値として正規表現で抽出できたら、いいなー、とは思うが 複雑すぎて、漏れにはかけない。 念のため、BRegExp.hlp を見たけど、出来そうで出来なさそうな そのあたりの感覚がなんか好きじゃないな。 あと、もう一つ正規表現が嫌いな理由が、可読性が低いからだと気がついた。 では、とりあえずお休みなさい。様々なヒントくださったみなさん とくに、DelWikiに教えてくれる内容を書いてくださった方。 漏れのコードを恐るべき理解力で理解するところに驚きました。ありがとです。
> 『ABC123DEF- 456,789GHI123,,456 2007/05/11 17:12JKL』という文字列から > 123 -456789 123 456 2007 5 11 17 12 > > を数値として正規表現で抽出できたら、いいなー、とは思うが 文字列が上記の方で一定してるなら、それこそ正規表現の得意分野だと思うけどw
>>566 エラーが出る奴を片っ端からパッケージから外したらよくわかんないけどインストールできました。
ありがとうございました。
578 :
デフォルトの名無しさん :2007/05/12(土) 05:46:50
キー入力を受け取って処理をしたいのですが 第一歩から躓いてしまい 只今 めいっぱい めげてます。 procedure TForm1.OnKeydown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = Byte('Z') then Form1.Edit1.Text := 'hoge'; end if Chr(Key) = 'Z' も試してみましたが hoge とは入力されませんでした。 何か根本的な間違いをしてると思うのですが どこを直せば良いのかわかりません。アドバイス宜しくお願いします
というか、そこにブレークポイント設定して、実行すると、そこでちゃんと止まる?? イベントが発生してないんじゃないの?? フォームのイベント?何のイベント?イベントハンドラ設定されてる?? フォームのイベントハンドラならKeyPreviewは? 何でこっちがいっぱい質問しなきゃいけないの?? 後は頑張れ。
難しいな・・原因はわかるんだがどうしたらいいんだろう? キー入力のフォーカスがForm1じゃなくてフォーム上に配置されたEdit1とかにあるのが原因だと思う。 procedure TForm1.FormClick(Sender: TObject); begin ActiveControl := nil; end; とかすれば一時的には受け付けるようになるだろうが、根本的な解決じゃないよな・・
んだったら、さっき書いたようにKeyPreview := Trueでいんじゃまいか
582 :
580 :2007/05/12(土) 06:10:16
>>581 なるほど!
もう7年以上使ってるがこのプロパティ初めて知ったよ!
578ではないがサンクス
583 :
デフォルトの名無しさん :2007/05/12(土) 08:06:25
>>579 丁寧な指摘ありがとうございます。
ブレークポイントを設定して確認してみると
言われた通り Onkeydown のイベントが呼ばれていませんでした。
それで、Form1 でイベントを受けたいので
procedure TForm1.Form1OnKeyDown と書き換えて
KeypreviewをTrueにしましたが それでも OnkeyDownのイベントは呼ばれません
ネットでサンプルを探し回ったのですが
OnkeyDownと OnKeyPressの違いとか
Ctrl、Shiftキーとの同時押しの説明とか。内部処理の解説とか
仮想キーコードはどうだ とか
しか見つからず くたびれております。
短めのサンプルどこかにありませんでしょうか…?
いや、そんなわけないだろ。 >procedure TForm1.Form1OnKeyDown と書き換えて ってあるけど、名前だけ書き換えたとかそんなことしてないよね。というか別に名前は なんだっていいんだけど、 フォームを選択して、オブジェクトインスペクタのイベントタブで、 OnKeyDownでForm1OnKeyDownってなってる空欄だとイベントとコードの関連付け がされてないので呼ばれる訳が無い。
訂正>> OnKeyDownがForm1OnKeyDownってなってる?空欄だとイベントとコードの関連付け がされてないので呼ばれる訳が無い。
>>584-585 orz
…まさにそれです。
イベントパンドラは自動的にその名前で呼べるもんだと思ってました
本当にありがとうございました。
これが斜め上の発想というヤツか
このスレにマッチした質問です。大変すばらしい。フサギコはしね
>>575 >『ABC123DEF- 456,789GHI123,,456 2007/05/11 17:12JKL』という文字列から
>123 -456789 123 456 2007 5 11 17 12
>を数値として正規表現で抽出できたら、いいなー、とは思うが
正規表現スレ行けば5分で解決するようなことを長々と・・・
1
+3.14
-10,123,456.9999
あたりににマッチする正規表現
([+-]?(\d{1,3}(,\d{3})+|\d+)(\.\d+)?)
>あと、もう一つ正規表現が嫌いな理由が、可読性が低いからだと気がついた。
書くときにインデントして考えればなんてことはない。
(
[+-]? (?# "+" or "-" or "")
(
\d{1,3}(,\d{3})+ (?# "12,123,456,789")
|
\d+ (?# "123093524")
)
(\.\d+)? (?# ".12391412" or "")
)
>>569 procedure SkipBlank(var p: PChar); //空白ならスキップする
begin
while p^ in [#7, ' '] do inc(p);
end;
function GetDotNum(var ptr: PChar; var retVal: Extended): boolean;
var
s: string;
DotCnt: Integer;
iret: int64;
Minus: boolean;
p: PChar;
begin
p := ptr; SkipBlank(p); if p^ = #0 then exit;
Result := false; DotCnt := 0; Minus := false;
if p^ in ['+', '-'] then
begin minus := p^ = '-'; inc(p); SkipBlank(p); end;
while true do
case p^ of
'0'..'9': begin s := s + p^; inc(p); end;
'.': begin inc(DotCnt); if DotCnt >= 2 then break; s := s + p^; inc(p); end;
else break;
end;
if s <> '' then begin
ptr := p; retVal := StrToFloat(s); Result := True;
if minus then retVal := -retVal;
end;
end;
590 の続き
>>549 の590対応版
var
SL: TStringList;
i, j, k: integer;
nam: string;
dt: Extended;
p: PChar;
begin
if opendialog1.Execute then
begin
SL := TStringList.Create;
try
nam := OpenDialog1.FileName;
SL.LoadFromFile(nam);
for i := 0 to SL.count - 1 do
begin
p := PChar(SL.strings[i]);
for j := 0 to 5 do
begin
if p^ = #0 then break;
if not GetDotNum(p, dt) then break;
SkipBlank(p);
x[i][j] := dt;
if p^ = ',' then inc(p) else
if copy(p, 1, 2) = ',' then inc(p, 2) else break;
end;
end;
finally SL.free end;
end;
end;
>>589 仕様は
>>561 だから、全角数字や 全角カンマ
全角符号の後の全角空白 にも対応しないといけないよ
統一のとれてない滅茶苦茶なCSVだわな。そんなの読み込みたくないわ
まあ、VBやDelphiのパスカル文字列派は、こういう場合は 全角コンマを 半角コンマに置換してから処理するんだろな。 で、もっさりアプリが出来上がると。 正規表現も同じで、一見便利に見える正規表現も全角文字が入ると途端に面倒になる。 これも、全角文字を先に半角に置換しろよとなるんだろ? Cコンパイラのコンパイルが遅いのも、プリプロセッサがコンパイルとリンクで最低3パスになるから Delphi使いなら1パスで処理するのを目指したいものだ
×プリプロセッサがコンパイルとリンクで 実際はasm/リソースを使うと プリプロセッサ=>コンパイル=>asm=>リソースコンパイ=>リンクだな
徹頭徹尾激しくどうでもいいです
知らない事はどうでもいい事らしい
>>575 そういう目的なら
今日はがんばった、2007/4/10
今日はつかれた、2007/04/12
今日は2階に移動、2007/04/15
今日頑張って1番だぜ、2007/04/17
てな場合に 1,2が抽出されるのはマズイんじゃないのか?
フィールド形式の指定が出来ないなら
日付が入ってる場合は、日付を優先するとかさ
>>590 のコード
p := ptr; SkipBlank(p); if p^ = #0 then exit;
Result := false; DotCnt := 0; Minus := false;
---------------------------
Result := false;
p := ptr; SkipBlank(p); if p^ = #0 then exit;
DotCnt := 0; Minus := false;
と順番を入替えて
>>569 > これをdouble型でやるとしたら大分改良が必要ですか?
端から見てると、仕様がコロコロ変わってるみたいだね。
>>489 の例はカンマ区切りではないし、実数型でもない。
>>575 > 『ABC123DEF- 456,789GHI123,,456 2007/05/11 17:12JKL』という文字列から
> 123 -456789 123 456 2007 5 11 17 12
>
> を数値として正規表現で抽出できたら、いいなー、とは思うが
できるよ。
>>589 さんが書いてるけど、実数値をWritelnでテキストファイルに
書き出した
0.00000000000000E+0000 1.00000000000000E+0000
なんていうのも、正規表現でまとめて抽出できる。
601 :
17 :2007/05/12(土) 15:44:59
>>553 情報ありがとうございます。
再トライしてみます。
(´-`)。oO(なんで正規表現が出てくると拒絶反応が起きるんだろう…)
そりゃ正規表現使うと、簡単に見えて実は大変だなからな。 抽出までは楽だけど、その後、数字に直す段階で、 結局全角文字を半角にしたり、空白削除したりで、パースのやり直し。
>>603 このスレでは正規表現使え、そんなのスクリプトでやればいいじゃん。はNGワードです。
>>543 だけどさ、
そもそもフサの細かい仕様わからんし、正規表現そこそこやったことあるし、
今回は流れで字句解析の事書いたけど、正規表現でもぜんぜん問題ないと思う。
正規表現便利だしさ。やり方色々あるからやってみるのをお勧めする。
字句解析も正規表現もやってみるとおもろいし。たくさんの事を学べる。
>あと、もう一つ正規表現が嫌いな理由が、可読性が低いからだと気がついた。
ってフサが言ってるけど、俺的には、正規表現使えるところはそれ使えば、
その分コード量少なくなるし、シンプルになるからトータル的には使った方が
いいと思う。もちろん、実装する機能・仕様しだいだけどさ。
俺的にはVCLに標準で取り込んでほしいところ
独り言はチラシの裏へ
ここがペーパレスなチラシの裏です
便所の落書きと呼ばれてるのはここの掲示板のことです。
初心者スレの嵐は最低だな
Delphi用のLEXがWideString対応ならいいんだけどね
レックス&ヤックル ヤックル「ぷいにゅ」
VCLがUnicodeにまだ対応してないんだから、それは言わない約束だお
でもUTF8Decodeとかあるよね
そろそろうにこーどに対応しろよまじで
168 :デフォルトの名無しさん :2007/05/10(木) 07:29:46 for win32を、unicode対応汁!ってやつは頭がどうかしてると思うよ 169 :デフォルトの名無しさん :2007/05/10(木) 09:28:27 まぁ、いまだにDelユーザやってる時点で頭が(ry 170 :デフォルトの名無しさん :2007/05/10(木) 17:09:54 デルフィおわったな
_________
∧,,∧ /
ミ,,゚Д゚彡 < きょうはあたかかったね
ミつ旦(ミ~~ \
@ミ ミ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∪''∪
>>589 さん
たぶん、考えていることが全然違うから、
正規表現スレに行っても、抽出出来ないと思うんですけど,,,
>>594 さん
・・・アプリの作りを楽にしたいのか、
ユーザーの使い勝手を考えるのか・・・
>>598 さん
うん、確かに実はそうなんだよ。
そこは、ユーザーが理解してくれて選択するかなあ。
と考えてますです。
やや、矛盾をはらんでいますが
どんなエディタでも、自然数ソートって、その手の
仕様矛盾があるのかしら?と、適当な所で妥協してます。
>>589 さん
そうなのか!
ブログで書いてあるんだけど
PickOutInt64FromStringVer3
のクローン関数を正規表現で、作れる?
とりあえず、漏れは正規表現より、文字列パーサークラスなどに
興味があるんだけれども。
∧,,∧ /
ミ,,゚Д゚彡 < ・・・
ミ つ旦)~~ \
とちゅうまで読んでからレス書いたんだが....
>>603 さん
なんか嫌な思い出でもあるのかと
というか、宗教的に漏れも正規表現反対派なので
>>602 さんのカキコミがわからなくもない気がする。
だーーって、わかりにくくない?正規表現。
単なるウィンドウアプリつくるのにVCLや.NETじゃなくて
MFCとかWinAPIゴリゴリで書くような
わざと物事を難解にして喜んでいるような気がしてならないんだ。
しかも、正規表現を押してくる人って、なんだか高圧的で。
"知ってるから偉い!知らないと無能。"
みたいなセンスがあって、閉口しぎみというか...
といっても、とりあえず漏れは
Regular Expression(Riue ちゃんの正規表現講座) - Index
http://www.sixnine.net/regexp/index.html この内容はほどほどに理解してますよ。
こういうよいページはありがたいよね。
>>606 さん
標準で取り込むのは、漏れも賛成です。漏れは使わないかもしれないが
それで利益を受ける人が多数いることには、賛成を一票。
いい加減隔離スレ逝ったら。お前の趣味なんて知ったことか。
オナニーも程ほどにナ
初心者スレ荒らして、なにが面白いんだろうなぁ・・ コテハンたたきじゃないけど、ちょっと今回はひどすぎ
寺小屋すれにいったらいいのに。あそこで好きなだけやればいい。
Delphi用の質問系スレッドがここしかないんだから 超初心者以外の質問が出てしまうのも ある程度仕方が無いような気がする 質問の意味さえ理解できない俺からの意見w
そうだけど、まじめな質問&回答になってないだろ。あーだ、こうだ、好きだ嫌いだ ってもう無意味
∩|
ミ ゙''゙゙゙つ
ミ∧,,∧ およよ
ミ,,゚Д゚彡
U U なにがご不満に入ったのか知らんが...
>>620-623 、の方がどうみても.......
ま・いっか。
お気に入りに入ってなかったんで気がつかなかったけど
昔あった上級者質問スレのようなのが
寺子屋スレなのね。
次に質問するときはそっちにします。
どもどもー。
・・・でも初心者のためとかのスレタイだな・・・
>>624 さん
すません〜〜、お騒がせしました。
いいんじゃねぇの。ここに何書いたって。 >>お前の趣味なんて知ったことか。 はぁ?展開されてる話題がお前の興味の範囲外であろうと知ったことかボケ。
多分正規表現の好き嫌いのことだろ 別に大した脱線でもないし、長々とスレ違いの議論をやられるわけでもなけりゃ許容範囲だと思うけどね
というかブログ連動型質問されてもわけわからんし。
>>575 の要望に答えたら全角対応してねぇとか言われるし。
オマイラ少し落ち着けw
タイプライブラリの取り込みでDelphiから簡単にWSHを使えるようになる。 D6perでも簡単に正規表現使えるんだぜ? まあこの話は質問スレでどうこういう話じゃないな。 こういう文字列からここれを抽出したいって質問だと思ってるから、 回答者も正規表現でぱっぱと書いてはい終了って感じだろし。 そもそも後出しじゃなくて仕様をはっきりさせてから来いと。
> タイプライブラリの取り込みでDelphiから簡単にWSHを使えるようになる。 くわしく
>>632 プロジェクト>タイプライブラリの取り込み>Microsoft VBScript Regular Expression 5.5(Version5.5)
TurboDelphiExplorer でもできますか?
>>631 たぶん、みんなが欲しいのはLEXのような正規表現case文
英語圏の人はDelphiLEXがあるから必要を感じないんだろな。
という事で、正規表現派の人 Delphi用LEXのWideString版を作らない?
∧,,∧ ___ ミ,,゚Д゚ミ .||::::::::|| ミ つ___||_____|| | ̄ ̄|__ミ――――― `ー┬‐'' ┴ そのスクリプトの取り込みかた 漏れのブログで書いたがな....
637 :
デフォルトの名無しさん :2007/05/13(日) 11:13:29
638 :
デフォルトの名無しさん :2007/05/13(日) 11:30:17
正規表現版 type TInt64DynArray = array of Int64; function PickOutInt64FromStringVer3(Source: WideString): TInt64DynArray; var RegExp : TRegExp; pMatches: MatchCollection; pSubMatches: SubMatches; i, j, k: Integer; s: WideString; OutValue: Int64; begin SetLength(Result, 0); RegExp := TRegExp.Create(nil); try RegExp.Global := True; RegExp.Pattern := WideString('([+\-+−]?[\s\t ]*(?:[\d0-9][,,]?)+)'); // パターンマッチ pMatches := RegExp.Execute(Source) as MatchCollection;
おとなしく鬼車をDelphiから呼べば事足りるんじゃないの。 早いし、WideString使えるし、BSDライセンスだし言うことなしだと思うけど
// マッチ結果の加工 for i := 0 to pMatches.Count - 1 do begin pSubMatches := (pMatches.Item[i] as Match).SubMatches as SubMatches; for j := 0 to pSubMatches.Count - 1 do begin s := pSubMatches.Item[j]; // 残していい文字以外を削除 RegExp.Pattern := '[^+\-+−\d0-9]'; s := RegExp.Replace(s, ''); // 全角→半角変換 for k := 1 to length(s) do if (ord(s[k]) >= $FF00) and (ord(s[k]) < $FF5F) then s[k] := WideChar(ord(s[k]) - $FF00 + $20); // 数値に変換して格納 if TryStrToInt64(string(s), OutValue) then begin SetLength(Result, Length(Result)+1); Result[Length(Result)-1] := OutValue; end; end; end; finally pSubMatches := nil; pMatches := nil; FreeAndNil(RegExp); end; end;
使用の前に:
>>633 の手順に従って
プロジェクト>タイプライブラリの取り込み>Microsoft VBScript Regular Expression 5.5(Version5.5)
を取り込む。
どういうわけか(タイプライブラリインポータがさぼってるとしか思えん)
一部のプロパティが使用できなくなっているので
VBScript_RegExp_55_TLB.pasを開き
procedure TRegExp.Set_Global(pGlobal: WordBool);
begin
Exit;
end
を
procedure TRegExp.Set_Global(pGlobal: WordBool);
begin
DefaultInterface.Global := pGlobal;
end
に修正して保存。
プロジェクト>プロジェクトに追加
で VBScript_RegExp_55_TLB.pas を追加。
ユニットの uses に VBScript_RegExp_55_TLB を追加。
>>639 お疲れ様。 ソレって逐次的に実行は出来ないの?
Wikiのコードは1回の呼び出し毎に 文字列又は数値が帰って来るんで
比較の都度全部スキャンしてると、効率が違って来ると思うんだけど
最初はDelwikiで紹介されてた TRegExpr を使ってたが 後方参照しないグループ化 (?:) が使えないのと、 グローバルマッチが使えないので断念。 パターン文字列自体は、小一時間で形になったが +-+− の - 記号が範囲指定働きをしているのを失念して1時間無駄にした。 全角→半角変換のルーチンも正規表現で書けなくはないが delwikiのコードより長くなりそうだったのでdelwikiのコードを流用 個人的には、正規表現を人に勧めるのは Delphiの標準コンポーネントになってからでも遅くないと思う。(もうありえそうにないが)
function Int64FromPtr(var p: PWideChar; var ret: Int64): boolean; var s: WideString; label numMode; begin s := ''; result := False; while true do case p^ of #0: exit; '+', '-', #65291 {+}, #65293 {−}: begin s := ZenToHan(p^); inc(p); while true do case p^ of #0: exit; #9, ' ',#12288{ }: inc(p); '0'..'9', #65296 {0}..#65305 {9}: goto numMode; else begin s:='';break;end; end; end; '0'..'9', #65296 {0}..#65305 {9}: begin numMode: while true do case p^ of '0'..'9', #65296 {0}..#65305 {9}: begin s := s + ZenToHan(p^); inc(p); end; ',', #65292 {,}: begin inc(p); if not ChkChar(p^,'01234567890123456789') then break; end; else break; end; ret := StrToInt(s); result := true; exit; end; else inc(p); end; end;
使った関数。
function ChkChar( c: WideChar; s: WideString): boolean;
var
i: Integer;
begin
Result := True;
for i := 1 to length(s) do if s[i] = c then exit;
Result := False;
end;
function ZenToHan(c: WideChar): WideChar;
begin
if (ord(c) >= $FF00) and (ord(c) < $FF5F)
then result := WideChar(ord(c) - $FF00 + $20)
else result := c;
end;
>>645 は
DelWikiのコードは文字と数字に別けて返す関数なんで、
数字の時だけ返すようにして、参照ポインタで渡すようにした。
>>644 標準コンポーネントになるより、言語に取り込んで欲しいな
RegCase p of
'ABC': で文字列ABCにマッチした場合にpをABCの次のポインタまで移動してくれればと
PAnsiCharとPWideChar だけでいいからさ。
>>645 お疲れ様。
結局、Delphiでも字句解析をやろうとしたらポインタ型だよね
だめだな、 RegCase p to str of でマッチした結果はstr変数に入ってくれないと使えないか
([+\-+−]?[\s\t ]*(?:[\d0-9][,,]?)+) 今までパターン文字列は出てきても読み方が説明されたことがないので説明しとくね [+\-+−]? + か - か + か − のいずれかが0回か1回出現し、 [\s\t ]* 続けて、半角スペースかタブ文字か全角スペースが0回以上出現し、 ([\d0-9][,,]?)+ 続けて、 (半角数字か全角文字の0〜9が1回出現し、続けて , か ,が0回か1回出現する) というグループが1回以上出現する という文字列に適合するパターン マッチした文字列として () で囲われた部分が返ってくる。 マッチした文字列として返すわけではなくただグループとして囲う場合は (?:パターン) と書く。
でもさ、俺、最初仕様を、
文字列で頭からソートするけど、途中に数字が入ってたらそこは数字順にする
と思ってたんだけど、そういう仕様だと、正規表現でのマッチだけじゃダメだよね
そうじゃない場合部分と、マッチした部分に別けないといけない。
さらに
>>649 だと、数字の前の空白と、数字が終わったあとのカンマが数字に含まれてしまう。
>>650 その場合なら
(文字列部に適合するパターン)(数字部に適合するパターン)
というパターンを書けば、文字列部と数字部が一度に取得できるので
それで文字列順にソートした後、数字順にソートすればいいんでない?
ま、パターン考えるのが大変そうだけど
超初心者が絶滅しても当分このすれは大丈夫だな、こりゃ・・・
いい加減にしないと 初心者さんが質問できないぞw 長ながと議論が必要な質問は過疎ってる寺子屋のが良いんでない?
お、なんか質問できそうなふいんき(←なぜかry
Tmemo.Lines.SaveToFileで作ったtxtファイルの文字コードを
UTF-8に変換したいんですがどうすればいいんでしょうか?
ちなみにDelphi6です
>>279 もDLしてみたんですが、リンク切れがあって使えませんでした
procedure TForm1.Button1Click(Sender: TObject); var sl: TStringList; begin sl := TStringList.Create; try sl.LoadFromFile('test.txt'); sl.Text := UTF8Encode(widestring(sl.Text)); sl.SaveToFile('test2.txt'); finally sl.Free; end; end;
即答有難う御座いました 相当の暇人ですね(笑) ちゃんと動きました! 神よ感謝します!!!
658 :
654 :2007/05/13(日) 16:45:31
>>655 無事出来ました
ありがとうございます!
659 :
654 :2007/05/13(日) 17:24:22
調べてみたらAnsiToUtf8もありました
まあ初心者的には結果さえきちんとかえってくるならなんでもOKっす
もう
>>655 氏ので実装しちゃったんでこのままいきますよ
ふいんきの間違えについて指摘してやったら マジレスするなとかここは2chだとか 訳の解らない事を言ってくる
自アプリのボタン等を別ウインドウにドラックして、そのドラック先のハンドルを取得したいのですが どのようにすればよいのでしょうか?
ボタンで、ドラッグを開始する procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetCapture(Button1.Handle); end; //ドラッグ中(マウスを押し続けてる間はキャプチャーされる) procedure TForm1.Button3MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var pt: TPoint; hdl,hdl2: HWND; s: string; begin pt := Point(x, y); Windows.ClientToScreen(Button3.Handle, pt); Edit1.Text := format('%5d %5d', [pt.x, pt.y]); //テストの為に座標を表示してるだけ hdl := Windows.WindowFromPoint(pt); if hdl <> 0 then begin hdl2:=ChildWindowFromPoint(hdl,pt); if hdl2<>0 then hdl:=hdl2; GetWindowText(hdl, PChar(s), length(s)); SetLength(s, 1000); //テストの為に表示してるだけ s := Pchar(s); Memo1.Lines.Add(s) end; end; 放した時に、 ReleaseCapture(); を忘れない
>>663 その機能全部入れろっての?
窓ハンドルが手に入れば GetWindowRect でその領域が手に入るし
GetDC(0) で全体の描画用ハンドルが手に入るから、それをTCanvasに入れて
CopyRectしてくればいい
>>640 鬼車もUnicodeだと今ひとつ速くないっていうか、改造しないと
WinAPIなWSHみたいに2バイト文字のinsensitiveに対応できないでしょ
WSHはPerlみたいに(?i)でオプションONとか出来ないのは不満だけんど
いけねえ「Turbo」だw
trubo…? turbo…ターボ turbe…鶴瓶師匠
はい、次の質問どうぞ! ↓
671 :
デフォルトの名無しさん :2007/05/14(月) 00:18:00
そろそろ製品版を買おうと思うんだがどれがオヌヌヌ? 無料版はもう2、3年使ってきたし使いにくさを感じてきたんだが
普通にTurboDelphiかDelphi 2007 for winでいいんじゃない?
675 :
デフォルトの名無しさん :2007/05/14(月) 07:28:03
タイトルバー非表示のツールをつくっています。 クライアント領域の一部を右クリックされた時に タイトルバーが右クリックされた時に出るメニューを出したいのですが どのイベントをどうやってかっさらってくれば良いのでしょうか?
その「一部」にメニュー付ける
>>675 これか
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if (Msg.hwnd = Panel1.Handle)
and (Msg.message = WM_LBUTTONDOWN) then
begin
SendMessage(Self.Handle, WM_SYSCOMMAND, SC_MOVE or 2, 0);
{↑Panel1.Handleとすると
Panelをドラッグで移動できる}
Handled := True;
end;
end;
これ
procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
begin
ReleaseCapture;
SendMessage(Handle, WM_SYSCOMMAND, SC_MOVE or 2, MakeLong(X, Y));
end;
end;
678 :
デフォルトの名無しさん :2007/05/14(月) 13:17:38
>>676 どうやるんでしょうか?
>>677 ドラッグの操作ではなくて、閉じるとか最大化とかが選べるメニューです。
>>664 いえ、機能の一部をみていただいて、理解していただきたかっただけです、
ちなみにフォーム貼り付けるはButton1とButton3,そしてEdit1とMemo1ですよね?
これだと
>>662 はまともに動作しないのでButton1=Button3としたところ
Memo1には"Edit1"が延々と表示されてまして・・・。
何か根本的なことを勘違いしてますか?
OnMouseDownとOnMouseUpでいい気がする
>>681 やってみましたが相変わらずEdit1としかMemo1には表示されないです・・・。
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetCapture(Button1.Handle); end; procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var hWnd: Windows.HWND; s: String; begin hWnd := WindowFromPoint(Mouse.CursorPos); SetLength(s, GetWindowTextLength(hWnd)); GetWindowText(hWnd, PChar(s), Length(s)+1); Caption := s; ReleaseCapture; end;
>>683 グレイト!!
感動しました。
本当にありがとうございました。
>>679 あのメニューの名前はシステム表示だったんですね。
ありがとうございます。
686 :
デフォルトの名無しさん :2007/05/15(火) 11:03:03
Delphi6で作成したソフトを Windowのサイズに会わせてコントロールのサイズや位置、フォントサイズを調整する 別ソフトを作成したいのですがうまくいきません。 Windowとボタンのハンドルは取得できるのですが、LabelとShapeが取得できないのですが (WinSight32にも表示されません)何かいい方法ないでしょうか?
>>686 Labelは窓ハンドルを持っていません。
ですから、Delphi6で作成したソフトが自分のものでしたらソッチで何とかするしかないでしょう
こんにちは。 いぜんドラッグ中のハンドル取得について質問していたものです。 またつまってしまいましたので、どなたか力を貸していただけないでしょうか? 現在のソースは procedure Button1MouseDown(略); begin FOldHWND := 0; SetCapture(Button1.Handle); FIsCapture := True; end; procedure Button1MouseUp(略); begin FIsCapture := False; ReleaseCapture; InvalidateRect(FOldHWND, nil, True); FOldHWND := 0; end;
procedure Button1MouseMove(略);
var
hWnd: Windows.HWND;
DC: HDC;
Canvas: TCanvas;
Rect: TRect;
begin
if not FIsCapture then exit;
hWnd := WindowFromPoint(Mouse.CursorPos);
if FOldHWND = hWnd then exit;
InvalidateRect(FOldHWND, nil, True);
DC := GetDC(hWnd);
Canvas := TCanvas.Create;
Windows.GetClientRect(hWnd, Rect);
Canvas.Handle := DC;
Canvas.Pen.Width := 5;
Canvas.Pen.Mode := pmBlack;
Canvas.MoveTo(Rect.Left, Rect.Top);
Canvas.LineTo(Rect.Right, Rect.Top);
Canvas.LineTo(Rect.Right, Rect.Bottom);
Canvas.LineTo(Rect.Left, Rect.Bottom);
Canvas.LineTo(Rect.Left, Rect.Top);
ReleaseDC(Canvas.Handle, DC);
FOldHWND := hWnd;
end;
このソースは、取得したハンドルのクライアント領域に枠を描画するといったものです。
このソースである程度うまくいくのですが、窓のタイトル?をドラッグすると何も描画されなくて困っています。
希望する動作は
>>663 にあるようなソフトと同じようなものをイメージしています。
どうぞ、よろしくお願いします。
DC := GetDC(hWnd); Canvas := TCanvas.Create; Windows.GetClientRect(hWnd, Rect); ↓ DC := GetDC(0); Canvas := TCanvas.Create; try Windows.GetWindowRect(hdl, Rect); ・・・ finally Canvas.Free end;
>>690 ご回答ありがとうございます。
InvalidateRectもInvalidateRect(0, nil, True);
このようにして早速やってみました。
その結果、望みの動作をしているのですが、今度は描画できるウインドウと
出来ないウインドウが出てきました。
また、ちらつきも以前よりも増してるようです。
んー、根本的に何かおかしいのかな・・・?
んー、動作自体はいいのだけど、画面全体を再描画させるとどうしてもちらつく・・・。 画面全体の上に乗せるような感じで、枠を書いたり、消したり出来れば最高なんだけどなぁ。 でも、これだと、窓が時間経過とともに動くようなものだと無理か・・・。 となると、やっぱりクライアント領域に直接描画するのが一番なのかな? うー、頭がこんがらがってきた・・・。
>>691 >InvalidateRectもInvalidateRect(0, nil, True);
これが何のためにやるわけ? これだと全画面書き換えろって言ってるわけで、そりゃちらつくだろ
>>693 そうなんですよねぇ。
でもInvalidateRect(FOldHWND, nil, True); のままだと後が残ってしまうんですよ。
んで、pmNotで消すかーと思ってやってみても、白くなるだけで意味がなく
もうお手上げの状態です。
>>691 で描画できないと書いてありますが、どーもこれは自分で消しちゃってる(InvalidateRectを使って)っぽいです。
むぅ・・・。
後が残るのは、ど太い線で描画してるからだろ? 1、まず、領域に収まるサイズで描画する事 =太い線使うならその分小さくする 2、InvalidateRect でそのサイズのRECTを渡してやる、
>>695 Offsetつかったりして、描画領域の調整をしたりしているのですが、
窓の部分部分によって再描画されない領域のようなものがあってうまくいかないのです・・・。
もう一度やってみて、再度、ソースを上げますね。
UPしましたです。
ttp://cgi.2chan.net/up2/src/f256315.zip んーやはり窓のタイトルのラインがどうやっても消えない・・・。
>>695 >2、InvalidateRect でそのサイズのRECTを渡してやる
このときのハンドルは指定するのでしょうか?
それとも0にして、その領域のRect(ソース内の変数だと@FOldRect)を渡すのでしょうか?
前者だと残ってしまうし、後者だとちらつきが酷くなってしまいました。
後者の方法、全体を再描画してる気がするんで、もしかしたら渡し方がいけないのかもしれない・・・。
>>699 InvalidateRectが何なのかはちゃんと解かってるのか?
こんな実装してるとは思えないけど、とりあえずデキターヨ procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var hWnd: Windows.HWND; DC: HDC; Canvas: TCanvas; Rect: TRect; begin if not FIsCapture then exit; hWnd := WindowFromPoint(Mouse.CursorPos); if FOldHWND = hWnd then exit; DC := GetDC(0); Canvas := TCanvas.Create; try Canvas.Handle := DC; Canvas.Pen.Width := 4; Canvas.Pen.Mode := pmMergePenNot; Canvas.Polyline([FOldRect.TopLeft, Point(FOldRect.Right, FOldRect.Top), FOldRect.BottomRight, Point(FOldRect.Left, FOldRect.Bottom), FOldRect.TopLeft]); Windows.GetWindowRect(hWnd, Rect); Canvas.Polyline([Rect.TopLeft, Point(Rect.Right, Rect.Top), Rect.BottomRight, Point(Rect.Left, Rect.Bottom), Rect.TopLeft]); finally ReleaseDC(Canvas.Handle, DC); Canvas.Free; end; FOldRect := Rect; FOldHWND := hWnd; end; Button1MouseUpもうまく処理してやってね
おまえ、ここまで俺達の手を焼かせるんならオープンソースにするんだろな? こういうのをやるなら、注目窓の回りに蟻の行列アニメでもした方がいいんじゃないか? まあそれは無理そうだから、 XORで描画して、InvalidateRect使わん方がスマートに行くぞ。 あと、新しい窓を捕まえた時と、その窓から出た時の処理を書いた方がいいぞ
>>702 ぬぉぉぉぉ!!!
これは完璧だ!!
というか理想どおり過ぎて笑いがこみ上げてくるよ!
MouseUpも消す為に
>Canvas.Polyline([FOldRect.TopLeft, Point(FOldRect.Right, FOldRect.Top), FOldRect.BottomRight, Point(FOldRect.Left, FOldRect.Bottom), FOldRect.TopLeft]);
を書けばいいということですね。
やっと先にすすめます。
ありがとう!
>>703 そんな、オープンソースなんて大袈裟なぁ。
って
>あと、新しい窓を捕まえた時と、その窓から出た時の処理を書いた方がいいぞ
これは何で?
改良したソースで残っている問題といえば、
ターゲットの窓が線を引いたのより後に再描画すると線が消えるって事ぐらいなんだけどなぁ。
もしかして他にも何かある?
再描画に対応するにはフックとかいろいろしないといけないような気がする。
というか、知ってるアプリの全てがコレには対応出来てないみたいだから
技術的に不可能(というか非効率?)なのかも〜。
何はともあれ
>>702 さん、ありがと(#  ̄ー ̄)〇"グッ
706 :
17 :2007/05/16(水) 03:53:28
>>553 ExHeaderのリークはDestroyでFIcons[]をFreeしてないのが
原因のようです
が、相変わらずEAccessViolationがでてます。。。
class.pas内のRemoveFreeNotificationで落ちているみたい
なので、どっかのFreeNotificationあたりが原因なのかも。。。
もしよければ、
>HeaderControlとかに変えたら
ってどうやるのか教えていただけませんか?
HeaderControlをFormに追加して、ExHeaderの使われ方
となるべく同じになるように関数やプロパティを変更する
のでしょうか?
707 :
553 :2007/05/16(水) 16:31:20
ExHeaderを削除して、HeaderControlをFormに追加して、 プロパティ合わせて、多々コメントアウト。 でもこれはリークチェックのために一時的にそうしただけだぞ。 EAccessViolationはたぶんTreeList Treelist.pasの上のほうにある $DEFINE EXHEAD を有効にする
708 :
デフォルトの名無しさん :2007/05/16(水) 16:45:30
他の言語で言うkconvとかみたいな、文字コード変換ライブラリって、無いですかね? とは言え、やりたいことは、UTF-16 BOM付きファイルを出力したいだけなのですが。
つ VB.NET
WideStringを使いたくないって事? WideCharToMultiByte MultiByteToWideChar
711 :
デフォルトの名無しさん :2007/05/16(水) 17:25:13
あ、WideStringって、UTF-16?
Delphi 2005(Win32アプリ) on WinXP環境下で、プロジェクト内の 特定のフォームでの突然ブレークポイントが効かなくなりました。 (それまでは同箇所でのブレークポイントは効いていました。 他フォームのブレークポイントは現在も有効) そこで、 ・dcuファイルの削除 ・resファイルの削除 ・ビルド ・コンパイル ・ブレークポイントが効かないPasファイルの切り離し、再追加 ・新規プロジェクト生成、全Pasファイル追加しなおし ・[プロジェクト]→[オプション]→[コンパイラ]→[デバッグ情報]の On/Offそれぞれでコンパイル、再度Onでコンパイル ・[プロジェクト]→[オプション]→[リンカ]→[TD32デバッグ情報を含める]の On/Offそれぞれでコンパイル、再度Onでコンパイル 上記を試すものの、改善しません。 アップデータは最新版の3まで適用済みです。 丹念にぐぐってみたものの、どうしても改善策が分かりません。 お知恵をお貸しください。どうか宜しくお願いします。
そういうの昔っからあるよな
715 :
デフォルトの名無しさん :2007/05/16(水) 18:34:02
BDSの2006のヘルプ使いにくくないですか? 単語検索でヒットしなかったりします。 たとえば、「累乗」で検索して、Powerに辿り着きたかったのですが、 検索しても出てきませんでした。 結局、Mathユニットのヘルプ見て、探し当てた始末・・・
俺はdelphi6についてたWinhelpを外部ツールに登録して使ってる つーか、BDSヘルプ閉じてもdexplore.exeがプロセスリストに残ってることがあるんだけど大丈夫なの?
717 :
デフォルトの名無しさん :2007/05/17(木) 01:17:35
非VCLウィンドウの上にVCLコントロールを作成するにはどうすればいいでしょうか? とあるプログラムのプラグイン的なものを作成しているんですが、 プログラム本体からはパネル(たぶん)のウィンドウハンドルしか送られて来ません。 TWinControlから派生したコントロールなら ParentWindowにそのハンドルを設定すれば出来るのですが、 動作がちょっとおかしかったり、TImageなどTWinControlから派生していないコントロールだと、 上記の方法は使えません。 こうゆう事は直接APIを使ってコントロールを作成しないと駄目なんでしょうか? どなたか詳しい方いたら教えて下さい。
718 :
デフォルトの名無しさん :2007/05/17(木) 01:24:41
初心者なんですけど コンパイルするときに "cl ファイル名"でやると、 「"cl"は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。」 ってでるんだけど"cl"じゃ駄目なの??
×こうゆう ○こういう
>>718 IDEからF9でいいじゃん
わざわざコマンドプロンプトでやる理由が無い。
721 :
デフォルトの名無しさん :2007/05/17(木) 01:31:28
>>720 どういうことですか??
初心者なんで…
>>721 Delphiを起動して、目的のプロジェクトを開いて、F9キーを押す。
723 :
デフォルトの名無しさん :2007/05/17(木) 01:36:40
>>722 すみません…
そのDelphiの起動方法を教えてもらえませんか??
お前どうやって開発してんだよ
ここはDelphiのスレだぞw おまいの使ってる開発環境/コンパイラのスレに逝けw
Delphiのコマンドラインコンパイラはdcc32.exe
727 :
17 :2007/05/17(木) 02:21:37
>>707 TreeList.pasのEXHEADは有効になっておりまする
そろそろ手詰まり。。。
もうお前が何の話してるかわかんないし、俺みたいな奴はわざわざレス追って状況把握までしてやらないから そろそろ話をまとめて、ソースでもうpれ
>>717 窓ハンドルを持ってない = TWinControlでないコンポーネントは巧くゆかない
それは親になるコントロールが処理しているから
もらった窓ハンドルの上に、パネルを張って処理すればある程度動くだろうけど
でも、メッセージポンプが自前で無いから特定のメッセージが送られて来なかったりするだろう
そのあたり我慢出来る範囲で使うしかない
730 :
712 :2007/05/17(木) 09:00:58
>>713-714 レスありがとうございます。
同名別ユニットはありません(プロジェクトだけでなく、フォルダ内も確認済み)。
原因が探れないため、例外的な事象としてブレークポイントを使わずに
デバッグを進めてみます。
>>730 ブレークポイント前後のコードここに書けないか?
多分、最適化でコードが削除されてる気がする。
以前はそこでブレークできてても前後のifの条件とか変数の使用の変更とかで削除されることはよくある。
・そのformと同名のClassが別ユニットにある ・{$**}みたいなコメント書いたつもりがコンパイラ指令になってるとか{$D- }とか
1. そのユニットの先頭行に$$ERRORとか書いて意図的にコンパイルエラーを引き起こして、 本当にそのユニットがコンパイル対象になっているかどうかを確認。 2. 以下のコンパイルスイッチをフォームのinterface直下に直接埋め込んでみる {$DEBUGINFO ON} {$LOCALSYMBOLS ON} {$DEFINITIONINFO ON} これで駄目ならもうわがんね
734 :
730 :2007/05/17(木) 11:42:33
>>731 どの場所にブレークポイントを貼っても効かない(実行時に緑色になる)ので、
最適化の弊害ではないと思います。
ブレークポイントの効くフォームから、そのフォームをShowする直前に
ブレイクポイントを貼り、トレース実行しても同じでした。
ShowModalで開くと、そのフォームをクローズした後に再びステップ実行に
切り替わります。
皆さんの丁寧かつ的確なレス、本当にありがとうございます。
>>732 同名のClassは探してみましたが、ありませんでした。
また、コメントのつもりがコンパイラ指示・・・もありません。
>>733 1.
作為的にコンパイルエラーを起こしての確認は行いましたが、
確かにコンパイル対象となっていました。
2.
早速試してみます。
736 :
730 :2007/05/17(木) 11:46:51
結果報告です。
>>733 コンパイルスイッチを早速試してみましたが、やはりNGでした。
737 :
デフォルトの名無しさん :2007/05/17(木) 11:47:04
>729 やっぱり色々問題がありそうですね… レスありがとうございました。 とりあえず教えてもらった方法を試してみます。
>>730 そのFormを名前を変えて保存してみな。ダメならソース晒せ。
739 :
730 :2007/05/17(木) 12:42:53
>>738 Form名変更後保存も行ってみましたが不可でした。
ソースは当該ユニットだけで70,000行超ですので、ごく一部を晒します。
---------------------------------
strCap := '現在表示されているページの入力内容がすべて破棄されます。' + #13#10 +
'本当によろしいですか?';
if (Application.MessageBox(PChar(strCap) ,
'クリア確認',
MB_YESNO + MB_DEFBUTTON2 + MB_ICONWARNING ) = mrYes) then
begin
if _PnlP01.Visible Then
begin
FV_ClearAllDataOnPanel(_PnlP01);
FV_CtrlInputArea(Self);
_FS_Cash();
end;
---------------------------------
※インデントを見せるために、各行冒頭を全角スペースにリプレイスしています
他のどこでもそうですが、当該ユニット内のどこにブレークポイントを貼っても
不可でした。
>ソースは当該ユニットだけで70,000行超ですので、ごく一部を晒します。 ここが激しく臭いな 今の某なら65k以上のソースは扱えませんとか平気でやりそうだし
そうだな。 そのサイズならDoc-Viewに別けるべきだろうな
> _FS_Cash(); を > _FS_Cache(); にすれば直りそうな予感w
743 :
739 :2007/05/17(木) 14:42:50
>>740-741 そこですかね。
ファイルサイズの小さいユニットはきちんとブレイクするので、
ひょっとしたらそうかもしれません。
>>742 他の人が作ったパッケージのカスタマイズをしているので、
元のソース作った人にスペルミス言っておきますw
それにしてもよくそっち(CashではなくCache)のキャッシュの処理って
分かりましたね。流石。
TListViewのvsReportで行の幅ってどうやって変えるんですか?
Columns
Columnsでどうやればいいんですか?
widthプロパティに列の幅をピクセル単位で指定する
あ、行の幅か・・勘違いしてた。ゴメン
行の幅じゃなくて行の高さならImageListを設定すればいいんじゃないの。
初歩的ですが、 2つのクラスのメソッドでお互いのクラスを引数に使います。 ユニットを分けると循環参照になり 同一ユニットに記述すると、未定義の識別子となります。 どうすればいいんでしょう。おねがいします。
type TB = class; TA = class procedure foo(b: TB); end; TB = class proceudre bar(a: TA); end; こんな感じ
>>751 ありがとうございます。それだ!
たった今、過去ログその6(03/09/11)で同様の書き込みを見つけました。
そこでは循環参照になるのは設計が悪いと言われているようなので
もうちょっとログを読んでみようと思います。ありがとうございました。
一概に悪いとも言えないけどな。 親が子を所有し、子が何かするとき親の参照辿って情報を盗み見るというのはままあること。 まあ手抜きといえば手抜きなんだが。
コンストラクタとかプロパティとかで、自分と同じクラスを参照するような クラスも面倒だよね、と少し別の話をしてみる。
755 :
デフォルトの名無しさん :2007/05/17(木) 22:37:55
リッチエディットのCaretPosプロパティーでできるのは、表示行・列を取得/設定の ようですが、物理行・列を取得/設定する方法ってあるのでしょうか? 地道にCRLFを数えるしかないのでしょうか?
>>755 取得はEM_LINEFROMCHARを投げればいいのでは?設定はEM_LINEINDEXを投げて
行頭の文字インデックスから必要な場所へ移動させればいいと思う。
MDIのちらつきを出なくするほうを教えてください。 MDIの子フォームを新規で呼び出した時 子フォームはまず、小さいフォームで出現し、 それから親フォームへ向かって拡大しています。 呼び出した時だけ、表示しないようにすればいいと思い、 試したところ、子フォームを隠すことはできないと、delphiにおこられました。 どうすればよいでしょうか? 教えてください。
LockWindowUpdate(親フォーム.Handle); {MDI子フォーム作成} {MDI子フォーム作成完了} LockWindowUpdate(0);
760 :
デフォルトの名無しさん :2007/05/18(金) 19:19:54
761 :
757 :2007/05/18(金) 20:53:15
>>760 あ、物理行か。それは数え上げるしかないな。
>>739 CPUViewにプレークポイントを設定してみてはどうかな。
>>761 それしかないですか。
改行コードをカウントするだけなんだから、メソッドやプロパティーとして入
れといてもいいと思うんですけどね。>Borland
自作エディタで行番号表示つけるときなんか、モロ必要だろうに。
Delphiに連想配列ってないですかね Hash['Hoge'] := Pointer(FHoge); FHoge := THoge(Hash['Hoge']); みたいな
TBucketListというものがあるらしい。 が、使ったことはない。
>>764 IniFiles..pasにTStringHashがある。
>>765 文字列をKeyにできないから私の使いたいのとちと違った
>>766 THashedStringListというのは見つかった
Hash.Values['Hoge'] := IntToStr(Integer(Pointer(FHoge)));
FHoge := THoge(Pointer(StrToInt(Hash.Values['Hoge'])));
こんな感じになったが
文字しか入れられないから激しくキャストしてIntToStrで変換して入れてるけどこんなんで大ジョブかね
>>767 IndexOfName 使って Objects に入れた方が少し速いよ
連想配列的にやるなら継承しないといけないけどさ
770 :
デフォルトの名無しさん :2007/05/19(土) 08:43:30
Hash.Values['Hoge='] := 'moge'; すると・・・
>>770 "=" が入ってるなら、エスケープしないといけないね
772 :
デフォルトの名無しさん :2007/05/19(土) 11:05:27
実数型の変数を独自形式のファイルに保存したいんですけど、 字数型の変数のメモリにあるビット(指数とか底で表されてるもの)を参照するにはどうしたらいいんでしょうか?
字数型は実数型の間違いでした。すみません。
var dd:double; var di:int64 absolute dd; var de:Extended; var db:array [0..9] of byte absolute de; のようにすれば、浮動小数点のバイナリイメージを固定小数点型で見る事が出来るけど たぶん、Frexp のことじゃないのかなと
ListViewでカラムで右クリックメニューを表示しないようにしたいのですがどうすればいいでしょうか? procedure ListViewContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin if not(ListView.GetItemAt(MousePos.X,MousePos.Y) = nil) then PopupMenu.Popup( ListView.ClientToScreen(MousePos).X, ListView.ClientToScreen(MousePos).Y); end; これだとカラムの下のほうも反応してしまいました。
776 :
761 :2007/05/19(土) 14:57:15
>>763 改行コードをカウントするのは論理行じゃないの?自作エディタで物理行表示が必要な
場合なんかは、ふつう自分で描画するから付いていないのだと思う(どこでどう改行する
かはプログラム作る人によって違うだろうから)。
ボーランドの前にWindowsのRich Editのラッパーだから、そっちの方に機能がないものは
付けて良いか微妙(標準コントロールと動きが変わってしまうから)。
改行コードでカウントするのが物理行だよ
778 :
デフォルトの名無しさん :2007/05/19(土) 16:07:01
>>777 ああ、ダブルで勘違いしていた(RichEditの動作と物理行)。改行コードを数えるよりは、
Linesの文字数を数えてSelStartと比較するほうが楽かも(改行コード分を忘れずに)。
>>769 こんな感じですかね?
//入れるとき
Idx := Hash.IndexOf('Hoge');
if Idx = -1 then
begin
Hash.AddObject('Hoge', TObject(FHoge));
end
else
begin
Hash.Objects[Idx].Free; //これは好みで
Hash.Objects[Idx] := TObject(FHoge);
end;
//取り出すとき
Idx := Hash.IndexOf('Hoge');
if Idx = -1 then
begin
FHoge := nil;
end
else
FHoge := THoge(Hash.Objects[Idx]);
end;
>>779 Lines[i]は物理行ではなく論理行一行の文字列が返ってくるんですよね?
だとすると、ちょとイメージ湧かないんですけど。
例えば、物理行の3行目、論理行では5行目(ただし処理の前に5行目である
ことは分からない)の行頭にキャレットを移動させたい場合、どんな感じのコ
ードになりますか?
>>774 absolute指令というのがあったんですね。
バイナリの独自形式なので一番ぴったりの動作をしてくれました。
>>774 さん
>>778 さん、ありがとうございました。
783 :
758 :2007/05/20(日) 15:48:32
>>759 ありがとうございます。
でも、タイミングがわからず、ロックするのを確認できたのですが、
小さいフォームの枠までも表示されてロックされていて・・・
子を作ったよりも前にしかけるのか? ←失敗
子オブジェクト作った直前なのか? ←失敗
と、お手上げ状態になってしまいました。
MDIの子フォーム作成 → 完了
この、タイミングをどなたか、教えてください。
784 :
779 :2007/05/20(日) 16:00:59
>>781 うそ、こっちも論理行でしたっけ?じゃあ、物理行での管理はRichEditではやって
いないってことなのかな。とすると、論理行は別に管理しておく必要があるかも。
って凄く面倒くさそう。
でも、改行はちゃんと管理している(サイズ変更をすると改行はちゃんと改行されるし、
改行のないところはちゃんと前の行につながる)みたいなんだけど、取得する方法が
ないのかな。
TextプロパティーでCRLFを数えるか、TStringList.TextにTextプロパティーの値を
読ませて文字数を数えていくしかないのかも。
タイトルバー以外でドラッグするソースを色んなところで見つけることが出来るのですが ソース内の"SC_MOVE or 2"の2がなんなのかいまいち理解できません。 これはなんなのでしょう? それとReleaseCaptureもコメントアウトしてもいいような気がするのですが この必要性もいまいち・・・。 なんだか気持ち悪いので、どなたかずばっ!と答えることが出来る方いらっしゃいませんか? 以下、ソース。 procedure TForm1.FormMouseDown(Sender:TObject;Button:TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; // これって何のため? SendMessage(Handle, WM_SYSCOMMAND, SC_MOVE or 2, 0); // 2っているの? end; end;
幼女に中出しした後に チャックを開けたままで街にくり出す これが非常に不快 だからリリースする
>>785 2はHTCAPTION
つまり、タイトルバーでドラッグしてますよ、と騙すためだ
>>787 おぉ!なるほど。ありがとう!
ん、でも、何でこんな事する必要があるんだろ?
右クリックしたときに、タイトルバーをクリックした時に出るメニューを出す為かな?
ぬぬ??
タイトルバーでドラッグしてる事にしないと、ウィンドウが移動してくれないだろ。
こんなおまんこ野郎は相手にしないに限るが 超初心者スレだから仕方が無い
>>789 あ、ほんとだ。
コメントアウトして再コンパイルしてみたら挙動が変になるね。
教えてくれてありがと。
他のウインドウを監視(Windowの状態、位置、サイズ)したいのですが どのようにすればよいのでしょうか?
>>784 ただ物理行を取得するためだけには大袈裟かもしれませんが、TSynEditという
海外製のコンポを使うという手もありそうです。
少し遊んでみたのですが、これのCaretX、CaretY、CaretXYは物理行・列が返
って来ます。
ただし問題が2つ。
物理行は取れるんですが、PerformでEM_〜を投げても0しか返ってきませんし
Lines[idx]も物理行単位です。つまり論理行が取得できません。(あるかもし
れませんが発見できてません)
そしてもっと大きな問題は、ヘルプ、マニュアル、使用例等の資料がネット上
にあまり見あたらないことです。
まあソース付きなので、時間に余裕がある人ならなんとかなるかもしれません
が。
>PerformでEM_〜を投げても0しか返ってきませんし なにやってるの? カスタムコンポがMSが決めたメッセージを理解する、と 期待するほうが無理だろ。
ソース付きなら、むしろどうやって物理行取得してるか調べた方が早くない?
796 :
デフォルトの名無しさん :2007/05/20(日) 21:53:36
zipファイルを解凍しないで中身を見るのって delphiだとどんな方法があるの?
素直にうんじp
798 :
デフォルトの名無しさん :2007/05/20(日) 22:12:45
800 :
デフォルトの名無しさん :2007/05/20(日) 23:48:09
>>800 だから798のコンポーネントでいいんじゃないの?
798の表は古いけど最新版ではちゃんと一覧取得可能になってるよ
802 :
デフォルトの名無しさん :2007/05/21(月) 00:23:07
803 :
momo :2007/05/21(月) 01:04:02
お願いします。 datetimepickerの日付の初期化の仕方を教えてください。
初期化というのが何を指してるのかは知らんがDateTimeプロパティに好きな値入れればいいんじゃないの?
StringToWideCharの使い方がわかりません。 ↓引数とすべきstringの他にDestとかDestSizeとかがありまして… function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar; 仮に内容が'0'のstringをこの関数でWideCharにする場合、どのように書けばいいんでしょう?
>>805 var buf:array [0..100] of WideChar;
StringToWideChar( '0' , @buf[0] , length(buf) );
普通は使わない。 WideString の変数に代入するだけで変換されるから、そっちを使う
>>806 ありがとうございます。
実は文字列と配列の関係をWideStringで実験中なんですが、WideString[hoge]に'0'を入れてみようとして行き詰っていたのです…
いまいじっててまた悩んでいるのですが、逆にWideCharToStringの場合の引数が(Source: PWideChar): string;と、ポインタになっているので^WCharaのようなものを入れてみたんですが、うまく行きません…
多分、ぼくがポインタってものをよく理解してないからだと思うんですが、こういう場合はどのような引数の形にして入れるんでしょうか?
>WideString[hoge]に'0' var ws : WideString; setlength(ws,hoge); ws[ hoge ] := '0'; ってこと?
>>808 いえ、str1: string;
str1 := '0';
ws[ hoge ] := str1;
みたいに、とりあえず、1バイト文字を思ったところに入れてやろうと、
そうしたらWideCharとstringは型が違います、と怒られて…
str1をWideCharの変数に入れてやろうと思ったわけです。
それは ws:='xxxxxxxxxx'; p:=PWideChar(ws); inc(p,hoge); StringToWideChar( '0' , p, 2 ); のようにするって事? でも、コレだと 1#0 と#0が付いてしまうからうまくゆかない 素直に for i:=0 to length(str1)-1 do ws[ hoge +i ] := str1[ i+1 ]; とやるべきでしょ 文字列のサイズは指定忘れないようにね
>>810 うーん、そのようになりますか…
ま、素人にはポインタで、ってよりそのやり方のほうがわかりやすいかもしれません。
ありがとうございます。
大変参考になりました。
812 :
デフォルトの名無しさん :2007/05/21(月) 14:01:48
>>803 すいません。
プロパティの書き方がわかりません。
おしえてください。
>>803 ひょっとして、NULLにしたいっていうこと?
(日付が何も入ってない状態にしたい、という意味)
だとしたら出来ません。
創意工夫して、NULLっぽく見せるように自分で考えてください。
Delphi6Proのアップデートパッチってもう入手負荷なの? URLが消えてる・・・
ありがと。 このIPって某のもの? DelWiki直しておこうかと思うんだけど載せちゃっていいものなのかね。
817 :
815 :2007/05/21(月) 14:41:23
>>816 一応IPはBorlandのものだったよ。
------------------------
inetnum: 202.33.253.0 - 202.33.253.255
netname: BORLAND-JP
descr: Borland Co., Ltd.
country: JP
------------------------
載せていいかどうかは分からない。
っていうかアップデータ自体、ぐぐればすぐ出てきたよ?
819 :
デフォルトの名無しさん :2007/05/21(月) 16:54:31
>>803 いえ日付を2年前にしたいだけなんです。
久しぶりにくだすれらしい質問だ
ftpサイトもまだ死んではいないようだ。必要な人は今のうちにダウンロードしといたほうがいいかも。
>>794 試しもしないことを責めるんならまだしも、試して文句言われるんでは納得い
かないんですが。
>>795 自分が初心者でなければどこに書いてあるのか見当がすぐにつくのかもしれま
せんが、とにかくコード量が膨大なので追い切れてません。
なので、暇な時にやりたいと思ってます。
論理行が取得できないと
>>793 で書きましたが、その後の調査で、DisplayX、
DisplayY、 DisplayXYで取得できるようです。
まあこんなことは、TSynEditに興味がない人にはどうでもいい情報でしょうが、
2chは検索に結構引っ掛かるのでネット上に残しておくために書いておきます。
>>823 TEditor は「EM_ 系の一部のメッセージに対応」してるよ。
期待してもおかしくないんでない?
指定した窓を監視したいのですが スレッドを作成してGetWindowInfoで指定の窓を見張るやり方でよいのでしょうか? それとも他に何か良い方法がありますか?
GetWindowInfoでまにあうなら、それでいいんじゃないの? グローバルフックでメッセージを横取りするほどの事じゃないと思う
>>826 ありがとう。
早速実装にとりかかります。
そういえばフックってdllが必要なんですよね?
昔、単一Unitでフックしてたのをどこかでみかけたけどどこだったんだろ?
Halbowさんとこだと思ったけど、みつかんないなぁ・・・。
ADOでデータベースにアクセスするOLEオートメーションサーバーを作りたいのですが、 オートメーションインタフェースのメソッドの引数や戻り値としてADOのRecordsetを使えるんでしょうか。 たとえばExcelからDelphiで作ったOLEサーバーにSQLを渡して、Recordsetを返してもらうといった使い方をしたいのですが・・・。 タイプライブラリエディタの型のリストには該当するものがないので、使いないんですかね
>827 XRAYさんのところは?
Delphi6のProってまだ売ってましたっけ?
TURBOのコンポ追加できたバージョンのインストーラ まだお持ちの方譲って頂けませんか。 TServerSocketが使えないので。
833 :
デフォルトの名無しさん :2007/05/22(火) 04:19:48
SkypeはDelphiで作られています。 Delphiは決して日曜プログラマーのための玩具ではないのです。
いまは日曜プログラマにも相手にされてないけどな。↑これって、自らおもちゃだと認めてるところがすごい。 こわれたオモチャだけどな。
>>819 質問に答えてもらったら、お礼を言いましょう。
ネットマナーの基本です。
肝
別プロセスのWindowのフォント(サイズ)を変更したいのですが WM_SETFONT使ってみたのですが変更できませんでした Windowやコントロールのサイズは変更できるのですが 環境は、WindowsXP + Delphi6です
WM_SETFONT は自前の窓だと対応してない方が多いと思うよ
>>838 ありがとうございます
NT系は、別プロセスにWM_SETFONTを使ってもだめなような書き込みを見つけましたので
たぶん無理みたいですね
Delphiの話題からそれてますが、別な方法あればお願いします。
BDS2006にタスクバーみたいな動きをするパネルってありますか?
841 :
840 :2007/05/22(火) 11:57:23
すみません、タスクバーを自動的に閉じる設定をしたときの動きです。
WM_SETFONT はハンドルを渡すから、単に別プロセスから送ってもダメなわけで、 グローバルフックでもして、一度そのプロセスでハンドルを作ってから送りなおしてるんだろ?
グローバルフックしておいて TFONT をシリアライズしてATMを作り独自のメッセージIDでメッセージを送って そのメッセージをフックしたら、フォントを作ってWM_SETFONTを投げなおす という事か?
844 :
番組の途中ですが名無しです :2007/05/22(火) 15:54:09
delphi6のFormatDateTimeで、 元号を(M,T,S,H)で表示する方法無いですか? この関数じゃなくてもいいですけど
>>844 Delphi標準ではないように思う。
gやggで「平成」とか取得してそれを「H」に置換する関数自作したらどうだろう?
847 :
番組の途中ですが名無しです :2007/05/22(火) 17:16:08
>>845 古いバージョンならそれでokなんだけど6だと「平」になるんだ
>>846 美しくないけどそうするw
メタファイルでプレビューを描画していますが、TMetafile の Height を ディスプレーの高さ以上にすると、高さを超える部分の描画ができないと いいますか不完全に表示されてしまいます。何が原因なのでしょうか。 (Delphi6 Personal と WindowsXpです)
>>848 >>何が原因なのでしょうか。
>TMetafile の Height をディスプレーの高さ以上にする
素直にここじゃね?
う、メタファイル描画後に TImageのCanvas に縮小して画面には収まるように 表示しています、と言う説明が抜けてました。
TImageのBitmapのサイズはどうなってるの? というかPictureプロパティに代入するだけじゃダメ?
TEditor と SynEdit は無関係。Windows のエディットコントロールと違って ソースがあるなら、わざわざ試さなくたってグレップすれば一瞬でわかるわな。
854 :
758 :2007/05/22(火) 21:51:02
テキストファイルを開くとき、EUCとかだと文字化けするんですが、 Delphi6ではどうすれば、文字化けせずに出力しますか?
JConvert.pasを使って変換するとか。
856 :
758 :2007/05/22(火) 22:07:30
>>855 ありがとうございます。
ダウンロードできましたので試してみます。
DelphiについているParadoxというデータベースは「2Gまでしか入らない」という噂を聞きました。 この場合の2Gというのは、一つの.dbで2Gということなんでしょうか、Appendする一つのレコードは2Gまでじゃないといけない(Blobみたいな巨大なデータとか)ということなんでしょうか? InterBase(FireBird?)ならこの最大値はいくらくらいあるんでしょうか?
2ギガというのは 2^31 = 2147483648 という事で 符号付32bit整数の最大値に制限されるという事 ようするにあらゆる部分で32bit整数を使ってるんだと思うよ。
>>858 ということは一つの.dbで2Gということですか?
画像とか溜めたらあっというまですね…
Delphi製アプリのListViewって Vistaだとクリックで音が鳴りませんか?
861 :
デフォルトの名無しさん :2007/05/23(水) 23:13:27
datetimepickerで日付を常に今日にする方法を教えてください。
それって体験版を永遠に使えますね
日経ソフトウェアのDelphi風林火山 せっかく面白くなってきたのに 来月号で最終回とな。 残念なり。
>>863 やはり半年で終了か。予想通り。
となると、VBパラダイスも終わりかな?
時間があれば今までのVBパラダイス(俺はC#で打ち込んでるけど)のプログラムも
Delphiに書き換えようと思っている。
「Delphi風前の灯火」とか始まるかもな・・・
>>861 DateTimePicker1.Date := Date;
教えて下さい。 Turbo Delphiではタイプライブラリの取り込みも 出来ないのでしょうか?
868 :
デフォルトの名無しさん :2007/05/24(木) 12:59:35
って無料版の話ね
VistaってTOSVersionInfoExのdwMajorVersionは"6"? それともdwMajorVersionは"5"でdwMinorVersionが"3"以上だっけ?
集合型の中身を知りたいときにはどうするの? var a: set of Byte; begin a := {1,3,5}; このaの1番目、2番目に何が入っているか知りたい つまりデータ作ったあとの逆引き なんかincludeで「5が含まれるかどうか」しかわからないらしく・・・
順に調べるしかないでしょ var a: set of Byte; i:Byte; begin allocConsole; a := [1,3,5]; for i:=low(i) to High(i) do if i in a then Writeln(i);
for i in a do WriteLn(i);
まぁ、そもそも集合の要素に順番なんてないわけだが・・
まぁ for i:=low(i) to High(i) do こんなのが動くわけないわけだが
>>878 Byteだから別にそれくらいの負荷問題じゃないだろ
高速化したいならByteじゃなくて 範囲をもっと狭くするか
ビットを直接処理するか
>>879 どうでもいいが、彼は君の揚げ足取ってるだけだと思うよ。
for i:=low(Byte) to High(Byte) do
? どこか問題が?
>>874 の定義の部分を
type THoge=1..5;
var
a: set of THoge;
i:THoge;
としておけば、 for i:=low(i) to High(i) do は 1〜5になる
Byteだと for i:=low(i) to High(i) do は0〜255だから無駄って事
ネチネチ百済ねー事やってんな・・・ i: byte;のとき low(i) = low(byte) = 0 high(i) = high(byte) = 255
(i)←おまえらわざとやってんだろwww
integer や Int64 だったらどうするのだろう?
何十万行もあるテキストファイルをマッハで処理したいんですがどうすればいいのでしょうか? 今はStringListに読み込んで一行ずつ検査(Posで指定文字列の検索)しているのですが遅すぎて困っています。 分散処理なんかも視野にいれるべきなのでしょうか? アドバイスお願いします。
unsigned __int64って、Delphiだとどう書くの?
>>884 俺もそう思ったんだけどね、(i)で問題ないよ。
>>886 var f: text;
AssignFile(f, 'foo.txt');
Reset(f);
while not Eof(f) do readln(f, s);
とかやって一行ずつ処理。
StringListは無駄が多すぎるのでテキストのサイズが大きいときには使い物にならない。
byte で50倍の無駄。integer だったら果てしなく無駄なコードが問題ないわけないだろ・・・
∧_∧ ( ´・ω・`) ∧_∧ / \ (´∀` ) ハハハ .__| | .| |_ / ヽ ||\  ̄ ̄ ̄ ̄ / .| | | ||\..∧_∧ (⌒\|__./ ./ ||. ( ) ~\_____ノ| ∧_∧ / ヽアホか \| ( ´_ゝ`) 何言ってんだコイツ? | ヽ \/ ヽ. | |ヽ、二⌒) / .| | | .| ヽ \∧_∧ (⌒\|__./ /
>まぁ >for i:=low(i) to High(i) do >こんなのが動くわけないわけだが はじめは、「動くわけない」と動く・動かないを問題にしてたのに、 動くことがわかったので、誰かさんはこっそりと速度の問題にすりかえてるよ。
893 :
886 :2007/05/25(金) 20:31:54
>>889 ありがとうございます。試してみます。
速くするならWinAPIだろ!と思ってReadFileでバッファに入ってきたデータをstrpasして中身見てみたら改行コードをどう処理すればいいのかわからなくて挫折。むずい。
遅すぎるってどれくらい時間かかってんの? ファイルを読む部分なのか、Posで検索する部分なのか ボトルネックを調べたら??
stringlistの無駄の多さがボトルネックと上に書いてある
>>893 メモリ(string)に全部読んで
http://delwiki.info/?%A5%B3%A1%BC%A5%C9%C1%D2%B8%CB%2FUnicode%C2%D0%B1%FE%B0%C6%A4%BD%A4%CE%A3%B1 function LoadFromFileToStr(fname:WideString):string;
var hin:THandle;
var rsize:DWORD;
begin
result:='';
hin:=CreateFileW(PWideChar(fname),GENERIC_READ,0,nil,OPEN_EXISTING ,FILE_ATTRIBUTE_NORMAL,0);
if hin<>0 then try
SetLength(Result, GetFileSize(hin, nil));
ReadFile(hin,PChar(Result)^,Length(Result),rsize , nil);
finally CloseHandle(hin);
end
end;
あとは1文字づつ見ていけばいいんだよ。
Delphiはネイテブコンパイラだから、1文字づつ見るコードが一番速い
文字列検索で一文字づつ見るとかだるい
だるくても、一度そういう手続きを作っておけば、次からは楽なんだからガンバレよ
>>896 > メモリ(string)に全部読んで
ええー10万行を超えるテキストファイルをー?
もしかしたら数100MBあるかもしれないのにー?
1行が平均千文字近くあるの?
> 速くするならWinAPIだろ!と思って 基本的にAPIは遅いよ 中の人が便利に色んな事してくれてるから つーか、10万行とか数100MBとかSQLiteかなんか使った方が。。。
相変わらずわけのわからないがんばり方だなぁ
>>899 そんなに大きかったの? なら
CreateFileして、
CreateFileMapping でメモリに割り付けて、
後はポインタで1文字づつ処理すればいいでしょ
>>901 最初からデータ形式を自前で設計できるならともかく
与えられたテキストファイルを読みたいのが目的なんだから、ソレは目的を外れているだろ。
10万行とか何をするんだろうな ヘッダファイルの検索・置換だろうか?
質問した当の本人はどっかいってしまったから第3者でにぎわってもしょうがない
906 :
886 :2007/05/25(金) 23:11:57
>>896 そのResultを一文字ずつ判定って概念はわかるのですが
具体的にどういったコードを書けばいいのか見当も付かないです。
copyで切ったりするの?
>>900 一行は多くても100byteくらいですが行数だけが半端なく多いのです。
>>903 メモリとかポインタとかよくわかんないので、勉強してきます。
>>905 紅の豚見てた。
なんだか速度を追求すると相応の技術が要求されるようでみんな何の話してるかわかんなくなってきた。
>>906 やりたい事は具体的にどういう事なの? 検索するだけ? 検索してカウント? それとも置換?
908 :
886 :2007/05/25(金) 23:30:31
>>907 一行ずつ検索してカウントです。
元のデータには変更を行いません。
>>885 集合型を作れる基本型の要素は最大256個までだから、そういう心配は杞憂
>>908 全部メモリに読み込んで、探したい文字列の最初の一文字があるところ探して
そっから文字列比較とかしてみ
>>908 その1行づつ検索する理由は何?
たとえばその出現した行番号を表示したいとか?
もし、
単に個数をカウントするだけなら、検索文字の先頭文字を見つけては、
その部分をcopyして比較するといい。
もちろん、さらに高速にする方法は色々あるけど、
for i:=1 to length(str) do if str[i] = c then
if copy(str , i , length(dst)-1) = dst then
行番号をカウントしないといけないなら、 LF=#10 の個数も数えるといい
for i:=1 to length(str) do
if str[i] = #10 then inc(lineNo)
else if str[i] = c then if copy(str , i , length(dst)-1) = dst then
さらに効率を上げるなら KMP法(KnuthMorris Pratt) BM法(Boyer Moore) でgoogle検索をどうぞ
913 :
886 :2007/05/25(金) 23:54:27
>>910 今後も役に立ちそうだからメモリやらポインタについて調べてみます。
できれば直接参照して検索した方が速いんでしょうね。
>>911 一行ずつ検索する理由は、基本的には読んだファイルの中に任意の指定文字列がいくつあるのか数えたいからです。
stringって一文字ずつバラして取り出すことができるんですね。勉強になりました。
>>912 ありがとうございます。ぐぐってみます。
100MBぐらいメモリにつっこめよと思うのだが・・・。 こういう考えはプログラマ失格かね?
今時のPCなら問題なし
Delphiでデバイスドライバは作れますか?
>>916 作れるかといわれれば、作れるよ
面倒くさいから、誰もやらんが
単独ではつくれないだろ。
DelphiでVC++相当をつくって、それで作ればいいから、つくれるっていやぁ作れる。
delphi2008って出るのかな? Vista対策にいーかげん買い換えたくなってきた。
Delphi7使ってるんですが 同じ構造体の代入は出来るんですが 比較演算子で「互換性の無い型です」と怒られるます。 出来ないんでしょうか?
できないよ。 フィールドに文字列やオブジェクトとかぶら下がってることもあるから機械的な比較は不可能。 あえてやりたいならCompareMem。
構造体の比較は2006以降でないと無理。
(´・ω・`)ショボーン ありがとやんした。
926 :
初心者 :2007/05/26(土) 14:24:04
TStringGridについて質問です。 一覧性を高めるために、デフォルトのセルの高さを11に設定してフォントのサイズを8に(これ以上小さいと字がくずれてしまう)設定しているのですが、 文字を入力するときに小さい入力ボックスのようなものが出て直で入力ができません。 これは防ぎようがないことなんでしょうか? WinXP HOME Delphi 5J です。お願いします。
>文字を入力するときに小さい入力ボックス は自前で出してるんだろ? だったら、大きくしたらいいんじゃないの?
>>926 StringGridの入力使わずに、入力するタイミングでGridの上にTEdit貼り付けるといいよ
半ば諦め気味の質問なんですが・・ Delphi6personalからTurboDelphiに移行したんですが XPManを適用したところ、 InputQueryのフォームのサイズが変わってしまいました。 これはどうしようもないですか?
var a: set of byte; a := [1,3,5]; はできるのに、 a: Array [0 .. 2] of byte; a := [1,3,5]; と書けないのはなぜ・・・ 配列を一気に定義したいのに
オープン配列ならそうかけるので、 オープン配列の引数を使えばどう?
オープンハイレェェェェェツッ! チェーーーンジ!ゲッターbyte! スイッチッ!オンッ!
キー入力を同期させたいのですがどのようにすればよいのでしょうか? 例えば現在自分のForm内のEdit1にフォーカスがあったとして、 そのEdit1内でのキー入力を別の窓のEdit(ハンドルは取得済み)と同期(入力)させたいのです。 詳しい方、どうぞよろしくお願いします。
自分のエディットが変更された時のイベントで エディットの文字列を取得 SetWindowTextで別窓のエディットに
>>934 回答ありがとう。
出来ればEdit内だけでなくGridやその他のコントロールでも同期させてみたいです。
そこでキー入力自体をキャッチしたいのですが、どのようなメッセージをキャッチすればよいのでしょうか?
WM_KEYDOWN / WM_CHAR だろ
937 :
デフォルトの名無しさん :2007/05/26(土) 23:28:26
ヒントを任意のタイミングで表示したり、消したりしたいのですが どのようにすればよいのでしょうか? THintInfoあたりを弄ってみても、少し待たないとヒントが表示されず困ってます・・・。
コンポーネントの名前(Nameプロパティ)を変数で指定する方法はありますか? たとえばEdit1,Edit2...とあってXが2ならばEdit2に表示するといったことがしたいのですが。
findcomponent
現状で楽してネイティブ作れるのってこれだけか C+WIN32APIは糞面倒臭いにも程がある
c++builder
>>938 Application変数にある Hint に ''ShortHint | LongHint' で入ってる
ヒントには短いヒントと 長いヒントがある。 | で区切れば、区別出来る。
ロングヒントは、
Application.OnHintを使うと StatusBar.AutoHintがTrueでもロングヒントが表示されない
自前でGetLongHint して表示しないといけない。
ShortHintは
HintPause/HintHidePause/HintShortPause とHintColor/HintShortCuts で調整
ショートヒントをマニュアルで出すには
GetCursorPos(P);
Application.ActivateHint(P);
ショートヒントをマニュアルで消すには
Application.CancelHint
VirtualTreeを使ってるんだけどどんな風に"使用してます"ってかけばいいのかな? バージョン情報のウインドウなんかに VirtualTree配布もとのリンクを貼ればOKなのだろうか・・・? この手のライセンスのコンポを使用している有志、ご意見を聞かせてもらえないでしょうか?
VirtualTreeの配布元のページにVirtualTreeが使われてるソフトがギャラリーみたいく 並んでいなかったけ?それらのソフト参考にすれば?? 俺はバージョン情報のダイアログにのっけてる。
41個の整数を要素とする母集団があり、 その中から任意の2〜40個、及び41個の要素の和を総当りで調べる プログラムを作ってみたんだけれど、(Del6Per) 四半世紀ほど年齢が上の上司がJIS-BASICで作ったモノに 実行速度で負けたのはショックだった orz
で?
Delユーザにはそんなレベルのが多いよね
そこでインラインアセンブラ
2個の場合は、最初は1〜40の中から1つ選ぶんだ N[0] とするよ 次は N[0]〜41 の中から選ぶんだ 3個の場合は 最初は1〜39 次はN[0] 〜30 最後は N[1] 〜31だ
アルゴリズムの坂
レコード型にメソッドを付けられるようになったのはいつからでしょうか?
TurboPascal5.5からじゃなかったかな
2006からだね。object型なら昔からできたけど。
958 :
デフォルトの名無しさん :2007/05/29(火) 22:27:18
>>949 ちょい前にも出てたけどアルゴ方面へ逝け。
ただし、だ。配列使いまくりで演算させていたならその結果は当たり前。
Delphiの伝統として、配列の使用はタブーだろw
>Delphiの伝統として、配列の使用はタブーだろw いみふめ
配列の使用はタブーのコンパイラ・・・糞ですな
How many files (0−15)?
動的配列の導入以後は全く事情が違うさ。
配列使わず何を使うんだ?
AllocMemでメモリ確保してポインタで舐めてたんだろ
チューニングパラノイアが初心者スレ引っ掻き回すのはやめてもらいたいなぁ
動的配列の追加はよかったよな。 今では動的配列無しに書けない体になっちゃった。
Stringもそうだけど配列もクラスとして記述できるくらいのパワーが言語に欲しかったな。 Stringはユーティリティ関数が散らばりすぎだし、動的配列は可能な操作が貧弱すぎる。
クラスとして表現といっても現状のOOPの機能の追加を継承による方法では 手続きの引数で表現する方法に比べて良くなるとは思えない。
一番目の引数について自動的にドットシンタックスが適用出来るような 仕様にすればどう? function Add( A:Integer ; B:Integer ):Integer; で、 C := 1 .Add(2) と書けるような
それで、どう便利になるか判らん。 教えてくれ
>>969 .NET 3.0正式対応のIDE待ちだな。
もしかしたらWin32版でも追随してくるかもしれないな。
972 :
デフォルトの名無しさん :2007/05/30(水) 15:54:10
Delphi2005で、画像の印刷で苦しんでいます。 Printer.BeginDoc; Printer.Canvas.CopyRect(Rect(0,0,1024,768),Image1.Canvas,Rect(0,0,Image1.Width,Image1.Height)); Printer.EndDoc; ※ Image1.Picture には、emfファイルを読み込ませてあります。 これを実行すると、 「ビットマップを持っている時のみイメージの変更が可能です」 というダイアログが出て、印刷出来ません。 Image1で持っているemfデータを、内部的にBitMap化させないと いけないのでしょうか。参考になるURLでも結構ですので、 ご教示くだされば幸いです。よろしくお願いします。
974 :
972 :2007/05/30(水) 16:08:35
>>973 TImageで持っているメタファイルをPrinter.Canvasに展開した後、
TextOutで文字を追記する必要があるので、直接印刷だと都合が悪いです・・・。
PlayEnhMetaFile で印刷した後、TextOutすればいいじゃない
CopyRectじゃなくて普通にDrawすればいいのでは?
977 :
972 :2007/05/30(水) 16:32:07
>>975 PlayEnhMetaFileでメタファイルをキャンバスのハンドルに展開しても、
結局TImageからTPrinterへ渡すのと変わらないようですが……。
>>976 Drawしてみました。
Printer.Canvas.Draw(0,0,Image1.Picture.Graphic);
エラーは出なくなりましたが、絵が一切印刷されませんでした・・・。
978 :
972 :2007/05/30(水) 16:50:06
自己レスです。 下記のやり方でなんとか印刷できるようになりました。 (TPictureにロードして、ビットマップに変換、その内容をTPicture.Bitmapに還元) お騒がせしました。 procedure TForm1.Button1Click(Sender: TObject); pic_Wk: TPicture; bmp_Wk: TBitmap; begin pic_Wk := TPicture.Create; bmp_Wk := TBitmap.Create; pic_Wk.LoadFromFile('【emfファイル】'); bmp_Wk.Width := pic_Wk.Width; bmp_Wk.Height := pic_Wk.Height; bmp_Wk.Canvas.Draw(0, 0, pic_Wk.Graphic); pic_Wk.Bitmap := bmp_Wk; Printer.BeginDoc; Printer.Canvas.Draw(0,0,pic_Wk.Graphic); Printer.EndDoc; pic_Wk.Free; bmp_Wk.Free; end;
おちんぽみるくでちゃった
>>978 でもDPIとか合わせないときちゃなくなっちゃうんじゃない?
たぶんデフォルト96DPIとかだろうし
>>977 Drawの代わりにStretchDrawだとどうですか?
Printer.Canvas.StretchDraw(Rect(0, 0, Printer.PixelWidth, Printer.PixelHeight), Image1.Picture.Graphic);
ちなみにビットマップの印刷では
DDB(デバイス依存ビットマップ,TBitmapをCreateしたときのデフォルト)を
プリンターのキャンバスに描画するのはNGみたいですよ.
http://www.asahi-net.or.jp/~HA3T-NKMR/tips004.htm
TTableのftCurrency項目の範囲はいくらからいくらなんでしょうか? 金額をintegerで管理するのと比べてのメリットはなんなんでしょうか?
テキトーな答えだが、固定小数点じゃなかったかcurrency
ヘルプのCurrency型の項見れ
986 :
983 :2007/05/31(木) 01:24:17
↓こんな感じですか? 1,000 ftIntegerで管理すると30億円とかの額になると溢れてしまうし、金額をカウントするときはどの型がいいんでしょうか?
987 :
983 :
2007/05/31(木) 01:32:27 うお、元にCurrency型ってのがあったなんて知りませんでした。 ありがとうございます。