おう
デルッピィ
Delphiがんばれ、というか、Borlandがんばれw 昔のUIがDelphi、処理がCとか懐かしいな・・ お、1.0のディスクが出てきた。。。
Borlandは星になりましたが?
case文でhresultの値を扱おうとすると$80000000で警告が発生します。 hresultは本来、$00000000〜$FFFFFFFFまで取り得ると思うのですが なぜ、"範囲を超えました"となるのでしょうか? //ケース1 case hresult(0) OF $7fffffff:; end; //ケース2 case hresult(0) OF $80000000:; end; //[警告] Unit1.pas(33): 定数式が範囲を越えました
HRESULTはSystem.pasでtype Longint;と定義されてるが?
無料の某6使ってるけど アクションマネージャってなに?アクションリストとは全然違うの?
つヘルプ
>>10 ごめんヘルプ見ても理解不能
アクションバンドとか出てきたし
3行でいいから特徴をおせーてプリーズ
>>12 タイトル見ようぜ
> 新しいアクション機能(Professional 版および Enterprise 版)
>>13 それはわかっとる
Personalで使えないからどんなもんか知る術がない
>>13 それはわかっとる
Personalで使えないからどんなもんか知る術がない
どうあがいても使えないものを必死に使いこなそうとする男の人って・・・
いや使えないことはわかっとるがな どんなもんかちょっと聞いてみただけやがな ちょっと3行で教えてーなプリーズ?
>>9 Office2000形式のメニューとか作れるんじゃなかったか。
Actionをドラッグ&ドロップして。
>>5 昔はCで書かれてたのかぁ
無料のTurboDelphiインストールしようとしたら、.NetとかJ#とかMSですら使ってない
ような物を入れさせられて嫌だったなぁw
ちゃんと全部Delphiで書いて貰いたいものだ
>>19 > 昔はCで書かれてたのかぁ
Delphiは最初からDelphi製でしょ。
> 無料のTurboDelphiインストール
今はそうでも無いよ。
「今は」ってどういう意味? Delphi2009が.NETいらなくなってってこと? それがどうTurboDelphiに掛かってるのか良く分からない
>>20 あ、そういう事ね
自分でアプリ作るときにUIだけDelで作って、処理はCで書いてたって意味かな?
>>17 使った事ないんであれだけど、動的UI作れるんじゃないのかな?
D&Dでメニューやツールバーを動的に構築できるとかいう話かなと、わからんけど
>>21 > Delphi2009が.NETいらなくなってってこと?
.NET SDKはほぼ100%要らない。
ヘルプビューワーのみ。ドキュメントのインストールも無し。
.NET ランタイムは要る。
>>24 で、「無料」のTurboDelphiへの批判レスにはそれが妥当だと思ったわけだね
話しかみ合ってる?
データベースに関する質問です。 画像を格納できるテーブルを作成・編集するアプリを開発中なのですが クライアントの要望で音声も格納できるようにしようとしています。 しかし音声にはDBImageコンポみたいなコンポがありません。 ググってもTorryをみてもそれっぽいコンポを見つけらなかったのですが 何か良いコンポはありますでしょうか。
バイナリーで保存するんじゃねーの。
やはり自前で実装ですかね。 DBWaveコンポ(仮称)つくってみます。
SQliteでバイナリも保存できるんじゃね?
>>27 はDB awareなコンポーネントないか聞いてるのにバイナリだの
なんだの見当違いなこと言ってる秋の夕暮れ
「じゃね」使いはアホ。
俺Jane使ってるよ 使いやすくてオススメ!
34 :
デフォルトの名無しさん :2008/11/06(木) 10:42:06
既存のデータの入ってる実際に使っているテーブルに 新たにフィールドを追加する必要がでてきました。 TTableで フィールドA フィールドB があるテーブルに 「フィールドCがなければフィールドCを追加」 という処理をしたいんですがどのようにすればいいんでしょうか? TQueryのSQLを使ってALTER TABLE ... ADD ...すればフィールドは追加できますが「フィールドCがなければ」という処理をどう書いていいかわかりません。 Table.FindField('フィールドC') = nil で調べれるのかとも思ったのですが、これはTFieldがあるかどうかを調べるだけで、データベース内にフィールドがあるかまでは調べてくれません。 いったんテーブルを削除して作り直せば簡単には出来ますが レコードは残したままでやりたいのです。 何かいい方法はありますでしょうか?
TableXXX.FieldDefs.IndexOf('フィールドC') < 0
36 :
デフォルトの名無しさん :2008/11/06(木) 12:13:11
引継ぎもなく、古いDelphiの修正しろといわれたのですが、 実行してみようとすると wwDataInspector, wwrcdpnl, wwdblook,TwwDBLookupCombo などがないと言われます。 これらはどういうコンポーネントを入れればいいのでしょうか? Delphi2006をいれたのですが、元のプロジェクトはどのバージョンか不明です。
Explorer終了すると --------------------------- Error --------------------------- Runtime error 217 at 019CF57D --------------------------- OK --------------------------- とかいうエラーが出るんだけど常駐しているDelphi製アプリと関係ある?
>>37 Explorer終了ってつまりシャットダウンとかログアウトだよな
>>34 Firebird / Interbaseならrdb$relations
Oracleならuser_tab_columns
を検索
ほかのDBはシラネ
41 :
36 :2008/11/07(金) 12:25:08
>>38 いやまじググッてもでなくて。
DelphiてVerごとの上位互換とか結構高いんですか?
検索して出てこないなら内部で作ったコンポなんじゃないの。 CDだかPCだかを全grepしてみたら。
44 :
デフォルトの名無しさん :2008/11/07(金) 15:06:01
質問です。 procedure EdiToolCdExit(Sender: TObject); begin if ( ( BitBtnEnd.Focused = False ) and ( BitBtnCancel.Focused = False ) and ( RadGrpKey1.Focused = False ) and begin //キー部の入力チェックを行う if ( LFncKeyCheck ) then begin LProUseToolTblCtrl; end; end; end; このようなExitイベントがあり、特定のボタン(終了、取り消しなど)を 押下された時には入力チェックを行わないようにしています。 ですがBitBtnEndとBitBtnCancel.押下時は入力チェックが走らないで正常に動作するのですが RadGrpKey1を押下時はなぜか入力チェックが走ってしまいます。 どなたか分かりますでしょうか? ちなみにRadGrpKey1はRadioGroupです。
つーかなんのためにsender持ってんだ
47 :
デフォルトの名無しさん :2008/11/07(金) 15:46:51
endが変な位置に行ったのはコピペしたからですwすいません。 Sender使ってif(Sender <> RadGrpKey1)then を追加してみたけどだめでした。。。
48 :
デフォルトの名無しさん :2008/11/07(金) 18:41:41
DELPHI6での コンポーネントとパッケージとパレットの関係を教えてください。 DELPHIは拡張子が多すぎて初心者の方は混乱しませんか?
>>44 RadioGroupの場合、フォーカス持ってるのは中のRadioButtonだから。
ActiveControl is TRadioButtonかどうか見て、さらにそのParentを調べるか
RadioGroupのOnEnterとOnExitでフラグ立てるかお好きな方で。
ちょいと教えて欲しいんですが、Captionを欧文フォントにして 全角(漢字とか)入れると急激に重くなるのはどういうことでしょうか。 これをC++Builderで書くと、ほんの少し軽くなる。 これってDelphiが悪いのか、WINDOWSが悪いのか 良くわからないんですけど、誰か知ってたらお願いします。
Delphi/C++Builderのバージョン、OSを明示すべし。
52 :
41 :2008/11/08(土) 09:29:32
>>43 ありがとうございます。
DelphiってBorlandしかコンパイラーとか作ってないのかと思ってましたが、
別のIDEとかもあるんですね。
しかし、前任者はなぜこれを使ってたのか。。
>>50 OpenTypeの欧文フォントで文字セットを日本語にすると
日本語の文字が出てくるたびに
あらかじめ関連づけられた日本語フォントファイルからフォントを持ってくるという
面倒なことをやっていますのでガクッと重くなるのかもしれません。
(駅の売店でものを売るときに奥の棚から商品を引っ張り出すような感じでは?)
BCBが若干軽いのはBCB未経験ゆえにわかりませんが
DelphiとBCBとでは文字列処理の実装が異なるとすれば影響するかもです。
>>19 今思えばJ#使ってるのってヘジたんのせいだったんだな
JBuilder こコードを流用しただけだろ
× JBuilder こコードを流用しただけだろ ○ JBuilder のコードを流用しただけだろ
ヘジは、J#開発者だが、 そのころにはすでにBorland去ってるからなあ Delphi2の開発時にMSにいっちゃったんだっけか
delphi2009のことについてききたいんだが 活発なスレどこ?
そんなものない ML池
欧文フォントで文字セットを日本語にすると、フォントマッパによって フォントフェイス名より文字セットの方が優先されると思うから、 実体化で指定したフォントと異なるフォントが大抵選択されていると思うが。
だから?
∧ ∧ いまさらながら、 ミ ゚Д゚彡 BDEの使い方について 〜ミ,,,,uuミ ききたいのですが。。。 詳しく知っている人いらっしゃるでしょうか.... 環境はD2007と付属のInterbaseを使いたいのですけれども うまく接続できません。 コンパネのBDE Administratorを起動すると databaseとして dBASE Files DBDEMOS Excel Files GlobalCar IBLocal MS Access Database Visio Database Sample とあるのですが(初期状態?) これ、それぞれ、どうやって接続すればいいんでしょうか。
IBLocalはどうやら ユーザー名:SYSDBA パスワード:masterkey らしいのですが(ネットで調べると) データベース エンジン エラー IDAPI サービスライブラリをロードできません。 ファイル:SQLINT32.DLL エリアス:IBLocal と、表示されて接続できません。 BDEのエリアス設定方法、特にInterbaseやら paradoxやら、ExcelFilesやらが、わかったらうれしいかなと 思ってます。 ∧ ∧ オシエテ.... ミ ゚Д゚彡 〜ミ,,,,uuミ
誰もいないからいまのうち。 _____________ .∧,,∧ / @'"ミ,,゚Д゚ミ < どんどん質問してしまうぞ。 UU''UU \___________ 世界のすべてのDelphi質問を俺の質問だけで埋めてシマヘ IB2007付属のIBConsole2007ならつながったんだけど DEKOさんのIBConsole、Firebird対応版で D2007Pro付属のIB2007に対して接続するには どうしたらいいんじゃろーか。 ローカルのInterbaseとしては インスタンスがgds_dbという名前で存在するんですが それを設定するのがどこにあるのかしらと。。。
>63 なぜIBにつなぐのにBDEなの?IBXなりdbExpressでいいじゃない。
ん〜D2007ではBDEはParadox/dbase用に残されている、という状況だったはずなんで。 今試してみたけどうまく繋がらんね(XPSP3+D2007+IB7.1)。
上記のURLの
Borland Database EngineアプリケーションのdbExpress への移行
∧,,∧ なんて読みにくい
,,ミxдxミ くず文章だ....
.とミ,,,,,U,,U 頭イタイ...
このサンプル見て、サンプル通りに物を作れるとおもっておんのか....
サンプル構築手順と説明文書が
合わさって書いてあって、ものすごい読みにくい。
せっかくのdbExpressが台無しだな…
>>68 さん
調べてくださってありがとうございます。
Delphi7 ProでBuild 4.453ってちゃんとパッチが当たってる状態ですか? 使っている人いたら最新のビルド番号教えてください。
71 :
68 :2008/11/10(月) 20:52:16
>69 DEKOさんがお答えくださってるようなのでそちらへドゾ。
Delphiにて、ハッシュテーブル的(Dictionary的な)クラスはありませんでしょうか? THashedStringList というのを見つけたのですが、ヘルプを呼んでもイマイチ使い方がわかりません。 TStringListと同様につかえる、という記述をネットで拝見したのですが、 文字列をキーにして、文字列を得たい場合、 Hash.Values["Hoge"] := "Value of Hoge"; のような感じで、使ってよいものなのでしょうか?
PopupMenuとその中のitemを動的生成した場合って、PopupMenuを解放すれば 中のアイテムも解放されるんでしょうか? それとも個別にfree?
>>72 文字列をシングルクオートで括ってるならいいと思うよ
>>73 ソースを読めば分かるとおり、解放される
以下のinterfaceを使ったコードにおいて、メモリーリークが発生するのですが、対処法はありませんでしょうか?
こちらのdSpec
http://delphixtreme.com/wordpress/?p=15 で同様のコードがありどうしたものかと困っております。
program circular_reference;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type
ITest = interface
['{38C68C6A-7CBD-42FE-9249-0ED869119A29}']
procedure Foo;
end;
TTest = class;
TSubTest = class
FTest: ITest;
public
constructor Create(NewTest: ITest);
destructor Destroy; override;
end;
TTest = class(TInterfacedObject, ITest)
FSubTest: TSubTest;
public
constructor Create;
destructor Destroy; override;
procedure Foo;
end;
procedure CallFoo(Test: ITest);
begin
if Assigned(Test) then Test.Foo;
end;
{ TSubTest } constructor TSubTest.Create(NewTest: ITest); begin FTest := NewTest; CallFoo(FTest); end; destructor TSubTest.Destroy; begin inherited; end; { TTest } constructor TTest.Create; begin inherited; FSubTest := TSubTest.Create(Self); end; destructor TTest.Destroy; begin FreeAndNil(FSubTest); inherited; end; procedure TTest.Foo; begin Writeln('TTest.Foo!!'); end;
78 :
>>76 続き :2008/11/12(水) 20:31:35
procedure Main(); var Test: ITest; begin Test := TTest.Create; CallFoo(Test); end; begin ReportMemoryLeaksOnShutdown := True; Main; // Writeln('push ENTER key to end!!'); Readln; end. -------------------- で終わりです。 TSubTest.FTestをTTestにし、TSubTest.Create(NewTest: TTest)にした場合は大丈夫のようなのですが、 どうようの入れ子構造にし、TSubSubTestが、ITestを持っていると駄目?なようです。
79 :
76 :2008/11/12(水) 21:00:52
なんとなく、わかてきた・・・ Delphiのinterfaceが参照カウンタ実装でGCがないので、interfaceを循環参照にするとメモリーリークを起こす、 という奴でしょうか? TTestのフィールドにTSubTestを持たせないようにすれば、いけそうな気がしてきました。 弄ってみたいと思います。 何か助言あればぜひお願いします
80 :
デフォルトの名無しさん :2008/11/12(水) 21:05:27
バッチファイルで処理していたことをDelphiのボタンを押した際に処理する ようにする場合、以下の文はどのように書くのでしょうか? AAA remove root\BBB AAA install BBB.inf root\BBB どなたか力を貸して下さい。 よろしくお願いします。
82 :
デフォルトの名無しさん :2008/11/12(水) 22:00:49
>>81 調べてみたのですが分かりませんでした。
バッチファイルの操作でしたら
WinExec('AAAt.bat',SW_SHOW);
で可能でしたがバッチファイルの中身を操作することが出来ませんでした。
83 :
デフォルトの名無しさん :2008/11/12(水) 22:37:06
>>82 Tmemo.loadfromfile(aaa.bat)
84 :
デフォルトの名無しさん :2008/11/12(水) 23:01:10
そもそも以下の様なドライバのインストールはDelphiで可能なのでしょうか?
AAA install BBB.inf root\BBB
>>83 すいません!未熟なので内容が伝わりません。
>>75 それが判る初心者なら質問しませんって・・・
次いでと言ってはなんですがどうやったら判るんです?
解放されてるかどうかの判定。
87 :
超初心者 :2008/11/12(水) 23:38:50
Delphiでビンゴゲームを作ろうと思っているのですが、1〜80のランダムな数を1回ずつだけ表示させるやり方がわかりません Random()だと同じ数が出てきてしまうので… 超低レベルな質問なんでしょうが調べてみても良く分からなかったので勇気を持って書き込んでみました Delphi使いの皆様、どうかご教授ください。お願いします
stringlistに1-80入れて 行をシャッフルして上から見てけば?
∧ ∧
>>68 さん
ミ,,。_。彡 >>DEKOさん
〜ミ,,,,uuミ
ありがとです
∧,,∧ / ̄
\,,,,ミ,,゚Д゚彡 < しつもんす!
⊂,,,,,,,,,つつ. \_
配列定数初期化は、ここにあるようにかっこよくかけるんだけど
http://delfusa.main.jp/delfusafloor/opensource/emeditorplugin/20070830170942/Product/DelphiCommentDelete/DelphiCommentDelete.dpr.txt braceTable: array[TBraceType] of TBraceInfo = (
(beginMark: ''''; endMark: ''''; remove: false),
(beginMark: '{$'; endMark: '}'; remove: false),
(ry
動的配列の初期化は下記の風にしかかけないのかな。
var
braceTable: TBraceTable;
begin
SetLength(braceTable, 5);
with braceTable[0] do
begin beginMark := ''''; endmark := ''''; remove := False; end;
with braceTable[1] do
begin beginMark := '{$'; endmark := '}'; remove := False; end;
with braceTable[2] do
begin beginMark := '{'; endmark := '}'; remove := True; end;
(ry
なんだか、配列定数風にかけたらかっこいいと思うんだけど方法ない?
動的配列に配列定数をほりこむとかでもいいから、なんかきれいな記述方法があればオシエテくで。
>>86 FastMMとか
>>90 俺は綺麗な方法なんて知らんので関数作るな
procedure SetBraceInfo(var Brace: array of TBraceInfo; beginMark, endMark: String; remove: Boolean);
var
I: Integer;
begin
for I := Low(Brace) to High(Brace) do
begin
Brace[I].beginMark := beginMark;
Brace[I].endMark := endMark;
Brace[I].remove := remove;
end;
end;
自分ならTBraceTableをTBraceInfoを保持するTObjectList/array ofベースのgenericなコンテナにして TBraceInfo = record or object public constructor Init(beginMark, endMark: String; remove: Boolean); end function BraceInfo(beginMark, endMark: String; remove: Boolean): TBraceInfo; begin Result.Init(beginMark, endMark, remove); end; braceTable[0] := BraceInfo('''', '''', False); braceTable.Add(BraceInfo('''', '''', False)); braceTable[1].Init('{$', '}', False); braceTable.Add('{', '}', True); なんて書けるようにするな。どこまで書きやすくするかは利用頻度次第。 Delphiの定数表記は貧弱だからあまりがんばる余地がない。
>>76-79 条件がよく分からないのですが別のオブジェクトに所有されるときに参照カウントが0になって勝手に解放されてしまうようですね。
手っ取り早い解決法は参照カウントが無効なクラスを用意してTInterfacedObjectの代わりに使うことです。
// 参照カウントを無視するインターフェイスクラス(TObject版)※TInterfacedObjectのコピペ改造
TNoRefCountInterfacedObject = class(TObject, IUnknown)
protected
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
end;
function TNoRefCountInterfacedObject.QueryInterface(const IID: TGUID;
out Obj): HResult;
const
E_NOINTERFACE = HResult($80004002);
begin
if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE;
end;
function TNoRefCountInterfacedObject._AddRef: Integer;
begin
Result := -1; // これで参照カウントが無効になるらしい
end;
function TNoRefCountInterfacedObject._Release: Integer;
begin
Result := -1; // これで参照カウントが無効になるらしい
end;
>>90 レコード型変数は直接代入できますので配列定数からコピペする場合は
const cBraceTable: array[TBraceType] of TBraceInfo = (ry
var e: TBraceType;
SetLength(BraceTable, Length(cBraceTable));
for e := Low(TBraceType) to High(TBraceType) do
BraceTable[ord(e)] := cBraceTable[e];
…くらいにはできそうです(一応テスト済み)。
96 :
76 :2008/11/13(木) 19:41:55
>>94 勝手に開放される側の話じゃなく、開放されないっていう話なのですが・・・('A`)
>>94 の方法はDelWikiにある奴ですよね
>>96 なるほどそれは失礼しました。
TSubTest.DestroyでFreeAndNil(FTest)(自分で解放する)では駄目ですか?
せっかくの自動解放システムを捨てるのももったいない話ですが…
>>94 はDelWikiを見る前からやっていましたが
もし知っていたら余計な苦労をしなくて済みましたね。
TMemoに読み込んだファイルの内容を操作したいんだけど 行を指定するのはMemo1.Lines[i]といった形でできる。 では行の中のさらに文字の部分を指定するのはどうすればいいんでしょうか?
∧,,∧
>>92 さん
ミ,,゚Д゚,彡 ありがと....
ミ(旦⊂ ミ
(~,,(~,,,ミ@ でも、そのコード、動かんがな...
>>93 さんもありがと。
>TObjectList/array ofベースの
いや、そこまでは。。。
>Delphiの定数表記は貧弱だからあまりがんばる余地がない。
そのようですね。
とりあえずBlogに書いてみたので、この程度の使い道っす。
>>DEKOさん
内緒ですし、あと、猫の耳が
Λ∧
ラムダになってます。
耳は"および"のほうがカワイイですよ。
MSPゴシックだとわかりませんが。明朝だとわかる思います。
>>98 さん
∧,,∧ こんな感じかしら
ミ゚Д゚,,彡
ミ(旦⊂ ミ 操作なので。
(~,,(~,,,ミ〜
これ動かして慣れてみてください。
procedure TForm6.Button1Click(Sender: TObject);
var
i: Integer;
j: Integer;
s: String;
begin
for i := 0 to Memo1.Lines.Count - 1 do
begin
s := Memo1.Lines.Strings[i];
for j := 1 to Length(s) do
begin
s[j] := '*';
//読み出しだけならこんな書き方もできたり。
// s := s + Memo1.Lines[i][j];
end;
Memo1.Lines[i] := s;
end;
end;
101 :
98 :2008/11/14(金) 00:32:08
>>100 助かりました。
ありがとうございます!
おかげで色々と操作ができまして懸念が1つ解消されました。
102 :
87 :2008/11/14(金) 09:25:46
>>88 ご回答ありがとうございます。やってみます
>102 えぇ、 普通にRandomで、出てきた数字を覚えておいて重複したら却下すれば良いだけじゃないの?
ざくっと書いて見た。 procedure TMainForm.Button1Click(Sender: TObject) var o: array[0..79]of Boolean; i, n: Integer; function AllOut: Boolean; var i: Integer; begin result := false; for i := 0 to 79 do if( not( o[i] ) )then exit; result := true; end; begin for i := 0 to 79 do o[i] := false; while( not( AllOut ) )do begin n := Random( 80 ); if( not( o[n] ) )then begin o[n] := true; // ここに新たに数字が出たときの処理 end; end; end;
この流れちょっと前にも見たな
107 :
76 :2008/11/14(金) 18:45:47
>>97 つきあってくれてありがとう。質問者側じゃないようなレスしてスマソ
ReportMemoryLeaksOnShutdown の出力結果張り忘れてました。
はっときます。
つまり、両方(TTestとTSubTest)のDestroyが呼ばれてないんです。
どちらかの開放の責任を循環参照の外側に出せば、開放されるはずなので、
いろいろ弄繰り回して試してみたいと思います。
108 :
76 :2008/11/14(金) 18:48:23
出力結果張る前に投稿しちゃった・・・
以下は、
>>76-79 の ReportMemoryLeaksOnShutdown の出力結果です。
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:
1 - 12 bytes: TSubTest x 1
13 - 20 bytes: TTest x 1
---------------------------
OK
---------------------------
109 :
76 :2008/11/14(金) 18:51:32
110 :
109 :2008/11/14(金) 18:52:16
名前欄消し忘れたorz 76と関連性はないです。
それが2009の拡張なんだろ
>>106 procedure Main();
var Test: ITest;
begin
Test := TTest.Create;
CallFoo(Test);
end;
Test変数がスコープ外れた後、参照カウンタが-1されるが、まだ、TTestクラスのインスタンスは
自身の内部変数FSubTestによって参照されているので、参照カウンタ1のまま、TTest.Destroyが永遠に呼ばれず
メモリリーク。
∧,,∧ たぶんね
ミ,,゚ 3 ゚彡 遅いかも
>>103 さん、105さん
ミ つ旦)~~
〜と,,,~),,~)
いや、パフォーマンスを気にする必要が無い場面は
多々あるんだと思うだが、この場合、
1000個目の乱数を出すために大変だよ。
出力済みの999個は重複しているから。
何を出力してもほとんどははじかれる。
こういう時には
>>88 さんのいうように
リストでも配列でもいいんだけど
1 2 3 4 5 6 …
を用意しておいて、
1番目の箱を乱数1-1000で決めた他の番号の箱と中身を入れ替えて、
2番目の箱を乱数1-1000で決めた他の番号の箱と中身を入れ替え。。
と、1番目から1000番目の箱を入れ替えていくのがセオリーかと。
>「関数内関数を匿名関数型の変数に代入」ができると、 さらなる可能性
そうなの?
面白い事やってますね。
TListViewでOwnerDataがTrueの場合、複数選択はどのように取得すればいいんでしょうか OwnerDataがFalseのときはItemIndex番目からSelCount個見つかるまで 一つずつItems[i].Selectedを調べていたんですが使えないみたいです。 ヘルプの例に従い以下のようにやってみても駄目でした。 選択数が1個の時だけ検出されます。複数になると1個目すら検出できません。 (Ctrl+クリックのときだけいけるっぽい) OnSelectItem内で ListItem := ListView1.Selected; while ListItem <> nil do begin ほげほげ ListItem := ListView1.GetNextItem(ListItem, sdAll, [isSelected]); end; よろしくお願いします
OnDataStateChangeにも同じコード書いたら行けたみたいです 今度はCtrl+クリックに反応しなかったんで両方でコード実行しないと駄目ぽいけど・・・
>>113 でもさぁ、たかがビンゴでパフォーマンス云々言われてもねぇって感じ。
見た目簡単なほうが良いんじゃね?
まぁ、何でビンゴなのに80まであるのかの方が疑問ではあるのですがね。
>>117 >まぁ、何でビンゴなのに80まであるのかの方が疑問ではあるのですがね。
9 × 9 - 真ん中1つ = 80
じゃない?
間違ってたらごめんね。 ビンゴって1−75じゃなかったっけ? その数字が5*5のマスの真ん中以外にランダムに配置されてるんじゃ? あ、ビンゴにもいろいろあるんですか??
全員にすべての数字が揃ってるわけじゃない
121 :
デフォルトの名無しさん :2008/11/15(土) 14:15:30
TEditを継承したクラスをつくるって方法を使わず、FormCreate時にEdit1をキャレット非表示のものにする方法をどなたか教えてください!
>>121 Edit1.Enabled:=False;
Create時じゃないが procedure TForm1.Edit1Enter(Sender: TObject); begin HideCaret(Edit1.Handle); DestroyCaret(Edit1.Handle); end; でどうだ
124 :
デフォルトの名無しさん :2008/11/15(土) 16:38:28
>>123 それでやってみるようにします。
ありがとうございます。
うまく説明できないかもしれませんが、 ・どんなときでもForm1のKeyDown(Press)がメッセージを取る ようにするにはどうすればいいんでしょうか?
KeyPreviewプロパティかな?
>>117 人間が手でやるとしたら1から80までのカードを作ってかき混ぜるでしょうから
コンピューターでもそうやるほうが自然ではないかと思います。(作ってみたらこっちの方がわかりやすいとオモウ)
// Num1 と Num2 の値を入れ替える
procedure SwapNumbers(var Num1, Num2: integer); //inline;
var
TempNum: Integer;
begin
TempNum := Num1;
Num1 := Num2;
Num2 := TempNum;
end;
// Numbers のシャッフル:奥村先生のコードを移植.
procedure Shuffle(var Numbers: array of integer);
var
i1, i2: Integer;
begin
for i1 := High(Numbers) downto 1 do
begin
i2 := Random(i1 + 1);
SwapNumbers(Numbers[i1], Numbers[i2]);
end;
end;
var
Numbers: array [1..80] of integer;
begin
Randomize;
for iNum := Low(Numbers) to High(Numbers) do
Numbers[iNum] := iNum;
Shuffle(Numbers);
128 :
125 :2008/11/15(土) 16:50:40
>KeyPreviewプロパティかな? うまくいきました。 どうもありがとう。
>>127 玉を一個一個出すビンゴゲームの雰囲気ではないですけど、いいですね。
わかりやすい。
130 :
125 :2008/11/15(土) 18:15:17
Form1をKeyPreview:=trueにして、Form1.OnKeyDownでButton1.SetFocusとかでフォーカスを設定しようとしたのですが、 Tab移動のほうに処理が取られるようでうまくいきません。 Tab移動を眠らせてOnKeyDownの中でフォーカスを移すにはどうすればいいんでしょうか?
131 :
デフォルトの名無しさん :2008/11/15(土) 19:18:23
>>127 玉を一つ一つ取り出す随時抽選方式のビンゴ風に改造してみました。
var
Numbers: array[0..74]of Integer;
LotNumber: Integer; 当選番号
LotCount: Integer; 抽選回数 74->0
procedure BingoStart;
var
i: Integer;
begin
LotCount := 74;
for i := 0 to LotCount do
Numbers[i] := i;
end;
procedure BingoLot;
var
n: Integer;
procedure SwapNumber(var a, b: Integer);
var
c: Integer;
begin
c := a; a := b; b := c;
end;
begin
n := Random( LotCount );
LotNumber := Numbers[n];
SwapNumber( Numbers[n], Numbers[LotCount] );
Dec( LotCount );
end;
Delphi2009高いな 商用不可でいいから 低機能だけどコンポは使えて 9800でだしてくれんかな。 シェア広げることも大事だと思うんだが
Del6personalでDelユーザーを増やせたのにねー Del8以降の迷走で損してるわ。
Delphiはもうガラパゴス諸島化してるだろ。
.NETバブルにのって崩壊
TurboDelphiExplorerがあるじゃない
>>137 Turboは、.net1.1に依存してるのと、
コンポが使えないのがネック。
商用不可でいいから6Personalみたいな形で
だしてほすい
http://www.itwriting.com/blog/a-simple-delphi-wrapper-for-sqlite-3 上記サイトのDelphiラッパーを使おうと思い、まず同梱のTestSqlite.dprを実行させようとしたところ
エラーが出てコンパイルできませんでした。どこを修正するといいのでしょうか?
[エラー] SQLiteTable3.pas(470): 'TSQLite3Destructor' と 'Pointer' には互換性がありません
[エラー] SQLiteTable3.pas(627): 'TSQLite3Destructor' と 'Pointer' には互換性がありません
[エラー] SQLiteTable3.pas(787): 'TCollateXCompare' と 'Pointer' には互換性がありません
[致命的エラー] uTestSqlite.pas(7): 'SQLiteTable3.pas' ユニットはコンパイルできませんでした
>132 シェアを広げることが(企業としての)利益を増やす、ということに繋がるのかどうか、が問題みたいですね。 これをCodeGearの人たちに納得させられればいいのですが。 Borlandから独立することによってBorland(ALM/Together)の連中がやっていたIDEの安売り、投げ売りから 解放されて自分たちの技術、製品が正当な利益、正当な評価を生み出すことを実感している、という 現状からすると、しばらくの間は難しいんじゃなかろか、というのが個人的な意見です。
某もたいして安くなかったのにね マイナー言語のくせに偉そうだな
>解放されて自分たちの技術、製品が正当な利益、正当な評価を生み出すことを実感している、という >現状からすると、 ソースぷりーず
>自分たちの技術、製品が正当な利益、正当な評価を生み出すことを実感している、 糞ヘルプ、バグだらけの正当な評価だろうけどな。
起きたらオッチャスレ落ちてたんだけど誰か立てないのか
>143 forum(private含む)でのCodeGear関係者の発言からはそう読めるけどね。ディスカウントとか無料とか なんでそんなことしなきゃいけないの?利益に貢献するの?ってな感じ。 ソースは脳内なので当たっていないと思うなら無視してくれて構わないよ。 >142 Personal/Turbo Explorerはただでこれ以上安くできないけど?バージョンアップとかも新規に比べりゃ 安いもんだったしな。でも今はマイナーだからこそ稼がないと消滅しちゃうわけで。MSみたいに ボッタクリ部門があるわけじゃないからな。 >145 あら、ほんとだ。
>>138 データベース(に接続して読み書きする機能)で差を付けられなくなってしまった現在では
有料版とどこかで差別化しなければならなかったわけで落としどころとしては悪くないと思います。
またコンポは設計時に貼り付けられないだけで実行時にコードで生成することはできますので
私はここ1〜2年はこれで頑張っています。
フレームを積極的に使い始めたためか標準でないビジュアルコンポーネントをポトベタしたくなる場面が
かなり減ったのでそんなには困っていませんがさすがにそろそろポトベタできる有料版が欲しいです…
俺の不満はDelphiのシェア低いから使えるライブラリの種類少ないことだな。 Delphiのクラスライブラリが.NET並とはいかないまでも、もっとリッチならまぁ気にならないが。 正規表現にしてもDelphiのVCLに標準で用意されていないし。まぁ、PCREや鬼車使えるけど、 アプリに静的リンクしようとかなるとたちまち、メンドくさいし。 前はDelphiで構文解析やろうとして、Delphiのソース吐くやつが余りないから、 C#のコードを吐くパーサジェネレータをDelphiのコードを吐くように改造したり。 めんどくせぇ。
隔離スレに帰れ
まじでめんどくさいぉ。
オッチャなくなったので、こちらで活動開始。
オッチャすれ アンチ対策テンプレ v1.0(案)
(p)
http://codegearwatcher.web.fc2.com/faq/anti.html > オッチャすれ アンチ対策テンプレ v1.0(案)
> 以下はオッチャすれに出没する、アンチの持ちネタです。
> これらのネタは、4年以上にわたる不毛な議論と逆予言により終息しています。
> しかしアンチは自作自演を交えつつ、無限ループを続けています。
>
> このスレでアンチを見かけた場合は、このテンプレを提示しましょう。
マンセがうるさいので、これからここに質問に来た初心者をけなしてDelphiユーザーの 妨害活動をしますのでよろしく。
>>152 はまんせじゃなくて最凶アンチ。きもい。
既存のコンポを継承したコンポを使いたいんですけども どうやって呼び出したらいいんでしょうか? 例えば、TCustomEditを継承したTEditExを作ったんですけども フォームへの貼り付け方法がわかりません。 環境はTurboDelphi Explorerです。
TDEじゃ無理です
あ、FormのOnCreateで EditEx1 := TEditEx.Create(Self); EditEx1.Parent := Self; とすれば貼り付けじゃなくてもおk
>>158 ぬぉぉぉ
できました。
ありがとうございます!
「→」や「→」などを「→」のように文字に変換する方法はありますか?
全部同じにしか見えない
ミスったorz 「&#8594;」や「&#8594;」などを「→」のように文字に変換する方法はありますか?
再び・・ 「&#8594;」や「&#rarr;」です
「&#8594;」や「&#rarr;」を「 → 」に置き換えればいいんじゃないの?
全ての全角文字と記号がこの形式になっているもので・・
キーボードが壊れてしまって「あ」が「あ」になってしまうんです。 思い出した。
classとinterfaceを継承したclass(例えば TTest = class(TObject, IInterface))があるとき、 自身を、IInterfaceを引数に取る関数に渡す場合はどうすればいいんでしょうか?
>>167 Self as IInterfaceとかじゃね?
>>168 「この型には指定した演算子は使えません」と出ます
>>169 そのままSelfか、IInterface(Self)でどう?
interfaceを使うときは一般的にはTObjectじゃなくTInterfacedObjectから継承する。 そうでなければQueryInterfaceや参照管理を自前できちんと実装しないといけない。 分かってやってるならいいけど。
OSを替えたんでDELPHI6を再インストールしたら 前の使用許諾コードが入らないんです。それで新たに発行してもらおうとしたら 以前に使ってたメアドで登録してたんで、今の使ってるメアドで登録しなおそうと思っても シリアル発行終了してるんでどうしたら良いのか困ってるんです。 一度は登録済みだから未許諾ままでも良いですかね。 フリーソフトとかで配布したいんですけど
ポップアップメニューがポップしてるかという判断ってどうやればいいですか。 ポップしている間にTimerイベントが発生してしまい ちょっと望ましくない挙動になってしまうのでif文を追加したいのです。
HKEY_CURRENT_USER\Software\Borland\Delphi\6.0のLMKEYを前のとあわせたらどうかな でもバックアップ取ってないよね まあ登録しようがしまいが構わんさ それでソフト配ってる奴なんか山のようにいる
LMKEYじゃなくてLMかも分からんね
>>175 WM_ENTERMENULOOPでフラグ立ててWM_EXITMENULOOPでフラグ降ろす
179 :
174 :2008/11/17(月) 14:56:10
>>176 >>177 バックアップのと照らし合わせたら同じでした、と言う事は
インストール番号とキーは今のOSでは使えない(インストールだけは出来る)ので
メールでインストール番号とキーを書いて送って帰ってきた
使用許諾コードも使えないと言う事ですよね、困ったなぁ
>それでソフト配ってる奴なんか山のようにいる
EXEの中に未許諾の情報とか入ってないんですか
>>179 むむ・・・すまん
じゃあもういっその事レジストリ全部上書きでもいいと思うよw
> EXEの中に未許諾の情報とか入ってないんですか
Kylixにはあると思う(System.pasにそんなことがちらり)けど、Delphiにはないんじゃないかなあ
181 :
174 :2008/11/17(月) 15:56:17
>>180 上書きは項目が沢山あるんで諦めましたw
情報はDELPHIの方には入って無いんですか、じゃあそのままにしときます。
一応登録する意思はあるんで、出来ないんじゃどうしようも無いですし。
自分せいじゃあ無いんでしょうがないです。
色々ありがとうございます、ちょっと安心しました。
OSとか換えなくてもDel6入れ直しただけで前の使用許諾コード使えなくなったな 俺はそのまま赤いまま
183 :
デフォルトの名無しさん :2008/11/17(月) 19:26:44
Delphiのimplements指令がいまいちわかりません。
下記サイトでサンプルコードがあったのですが、
An Introduction to COM Programming with Delphi (3 / 6)
http://delphi.about.com/library/weekly/aa120704a.htm 結局、implementsを書いたクラスは一度interfaceにキャストしないと
メソッドよめないんでしょうか?
var
Test: TTest;
Foo: IFoo;
begin
Test := TTest.Create;
Foo := Test;
Foo.Bar; // FooにキャストしないとBarに呼べない
184 :
デフォルトの名無しさん :2008/11/17(月) 19:27:26
> メソッドよめないんでしょうか? メソッド呼べないんでしょうか?
>>174 登録コードの数字と使用許諾コードがあればレジストリでLMの最後にある数字を
元の登録コードの数字に書き換えれば登録できる
>>162 こんな時こそ正規表現ライブラリを使うべし。
正規表現ライブラリはいろいろありますけど今回はskRegExpで。
日本語のヘルプもあるので比較的使いやすいと思います。
そのものズバリのコードも書いてしまったのですが勉強にならないと思うので
今回は変換したい部分を特定するコードのサンプルだけ。
const
cSample = 'I want to convert "→" and "rarr;" into right arrow!';
var
exp: TSkRegExp;
Converted: string;
begin
Writeln('Sample:"', cSample, '"');
exp := TSkRegExp.Create;
try
exp.Expression := '[0-9]+;|[A-Za-z]+;'; // 見つけたいパターンは「,0から9のどれかが1文字以上,;」または「,A〜Zかa〜zが1文字以上,;」
if exp.Exec(cSample) then // 先頭からパターンに一致するところを探せ.もし見つかったなら…
repeat
Writeln('見つけた!: 「', exp.Match[0], '」 ', exp.MatchPos[0], '文字目から', exp.MatchLen[0], '文字分');
until not exp.ExecNext; // 次を探せ.見つからなかったらループを抜ける.
finally
exp.Free;
end;
end.
>>168-169 as 演算子によるインターフェースへのキャストはGUIDを付けないと使えないみたいです。
でも今回はそれが原因ではない気もします。
>>183 TestはあくまでDelphiのオブジェクトなので実装されていない
メソッドが呼べないのは当たり前じゃないでしょうか。
>>181 ・SerialNumber:インストール番号と
・AuthorizationKey:インストールキーは、そのまま使える
ってか使えるからインスコ出来る訳で
インスコし直し(とかD6RegClean.exe実行)すると
・RegistrationKey:登録コード が変わる
その登録コードで有効な許諾コードを取得
https://reg.codegear.com/srs6/sanctone_serial_number.jsp メアドはDeveloper Networkのアカウントにログインして変えれば良い
Borlandの時の返信Mailは登録コードも書いてあったけど
Embarcaderoのには書いてない。
念のため事前に数字メモっとかないと。。。
189 :
デフォルトの名無しさん :2008/11/18(火) 05:07:48
OOPについての基本的な質問なのですが・・・ オブジェクト"objA"からオブジェクト"objB"を生成するとします。 procedure TMain.foo(); begin objA := TObjA.create(); objA.foo();// objBを生成 end; procedure TObjA.foo(); begin objB := TObjB.create(); end; この場合、objAからobjBにメッセージを送ることはできますが、 その逆(objBからobjAにメッセージを送る)はできないと思います。 (objBは、どのオブジェクトから生成されたか知らないため) objBが、生成元のオブジェクトobjAにメッセージを送れるようにするには、 どうすればいいでしょうか?
コンストラクタで生成元を渡すような仕様にしたらいいんでは?
メッセージが何のことやら
192 :
189 :2008/11/18(火) 05:16:24
>>190 ありがとうございます。
procedure TObjA.foo();
begin
objB := TObjB.create(self);
end;
などとして、引き回すということですよね?
この方法が一番スマートですかね…?
193 :
174 :2008/11/18(火) 05:55:54
>>182 >>185 >>188 返事遅れてすいません、
>>185 さんの方法で上手く出来ましたw
OSの違いじゃなくて登録コードが合ってなかったんですね。
入力欄に入れようとしても変えられなかったんで関係ないと思ってました。
いや本当に助かりました、これでスッキリとDELPHI6を使い続ける事ができます。
本当にありがとう御座いました。
人によってクセがあるので自分で書いたほうが 使い易かったりもするけどね
>>189 なんでそんな面倒なことするの? メンバ変数で記録すればいいじゃないか
procedure TMain.foo();
begin
objA := TObjA.create();
objA.foo();// objBを生成
end;
↑これobjB作れてないじゃん objAとかobjBは結局ポインタなんだけどわかってる?
procedure TForm1.Button2Click(Sender: TObject); var lp: PChar; str: String; ch: Char; begin ch := 'A'; str := 'A'; lp := PChar(str); if lp = ch then begin Caption := 'equal'; end; end; delphi2009だと、lp = chでstring->ShortStringな警告が出るんですが、 そういうものでしょうか?思いっきり、'A'を文字数だと思って比較しています。
>>199 漏れもそう思ったんだが、両方文字列に変換してから比較るらしい。
D5だとequal言うんよね。
あの、流れ無視でごめん。 所でDelphi2009は.Net対応? みんなは.Netに移行するんですか?Win32維持ですか? Delphiはその流れに付いて行っているんですか?
いまのDel使いは.NETに乗り遅れた人達なんだよ・・
oniguruma.pasに接頭辞Tで始まるデータタイプを定義してほしい。
もうね、
var
RegExp: OnigRegExp;
Windows.pasも例えばTLogFont = tagLogFont;と別名定義してんだし、
合わせろよ。
と、
>>195 に同意。
>>188 ありがとう
居座ってた赤いの消すことが出来た
VBSなRegExp風にラップしてくれ〜 あれが一番使いやすい。 ついでにコールバックによる置換なんかに対応してくれれば言うことない。
「VBSなRegExp」がどんなのか分かったら暇なときにやらないこともない
207 :
197 :2008/11/18(火) 21:56:01
>>197 del5でもShortStringに変換して比較してた>AStrCmp
WideCharの比較でなんでShortStringが出てくるのかわからないけど、仕様ならしょうがないか。
UnicodeStringへの添え字でのアクセスはShortStringになるのが関係ありそうでなさそうでありそう
>>187 まあそれはそうなのですが、単純にブリッジ処理書くのが省ければなあ、
という用途で使おうと思ったら、
面倒くさい仕様なので残念!といったところなのです。
Ordをかましたらどうだろ
Orz
delphiで、一部の文字の色を変えるエディタって簡単に作れるの?
>>212 そんなこと聞いてるあなたには簡単ではないでしょうね
richeditで出来るだろ
Delphi2009のバージョンアップ版ってインストール時に 前バージョン(Delphi4持ってる、2は行方不明)の確認ありますか? VBとの比較検討用だったんでユーザー登録もしてないんだけど...
おそらく前バージョンのユーザー登録してないならアクティベーション通らないんじゃないかな? CDNのアカウントで認証してるみたいだし。サポートに問い合わせた方がいいかと。
>>192 TObjBでイベントを定義して、ObjBを生成したときに
イベントハンドラとしてObjAのメソッドをを代入するのがいい。
ObjAの参照を持たせるよりも結合度を小さくできる。
特定のオブジェクトの参照を保持するのと、そのメソッドを保持するのと 結合度に差があるの? メッセージを送りたいんだから TObject の Dispatch() を使えるし、だからすべてのクラスで参照を保持できたほうが汎用性の意味では よりいいんでは?
219 :
217 :2008/11/21(金) 01:04:58
んー、どうだろね。
メッセージというのがwindowsメッセージやdelphiのディスパッチのメカニズムを
利用する話なら
>>218 で正しいと思うけど、
>>189 にはOOPの話と断りが入ってる。
OOPでのメッセージという用語はオブジェクト間のやりとりの総称なので、
メソッドの呼び出しなども当然に含まれる。俺はそういう理解で解答してる。
>>186 なんかりんごの皮をチェンソーで剥いてる様な気がするのは俺だけ?
そりゃ金の取れる芸のレベルだよ
正規表現コンポに金使えばいいのか
FreeMemにサイズを指定するメリットってあるんでしょうか? Sizeが無指定だとちゃんと全部開放されないとかあるんでしょうか
224 :
デフォルトの名無しさん :2008/11/22(土) 16:37:35
Delphi6 Personal使ってます。 manifest適用時にTComboBoxのSelText、SelStart、SelLengthの値が 正しく取得できなくて困ってます。 Textに「あいうえお」と入力して「うえ」を選択したとき SelText: � SelStart: 1 SelLength: 1 という結果が返ってきます。 半角だと問題ないのですが全角だとおかしくなります。 正しい値を取得するにはどうすればいいでしょうか?
Delphi 2007でも同様の結果になるようですね。
manifest適用しなければおk
ユニコード対応のD2009じゃね? Tntは修正が不完全だけど、一応使えるレベルだと思う。
228 :
225 :2008/11/23(日) 13:08:12
TNTComboBoxならSelStart/SelLengthは正常に取得できる。SelTextはTextをAnsiStringに 変換後に自前で変換すればいい。 procedure TForm1.Timer1Timer(Sender: TObject); begin Label1.Caption := Format('SelStart=%d SelLength=%d SelText=%s', [ComboBox1.SelStart,ComboBox1.SelLength, Copy(AnsiString(ComboBox1.Text),ComboBox1.SelStart + 1,ComboBox1.SelLength)]); end;
TNTって無料版の開発終わったよね
230 :
225 :2008/11/23(日) 13:34:43
まーでも古い版はダウンロード可能だし。mh-nexusさんとことか。でもDelphi 6 Personalは別版が必要かも?
231 :
225 :2008/11/23(日) 14:01:52
有料版でも直ってないそうですね まあ、英語圏の人は他言語IMEなんて使ってないだろうし FastCodeの中の人なんて、LowerCaseのTable作りに CharUpperBuff使っただけで、「Ansi」StringReplaceとか言っちゃってるしなぁ
いけね、UpcaseのTableだ
>>230 そのままだとコンポが足りないのでエラーが出るけど
ちょっと書き換えればD6Perでも動くよ
DBとBandアクチョン削ればOKだったかな で、必要な人はsoft-gemsのThemeManager入れる、と
特待販売の葉書が来た。 久々にバージョンアップしてもいいかなぁと思ってるところ。 今C#を主に使用しているんだけど、Delphiならではのメリットっていうと、 VCLとネイティブコンパイルぐらい?
バージョンアップしなくても「Delphiならではのメリット」は変わらんだろ・・
昔、Delphi 7 では、デバッグでカーソルを変数に合わせるだけで値をインスペクトできた。 先日、Delphi 2006 を借りて使ってみたら、それができないじゃん。 新しい Delphi ではどうなっているのか知ってる人、どーか教えてくだしゃい。
>>236 おれんとこにも来たな、特待販売の葉書。
見たら会社名に「エンバカデロ・テクノロジーズ」って書いてある。
エン バカ デロ
は、日本じゃアウトだろフツー。
C++Builder でまともなプログラム組めたことなかったし、
Delphi 2005, Delphi 2006 も安定しなかったんでまともに使ってなかったし、
エン「バカ」デロ Delphi と C++Builder はマジで悩む。
えっ?できますよ?
>>239 安定しなかったってどういうこと?
ちなみに、Delphi7で業務アプリ作ったけど、その時は割と安定してたけどな。
Delphiで気になるのは、ネイティブコンパイルと、VCLかな。
ビジュアルコンポーネントの使い勝手は優秀だと思った。
StringListとかObjectListなどの非ビジュアルコンポも優秀だけど、
いまじゃC#でもList<String>とかで代用できてしまうし、
コンポーネントもVCLライクに仕上がって遜色ない出来になってるしなぁという感じで悩む。
ま、.NETFrameworkがないと動作しないのは相変わらずなんだけど。
Delphi7は安定していたが、Delphi 2005は統合環境がなぜかフリーズしまくり。
Delphi 2006 はコードエディタな若干不安定で、箱形コピペなどすると、ずれ
てペーストされる。また、何もしなくとも、しばらくするとCPUを食うよ
うな処理が統合環境内部で起こる。そして、Delphi7より何か重たい。
また、
>>238 のように、デバッグでカーソルを変数に合わせるだけで値を
インスペクトできない。(あれは便利だった!!!!)
これらの現象は、コードギアが提供したパッチを当ててもダメだったんだな。
そんで、今もDelphi7を使っているんだよな、おれ。
ただし、どこかにあったGoogleMap を組み込んだデモだけは、Delphi7では
コンパイルできなかったのでDelphi 2006 で試したらうまくいった。
ハーア、何かうまくゆかないもんだな。
>>240 >えっ?できますよ?
えっ?できるの?
>244 >238のことですよね?できますよ。もちろんローカル変数ウィンドウでも評価ウィンドウでも見られますけど、 変数にカーソルをあてるだけでインスペクションできるし、最近のものでは構造体のメンバやポインタの 示す先を追っていくこともできます。できないバージョンは(Personal/TurboExplorerを除けば)ないんじゃないかな?
× できないバージョンは(Personal/TurboExplorerを除けば)ないんじゃないかな? ○ Delphi5以降でできないバージョンは(Personal/TurboExplorerを除けば)ないんじゃないかな?
>>238 >>244 「メニュー」ツール → オプション
「オプションダイアログ」 エディタ設定 → 支援機能 → ツールチップ式評価 をチェックでOK
デバッグの機能なんだけど、「デバッガオプション」ではなく「エディタ設定」にあるのがミソ
IDEが不安定ってことなのか。 いつからかIDEが.NET上でしか動作しないようになったんかな。 若干、重いイメージは確かにあったけど。 ネイティブで動作させることを目的としなければ、VS2005移行で十分に Delphi並のRAD環境になってるから、選択に難しいところではあるよね。
IDEは.Netだけど、コンパイルされるコードはネイティブ。
D2009はIDEはネイティブでそ? ヘルプのために.NETがいるだけで
Delphiって算術シフトの演算子ってないの???
shlとshr
>>251 ビットシフトこのとでしたら shl、shr で。
綴りで分かるかもしれませんがそれぞれ左シフト(SHift Left)と右シフト(SHift Right)。
って一番下の252が見えてなかった…すいません
ファイルの先頭からあるバイト目からをMemoに読み込むにはどうしたらよいのでしょうか? というのも、ファイルの先頭にいらない物が付いていてそのまま
途中送信してしまった・・・orz ファイルの先頭からあるバイト目からをMemoに読み込むにはどうしたらよいのでしょうか? というのも、ファイルの先頭にいらない物が付いていてそのまま Memo1.Lines.LoadFromFile(Filename); とやっても文字化け?して読めないんです。 でもその無駄なのを取り去ってやるとMemoに読み込めます。
>>256 TFileStreamとかAssignFile・Seek・Readで読み出せばいいはず
TFileStreamの方が簡単・VCL的なのでおすすめ
procedure TForm1.ButtonClick(Sender: TObject);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(Edit1.Text, fmOpenRead or fmShareDenyWrite);
try
Stream.Seek(10, soFromBeginning);//10バイト飛ばして読む
Memo1.Lines.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
>>257 うんこーどと断定できるとかすげえな
Delphi 2006でコンポーネントのインストールをしたい。 だが、「コンポーネントのインストール」がメニューから消えており、 HELPで「コンポーネントのインストール」を検索すると 『コンポーネントコンポーネントのインストール』 このダイアログボックスでは,コンポーネントを新規パッケージ または既存のパッケージにインストールします。 とある。 いったい、どうやってダイアログボックスまでたどり着くのだろう? どなたか教えて下され。
>>259 2006のヘルプを見ろよ
>すべてのコンポーネントはパッケージとして IDE にインストールされます。したがって,
>ユーザー自身がコンポーネントを作成するときには,まずそのコンポーネントを入れる
>パッケージを 作成してコンパイル する必要があります。コンポーネントのソースコードは,
>コンポーネント作成の概要 で説明されているモデルにしたがって記述する必要があります。
>>260 なるほど、Delphi2006は 「ファイル」メニュー から辿ってパッケージを作るようになってたんだ。
Delphi7では 「コンポーネント」メニュー からいきなり「コンポーネントのインストール」ができ、そこで
パッケージを新規に作成してたんで(これには)気付かなかった。Delphi2006のように
パッケージ・プロジェクトとして開発する方が、Delphi7のときよりも少しだけ楽だね。
助かった。ありがとうございました。
Turbo DelphiでFastMM4.90を利用しています。 デバッグ時にステップ実行していると、メモリの確保や解放時などFastMMのソースに飛ばされます。 これを無視したい(デバッガがFastMMのコードまで追わないようにしたい)のですが、どうすればいいのでしょうか。
263 :
262 :2008/11/27(木) 13:03:36
とりあえず、コンパイラ指令の{$D-}をFastMMのソースに加えることで抑制しました。
ソースに飛べないようにすればいいじゃない 削除するなり移動するなり
>>264 そーすると、例外が起きるたびにソースを要求されるそーすよ。
そーすね
___ ,,r''"´ `"''-,, / ノ ヽ、 \ / ( ● ) ( ● ) ヽ ヽ i゛ :::⌒(__人__)⌒::: ヽ ゛i l |r┬-| l ノ そーなんすかwww ! | | | レ' l l | | | l , l | l `ー'´ | l l ! l ,! | l l ゛i / l i゛ ゛i ヽ / / / ヽ,__,,,ゝ く ノ / ヽ ゛" / __ _ ) 、(二"'''ー'"ー'__゛゛ヽ r'  ̄  ̄ヽ,)‐-,,_ ´┴'ノ ヽ__,,-──-、__,ノ
FastMMがいつの間にやら新しくなってたので落とそうと思ったらアカウントが必要になってたのね そう思って登録しようとしても、必要事項書いてRegistration押してもその後何にも起こらん どうすりゃいいの?メール来るのかと思ったら来ないし
とりあえずお前が英語苦手だってことは理解した
>>268 ダウンロードにパスなんて必要ないんだけど
パスじゃなかったアカウントだ
あれー?Download押すとトップページに飛ばされるから そう思ってた。俺だけ?
すぐ上で言ってるとおり、Downloadだよ 俺だけのようだ…会社でも家でも同じだったんだよなあ なんでだろ
ブラウザのせいだったようだ すまんです
どんな糞ブラウザ使ってんだよw
Turbo Delphiを使用しています。 ローカルバックアップの保持ファイル数の上限を増やすことはできるでしょうか?。 私の環境では、どうも100個くらいしか保持してくれないようです。 これを1000個くらいまで保持してくれれば、個人的にはだいぶ楽になるのです。 よろしくお願いします。
あまりそれでがんばらずに素直にバージョン管理システム使ったら。 TortoiseSVN + pdumpfsの組み合わせて使ってるけどソース紛失で泣く事はなくなったな。
>>278 どうも。
IDE標準の、変更のたびにバックアップが作成されるというのは、
利点でもあり弱点でもありますね。
トイレに行った後、レジストリの方も調べてみましたが、
BDS-4.0-Editor-OptionにあるFile Backup Levelというキーで、
上限を増やせるようです?(実際に増えるかは未確認)。
当座はこれでしの(げるならしの)ぎます。教えていただいたソフトウェアについても、
調べてみたいと思います。ありがとうございました。
かなりくだらない質問なんですが 皆さんbegin...endのbeginをどこにで書いてますか? 例えば if hoge then begin hage; end; とか if hoge then begin hage; end;
>280 俺は上派だな。elseがある場合は下みたいな感じ。 if hoge then begin end else if mage then begin end else begin end; VCL内でも統一した書式はないと思う。
懐かしい議論だ。俺は下派。
使ってるモニタ次第 UXGAでちまちま詰める必要はないし ノートで縦にだらだら書いてたら確実に生産性が低下する
モニタでいちいち書式かえたらよけい生産性が下がるわな・・
以下のような書き方してる。 if hoge then begin end else if uge then begin end else then end; って書いてる。 ifのブロックとelseのブロックがend挟んで分離されるので、一目でどこまでがifのブロックか見分けることができると思う。 ただし、hogeが長くなったり複数行になる場合は、例外として、 if (hogeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee) and (ugeeeeeeeeeeeeeeeeeeeeeeeeeeeeee) then begin end; としてる。 beginが右の方に行き過ぎて、書いたかどうか分からなくなるから。 もし本当に書き忘れたり、うっかり削除すると、endの対応が一致しないってエラーに悩まされる。あと、思い込みのミスもあるし。 前回のコンパイルから時間が経ってると、どこ直したか忘れて、一カ所ずつ探すはめになるので。 こまめにコンパイルすればいいんだけど、気持ちよく書いている時って、しばしば忘れるんだよね。 また、質問と外れるけど、 if hoge then syoti1; syori2; って書いちゃって、なんでsyori2が常に走るんだって、悩むことになるから、if hoge then Exitのような単純な場合を除いて、ぶら下がりインデントは使用しない様にしてる。 基本的には、自分は間違っていない!という思い込みのミスを避ける方向に書くようにしてる。
パスカルの生みの親ビルトが頭弱かったから、汚い begin end がプログラムを醜くしてしまった。 単文、複文なんて、関係ないのにね。 まあ、おいらもバカだが、if 文は次のようなものが分かり易いと思っている。 <else 句がない場合> <else 句がひとつある場合> <else句が複数ある場合 ※ef はelseifの意> if 条件式 then if 条件式 then if 条件式 then 文 文 文 endif else ef 条件式 then 文 文 endif ef 条件式 then 文 else 文 endif
でも、endif も ef も予約語にないから、そこでおいらは次のようにしているんだ <else 句がない場合> <else 句がひとつある場合> <else句が複数ある場合> if 条件式 then begin if 条件式 then begin if 条件式 then begin 文 文 文 end end else begin end else if 条件式 then begin 文 文 end end else if 条件式 then begin 文 end else begin 文 endif これで begin end に目を奪われにくくなるんで、ちょいバグだしにくくなったかな(って気がしてるだけかも)。
>>286 で書き忘れたけど、式の中の「文」は、単文でも複文でもいいと思ってくれ。
if 条件 then begin end else if 条件 then begin end else begin end; よくこういう議論を見かけるが、俺と同じやり方の奴って 見たこと無いんだよなー
お前は俺か
291 :
280 :2008/12/01(月) 11:43:21
皆さんありがとうございます。 よくbegin...endの数が合わなくてエラー出てたもんで皆さんはどんな感じで書いているのか気になったんです。 教えていただいたものを色々試してみたいと思います。 とても参考になりました。どうもありがとうございました。
それはお前の頭が悪いww
でもさ、前々から思ってたんだけど、 ALT+[とかで対応する括弧は追えるのに なんでbegin/endは追えないんだろ?
>>287 くだらねぇ、気持ち悪いルール使ってんじゃねぇよ。基本はdelphiならVCL、JavaならJavaのクラスライブラリ
のソースに合わせろよ。おまえらなみたいな奴のソースは見苦しくてかなわんわ。
こういうのが沸くからアンケートネタはWikiの投票pluginかなんかを使ってやってくれ
以下のように記述するのが正式だというのを海外のサイトで読んだことがある。 if 条件 then 文 else if 条件 then 文 else 文; if 条件 then begin 文 end else begin 文 end; 文が短い場合は if 条件 then 文 else 文; って書いちゃうけどね。
書き方に正しいも糞もあるかよww
>>286 QuickBASICやVisual Basicではまさにそんな感じの構文になっていて使いやすかったです。
>>293 C/C++の { } ほどの地獄ではないからかもしれません。
>>286 のおいらだが、おいらが C++ 使いだったころ、次の#define プリプロセッサで
>>286 の構文が
コンパイラー通るようにしていたんだ。
#define if if(
#define then ){
#define else }else{
#define ef }else if(
#define endif }
てな感じだったけかな(?)。しばらくやってないんで忘れてしまったけどね。その他 for(;;) 構文なんかも
「 for 初期値 to 終了条件 step 増加式 do 文 endfor 」とか if と同じ要領でやっていた。
プログラムがスッキリしてたね。なんせ、おいら if や for の後の ( ) が大嫌いだったからね。
これいらないと思う。C言語作った男もおいらに負けず相当オタンコナスだね。
まあ、この構文(
>>286 )でソースコードを渡すと、相手はビックリしてたっけ。おいらもかなりバカだね。
融通が利かない人はどんな職業でもいい発想ができない。
case ofのかっこいい書き方を教えれ どうもelseだけしっくりこなかったりする
たしかにcase文はうざい
case n of 1: foo; 2: begin bar; end; else baz; end;
case n of 1: foo; 2: begin bar; end; else baz; end;
∧,,∧∩ おれ、こんなん。 ミ,,゚Д゚彡 ミ つ旦.ミ if then begin end else if then begin end else begin end; if が何個ならんでも、行頭を揃えたい気がするのです。 Caseはいつも悩む。 ifを、caseに変更したときに、begin...endをわざわざ インデント変更したくないから case A of B: begin end; C: begin end; end; //case かな。。行が増えすぎと、caseのendとbeginendが分けにくくていやなのだが。。
おいらも case 文は苦手だったな。どうやってもキレイに書けない。しかし、だいたい次のようにやってた。(case の範囲を字下げではっきりさせたいんだな、おいら) case A of B: 文 C: begin 文; 文 end D,E: 文 else 文 end case 文を 「case A of :値: 文 :値: 文 end 」とビルトが設計すればよかったかもね、次のようにスッキリする。(「文」は単文でも複文でも可だよ) case A of :B: 文 :C: 文; 文 :D,E: 文 else 文 end
気持ち悪い
caseの中はcaseより引っ込める ラベルの中身も引っ込める、begin-endの中も引っ込める ラベルの後ろにbeginを書くと、対応するendもおなじインデントに書きたい 横に伸び〜
case〜endの間を字下げで解決。
typeのクラス宣言内のprivateなprocedureとか、自動生成で変なインデントを付けられた日にはもうー
record型のconstの配列の初期化の記述がめんどくさい コンパイラサボりすぎ
>>308 おいらもおんなじ気持ちだけど、これやるとインデント深くなるんだよなあ。
だからおいらはインデントをスペース3文字分にしてるんだが、それでも深くなる。
これがインデントがスペース8文字分で表示された日にゃー目がぶっ飛ぶ。
え!Del党ってインデントはスペース2文字でしょ。
オレは2文字だな。 if 〜 then begin 文 end else if 〜 then begin 文 end; case i of 1 : begin 文 end; end;
caseとelseとendをそろえてる。 caseに関しては自動インデントを使わずなるべく詰める様にしている。 17インチCRTからの流れで横も縦も圧縮する様な書き方になってしまった。 ifなんかでも改行してbeginの方が見やすいのに。
>>305 ifが常に行頭だと、別のif分と区別がつきにくいから嫌だな
case分は無駄にインデントが増えるな
case hoge of
A:
begin
end;
B:
begin
end;
else
end;
これでやると、else内だけインデントがずれるのがむかつく
if分、じゃなくてif文だし、case分じゃなくてcase文 orz
>>313-314 インデント2文字でやってみたことあるんだけど気に入らなかったんだな、おいら。
なぜかっていうと、(一番多用される)if文のときインデント2文字だと
i f a = b then begin
c:= 2;
........
のようになって、この例で説明すると変数 a と c の頭が揃わないので美しくない。それに
if の近くに変数 c がありすぎて if が窮屈に見える。これをインデント3文字にすると
i f a = b then begin
c:= 2;
........
となって、こっちの方がスッキリして見えるんだな、おいらの目には。(if文重視なんで)
まあ、バカなおいらの好みだけどね。
そんで、クラス宣言の自動生成がインデント2文字固定なんで、苦労してる。
秋田
>>318 の最初の例が崩れてたから訂正するね。
if a = b then begin
c:= 2;
........
(2ちゃんは左側の半角スペース取っちゃうんだよね.....。)
インデントは2文字。
if文は
>>305 に同じ。
大規模なcase文などではソースを折りたためるようにREGIONを使う。
case hoge of
A: {$REGION '説明'}
begin
end; {$ENDREGION}
B: {$REGION '説明'}
begin
end; {$ENDREGION}
else
end;
322 :
321 :2008/12/02(火) 13:19:47
あ、if文は
>>305 とは微妙に違った。
if then
begin
end
else if then
begin
end
else
begin
end;
個人的には、else(else if) 〜endまでの処理を消したり、
begin〜endまでの複数行の文を単数行の文に書き換える際に自然だからこれで落ち着いた。
どうせソースの書き方なんて十人十色なんだからいい加減飽きろよ
新しい話題を提供しろよw
>324 「CodeGear RAD Studio 2009 日本語版」販売開始だって
delphiはなかなか良い言語だとは思うけど C++ライクに記述できるような仕組みがあれば、いいなぁ。 あと、delphiにC++を埋め込めるようにできれば、なおよし。 begin〜endはうざい。 あと、function/procedureと区別する意味がわからん。 C++歴5年、delphi歴3ヶ月より。
C++に、Pascalライクに記述できたらいいなあ。 なんて言われたら、ウザッとか思わない?
DLLとかC++ Builderとか使えば出来るけどね
>>327 そんな需要はないから。
delphiでC++ライクに使えれば、ポインタ使いまくれるし
C++脳の人間にとっては、とても楽。
でもちょっと違うか
C++記述するときにはいつも 「もっとDelphiライクなら・・・」 って思っちゃう俺はアホなのかもしれん^^;
じゃあおまいらどんな記述がいいのよ
334 :
デフォルトの名無しさん :2008/12/02(火) 22:21:56
教えてください。 既存のプロジェクトなのですが、DataModuleのSession,Aliasのアイコンが半透明に なっています。 実行するとデータベースに接続するところで異常終了します。 つなげるべきデータベースはわかっているのですが、どのように設定したらよいので しょうか。
Pythonが綺麗って言われてるよね。 Delphiと似てるからすぐに使えるようになるよ。
begin end が { } ならDelphiが無敵
if True then { MessageBox(Handle, 'test', 'test', MB_OK); }; こうですか分かりません><
むしろBegin〜endの方が俺は見やすくて好きw 変態ですので
Begin〜endよりbegin〜endのがよっぽど見やすい
細かいやつって嫌われるよな
C++のコードは見づらい
CoolBarの行を1行固定にしたいんだけどどうすればいいの? アイコンバンド1、アイコンバンド2、検索窓の3つ設置。 実行してCoolBandを弄ってると必ず2行目が出来てしまう。
C++ の :: と -> がウザイ。
俺も
フォーム上の末代までのコントロール数をカウントする方法ってあります?
Form1.ComponentCount 子供の子供まで数えたい時はComponents使って再帰とかすればいい function CountFunc(Compo: TComponent): Integer; var I, Count: Integer; procedure SaikiFunc(Compo: TComponent); var I: Integer; begin for I := 0 to Compo.ComponentCount - 1 do begin Inc(Count); SaikiFunc(Components[I]); end; end; begin Count := 0; SaikiFunc(Compo); Result := Count; end;
教えてください。 Nscripterで集積エフェクトを使いたいのですが, lsp 0,"****.jpg",208,32 print 99,3000,"breakup.dll/ulP" これだと左,中央,右の指定ができず困っています。 どうしたらいいですか?
>>347 それだと非ビジュアルコンポーネントまでカウントしてしまうので
> if Components[i] is TControl then
みたいに絞り込むか ControlCount/Controls を使うと良いと思います。
>>326 Delphiはプログラミング教育用に生まれたPascalの血を引いた言語ですから
わかりやすさを捨てることはないでしょうね。
逆にPascalのbegin〜endがうざかった人間が作ったのがCですから
突き放したような結論で恐縮ですが
「Delphiのbegin〜endがうざいならCPB使え」
ということになってしまうのではないかと思います。
(…なあんてことを書いたときに限ってDelphi2010あたりで{}が実装されたりして)
そういえば昔、SQL Anywhere というデータベースを使ったことがあったが、 そのストアードプロシジャーは if文が if 条件 then 文1 else 文2 end という構文で、文1と文2は単文でも複文でも begin end が不要だったな。 ありゃあ見やすいし、書きやすかった。 begin end や { } なんて過去の遺物、消え去るよ。
BCBだな
355 :
351 :2008/12/04(木) 04:45:25
>>354 やっぱりソースは公開しなくても良いんですね
おかげでスッキリしました、ありがとうございます
すいません、思いっきり略称間違えました… orz
357 :
デフォルトの名無しさん :2008/12/05(金) 02:03:30
onKeyDown や onKeyPress などを使って、 『キーの同時押し』を検知する方法ってありますか? たとえばAlt + Tab を検知するなど。
Downならif Shift = [ssAlt] thenで
GetAsyncKeyStateはだめ?
同時押しの検出ならGetKeyStateかShiftパラメータでは?
Del7+Win2000 フォームを半透過指定してフォーム上のコンポーネントは非透過ってのは可能? Transparentみたいな色指定透過っぽい感じ
Pascal を C++ っぽくしろって、 日本語は英語と同じ文法にしろっていうような門やん
>>362 Begin...Endの事?
そうは思わないな…
日本語だって英語の良いところはカタカナという形で吸収するんだから
コメントと文法くくりはBegin、{両方サポートしてくれたら私もうれしいな。
でもそうなると過去のソースが動かなくなるわけで、そこまでして言語仕様を拡張することには反対
結果として{は無理だと思うけど。
コンパイラ指令で切り分けできたら面白いすね、デフォルトはOFFで。
TEditの枠線の色を赤色に変えるにはどうしたらいいでしょうか? よろしくお願いします。
OSの管轄なので無理 あるいはオナニードロドロ
366 :
364 :2008/12/06(土) 15:58:30
早速回答ありがとうございます。 ちょっと変えてくれと言われたんだけど厳しそうだし、 見た目の問題だけなのでそのまま放置しますw
>>364 一回り大きいPanelに乗せてPanelの色を変える
>>366 ならそいつにVSでも変えてろハゲとでも言ってればいい希ガス
Delphi2006でヘルプを使いDelphi終了すると、タスクにdexplore.exeが残り、 再びDelphi2006起動してヘルプを使いDelphi終了すると、タスクにdexplore.exeが2つ残り、 とドンドンdexplore.exeがタスクに増えて行きます。(OSはXPです) これって、メモリーけっこう食ってますが、Delphiのバグでしょうか?
dexplorerのバグでしょう、きっと。
VS だとそんなことないから Delphi のIDEのバグじゃないの?
食わせてるデータがまずいからだとは思うんだけど、それで逝っちゃうようなのはやっぱりバグだと思うんだ。 DelphiのIDEはDExplorerをキックしてるだけだしね。ちなみにXPで発現することが多いみたい。
Borland Developer Studio 2006 (Professional)をデフォ状態でDelphi使うと ヘルプにC++の内容まで検索されてウザイ。 C++の内容が検索されなくなる設定ができるかどうか調べても未だに分からない。 どなたかHELP!
それが円馬鹿クオリテー
フィルタ条件ではあかんのか
6とかだとヘルプファイルの検索対象の範囲とか設定できるんだけどねぇ‥‥ CLXのヘルプ外したりとか。
ヘルプはひどいな リンクも不十分だし、欲しい情報になかなかとべん
旧ボーランド時代からヘルプは良くなかったですねぇ。
初代Delphiの頃はまだ良かったのですが…
>>367 さらにEditを枠無しにしたら完璧ですね。
>>378 やってみたけど枠を消すと文字がずれて、枠有りの状態のようにはいかなかった。
確かにうまくいきませんでした。 赤パネル Editと同じ色のパネル Edit の三段重ねでEditの位置を調整してなんとかそれらしく?なりましたがなかなか骨の折れる作業です。 複数貼り付けるならアンカーを使ったり赤パネルの代わりに赤フレームにすると作業効率は多少ましになるかもしれませんが AutoSizeが利かなくなるのかフォントサイズを変えてもウィンドウサイズが変わらないのはつらいですね。
そんなことするよりTCustomEdit継承して新しく作った方が楽じゃない?
初心者質問お願いします。 DateTimePickerにMaxDateを設定している時、 プログラムでDateTimePickerのDate プロパティにMaxDateと同じ日付を代入することはできないのでしょうか? 手動ではMaxDateの日付を設定できます。 当方Delphi4です。 〜例〜 (MaxDate は2008/12/31と設定している) DateTimePicker1.Date := StrToDate('2008/12/30'); ・・・日付が反映される DateTimePicker1.Date := StrToDate('2008/12/31'); ・・・日付が反映されない DateTimePicker1.Date := StrToDate('2009/1/1'); ・・・日付が範囲を超えているとエラーが出る (手動で2008/12/31を設定することはできる)
TEdit も TDateTimePicker もウィンドウズのコントロールだから、その機能は
本質的には Delphi と関係ない。MSDN 読むほうがいい。
>>381 は馬鹿回答。
384 :
382 :2008/12/09(火) 21:49:28
>>383 そうでしたかぁ。
ありがとうございました。
>382 Timeプロパティに何が入ってるか確認したほうがよいかも。
>>373 俺も2006でDelphiだけが表示される正式なヤリ方がしりたい。
前にどこかを見てやったときは、ヘルプのアプリ?がバグバグで
設定したのに設定したことにならなかったり嫌になった覚えがあるな。
しかし、どうやって設定したか憶えてなくて困る。
Delphiヘルプのみってのが確かできたはずなんだが。
6の時はテキスト弄るだけで簡単だったけどな。
387 :
382 :2008/12/10(水) 13:20:42
>>385 Timeプロパティを00:00:00にしたら正しく動きました!
ありがとうございました!
2006ではDelphi以外のHELPも(親切に)表示するのが仕様ということでハイ {{{{(+_+)}}}}。 (アーーーーめんどくさい) しかし、こんな簡単なことがデフォでできてないなんて、何なのこの会社?
390 :
デフォルトの名無しさん :2008/12/11(木) 00:24:47
教えてください。MediaPlayerを使って1から9までの動画をランダムにつなげて流すというプログラムを作っています(例えば2→5→8→1→3→9→4→7→6の順番で動画を流してくれるようなプログラムです) とりあえず作ってみたのですがボタンを押してもうんともすんとも動きません。ここが間違ってる、こうしたら良いなどのアドバイスをいただけたらと思います。よろしくお願いします var cou,new,test,i:Integer; video:Array[1..9]of integer; procedure TForm1.Button2Click(Sender: TObject); begin cou:=cou+1; if cou>9 then exit; Randomize; new:=Random(10); repeat test:=0; For i:=1 to cou do if new=video[i] then test:=1; If test=1 then new:=random(10); until test=0; video[cou]:=new; MediaPlayer2.FileName:=ExtractFilePath(application.ExeName)+'tabidachi'+IntToStr(new)+'.wmv'; MediaPlayer2.Open; MediaPlayer2.Notify:=True; MediaPlayer2.Play; procedure TForm1.MediaPlayer2Notify(Sender: TObject); if (MediaPlayer2.DeviceID <> 0) and (new < 10) then begin MediaPlayer2.FileName := ExtractFilePath(application.ExeName)+'tabidachi'+IntToStr(new)+'.wmv'; MediaPlayer2.Open; MediaPlayer2.Play; Inc(new); end;
391 :
デフォルトの名無しさん :2008/12/11(木) 00:44:39
宿題でダイヤモンドパターンのプログラムがあるのですが教えてください!!!!
couの初期値って何なの?
>>388 そうなんですか。それで変な動作をするんですね・・ TEdit くらい単純なラッパーの方がいいのに。
394 :
386 :2008/12/11(木) 10:02:34
ヘルプの編集思い出した。 編集というか、デフォルトのフィルタを変更するだけだけど 「ヘルプ」→「フィルタの編集」 (フィルタなし) を選択して、例えば以下を突っ込んで Save ("DevLang"="Delphi") OR ("DocSet"="bds_Win32") OR ("DocSet"="PSDK") OR ("DocSet"="indy") これで、デフォルトでDelphiとBDS Win32とPlatformSDK、Indy 10からしか検索されない。 根本的にいらないヘルプをはずすわけではなく、 実質、起動時にフィルタを選択しているのでヘルプ起動時少し重いが難
395 :
386 :2008/12/11(木) 10:06:04
396 :
386 :2008/12/11(木) 10:08:25
ああ、やべえ、
>>394 はやらん方がいいわw
(フィルタなし) に Saveすると、以下の様にでて元に戻せなくなるわw
---------------------------
Windows Internet Explorer
---------------------------
Filter cannot be saved without a definition
---------------------------
OK
---------------------------
欠陥ヘルプww
>>396 の問題は、deleteで(フィルタなし)を削除しようとしたら大丈夫だった
>>395 のヘルプの編集はうまくいった。
以下C++と.NETの削除の方法 for Vista。
まずは、適当なフォルダに %PROGRAMFILES%\Borland\BDS\4.0\Help\Common\mergeWin32.xml をコピー。
以下のパッチを当てる。(といっても該当行を削除するだけ)
--- mergeWin32.org.xml 2005-11-14 10:00:00.000000000 +0900
+++ mergeWin32.xml 2008-12-11 10:12:02.910931700 +0900
@@ -10,16 +10,13 @@
<CompiledIndex>Help\Win32\bds4Win32devguide.HxI</CompiledIndex>
<CompiledIndex>Help\Win32\bds4Win32tasks.HxI</CompiledIndex>
<CompiledIndex>Help\Win32\bds4Win32api_win32.HxI</CompiledIndex>
-<CompiledIndex>Help\Win32\bds4Win32api_cpp.HxI</CompiledIndex>
<HelpTopic>Help\Win32\bds4Win32guide.HxS</HelpTopic>
<HelpTopic>Help\Win32\bds4Win32devguide.HxS</HelpTopic>
<HelpTopic>Help\Win32\bds4Win32tasks.HxS</HelpTopic>
<HelpTopic>Help\Win32\bds4Win32api_win32.HxS</HelpTopic>
-<HelpTopic>Help\Win32\bds4Win32api_cpp.HxS</HelpTopic>
</FileList>
<Filters>
<Filter Name="Developer Studio 2006 for Win32">"DocSet"="bds_Win32"</Filter>
-<Filter Name="Language: C++">"DevLang"="C++"</Filter>
</Filters>
</Merge>
</helpConfig>
(つづく)
同じフォルダに以下のregHelp.batファイルを作り、管理者権限で実行 copy mergeWin32.xml "%PROGRAMFILES%\Borland\BDS\4.0\Help\Common" "%PROGRAMFILES%\Borland\BDS\4.0\Help\Common\regHelp.exe" -7 "%PROGRAMFILES%\Borland\BDS\4.0\Help\Common\regHelp.exe" 5 おもむろにヘルプを起動すると、しばらく後適用された状態で検索ができる / ̄\ | | \_/ __|___ / \ / \ l | ( | \ 〃_/ >'⌒ ̄ ̄、,\ / \ / ィ ,ノ'ヾ ヽ ( / ), l ) ノ _,/ 、,, | /⌒ ̄ ̄ ̄ | l 、_ ,ノ ,/ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| . └┬:‐┬───┬‐────┘ ノ ,‐‐,) 丿,‐‐,) ┼ヽ -|r‐、. レ | (,∠/ (,∠/ d⌒) ./| _ノ __ノ
>>397 念のため編集前に mergeWin32.xml はバックアップを取っておいた方がよいです
401 :
390 :2008/12/11(木) 13:28:48
>>392 さん
初期値は設定していません。設定しないとうまくいかないんでしょうか?
引き続きご回答いただければ幸いです。よろしくお願いします
cou:=cou+1; の行にBreakPointを置いて、実行。 止まったときのcouの値は? cou:=0; で初期化しないとだめじゃないの? 自動で0にしてくれたっけ?
403 :
390 :2008/12/11(木) 13:57:43
>>402 さん
cou:=0;で設定し、ブレークポイント置いて実行してみました
couは1で止まってしまっているみたいです…
ランダムに再生の前に、普通に再生は出来るの? video: array[1..9]of Integer に適当に数値を入れて、再生させると再生できるの? それとも、それでも再生できないの? ランダムの部分がいけないのか、再生部分がいけないのかの切り分けはしましたか?
>>402 ローカル変数は初期化されません(0にしてくれません)。
だから自分で初期値として0を代入しなければなりません。
ちなみにグローバル変数は初期化されます(0にしてくれます)。
たまたま0になっているときもありますがこれを当て込んではいけません。
406 :
390 :2008/12/11(木) 14:42:17
>>404 さん
ボタンを押しても何も起きません。読み込みもしてくれなくてうんともすんともです
再生部は問題ないようです。前半部のランダムの部分が良くないようです
説明不足な点が多くすみません
この板の上の方にBINGOの問題があって、 そこで同じようにランダムに数値を並べる例が出てるから、みて見れば? その例にそってvideo[1..9]にちゃんとランダムに数値を入れるところまで、 頑張ってみようよ。
マウスのホイールをフックしたいのですがホイールの上下を感知することってできるのでしょうか?
すみません wParamを見ればいいことがわかりました お騒がせしました
var a: array[0..10] of Byte; みたいな感じで定義した配列に、@a[0]を対象にMoveMemoryとかをやっても大丈夫なんですか? 配列はメモリ上で常に連続しているものなんですか? Cardinal型とByte型の配列を相互に入れ替えるとき、Moveは面倒くさくて
連続して無いとFileName: array[0..MAX_PATH] of Char;とか使えなくなる ので連続してるだろう
413 :
デフォルトの名無しさん :2008/12/13(土) 18:39:04
すみません!!! 0から1の乱数randomを200回発生させ、第1項から200項目までの和、その平均、二乗和を求めるプログラムを穴埋めで回答するように。 という課題がわかりません↓↓ 教えてください!! なお、和はedit1、平均はedit2、二乗和はedit3に出力するものとし、 s: 和 ss: 二乗和 r: 0 から1の乱数をいれる変数 av: 平均値 とする。 procedure TForm1.Button1Click(Sender: TObject); var i:integer; s,ss,r,av:real; begin s:=[(1)]; ss:=[(2)]; [(3)] i:=1 to [(4)] [(5)] r:=random; s := s+ [(6)]; ss:= ss + [(7)]; end; av:=s/[(8)]; edit1.text:=[(9)]; edit2.text:=FloatToStr(av); edit3.text:=[(10)]; end; }
414 :
413の続き :2008/12/13(土) 18:42:22
和の値(小数点以下3桁目を四捨五入する) 平均の値(小数点以下3桁目を四捨五入する) 二乗和の値(小数点以下3桁目を四捨五入する) も是非是非お願いします!!!!
これぐらい分からないとしょうがないぞ 0 0 for do begin i i*i 200 s ss
おれも出来てなかった
自力で解く気ゼロだな
5にrandomize入れてしまったw 4はdo beginで
419 :
390 :2008/12/13(土) 22:00:35
>>407 さん
いろいろとアドバイスいただきありがとうございました。お礼が遅くなり申し訳ありません
宿題を丸投げする413が教授に怒られますように ニヤニヤ
大学でDelphi習うところあるんだね
どっちかというとDelphiというよりはPascalだろーけどな
Delphi2006でファイルメニューの「開き直す」を選んだとき、過去のプロジェクトがたった4件しか表示されません。 これだと、ちょっと別のプロジェクトをいじっていると肝心のプロジェクトが表示されなくなったりして面倒です。 そこで「開き直す」プロジェクト数を増やそうと思ってオプションを見ましたが、該当するパラメータが見つかりませんでした。 このようなプロジェクト数を増やす設定は可能でしょうか。
>>424 それは俺も不便に思ってる。
スタートページも確かパス表示なしな上に、
プロジェクトの履歴少ないよな
>>424 プロジェクトのショートカットをデスクトップにでも作っておけ
ショートカットだと、もう一個IDEが起動する(´・ω・`)ショボーン
Delphi2006なら HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Closed Projects を書き換えるだけのソフトを作っておけばいい コマンドラインにプロジェクトファイルをくっつけて
それって簡単?
簡単かどうか試せばいいんじゃね?
ActiveProjectsとかいうフォルダにショートカット作っておいて タスクバー右クリツールバーの登録で指定して >>から起動したいファイルをIDEにドラッグドロップすれば開けるんじゃね。
>>430 やってみたけどIDE起動してると効かないみたい。そしてIDE終了さ
せるときエラーになる。
IDE起動してない状態で書き換え、IDE起動させれば確かに効くけど、
IDEの再起動が面倒かな。
>>431 やってみた。
ショートカットだと .lnk ファイルが開かれるだけ。
実プロジェクトファイルだと、現行プロジェクトを非アクティブにしてプロジェクトグループに追加される。
しかし、元々関係ないプロジェクト同士でプロジェクトグループにすると、どのユニットが何がなんだか分か
らなくなる。
いくつものスレッドでメインスレッドにある一つの配列をいじくる場合って衝突する危険性があると思います どうやって衝突を回避するんですか?
>>434 補足です
その共通に使う配列は構造体の配列でaddしたりDeleteしたりする関数を呼ぶ事で操作しています
スレッドから操作関数をよぶときにどこかが呼んでいる時は待つ、みたいなことができればいいと考えています
どうすればそういうことができるのでしょうか?
mutexやCriticalSectionで衝突する可能性のあるコードを保護する。 TCriticalSectionでも使っとけ。
下記スレッドの説明から 異なるスレッドが所有する VCL または CLX のメソッド/関数/ プロパティを別のスレッドの中から扱う場合、排他処理の問題が 発生します。 メインスレッドの所有するオブジェクトに対しては Synchronize メソッドを使う事ができます。他のオブジェクトを参照するため のメソッドをスレッドクラスに追加し、Synchronize メソッドの 引数として渡します。
>>434 >>437 玄人ではありませんし、add,deleteの頻度にもよりますが、add,deleteが1秒内に何十回も発生するなら
そのたびにSynchronizeを多用するとスレッド化のメリットが失われますのでいかがなものかと思います。
その場合、私なら全配列を丸々コピーしてスレッド内処理後、Synchronizeもしくはterminate後に元にコピーします。
当然、メモリー効率は犠牲にします。
低頻度ならそのたびにSynchronizeで良いのでは?
>>438 >434
>いくつものスレッドでメインスレッドにある一つの配列をいじくる場合
ということなので、各スレッドがコピーして保持し処理後にリストアするならばスレッドにする必要が無いと思う
>Synchronizeを多用するとスレッド化のメリットが失われます
メリットはまさに衝突回避なのだと思うけど、ここで頻度については議論の外でいいのでは?
まー後は434さんが実装して確認するのがはやいわな
>>411 亀ですが、言語仕様では
「静的配列はその配列の要素型の連続した変数の並びとして格納されます」
とあります。
わかりにくいのですが「連続した変数の並び」ということなので
連続して並んでいることを保証していると考えて良いと思います。
動的配列は連続してないかも、ってそんなことあるかいな・・
動的配列はポインタ1個だから、1つのメモリブロックしか扱えない。 だから連続してないってことはありえない。
初期化にFillCharルーチンなんぞを使ってるけど、動的配列や静的配列が どんなに大きくてもここ数年まったく問題なく動いていますんで、間違い なく連続してると思いますヨ。
case文のelseはbegin,endでくくらなくてもOK? case i of 1: aa; 2: bb; else cc1; cc2; end;
ok
し、知りませんでした… orz Delphi 4とDelphi 5の言語ガイド「case文」の項を見るとひとつの文しか記述出来ないような文面なのですが Turbo Delphi Explorerのヘルプ「宣言と文」の項を見ると複数の文を記述できるという内容が書いてありました。 しかし試してみたところDelphi 5とTurbo Delphi Explorerの両方でコンパイルが通ってかつすべての文が実行されるのを確認しました。 case 文の else 以降にbegin〜endを付けなくて良いとなるとコードもかなりすっきりしそうですね。
VCLのソース読むとかなり参考になるよ 例えばwith分で,で区切って複数の変数を使える var Edit: TEdit; Button: TButton; begin 中略 with Edit, Button do Caption := Text;// ButtonのCaptionをEditのTextに設定 end; これを知らないと with Edit do with Button do〜とか書くことになる
俺も知らなかった でもcase文ってそんなに使わないよねってか使えないよねcase文って
縁の下の力持ちってとこだろう
>>447 私がVCLのソースを参考にしたものはこんな感じです:
・TStringsとその派生クラス
・TCollection/TCollectionItemとそ(ry
・Resultをループ変数に使う
>>448 ( ))))))))))))
//(;;;`∀´;;;) 使うんだな、それが!
/ \
__| | | |___
||\  ̄ ̄ ̄ ̄
|| \ -●-●
case文使わなかったら、if then地獄になるじゃん
相変わらずドキュメントがだめだなぁ
ならWikiか何かで強力なドキュメント作っておくれよ
何かでcase文よりIF文の方が早いって見てから、ずっとifelse羅列してる俺がいる。
どう考えても逆w 5万で組んだマシンがあまりにも速すぎてゲーム以外では持て余し気味で もうプロファイルも取らずに局所的な高速化を試みることもなくなったな。
そんな超微量な時間のために可読性を捨てるのもちょっとな
多態を使えばcaseの出番は減る。 多重なwithはスコープを不明確にするので控えめがお勧め。
withって読みづらいからいらない
case sender of btn1 : 〜; btn2 : 〜; btn3 : 〜; end; とかいつかは出来るようになると思って早・・・3.0からかな。 まぁ無理なんだけどね。なんかcase文って惜しいイメージ。 勿論多用する派。
他の方法で
case TButton(Sender).Tag of 1 : 〜; 2 : 〜; 3 : 〜; end; で済ますかな自分なら。
ヘルプ「宣言と文」を見てみたらひでえな。 コードが読みづらいし、間違ったセミコロン付いてるし。
リストに格納した構造体のポインタを使う時なんかは、 いちいちキャストしなきゃならないのがうっとうしいからWith使うなぁ
>>462 elseやendの前のセミコロンのことか?
それだったらずっと以前に拡張になったことと記憶してるが。
いつからif文のelseの直前にセミコロン付けても良くなったんだ??
>>463 昔作ったプログラムを後から見たとき、長い複文にwith使ったところ
は理解するのに一苦労した。これに懲りて今では例えば
var a:Hoge ← HogeHogeHogeHogeと同じオブジェクト型とする。
.........
begin
..............
a := HogeHogeHogeHoge;
a.Nanchara := .....;
a.Kanchara := .....;
Dotchida(a.Nanchara);
..............
のようにして、with HogeHogeHogeHoge begin 〜 end の代わりにしてることが多い。
でも、withもたまに(短いとこに)は便利に使ってるよ。
withを使うと効率がよくなると聞いたが。 a.hoge1 := 0 a.hoge2 := 0 a.hoge3 := 0 は毎行aを参照するコードが走るけど、 with a do でくくるとaを参照するコードが1回で済む という感じだった。
コード行数は少なめに短くがモットーの俺はアンチwith ループで何万回実行するとかじゃない限りそんな些細なことは気にしないな・・
>コード行数は少なめに短く これも些細なことだと気づかないのか?
速度は計測しない限りわからんけど、コードは見ればすぐわかる ソースは昔のものでも結構参照するし(俺は)、易読性が最重要
Label1.Left := 10; Label1.Top : = 100; Label1.Caption := 'hogehoge'; Label1.Font.Hoge := hogehoge; Label1.Font.Size := 13; と with Label1 do begin Left := 10; Top : = 100; Caption := 'hogehoge'; Font.Hoge := hogehoge; .Font.Size := 13; end; で、withがない方が見やすいんですね? それなら良いんじゃないでしょうか。
俺はね そもそもbeginで改行するのすら許せない神経質
>>472 ははは、笑った。それならそれを突き通すんだ!
誰も文句は無いですよ。
コードは少ない方がいい。 そう思っていた時期もありました・・・
改行は多いほど見やすい 長い文は二行に そう思ってた時期が、俺にもありました
>長い文は二行に これは、今でもそうですね。 ただ、長い文になる事が無いように気を使ってコーディングしますけど。 >改行は多いほど見やすい これは、ネタでも笑えないね。
477 :
デフォルトの名無しさん :2008/12/17(水) 15:14:39
2chの書き込みでも無駄に改行いれて書き込むおかしな人がいるが そういう類の人じゃないだろうか?
コンパイルされると最適化されるからどっちでもいい
with do を使う・使わないでコンパイルされるものが違うんでしょ? 最適化されないんでしょ?違うのかな? 教えてください。識者の方。
同じ参照が続いたコードなんだから、コンパイルで最適化されると思うけどね
var alias: TMyType; begin alias := foo.bar.baz; alias.aaa; alias.bbb := 1; alias.ccc; end; は with foo.bar.baz do begin aaa; bbb := 1; ccc; end; と同じ。 foo.bar.baz.aaa; foo.bar.baz.bbb := 1; foo.bar.baz.ccc; とは異なる(可能性がある)。 プロパティbazがgetbazを呼んでいる場合 上二つは1度呼ばれ三つめは3度呼ばれる。 速度が遅くなるだけではなく副作用で実行結果すら異なることもあり得る。
>>481 さん
ありがとうございます。
>上二つは1度呼ばれ三つめは3度呼ばれる。
なので、withを使った方が速度的には有利。
>副作用で実行結果すら異なることもあり得る。
この副作用ですが、withを使ったが為に起こると解釈してもいいでしょうか?
withを使わないと副作用が出ますというようなコードはいかがなものかと思うのですが・・・
>>446 俺も知らなかったのでテストしてみたら新たな疑問が
上と下でSenderが変わってしまうのは何故?
procedure TForm1.Button1Click(Sender: TObject);
begin
with (Sender as TButton) do
begin
case Tag of
0:Caption:='ゼロ';
1:Caption:='いち';
else
Caption:='たくさん';
ShowMessage('てすと');
end;
Tag:=Tag+1;
end;
end;
with (Sender as TComponent) do
にするとフォームのキャプションが変わる?
Delphi の最適化はあまり当てにならないんだよね。 昔、サンプルプログラムにビットマップイメージをなるべくキレイに縮小する コードがあったが、これは実数を使って計算していてあまりに遅いので整数に 直して数十倍のスピードにしたことがあった。ところが、面白いのは、プログ ラムに、拡大ルーチン(縮小ルーチンとは別のプロシジャ)を組み込むと、若干 だが縮小の処理遅くなった。(拡大ルーチンは呼び出してない!!) どうも、Delphiの最適化は、プログラムが小さいときは処理スピードが上がるように 最適化し、プログラムが大きくなるときは、処理スピードを犠牲にしてもプログラム サイズが小さくなるようにしているみたいなんだ。 (これは Delphi2006とDelphi7で確かめた) ま、だいたい1割くらいだったかな、遅くなったの。(ちょっとがっかりした)
>>458 with文は最近使うようになりました。たとえば
Nantoka.Kantoka.Untara.Kantara.Options := Nantoka.Kantoka.Untara.Kantara.Options + [opHoeHoe, opHanyaan];
みたいな文だと
with Nantoka.Kantoka.Untara.Kantara do
Options := Options + [opHoeHoe, opHanyaan];
と読みやすく感じます。
最近のDelphiのIDEは入力補完でもwith文に対応してくれているようなので昔よりは使いやすいと思います。
何行にもわたる場合やwith a, b, c do とか書かれると私の場合は逆に混乱してしまいますので使いません。
>>483 TComponentにはTagはありますがCaptionはないからです。
with (なんとか) do のブロック内では
コンパイラはできる限り(なんとか)に対する記述であると解釈します。
そしてそのように解釈できない場合はwith文を使わないときと同じように解釈します.
そのため with Sender as TComponent do とした場合、
このwithブロック内で単にTagと書かれている場合には
TComponentにはTagプロパティがあるので
コンパイラはSender as TComponentのTagだと解釈します。
一方でこのwithブロック内で単にCaptionと書かれている場合には
TComponentにはCaptionプロパティがないので
コンパイラはwith文を使わないときと同じようにTForm1のTagだと解釈します。
>>485 (最後の行)
>コンパイラはwith文を使わないときと同じようにTForm1のTagだと解釈します。
コンパイラはwith文を使わないときと同じようにTForm1のCaptionだと解釈します。
with を使うときは、何がどれに属しているかちゃんと知っていないとあぶない。
Delphi7で思考が止まってるけど、withって、コード補完が効かなくない? なので、withは使わない様にしてる。 設定が足りないだけ?
そもそもDelphiのヘルプにObject PascalのBNFの記述がないのがおかしいんだけどな。 CodeGear腐ってる。
Synchronizeって引数付き関数呼べないよね? 引数付きの関数を呼ぶ場合どうすれば・・・
あ、メインスレッドでクリティカルセクション作っておいて、対象関数をEnterとLeaveで挟めば同じことかな?
>>491 気をつけないといけないのは、
メインスレッド側でも、サブスレッドで触る変数とかはクリティカルセクションで
ロック(?)しとかないといけない。
読み込むだけ、ならなくてもよい場合(1つの変数の値をよむだけとか)もある。
書き込むものは、しっかりとロックしとかないといけない
こういうのやるときはいきなり本番環境でやらずに、
簡単なスレッドのテストプログラムを作ってテストしてみるのがよいよ。
ポイントは(テスト駆動開発じゃないけど)必ず失敗するように組んでから、
成功するように組むとテストしやすい。
なるほど。 ってか変数読むだけならクリティカルセクション要らないんですか? 読んでる最中に書き換えが起こると可能性があるとしても?(書き換え側は保護してるとして)
サブスレッド側で値を書き込み Synchronize中でメインスレッドから読みだすなら問題なし。 VCLが絡まないならCriticalSectionでももちろんいい。 >ってか変数読むだけならクリティカルセクション要らないんですか? >読んでる最中に書き換えが起こると可能性があるとしても?(書き換え側は保護してるとして) 実際に遭遇したことはないけどマルチコア環境ではおかしくなるらしい。
もう一つ質問すみません クリティカルセクションはSyncronizeみたいにメインスレッドで実行するわけじゃないので、共用変数ごとに複数作っても問題ないですよね もちろん保護内では共用変数は一つしか使わないという条件でです
>>496 もちろん可能だけど、(上で出た with のように)ちゃんと設計しないと
恐い恐いデッドロックに遭遇するので要注意です。
>>489 昔、breakやcontinueが「手続き」扱いで、びっくりしたことがある。
>490 Synchronizeは子スレッドで使用するので子スレッド内のPrivate変数を利用すればok、また参照だけならSynchronize は必要ないですSynchronizeはあくまでメインスレッドの変数更新時の衝突回避なので
>>499 かなり昔のことで忘れたが、Synchronize で引数付き関数が呼べると「便利だなあ〜」などと思ったことがある。
コンパイラが頑張ってくれればできそうなものだと思うけど、間違ってる?
スレッドはTThreadをラップしてコンポーネント化してしまうと便利。 OnExecuteイベントハンドラにスレッドのコード書いて FormのPrivateフィールドの変数を好き勝手に読み書きできて そこからSynchronizeメソッドを呼ぶとOnSynchronizeイベントが呼び出されるようにして UseThreadプロパティをFalseにするとサブスレッドを使わずメインスレッドからOnExecuteが実行されるように 小細工してロジックのバグを事前に潰しておくとデバッグがかなり楽になる。
なるほどね、コンポーネントにするところまでは考えなかった。 Threadを使うのに便利そうなUnitは作ったことあるけど、なんせ、マルチスレッド にするプログラムはそう滅多になかったんで、(そのUnitは)どっかでカビが生え たまま消滅してるはず。(ずーっと見てもいない)(^_^; そういえばこの2年間シングルスレッドぱっかだなオレ。
>>486 その通りでございます orz
ありがとう!
504 :
458 :2008/12/18(木) 23:44:56
>>485 ありがとうございました
単なる私の不注意だったようですねお恥ずかしい
>>488 with内の[ItemIndex]は昔から効きませんね
>>501 コンポ化は便利そうだけど、イベントとして書くと貼り付けたFormのpas内に
コード書くことになるから、なんとなく抵抗があるな
スレッドは別処理するためにスレッドにすることが多いし、それだけで
ひとつのpasにまとめたい気分
>>501 それはいいかもね。
ちょっとした、TTimerのマルチスレッド版みたいな感覚かな。
MMTimerってのもあったけど、まあ、あれにはSynchronizeがなかったからな
TRegExprでExpressionに指定した正規表現が正しいか確認する方法はあるでしょうか? Compileの例外を監視するとかですかね?
Del7でTMyForm作ってpublishedなプロパティ、イベントハンドラを追加して それをフォームデザイナに反映させる方法ってない?
>>509 フォームデザイナに反映させる時は、どうしてもIDEに組み込む必要があって
コンポーネントとかの形にしないといけないみたい
動的にはできないんだよな・・・
>>510-511 パッケージ化すればできちゃうの?
普通にコンポーネントとして登録すると
新規作成ででてくるのかな。
>509 ない。 あきらめろ(冷たいようだけど)。
TRegExprでテキストファイルの空行を削除するには、どうすればよいでしょうか? ^$とかではマッチしないし、(\r\n){2,}を\r\nに置き換えようとすると、そのまま\r\nが 表示されます・・・
516 :
514 :2008/12/23(火) 01:34:30
>>515 即レスありがとうございます。
それでもマッチしません。
置換の方は、#13#10としてもダメです・・・
518 :
514 :2008/12/23(火) 06:19:49
(?m)^\r\nでマッチするようになりました。 お騒がせしました。
519 :
514 :2008/12/23(火) 07:16:29
続けてすみません。 置換後の文字列に改行を含むようにするにはどうすればよいか 分かりますでしょうか? #13#10とすると、#13#10がそのまま表示されます。
'hogehoge'#13#10'fugafuga'
'hogehoge'+sLineBreak+'fugafuga'
sLineBreakって何で存在するの? #13#10の方が短くていいじゃん
・数字の羅列よりも意味がわかりやすい ・将来、改行コードが変更されても対応しやすい そんなところかと。
524 :
514 :2008/12/23(火) 10:37:55
>>523 追加:
・マジックナンバーつかうような奴とは仕事したくない、という奴と仕事ができる
じゃあ使わなくても何の問題もないな
HTMLパーサのコンポーネントでオススメのものありますか?
delphiに標準でついているコンポーネントのコンポーネントパレットに出ているアイコンの 画像を取りたいのですが、これらの画像はどこかのフォルダにあるんでしょうか? delphi4です。
530 :
デフォルトの名無しさん :2008/12/26(金) 19:15:08
Print Screenキーでどうでしょ
そんなフォルダはないです? www
ない
ずっとFlashな仕事してましたが、またDelphiします。来年もよろしくです!
534 :
デフォルトの名無しさん :2008/12/28(日) 14:38:17
すいません、年の瀬に質問します。 memoの最大表示文字数を設定しようと思います。 ネットで調べて、以下の方法でできるらしいというところまできました。 Memo1.Perform(EM_SETLIMITTEXT, 32*1024, 0); ここで実行しようとするとエラーが発生いたしました。 EM_SETLIMITTEXTが認識できないらしいです。 なにかしらインクルード(Cの表現でごめんなさい)する必要があると 思うのですが、どうすればいいのかわかりません。 useの場所に何を追加すればいいのでしょうか?
Messagesかな
ソースを grep すると、なにを uses するべきかわかるよ。そのほかにも grep で得られる情報は多い。
grepっつうかファイル検索だな。
538 :
534 :2008/12/29(月) 09:55:58
ありがとうございました。 解決しました!
539 :
デフォルトの名無しさん :2008/12/29(月) 11:39:58
「WOLF RPGエディター」とは?
・高度なRPG開発が可能な、完全無料のゲーム作成ツールです。
・製作者はなんと「モノリスフィア」やツクール2000でシルフェイド幻想譚などを製作した
SmokingWOLF氏だよ。
・雰囲気はRPGツクール2000に近い。RPGツクール2000で自作システムを作りこむ際に
不満だったところがいろいろ解消されていて、かなり自由度が高いです。ただし
その分初心者には難しいかも。すでにツクール2000で自作システムを組むのに
慣れた人やRPGツクールでは物足りないけどプログラミングはちょっとという方にお勧め。
・作成したゲームは自由に配布したり、コンテストに投稿することも可能。
また本ソフトを持たない人でもプレイ可能!ファイル暗号化も完備してるよ!
・要望、不満点、バグ報告などなど書き込みお願いします。今もどんどん進化中です。
・それとマップやキャラなどのドット素材もじゃんじゃん募集中ですので
一度サイトにお越しくださいませ。
・このツールで作ったゲームをサイトで紹介してるから、ダウンロードしてどういう
ゲームが作れるのか見てみてね。
2ちゃん本スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1229261856/l100
英語版Delphiでも日本語(SJIS)表記したいのですが、 文字列リテラルで16進数で書く場合ってどう書いたらいいんでしょうか? 10進数だと #13#10 みたいにかけばいいみたいですが・・・
ああ、#の後に$でいいのか #$13#$10 みたいに書いたらいけました ありがとうございました。
ついでに質問なのですが、WideStringでの10進数16進数での文字列リテラルは どうかけばよいのでしょうか?
>>542 const Str: WideString = #$30ED#$30B0;
でいけました。
#$30#$EDじゃなくて、 #$30ED にしないといけないのですね。
ハマりました。
実は最終的にこれがやりたかったのですが、
英語版などのDelphiで、
WideStringからSJIS(string)への変換は可能なのでしょうか?
日本語版DelphiだとWideStringからstringへ代入するだけで
暗黙に変換してくれると思うのですが、英語版だと変換されないのですよね?
英語版が手元にないので憶測なのですが、
自前の変換ルーチンを用意するしかないのでしょうか?
ひとり漫才みたいだなぁ
ちゃんと解決策まで書いてくれれてありがたい
聞く前に落ち着いて考えようって事だな
548 :
デフォルトの名無しさん :2008/12/31(水) 19:05:08
少数を分数表示にしたいのですが、どうやったらいいのでしょうか?
549 :
デフォルトの名無しさん :2008/12/31(水) 20:37:38
ターボ デルファイをダウンロードしたけど シリアルナンバーがなかった・。・・
550 :
デフォルトの名無しさん :2008/12/31(水) 20:50:46
すみません、ありました 残り35711日 がんばらねば
>>529 Delphi4 で開発している人がいるんだ…。
オッチャスレ行ったら、お布施払わないから
Del使いなのにアンチ扱いされるかもww
漏れの古いマシンにも Delphi4 入ってたんで、ちょっと調べてみた。
$(DELPHI)\Bin ディレクトリの dclstd40.bpl というファイルに、ビット
マップリソースとして入ってるみたい。
その他の bpl は、コンポーネントパレットを右クリックして「プロパティ」
で出てくるウィンドウの「ページ」を選ぶと、対応するパッケージ名が
表示されるっぽい。
LoadLibrary で dclstd40.bpl のハンドルをゲットして(終わったら
FreeLibrary も忘れずに)、TBitmap.LoadFromResourceName で
ロードすると、ビットマップが取れた。
ただ、 MAKEINTRESOURCE を使って番号で指定したら、取れなかった。
だから、ビットマップをロードするためには、そのテキスト名が必要らしい。
DOS窓で
tdump dclstd40.bpl
とやって、「TACTIONLIST」とか「TANIMATE」とか書いてあるのがリソースの
テキスト名。これは ResourceHacker を使っても取れた。
ResourceHacker を使うと、ビットマップも読み出してファイルに保存できる
けど、著作権の問題があるだろうから、あまりお勧めできない。
>>494 > 実際に遭遇したことはないけどマルチコア環境ではおかしくなるらしい。
全ての書き込みをロックしてるはずなのに「おかしくなる」って…。
それじゃ、CriticalSection の意味がないんじゃないの。
Delphiプログラマの月給
ネタじゃなく
>>553 にx100するとそんなもんだわorz
地方のしがないソフトハウスの数少ないDelphi案件担当。
Delphiの将来
>>548 まず整数部分を分離して、小数部分だけにする。
次に、その小数が有限小数なのか、循環小数なのか、無限小数なのかをチェックする必要がある。
実際には数値誤差があるせいで最後あたりの桁がちゃんと循環してない場合もあるので、
最後あたりの桁は循環チェックから外した方がいいかもしれない。
あと、倍精度小数で表現できる桁数は32ビット整数よりも多いので、
分母も分子も倍精度小数(でも保存する値は整数)で表現した方がいい。
また、コンピュータは内部的には2進数で扱っているので、2進数で全てをチェックする必要がある。
以下、全ての数は2進数で表記する。
・ 有限小数の場合
例えば 0.00101 とすると、これは 101/100000 だというのはすぐ分かると思う。
・ 循環小数
例えばこんな感じで循環していたとすると、
x = 0.111010010 111010010 111010010 111010010 ......
1000000000 倍すれば
1000000000 x = 111010010.111010010 111010010 111010010 111010010 ......
となって、差をとると
111111111 x = 111010010
となって、つまりは
x = 0.111010010 111010010 111010010 111010010 ...... = 111010010 / 111111111
となる。
簡単に言えば、循環している部分を分子に、
循環している部分と同じ桁数の 1111...1 を分母にすればいいだけ。
1111...1 は 10000...0 - 1 なので作るのは簡単なはず。
・ 無限小数の場合
実際にはビット数が決まってる以上どの小数も有限なんだけど、
最初から最後まで桁が埋まっていて、循環性も認められない場合は、無限小数と考えたので良い。
これは分数にはできないとしてもいいし、
一応ビット数が決まっている以上有限なのだから有限小数なのだとして、有限小数と同じ扱いにしてもいい。
559 :
デフォルトの名無しさん :2009/01/05(月) 09:53:53
Delphi5でグリッドにDBから料金を表示させた場合に 表示した料金に三桁ごとのコンマを付けたいんですが、どうしたらいいですかね? (すみません;ホントに初歩から分かりません;;)
>>559 FormatFloatかFormatCurrでどうかな?
>>559 D6で申し訳ない
Gridは文字列なので文字列にしないとだめですね
TstringGridにはMaskEditがあるので、これでも調整できそうだけど、とりあえず表示だけであれば、Gridに追加するときに
StringGrid1.Cols[2].Add(Format('%10m',[001230.00]));
StringGrid1.Cols[2].Add(Format('%10n',[001230.00]));
んな感じでどうぞ
%mとかの形式文字列については,形式文字列を参照してくださいということです
(Format 関数のヘルプより)
564 :
デフォルトの名無しさん :2009/01/05(月) 14:37:21
Delphi6 Personal使ってます。 ComboBoxでドロップダウンしたとき、同じ文字列が複数はいってると ただしく選択が行われません。 procedure TPlayerForm.Form1Create(Sender: TObject); begin ComboBox1.Items.Add('Test0'); ComboBox1.Items.Add('Test1'); ComboBox1.Items.Add('Test2'); ComboBox1.Items.Add('Test3'); ComboBox1.Items.Add('Test0'); ComboBox1.ItemIndex := 4; end; 上のコードを実行してComboBoxをドロップダウンすると下記のような結果になります。 Test0 ←コレが選択される Test1 Test2 Test3 Test0 ←4番目を選択したい 正しく動作するようにするにはどうすればいいでしょうか?
意味がよくわからんがitemindex=4になる
566 :
564 :2009/01/05(月) 15:31:50
コンボボックスの矢印ボタンを押してドロップダウンリストを表示すると itemindexの項目が青く選択されると思うんですが それが正しく選択されないんです。
CombBoxのStyleをcsDropDownList にしてみるとかしてみそ それで幸せになれるかもしれん
568 :
564 :2009/01/05(月) 16:22:52
文字入力がしたいのでstyleの変更はできません。 選択したい項目に改行コード入れることこで誤魔化しておきました。
>>559 グリッドがDBグリッドなら、DBグリッドダグルクリックして、列名設定するウインドウを表示させる。
列を追加、選択し、Formatだかのプロパティで、「,0」とかすれば多分おk
もしくは、データセットの列でも同様にできた希ガス。
うろ覚えですまん
570 :
デフォルトの名無しさん :2009/01/06(火) 11:09:59
誰か以下のプログラムを作ってくれない? ・何個かのデータをもらい、入力と逆の順に表示する(最後に入力されたデータが最初に表示される)プログラム 初心者には難しすぎる
>>570 初心者じゃなくてもそれだけの情報では難しすぎる
エスパーさんしかできませんね
572 :
デフォルトの名無しさん :2009/01/06(火) 11:31:08
>>570 #include <stdio.h>
int main(void) {
int i, n, a[1024];
printf("データの個数: ");
scanf("%d", &n);
if (n > 1024) {
printf("データが多すぎます。\n");
return 1;
}
for(i = 0; i < n; i++)
{
printf("%d番目のデータ: ", i + 1);
scanf("%d", &a[i]);
}
printf("逆順で表示:\n");
for(i = n - 1; i >= 0; i--) printf("%d\n", a[i]);
return 0;
}
573 :
デフォルトの名無しさん :2009/01/06(火) 12:51:24
パスカルとは思えない命令ですね
>>570 for文でdownto使うだけじゃね?
TStackを実用したことのある奴の数↓
576 :
デフォルトの名無しさん :2009/01/06(火) 15:07:15
turbo visionすら使いこなせなかったな
577 :
デフォルトの名無しさん :2009/01/06(火) 22:14:38
qdirもどきを作ってみたいんだけど ウィンドウのタイトルバー部分をホイールクリックしたかどうかの判定ってどうやればいいんですか?
delphiに付属するWinSightってツールで、ホイールクリックした時に送られるメッセージを確認する。 で、プログラムでそのメッセージをフックし、座標がタイトルバーだったら何か処理をすればいいんじゃね? ざっと調べた感じ、メッセージはWM_MBUTTONDOWN / WM_MBUTTONUPっぽい気がする。
579 :
デフォルトの名無しさん :2009/01/07(水) 01:19:26
すんません。ちと教えてください。 Delphiで C言語のsprintfみたいな関数って無いですか? Writeのメモリ出力 or String出力でもいいんですが。 複数の整数・実数・文字列をカンマで区切った文字列を 作りたいんです。 いちいちキャストしては文字列に追加していくしかないんですかね?
>>579 TStringListに突っ込んで、CommaTextで取得
582 :
デフォルトの名無しさん :2009/01/07(水) 01:52:36
>> 580 ありがとう!!
583 :
デフォルトの名無しさん :2009/01/07(水) 01:56:28
>> 581 そういう手段もあるんですね。 今回は1クラスにつき一文字列しか作らないので Formatを使おうと思いますが、次のステップで使えそうなので 参考にさせてもらいます。 ありがとう!!
584 :
デフォルトの名無しさん :2009/01/07(水) 01:58:58
訂正:1クラス→1インスタンス
THogeHoge = object public A: integer; procedure Untara; end; という昔のスタイルのオブジェクトは初期化する必要がないので気に入って使っています。 しかし、これを次の例のような手続きKantaraの局所変数にするとTHogeHogeのインスタンスAは 自動的に初期化されないので、初期化したいときは明示的に初期化する必要があります。 procedure Kantara; var h :THogeHoge; begin h.A := 0; //明示的に初期化 h.Untara; … end; このように明示的に初期化しなくても自動的に初期化する方法ってあるのでしょうか? (あれば、たーーーーいそう便利だと思うんですが)
YTさんとか、ふさねこのところでそんなような話題があったな・・・ あれは、recordのdestroyを自動で呼ぶ話だっけ課?
Delphi6 Personalを使用しています。 Splitterをフォームに貼り付けた際の初期のサイズを変更したいのですがどのようにすればいいでしょうか?
Splitter自身の太さってことならコンポーネントテンプレートに登録。 TSplitterExなんてのを作ってコンストラクタで変えてもいいし。
DelphiにCでいうgetcharのようなものはありますか?
>>588 遅くなってすみません
レスありがとうございます
難しそうなのでしばらくはこのまま行こうと思います
ありがとうございました
591 :
デフォルトの名無しさん :2009/01/13(火) 10:00:08
すいません、質問してよろしいですか? プログラムを実行するとフォームが縮小されて表示してしまいます。 何か原因があるのでしょうか?
あるんじゃないかな?
>>591 フォームのWindowStateプロパティーがwsMinimizedになってるとか
594 :
591 :2009/01/13(火) 10:08:05
591です。 詳しくはフォームに配置したコンポーネントが小さくなってしまうという現象が発生してしまう です。
>>594 最初の質問と全然違うじゃん
もっと頭の中整理してから質問投稿してください
596 :
591 :2009/01/13(火) 10:26:41
度々申し訳ありません。 windowsstateはノーマルになっています。
Resizeイベントで縮小してるとか、Anchorsを[akTop, akLeft]以外に設定してるとか、 AlignをalNone以外に設定してるとか
598 :
591 :2009/01/13(火) 10:50:08
度々失礼します。 フォームのResizeイベントは存在しません。 Anchorsは[akTop, akLeft]です。 AlignもalNoneのままです。 あとAutoSizeをtrueに変更していますが、関係ないと思います。 ついでにdelphiのバージョンは4です。 失礼しました。
>>598 なぜAutosizeが関係ないんだ?
ためしてみたのか?
600 :
591 :2009/01/13(火) 13:05:37
autosizeをtrueにして実行、falseにして実行、ともにコンポーネントの縮小を確認しました。 なので関係ないと判断いたしました。 よろしくお願いします。
情報がなさすぎてよく分からないよ。 何のコンポーネントかすら分からないしw 一般的にはそんな現象はないとしか言えない。 コードの奥深く出何かを弄っているのかもしれないし バックアップとって大胆にイベントハンドラ全削除したりとかして探っていくしかない。
具体的にコンポーネントって何を置いたの? どこにおいたの?
こっちも面倒だしフォーム作り直せよ
604 :
591 :2009/01/13(火) 15:08:58
scaledをfalseにしたら直りました。 お騒がせしました。
Delphi2009です。 TMemoryStreamにUnicodeで文字列変数の中身をwriteしたいんですが、どうしたらいいんでしょう?
>>605 動作未確認ですが、これでどうでしょう。
Buffer := TEncoding.Unicode.GetBytes(Text);
Stream.WriteBuffer(Buffer[0], Length(Buffer));
GetBytesなんてメソッドがあったんですね、ありがとうございます。 早速試してみます。
608 :
デフォルトの名無しさん :2009/01/15(木) 03:27:47
よろしくお願いします。 ワードの「フォント選択用コンボボックス」のようなものを表示したくて、 ツールバー(TToolBar)上に、コンボボックスを乗せたいのですが、 方法が分かりません。 (右クリックでは「ボタン」と「セパレータ」の新規作成しか表示されません) どうすればいいでしょうか?
何の方法が分からないの? まず日本語を勉強してね
611 :
デフォルトの名無しさん :2009/01/15(木) 16:14:03
Delphi5で メールアドレス取得に失敗したときのログを出そうと WriteLogFile(C_ERROR, 'GetMail' , 'Errorだよ。'); って入力すると'実パラメータが多すぎます'ってメッセージがでる。 なんで??? 因みに↓ C_ERROR = 'E';
>>611 WriteLogFileのパラメータはどうなってんの?
614 :
611 :2009/01/15(木) 16:38:47
>>612 Delphi7で使用されていた同じ内容処理もってきたんですが
Delphi5では単純に使えないってことですかね;
>>613 ・・・・;
すみません
パラメータは解らないっす;;
Delphi7だとソースのWriteLogFileって書かれてる所を右クリックして定義の検索 を選ぶと手続きが定義されてる所に飛べるんだけどね。
617 :
611 :2009/01/15(木) 17:09:16
>>615 できました!!!!
ありがとうございます!!
折角IDEで関数の宣言が分かるんだからその機能使わないともったいない 関数呼出の括弧の中でCtrl+Spaceな
おうふ Ctrl+Spaceは補完だったぜい Ctrl+Shift+Spaceだったぜ
>>619 知らなかった!質問者じゃないけど勉強になったよ。ありがとう。
621 :
デフォルトの名無しさん :2009/01/15(木) 20:05:41
Delphi6EnterPriseで、OutLookExpress6のメッセージ作成画面の編集タブにあるコンポーネントを使いたいのですが、 どうしたらいいのかわかりません。 Winsightで調べてみると以下の情報が確認できました。 Class name: Internet Explorer_Server Executable module: 43B60000 mshtml.dll どなたかご教示願います。
>>621 OE6とか久しく見てないからどんなんか分からんが
ウィンドウいじる系は
FindWindowでメインフォーム検索
→FindWindowExで子コンポーネントのハンドルげと
→SendMessageで操作
ってのが一般的な流れ
FindWindowExでは子しか検索できない(孫見えない)ので
Visual Studio付属のSpy++か
HalbowさんのWindowTreeで内部構造把握しとくのおぬぬめ
623 :
621 :2009/01/15(木) 20:39:14
>>622 すみません、説明不足でした。
ウィンドウをいじるのではなく、OE6で使用されているコンポーネントを、
自分のソフトに張り付けて使用したいのです。
>>608 オブジェクトツリーでコンボボックスをツールバーにドラッグドロップ
何年か前にDelphiでHTMLエディタコンポーネントを使うみたいな日本語サイトを目撃したな。 ActiveXとりこんで。詳細は忘れた。
「OE6で使用されているコンポーネント」なんてものはないんじゃないかなぁ。ありゃ普通にMFCだろ。
>>623 目的がいまいち飲み込めないが編集可能なHTMLビューワが欲しいってことかい?
TWebBrowser.Document.DesignModeかえりゃいいんでねえかい
OE6起動してみたけど、ありゃ、ただのRichEditコントロールじゃねぇか?
629 :
621 :2009/01/16(金) 01:33:16
>>625-626 色々な情報を拝聴させて頂き誠にありがとうございます。
>>627 編集可能なHTMLビュワー用コンポーネントが欲しかったので、
一番身近な所で見つけたOE6で使用されているコンポーネントの使い方を
伺った次第ですが、TTWebBrowserのDocument.DesignModeを切り替えることで
OE6で使用されているコンポーネントの動きと全く同じ事をするようになりました。
とても参考になる意見を仰って頂き誠にありがとうございます。
>>628 RichEditではボタンの類やJavaScript等は書き込めませんでしたので違う物のようです。
631 :
デフォルトの名無しさん :2009/01/16(金) 13:05:10
久々にプログラムをしてみた program aaa begin write('a'); end. 今は前置きが長くて こんな感じでプログラム出来ないのだね・・・・
program Project2; {$APPTYPE CONSOLE} begin writeln('a'); end. これで動いた。Delphi2007。
今は、aaa の後に「;」が要るからな・・・・
Writeln('A`);
10年前くらいからそんな感じだったと思うけど、いつの時代からこられましたか?
Delphi出たのも95年だしな。
>>616 TurboDelphiだけど、Ctrl押しながら関数をクリックでも関数定義先に飛べる。
既に知ってたらすみません。
638 :
デフォルトの名無しさん :2009/01/16(金) 14:03:45
参照渡し?について質問です。 例えば、任意のTMemoインスタンスに文字を追加する手続きを作る場合、 procedure addString( aMemo: TMemo ); begin aMemo.add( 'hoge ' ); end; などと書くと思いますが、上記のように 「コンポーネント」を引数にした手続きを作る場合は、 varを付ける(つまり参照渡しにする)必要はないのでしょうか?
必要ない ってかvarにするとTMemoから派生したコンポが渡せなくなる
640 :
638 :2009/01/16(金) 14:32:48
>>639 ありがとうございます。
varを付けなくても参照渡しになっている、ということでしょうか?
あと、同じような疑問なのですが、「TStringList」が引数の場合。
これも、例えば
procedure funcHoge( sl: TStringList );// varを付けない
begin
sl.add( 'hoge' );
end;
のように、varを付けていないソースを見かけたことがあるのですが、
コンポーネントの時と同じく「varを付けなくても参照渡しになっている」のでしょうか?
よろしくお願いします。
641 :
デフォルトの名無しさん :2009/01/16(金) 15:00:29
最後にプログラムをしたのは、いつでしょう ターボパスカル6.0位だったと思います
>>640 classは最初からポインタなのですべてくclassにvarはつけなくておk
Integerにキャスト出来るでしょ
ちなみにその例ではTStringListではなくTStringsにした方がいいと思う
Integerにキャストできるからって、意味が分からないのだが あとあのソース見ただけでTStringsにしろってのも意味不明 TStringList以外のTStrings派生を受け付けたくない場合だってあるだろ
>>640 Delphiの型はInteger, Char, Realといった変数そのものが値を保持するものと
Class, String, 動的配列のように変数にはオブジェクトインスタンスへの参照(≒ポインタ)を保持するものの二つに大別され
前者を引数に渡して値を弄らせたい場合にvarを付ける。
後者には絶対付けないかと言えばそうでもなく
procedure cre(var a: TMyObject);
begin
a := TMyObject.Create;
end;
procedure fre(var a: TMyObject);
begin
a.Free; a := nil; // 実はバグありコード
end;
みたいに変数の持つ参照値をいじりたい場合にはつける。
TStringListかTStringsかということについては
TStringsはTStringListやMemoLines的なものの代表するような性質があるから
(TFileStream, TMemoryStreamを束ねるTStreamなんかも同様)
TStringsにしておくと受け付けられるオブジェクトの数が増す。
ただしTStringsList固有のメソッドもあるから常にTStringsにすればいいというわけでもない。
ということを頭に置いておけばどっちでもいいよ。
さしあたりTStringListが渡したいのならTStringListにしておいて
必要なら後から変えればいい。
それだとStringや動的配列にもvarつけなくていいと思われるような気がする
646 :
デフォルトの名無しさん :2009/01/17(土) 01:22:02
delphi 5 proで開発したBDE使用のアプリをインストールしたら、管理者権限でしか動作しないんだけど、 インストールは管理者で、起動はalluserってのはどうすればいいの? 一応、インスト先フォルダの実行県は付与した。
648 :
デフォルトの名無しさん :2009/01/17(土) 17:46:04
Form1とForm2のそれぞれのPanelに全く同じ様にLabelやEditを 配置しています(コントロール名も全く同じです)。Panel以外は異なるます。 で、Form1のボタンをクリックしたらForm1のPanel内の、Form2のボタンを クリックしたらForm2のPanel内のコントロールを更新していますが、今は 両方のボタンのクリックイベントで全く同じコードを書いています。 変更とかあると2箇所同じ修正をしてるのですが、何かもっと良いやり方って あるんでしょうか。
>>648 Form2のボタンにForm1.Button1.Clickて書けばいいじゃね?
あ、Form2のPanelか 上のは無かったことで。
Frameにするとか、Panel部分だけ配置済みの継承元フォームを用意するとか。
>>651 のように継承して作るのが一番いいが
Panelを引数にした手続き書くという手段も
procedure hoge(APanel:TPanel);
begin
APanel.Caption:='hogehoge';
end;
あまりオススメはしない
こんなんでどう? procedure Button1.Click(Sender:TObject); var p:TPanel; begin p:=(Sender as TButton).Parent as TPanel; //pにパネルが入ってるので適当に処理 end;
って、ユニットが違うのか。 イベントハンドラに同じ関数突っ込む処理がちょっとめんどいな。
655 :
649 :2009/01/18(日) 00:03:03
>>647 レジストリはいじってません
というか、インストールするときに管理者権限で動作させるか、一般ユーザでも動作させるかって、最近のソフトのインストーラーみたいにできないのでしょうか。
Delphi 5でBDEってWindows NT 4.0とか2000の時代のものなんだが。
>>655 BDEの設定がレジストリにあったと思うが・・・
659 :
デフォルトの名無しさん :2009/01/18(日) 10:32:57
>>656 別にドットネットに移行するつもりもないから、何ら不具合もないんだけど、何が問題なのか教えて??
Delphi 5はマルチコアでうまくないことがあった気がする BDEはVista上ではいろいろ手を掛けないと動かない(インストーラ一発というわけにはいかない) 付属のISXはVistaを考慮していない そんなところかな。要はVista上でも簡単便利というわけには行かないよ、というだけ。 それをわかっている上で使うなら何の問題もない。
661 :
デフォルトの名無しさん :2009/01/19(月) 08:31:24
648ですが、アドバイスありがとうございました。 Frameとコントロールを引数にした共通の手続きで、できるだけ共通化を したいと思います。 あとフォームの継承ってのも画面の共通化に使えそうですね。 図書館でDelphiコンポーネント設計みたいな本借りてきて見てみましたが、 結構目からウロコなことが書いてあっておもしろかったです。
Dephi2009で、IdHTTPでHTMLを取得しようとすると失敗します。
procedure TForm3.Button1Click(Sender: TObject);
var
s:string;
begin
s:=IdHTTP1.Get('
http://google.com/ ');
end;
これを実行すると
プロジェクト Project2.exe は例外クラス EIdSocketError (メッセージ 'Socket Error # 10013
Access denied.')を送出しました。
と出るのですが、何か手続きが足りないのでしょうか?
663 :
662 :2009/01/19(月) 12:33:10
ああすみません、今xp x86で試したら正常に動作しました。 Vista x64では上記エラーが出るのですが、何が原因なのでしょうか・・。
つTIdHttp.Create()
WinSockのAPIが32bitのまま呼ばれてるんじゃね? 大人しくDelphiの64bit対応待つか自分でWinSockのヘッダ書くかしないと無理なんじゃね?
改行を含む文字列を1つのItemとして、それを リストで管理したいのですが、よいクラスはありますでしょうか? TStringListだと、Itemに改行を含む文字列を突っ込むと 勝手に複数のItemに分裂しちゃうような気がするので適当 ではないような気がするのですが。 お分かりの方、是非教えてください。
Addで追加してやれば改行含んでもちゃんと1つのアイテムになるよ
TListのObjectsにTStringListを入れておけばいいんじゃないの? そうすればTStringList(TList.Objects[#]).Lines[#]みたいに各行にアクセスできるけど。
669 :
662 :2009/01/19(月) 14:14:45
>>664 それも先に試しましたが、ダメでした。
>>665 x86でコンパイルしてるのに、x64でWinSock呼び出すって変じゃないです?
WOW64で32bitコードは動くはずだし、それで動かないならWinsock使ってるアプリは大半がx64で死にますよね・・。
670 :
662 :2009/01/19(月) 14:20:47
すいません、Vista x86で試したところ、動きませんでした。 Vistaでは動かないという事みたいですね。 Administratorsでもだめみたいなんで、Vista非対応って事で泣いておきます・・。
>>668 TListにObjectsってあったっけ?
それ以前にそれって変じゃね?
TListにObjectsがあるとして、TList.Objects[#]で#行目の文字が取得できるのに、
Linesでさらにその中の文字列にアクセスしてる
それに各行に対してTStringList生成してるとメモリ馬鹿食いしそう
それだったら俺なら大人しくPChar使うかな
>>668 を俺なりに正しく修正すると、
TObjectListのItemにTStringListを格納しろ的な事でしょう。
(ListObject.Items[#] as TStringList).Text
でアクセスすればOKと言いたかったんじゃね?
まあ、効率はよくないけど、どうでも良い処理の部分だったらこれでもいいんじゃない?
>TListにObjectsがあるとして、TList.Objects[#]で#行目の文字が取得できるのに、 ちがうだろ? TList.Objects[#]で一つのTStrigListが取得できるんだろ? それに、メモリバカ食いするわけでもないだろ? >それだったら俺なら大人しくPChar使うかな まぁ、それでいいじゃね。
もう少し効率良くするなら、TStringListじゃなくて、Stringの変数1つ持ってるだけのクラス作るとイイかも。 TStringClass = Class str:string; end; みたいなの。 TStringListは、Textに代入するときにいちいち改行調べに行ったりと、無駄な処理が多い。
> >TListにObjectsがあるとして、TList.Objects[#]で#行目の文字が取得できるのに、 > > ちがうだろ? > TList.Objects[#]で一つのTStrigListが取得できるんだろ? じゃあなんてTStringListいくつも入れるの? Objects一つ一つに一行分のTStringListが入ってると俺は認識したけど > それに、メモリバカ食いするわけでもないだろ? TStringLst一つで処理するのとどれぐらい違うんだろうね
672さんの見解で正解なんじゃないでしょうか? メモリも記憶する文字列の大きさによるんじゃないですか? コードの部分は一つがメモリに展開されて、余分に喰うのは各々の文字列分だけじゃないんですか?
TStringListのインスタンスサイズは50byte前後 100万行ぐらいまでなら、昨今のメモリ搭載量を考えればそれほど大きな問題にはならない?
678 :
666 :2009/01/19(月) 16:14:59
皆様貴重なご意見ありがとうございました。
>>667 Addで追加するだけなら改行を含んでいてもOKなんですね。勉強になりました。
でもたぶん、いったんTextプロパティをつかったりすると1行づつに分解
されちゃったりして?
安心して使うには、どのメソッドとプロパティが大丈夫なのか調べる必要が
ありそうです。開発上、ちょっと気を使う必要がありますが一番簡単な方法
でしょうね。
>>668 ,671-675
皆さんのご意見を参考に考えると、string型のメンバ1つだけをもつ
独自のクラスを作り、TStringListのObjectsに、その独自クラスのインスタンスを
格納するのが単純明快そうですね。コーディングは何かと面倒にな
りますけど。
えっ?? 全部読んだ限り、TStringList.Items.Add() 使うのが一番楽そうだけど、なんでそういう結論に? Textに代入でもしなきゃ問題ないでしょ。
681 :
666 :2009/01/19(月) 16:52:34
ちょっと調べてみましたが、667の言うとおり、 Addメソッドで問題なく改行を含む文字列の追加・取り出しが できました。 さらに、=を含んだときのValuesやNamesの挙動も問題 なく、ExchangeメソッドもOKです。 Textプロパティも値の取得なら大丈夫でした。 というわけで、PHPやPerlやC#でよくある「名前つき配列」は TStringListで実現可能、ってことがわかりました。
エディターの左マージンの数値を上げると何か不利になる事ってありますか? おもいっきり300に上げたんで大丈夫か心配なんです。
>>681 言葉遣いは丁寧だけど、礼の一つも言えないってのはあまり社会性がない人ね。
そばに居たら二度と教えてやりたくないタイプ。
お礼しろとか馬鹿じゃねーの
まーたはじまるの?
いや、礼なんかしなくていいよ。
>>681 の内容が、もらったレスの反芻でしかなく、
そのレスに対してなんの敬意もないので、ウンザリしただけよ。
687 :
662 :2009/01/20(火) 09:16:14
動かない原因がわかりました。 Vistaで共有フォルダ上でexeを実行すると、IdHTTPのGetメソッドが失敗します。 ローカルにexeをコピーしたら動きました。 .Netではネットワーク上のexeの実行に色々制約があるのは知ってましたので、 イントラネット上のexeを支障なく実行できるように設定していましたが、 Delphiでexeが支障なく実行できるようにするには、どこを設定すればいいんでしょう?
>>686 >>1 も読めないお前は社会性の前に日本語を勉強した方がいいんじゃないかな
そういう慣れ合いはバカスレで頼むよ。
690 :
681 :2009/01/20(火) 12:56:44
>>683 678でお礼を述べたのですが。
その後に書いた681では、ただ教えてもらっただけでは
申し訳ないので、教えてもらった事を土台にして自分なりに
調査した結果を補足し、多少なりとも意義ある内容にした
つもりです。
(ROMの方々にもお役に立とうと思った次第)
64bit版でもPointerと同じサイズが保証されてるであろう型ってLongIntでいいの?
汎用型(IntegerとかCardinalとか)で無い限りは同じサイズだと思うよ あと、細かいけどLongIntではなくLongintだね
完全に読み間違えたwww
>>692 はスルーしてください
694 :
デフォルトの名無しさん :2009/01/20(火) 20:52:58
Delphiで構造化プロシージャの使い方がよく分からないのですが、 処理を呼びに行ったりするのはどうしたらいいですか。 すみません;漠然としすぎてて
"構造化プロシージャ"の検索結果 3 件中 1 - 3 件目 (0.54 秒)
エアロからVistaクラシックでDelphi7でつくったフォームを最小化するとゴミがのこりません?
まあ7はVistaに対応してないから仕方ないな。
698 :
694 :2009/01/21(水) 11:14:15
>>695 一応調べはしたんですが、欲しい情報が見当たらなかったんです;
単純に処理を呼びに行かせたいだけなのですが;
699 :
694 :2009/01/21(水) 11:15:05
>>695 一応調べはしたんですが、
欲しい情報を見つけられなかったんです;
単純に処理を呼びに行かせたいだけなのですが;
702 :
698 :2009/01/21(水) 12:11:31
>>700-
>>701 ワタクシの勘違いでありましたか・・;
処理的には
・DBより(条件A or 条件B or 条件C)に該当する情報を持ってきます
if (条件A)に該当
処理A
end
if (条件B)に該当
処理B
end
if (条件C)に該当
処理C
end
これの処理A・処理B・処理C の処理が長いのでプロシージャとして
別につくりたいのです
お前Delphiやったことないだろ? 「Delphi 入門」でググれ
private
procedure 処理A;←これ書いてctrl+shift+cで↓が勝手に書かれる
end;
procedure TForm1.処理A;
begin
//長い処理を自分で書く
end;
procedure TForm1.on適当(sender : TObject);
begin
if A then
処理A
end else if 〜
end;
って感じ?
>>704 メジャーとの2軸マルチで3単取った
705>> end1つ余計。
> これ書いてctrl+shift+cで↓が勝手に書かれる 横レスだけど、こんな技があったとは・・。
>>705 おいそんな便利コマンドあるならもっと早く教えてくれよ
知らなかったのか・・。 じゃあ、変数名や関数名の上でshift+ctrl+Eを押すと、簡単に名前を変えられるってのは?
じゃあ、 ・関数の宣言内でCtlr+Shift+↓で実装にジャンプ ・関数の実装内でCtlr+Shift+↑で宣言にジャンプ
おいおいこのスレにはD6ユーザはいないのかよ
>>712 CTRL押しながら関数名クリックしてたよ・・。
リファクタリングの便利さを知ったら、D6なんて不便すぎて使う気がしない。
Turboなんて重すぎて使う気がしない そこそこのスペックのPC買えたら入れたいけど
ctlt+Jのコードテンプレートの新規登録とか編集 D5ではエディタのプロパティから簡単に出来たんだが 2007でやってみたら「表示」「テンプレート」から出来るみたいだけど xmlでソース書くしかないのかな?ぢゃま臭いんだが
ドキュメントが貧弱だと大変だな・・
うろ覚えだけど、Alt+↓か↑で「宣言へ移動」。マウス使わなくていい
722 :
デフォルトの名無しさん :2009/01/23(金) 17:06:33
あの〜、 変数の内容がある状態になったら実行を一時停止させてデバッグしたいんですけど・・・ たとえば strFruit という変数が'リンゴ'になったらストップするとか。 そういうのって可能なんでしょうか?
if文の中にブレイクポイント設定して実行しろや
Delphi7で作ったアプリをWindows7で動かしてみたが無問題だな。 Delphi7であと5年は戦えそうだ。
Delphi素敵だね。 初めての言語、C++やろうと思ってたけど、こっちにしようかな。
Delphi2009のDataSnapについてお聞きします。 DataSnapのサーバ側モジュールって、exe形式のプログラム なんですか? それともApacheの拡張DLLとかになっているのでしょうか? 前者の場合なら同一マシン上でWebサーバを動作させることは できませんよね?(TCP/IP Portがぶつかるため)
>>726 趣味なら良いと思うよ。
そうじゃなかったら手はださん方がいい。
まぁ、そうだな。既存ユーザならともかく、これから参入は基地外沙汰だ。
730 :
726 :2009/01/23(金) 21:42:21
やっぱ先がないの? そんなに切羽詰まった言語なのか……
終わる終わると言われながらも中々終わらない言語です
>722 ブレークポイントを右クリック→条件 すごく遅くなるけどな。
今のDelphiが遅いPCって、どんだけ貧弱なんだ・・。
同情するなら
誤爆ったwwwwwww
> すごく遅くなるけどな。 条件設定しない状態と比較して、すごく遅くなるけどな。
IDEのライブラリパスの一覧みたいに、TListBoxのアイテムを灰色にする時ってやっぱりオナニードローですか?
うん。というかOnDrawItem。
ですよねー ありがとうございます
ド素人すぎる質問ですが、、 if edit1.text=('123') then showmessage ('OK') else showmessage ('NG'); end; このようなプログラムを使って('123')にあたるワードを別ファイル(txt等)から 読み込んで参照して判定させたいのですが、どのようにすればいいでしょうか。
TStringList.LoadFromFile TFileStream.ReadBuffer CreateFile AssignFile 上げるだけでキリがねーな
>>742 ありがとうございます!
AssignFileを使ってtxtのパスを書けば出来ました。マジ感謝
744 :
デフォルトの名無しさん :2009/01/25(日) 12:52:05
VBとDelphiはどっちが優れてますか? Delphiで最近導入されたジェネリクスは、VBでは2005の頃からあったそうですが。
このスレ的に言えばDelphiの方が優れてます
起動時にTEditとTUpDownをいくつかセットで動的生成しています その時Associateプロパティで関連づけてもセットされません 起動してから一つずつセットすれば反映されるのですがこれは セットしするたびに描画されないといけないということでしょうか? 以上、よろしくお願いいたします
>>744 VBとVB.netを同系列に語るなよ
VB6 vs Delphiなら Delphi > VB
だが、今の時代は
VB.net vs Delphiなら VB.net > Delphi
だろうよ。
ただし、VB.net使うくらいなら、C#を勧めるが
ああ、Delphi Prism入れていいなら、 言語仕様的には、Delphi Prism > VB.net > VB だな
馬鹿スレでやれ
フロントエンドアプリをDelphiで書き、バックエンドはApache+Perlを想定しています。 フロントエンドとバックエンドの通信はHTTPです。 このような形態のシステムで、TDataSet(TQuery)に相当する部分を 置き換えられるものが欲しいです。 要求されたDataSetをHTTP通信で取得してくれるようなコンポはない でしょうか? よろしくお願いします。
751 :
デフォルトの名無しさん :2009/01/25(日) 14:52:21
ラムダ式もないDelphiは時代遅れ
最先端である必要もない
VB 現役時代以降(浪人時代も含む)の長島茂雄
VB.net 現役時代の長島茂雄
Delphi 野村克也の全経歴(笑)
よって
>>747 がだいたい成り立つ(w。
まあ.net以前のVBとDelphiならDelphiが圧倒していたと思う。
しかしサッチー問題含む野村の全経歴は長島の現役時代を圧倒はしていない。
ドラゴンボールZのZ戦士で例えるとどうなる?
長島って倒れちゃったよね
VBがクリリンで delphiが天津飯
VB.net = 最長老に潜在能力を引き出されたクリリン
ここはガキまみれ?
Editboxに入力された数値を12.12という小数で割り, StringGrid1に記入したいのですが StringGrid1.Cells[1,1] := StrToFloat(Edit1.Text) / 12.12 ; ではうまくいきません。 正しく動作させるにはどうすればいいでしょうか?
XP+Del7Pro ClientDataSetのフィルターでinか*を使って部分文字列の検索をかけたいんだけどうまくいかん Filter := '住所 in' + '('+QuotedStr(Edit1.text)+')';//inが=の扱いになって結果が表示される。 Filter := '住所 =' + QuotedStr(Edit1.text)+'*'';//error式が必要な場所に何もありません。 Filter := '住所 =' + QuotedStr(Edit1.text)+QuotedStr('*');//検索結果が常に0。 Filter := '住所 =' + QuotedStr('*')+QuotedStr(Edit1.text);//破れかぶれでやってみたが上に同じ。 ではうまくいきません。 正しく動作させるにはどうすればいいでしょうか? フィルターオプションはワイルドカードを許可してます。
FloatToStr(StrToFloat())
>760 Filter := '住所 =' + QuotedStr(Edit1.text + '*'); じゃねーの?
>>760 FilterをShowMessageとかで表示させてみようとは思わなかったの?
それでたぶんすぐ分かったと思うけど
自分の目で確かめる癖付けた方がいいと思うよ
764 :
デフォルトの名無しさん :2009/01/26(月) 04:09:13
Delphiにインラインアセンブラはいらない。 オブジェクトシステムとガベージコレクションがあればそれでいい。 もっといえばDelphiはいらない。 Linuxで動くObject Pascalコンパイラがあればそれでいい。 あとはGlade3でベタポトするから。
765 :
デフォルトの名無しさん :2009/01/26(月) 07:23:24
Delphi初心者の皆さん、Delphiにはもう先がありませんからVBを使いましょう^^
>>764 あればいいって fpc(Free Pascal Compiler) があるじゃん。
教えてください。 delphiでC++のように 同じ関数名で別の引数というのは可能でしょうか。 procedure Func1(s: string); procedure Func1(v: Integer); とすると、overloadが指定されていないとエラーになりました。 overload をとりあえず付けてみたのですが、同様にエラーです。
すいません。事故解決しますた。 procedure Func1(s: string);overload; procedure Func1(v: Integer);overload; とすればうまくいきました。
>>760 それサンプルソースに乗ってるヤツで前方一致しか抽出しないんですわ。
Edit1.Text := '伏見';で京都府伏見が引っ掛からない。
今でも新規案件をためらいなくDelphiで始める俺。
大学の研究をDelphiでやってる俺 跡継ぐ人がどうなるかは知らない
超初心者です。教えてください。 ゲームのタイトル画面→新規ゲームスタート のように、フォームからフォームへ移動するような場合はどうすればいいですか? 両方は一応できていて、ボタンからどう繋げばいいのかわからないのですがw
772のものです。 改めて見ると釣りっぽいかもですが、 普通に困ってるのでお願いします。 教えてください。
procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; end; ってことか?
>>771 オレも大学の卒業研究をDelphiでやったよw
>>777 ありがとうございます。
解決しました。
delphi 2006なんですけどnumericupdownってないんですか?
781 :
780 :2009/01/27(火) 00:00:23
自己解決したぴょん
研究に使うソフトをDelphiで作ってるが、 後任がどうするか(ry
手慣れていればC#に移行する。
>>777 それだと別の画面(フォーム)が表れるんですけど、
同じ画面で移行させるにはどうすればいいですか?
別のフォームとして作ったのに? Form2にPanel乗せてParentをForm1に変えればそれっぽいことが出来るかも
>>785 始めたばっかなのでわかんなくて・・。
タイトルから全く別の画面に移動するときはどうすればいいのですか?
一回全部消して再構成するのですか?
やりかたを教えてくれたらうれしいです。
ゲームの作り方みたいな本でも買えば?
できればやり方だけでも教えてほしいです。 本屋になかったので。
「delphi、ゲーム」でクグるとか…
「ゲーム シーン切り替え」でググるとか…
「ゲ制作技術」板にいくとか…
|フォームからフォームへ移動するような場合はどうすればいいですか? |両方は一応できていて、ボタンからどう繋げばいいのか |それだと別の画面(フォーム)が表れるんですけど、 |同じ画面で移行させるにはどうすればいいですか? この矛盾を解決しないと答えられない まず、自分が用意したものを〜 実際に「一応できてい」るユニット名とフォーム名 例)unit1.pas(Form1、タイトル画面)とunit2.pas(Form2 新規ゲーム) のように明示して、〜 例1)Form1に載せたボタンクリックでForm2を表示したい その際Form1は見えなくなる(アクセス出来なくなる) 例2)Form1に載せたボタンクリックで「Form2内容をForm1の上に表示したい」 例3)オイラの頭にログインして、ソースを全て書いて欲しい
793 :
792 :2009/01/27(火) 20:14:28
私のヘルプミーなんですがw 今、書き込んだ瞬間に中指が暴走してしまい 一瞬のうちに右クリ→あぼ〜ん となり792が見えなくなってしまいました どうしたら復活するのでしょう ブラウザはJaneStyleです
>>786 そういうのは最初からForm1だけでやったほうがいいよ。
Panel1とPanel2をそれぞれAlignをalClientにして
タイトルをPanel1に、ゲーム画面をPanel2に乗せる。
最初はPanel1を表示させる為にPanel2のVisibleをFalseにする。
ゲームが始まったらPanel1のVisibleをFalseに、Panel2のVisibleをTrueにする。
これで画面が切り替わったように見える。
設計中は下のパネルが見えなくなるからアクセスしたくなったら
上のパネルを右クリ-コントロール-背面に移動すると上のパネルが下に回る。
Frameは?
どんなゲーム作ってるんだ?
Delphi2009、結構文字列周りでハマるな。 油断できねえ。
>>797 パネルではなくてフレームにしたほうがいいのでは?という話ですね。
フレームを使う場合はフレームやフレームに載せたコンポだけに関するコードは
フレームのユニットに書くことになるので、
メインフォームのユニットのコードがその分短くなり、
コードがわかりやすくなる利点があります。
何でもかんでもメインフォームに置くのは楽なのですが
そのうちコードが何千行にもなってどこに何のコードがあるのかわからなくなります。
…って私の失敗談なのですが。
delphi worldって移転しました? 移転先教えて頂けると助かります
迷走しまくって行方不明、実質死亡じゃなかったっけ
>>800 ありがとうございます。
>>794 さんに聞きたいのですが、パネルをオンオフにするのはわかりましたが、
どうやってパネルの上に画像を表示したりするのでしょうか?
>>804 普通に載せられました・・。
ありがとうございます。
最近は初心者にdelphiは厳しいな delphi6の頃は検索すれば情報がでてきたが javaか.netの情報ばかりでてきてイライラする delphi ○○○(調べたい言葉)で検索してるのに javaのページがでてくるってもうね
大抵の人はjavaだろうがC#だろうがDelphiに移植できるけど、初心者には辛いかもな
Google初心者ってことか
というか、Googleもちょっと精度が微妙になってきてる 精度を狂わすようなノイズ(糞ブログ)が昔より格段に増えたし
日本語でGoogleを利用してる奴には世界の有用なサイトより 日本語のサイトを優先して表示みたいな処理が入ってから 目に見えて糞化した。
procedure と function の区別って 意味なくね? 同じでいいじゃん。
リストビューの選択行の色が↓のコードで変更できないんですが、 自前でFillRect&DrawTextしないといけないの? procedure TMainForm.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin if cdsSelected in State then begin ListView1.Canvas.Brush.Color := clBlue; end else begin ListView1.Canvas.Brush.Color := clRed;//選択されてなければ変更できる end; end;
いけないの。 ListViewのデフォルトの挙動と同等のコードをOwnerDrawでやろうとすると半泣きになるよ。 サンプルコードくらい用意して欲しかったよ…
そこまで難しくなかったような・・・
DefaultDrawの設定
d めんどくさいな・・・ ちなみにDefaultDrawはTrue,Falseどっちでもだめでした
というかFalseだと描画されない(あたりまえ)
TransparentColor に現在のPenの色以外のすべての色を 指定する方法ってありますか?
作りかけのdprを開こうとすると 「モジュール'vcl70.bpl'のアドレス00〜8Cでアドレス00〜78に対する 読込違反が起きました。」 って言うエラーが出てきてファイルが開けなくなったのですが 対処法分かる方います? そのdprにリンクしてるpasも全部同じエラーで個別にも開けない。
メインフォームにはTDBGridとサブフォーム呼び出しボタン、
サブフォームには複数のTDBEditと[追加]ボタンをそれぞれ配置して
・メイン: リストの表示 ・サブ: 新規レコード作成フォーム と役割分担させ、
サブフォームの[追加]ボタンのOnClickに
MainForm.SimpleDataSet01.Append;
って書いたところ、サブフォームを埋めて[追加]ボタンを押しても
TDBGridには空白のレコードが足されるだけでTDBEditの入力内容が反映されません
具体的には
ttp://dn.codegear.com/jp/article/36347 これでやってることをリスト表示用メインフォームと新規レコード作成フォームとに分割して
新規作成フォームは適宜表示されるって形にするだけです
どこをどうすればサブフォームの内容がデータベースに反映されてTDBGridに表示されるのでしょうか?
データセットのPostメソッドで確定しても反映されない?
>>822 "データセットのPostメソッドで確定"がわかりません…
Delphi初めて半月、データベース触るの初めて基本用語さえ調べながらなんです
調べた結果、 Append Post は何をするメソッドだと書いてあった?
>>824 Appendはバッファ上で末尾に追加、Postはデータベースに登録、ですよね
ってことは
>>822 はAppendしてPostしたら確定されて反映されるだろうって意味で間違いないですか?
自分が思い描いているのは
>>821 のリンク先のものを上下別々のフォームに分割することなので、
データベースに登録されるされるのは別ボタンでの処理にしたいんです
なので[追加]ボタン一発でデータベースに即登録ってのは避けて、何か方法はありませんか?
1.サブフォーム呼び出しボタンクリックでAppendしてからサブフォーム表示 2.データ入力 3.サブフォームの追加ボタンクリックでpostしてからサブフォームを閉じる という内容で書けばいいんじゃないの? あとサブフォームにはキャンセルボタンもつけて、Dataset.Cancelをしてからフォームを閉じる処理を書けばいいかと。
データセットの状態を意識しよう。TDateSet.Stateプロパティだっけかな? >って書いたところ、サブフォームを埋めて[追加]ボタンを押しても >TDBGridには空白のレコードが足されるだけでTDBEditの入力内容が反映されません サブフォームを埋めてって表現見ると、既にデータセットのAppendメソッドが自動で呼ばれて、 挿入状態になってるから追加ボタンのOnClickには MainForm.SimpleDataSet01.Append; ではなく、 MainForm.SimpleDataSet01.Post;で確定すればいいんじゃないかな? 挿入状態の時に、Append呼んで一旦キャンセル(Cancel)されて、再びAppendされてるので 空白になってると思う。
後、Postメソッドはデータベースへの変更を確定というより、データセットへの変更を確定
と言った方がいいかも。バックエンドのデータベースまで変更されるかは使ってるデータセットの
種類による。ClientDataSetはキャッシュアップデートが基本だから、Postで変更されるのはデータセットだけ。
変更されたデータセットの内容を更にデータベースに反映させるには、
>>821 にあるように、
ClientDataSetのApplyUpdatesメソッドを呼ぶ。
ページを表示しようとしたら、 すっごく重くって、 「読み込み中です、、、」 って、ずーーーとなっていて、そんで、 しばらくしたら、なぜかページでなくて、 PHPのソースが、だーっと出てきてしまったの。 ちなみに、ソースは保存してあります。
head> <body> <form name="ctl00" method="post" action="../../../../images.aspx?article=38021&filename=12th_devcamp_banner_560x80.gif&siteid=10" id="ctl00"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/qLYwLaKv675BtktTji159q4HLd34GRLuDZxKD2bFZJNsebUqmDd7EiiSCi9O+l0=" /> </div> </form> </body> </html> HTTP/1.1 200 OK Date: Fri, 30 Jan 2009 09:09:09 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-AspNet-Version: 2.0.50727 Cache-Control: private Content-Type: text/html; charset=utf-8 Content-Length: 42774
>>832 こんなのがいっぱい出てきた。ページでなくて、aspxのソースが。
ソースじゃないやん
フリー版ダウンロードサイトの話ならIEで見ると直る。 しっかりしてくれよまったく。
837 :
821 :2009/01/31(土) 16:13:11
レス遅くなってすみません
>>826-828 メインフォームの呼び出しボタンのOnClickに
SimpleDataSet01.Append;
if SubForm.ShowModal = mrOK then
ShowMessage('追加しました');
サブフォームの追加ボタンには
frmList.sdsSalesdata.Post;
ModalResult := mrOk;
としてみたところ、TDBEditはすべて記入済みにもかかわらず
[項目 'ID' の値が必要です.]というメッセージが出てきました。
(IDは
>>821 のリンク先同様にデータベース内でnullを認めていない項目です)
ちなみにPostの部分をAppendで書いてた時には[項目〜必要です]は出ていませんでした
メッセージが出るようになった理由も対策もわからないので、引き続き知恵をお貸しいただきたいです
>>837 もうDelphiがどーのこーのって問題じゃないよ。
出てきたエラーメッセージについて1時間くらい真剣に悩んでみれば?
ここはそういうスレじゃないから
delphi2009でquadrupleD使えません? パッケージ作ろうとしてもDInputがコンパイル出来ませんと・・・ 再定義がなんたらと大量にエラー吐かれます
>>819 ビットマップクラスTBitmapには2色以上を透過する機能はありません。
指定した色以外を透過するのでしたらこんな風にするとできます。
暇だったのでてきとーなコードを書いてみました。
FForeBitmap … ペンで線を引いたビットマップ
FDrawOnlyBitmap … 線だけ取り出したイメージを描画するためのビットマップ
//★線を引かれたビットマップから線だけを取り出したビットマップを作る
FDrawOnlyBitmap.Assign(FForeBitmap);
// 元ビットマップのキャンバスのペンの色が透明色になるマスクに変換
// そのペンの色が黒、それ以外が白になる。
FDrawOnlyBitmap.Mask(FForeBitmap.Canvas.Pen.Color);
// 反転する
with FDrawOnlyBitmap do
BitBlt(Canvas.Handle, 0, 0, Width, Height, 0, 0, 0, DSTINVERT);
//★描画する
// 透明指定、黒を透明色に指定
FDrawOnlyBitmap.TransparentColor := clBlack;
FDrawOnlyBitmap.Transparent := True;
// 前景色をペンの色に指定
Canvas.Font.Color := FForeBitmap.Canvas.Pen.Color;
// 描画
Canvas.Draw(0, 0, FDrawOnlyBitmap);
TWebBrowserで読み込むときにカチッと音が鳴るのは消せませんか?
追加 WebBrowser.Navigateで navNoReadFromCacheを付けてもキャッシュから読んでしまって古いページが表示されます どうしたらいいですか?
>>842 コンパネ-サウンド
IEの標準動作だよ
>>845 ありがとうございます
プログラム上から設定はできないんですか?
ググれば腐るほど出てきます
848 :
840 :2009/02/01(日) 16:57:59
>>844 やってみましたがダメでした・・・
{$IF}指令ってdelphi6とどこか違うんでしょうか?
気のせいか、
{$IF UNICODE}みたいな記述のふきんでエラーをよくみます
2009持って無い人が分かるかもしれないからエラーメッセージ書いといたほうがいいと思うよ > {$IF UNICODE} {$IF Defined(UNICODE)} や {$IFDEF UNICODE}でなくて?
850 :
840 :2009/02/01(日) 22:06:31
>>849 そりゃそうですね、忘れてました。
(DInput.pas)
type
LPDIENUMEFFECTSCALLBACKA = function (const Para0: DIEFFECTINFOA; Para1: Pointer): BOOL; pascal;
LPDIENUMEFFECTSCALLBACKW = function (const Para0: DIEFFECTINFOW; Para1: Pointer): BOOL; pascal;
{$IFDEF UNICODE}
const
LPDIENUMEFFECTSCALLBACK = LPDIENUMEFFECTSCALLBACKW;
{$ELSE}
LPDIENUMEFFECTSCALLBACK = LPDIENUMEFFECTSCALLBACKA; ←
{$ENDIF}// !UNICODE
などのところです。まだたくさんありましたが。
エラーの場所はうろ覚えです・・・すみません。
2009消してD6入れなおしたもので。
いまから2009入れてくるのでメッセージの詳細はしばしまってください。
ウンコード
Turbo Delphiなんだけど ProjectからUnitを削除しても、プロジェクトソースの方は自動で削除してくれないんだね。 以前削除したはずのデータモジュールがプロジェクトソースに残ってて、新たにUnitファイル名は 違うんだけど、データモジュール名のNameプロパティが同じものを追加したら、名前の衝突が起こった。 ショックだった。
853 :
デフォルトの名無しさん :2009/02/02(月) 22:31:53
Execute('dir /s /b', Memo1.Lines); みたいなユーティリティコードってどっかにないですか。
TStringsに格納するユーティリティなんてすげーな。
BDEについて質問です。 SQLServer2005のデータベースに接続し、一時テーブルを使って集計しようとしたのですが トランザクション内でクエリを何度か実行すると「テーブル:(一時テーブル名)が見つかりません」 というエラーが出てクエリが実行できなくなってしまいます。 SQLServerのヘルプには「テーブルを作成したセッションが切断されるまで保持されます」と記載されているので TSessionが怪しいとにらんでヘルプを見たけどイマイチよく分からず、 ぐぐっても詳しく解説しているサイトが見つかりませんでした。 一時テーブルはトランザクション内でのみ使用しているので トランザクション中はセッションを保持するようにしたいのですが ぐぐるヒントでもありましたら教えてください。
>>852 よくあるまちがいは、プロジェクトから削除したユニットを、プロジェクト内のユニットから
参照していて、それが残ってるというもの。
しかしプロジェクトソースから削除しないって、プロジェクトから削除してないって
云うのと同義やね。
>856 ローカルUSESを先にはずすのを忘れたとかは、あったかもしれないkど、それはないよ。 どうもこのドッツネッツのIDEはわけのわからんところがある。 プロジェクトオプション見たら、フォームが2重登録になってたり。 現にいまも立ち上げたら、無効なポインタ操作とかのダイアログが出て、赤線アンダーラインでまくり。 ちゃんとコンパイルは通るんだけどね。
>>857 同じくTurboDelphiExplorer使いだけど、そういう場合(よくある)は
ファイル→すべてを閉じる→最近のプロジェクト一覧から再度開く
これで解決させてる。
つかえねぇな、そんなんじゃ
ガンガンスクロールしていくログを Teratermの様に行数制限付き状態で流したいです。 現在はMemoを使用して、単純に下記のようにしているのですが、 行数が多くなると(数百行位でももう)とにかく重いです。 TMemo1.Lines.Add('ホゲ'); TMemo1.Lines.BeginUpdate; if MAX_LINE < TMemo1.Lines.count then TMemo1.Lines.Delete(0); TMemo1.Lines.EndUpdate; どのようにしたらよいのでしょうか。
ガンガンたまるログを片っ端から消していくの?
TMemo1.Lines.BeginUpdate; を Addの前にすれば少しはましになるんじゃね?
StringなQueueを内部で管理してバーチャなListViewで表示すりゃいいんじゃね。 複数行にわたるコピペができなくなるけど。
ListViewって、最終行表示させるのに定番のコマンドってある? 以下のように自分専用の関数作ってるけど、何かあったら教えて欲しい。 procedure LVI(LV: TListView; const Strs: array of string; ScrollToEnd: Boolean = True); var i: Integer; begin with LV do begin with Items.Add do begin Caption := Strs[0]; for i := 1 to High(Strs) do SubItems.Add(Strs[i]); end; if ScrollToEnd and (TopItem.Index + VisibleRowCount > Items.Count-3) then Items[Items.Count-1].MakeVisible(True); // ↑この部分 end; end;
MakeVisibleにTrue渡した時はアイテムが見えてればスクロールされないから条件分岐いらないんじゃね > for i := 1 to High(Strs) do Strsに変数渡した時でも大丈夫? ここら辺の仕様覚えて無いからよく分からないけど
866 :
864 :2009/02/04(水) 18:07:11
>>865 レスありがとうございます。
変数を渡すことがないので検証してません。
使い方としては
LVI(ListView1,['1行目','2行目','3行目'])
といった感じで追加するのですが、ScrollToEndがTrueの時は
最終行が表示されていれば、最終行にスクロールするという処理を入れてます。
逆に言うと、最終行じゃない場合は最終行にスクロールさせません。
> 最終行が表示されていれば、最終行にスクロールするという処理を入れてます。 > 逆に言うと、最終行じゃない場合は最終行にスクロールさせません。 ならMakeVisibleいらないんじゃね? MakeVisible(False)なら分かるけど
868 :
864 :2009/02/04(水) 18:27:08
>>867 MakeVisible(False)もMakeVisible(True)も動作としては変わりませんでした。
以下の挙動を実現するには、MakeVisibleは必須です。
追加する前に最終行が表示されてる場合→追加後最終行を表示
追加する前に最終行が表示されていない場合→スクロールしない
そういう意味か・・・ だったらItems.Count-3はItems.Count-Length(Strs)じゃね?
870 :
864 :2009/02/04(水) 19:02:39
定期的に追加されるログの最新の行を見える状態にするのが自然だと思う。 ただ、スクロールして過去のログを見ている時に、ログが追加された場合、 勝手に最終行にスクロールされるのでは困る。 よって以上のことで実現させているのですが、 このような挙動がデフォルトで考慮されていないのは長年の疑問です。 嫌気がさして使い始めたVirtualTreesでもそのようなコマンドが見当たりません。 仕方がないので、自分でクラスを継承して、LastLine:Booleanという変数を保持し、 OnScrollで最終行であるかを毎回チェックし、行追加時にLastLineであれば OffsetY := ClientHeight - VisibleCount*18; で最終行を表示させて何とか凌いでいます。
871 :
864 :2009/02/04(水) 19:12:09
>>869 TopItem.Index + VisibleRowCount > Items.Count-3
Items.Count-1でも良かったのですが、スレッドで高速に追加してる関係で
余裕を持たせてました。以下の説明ではItems.Count-1とします。
ここの意味するところは、仮定すると分かりやすいのですが、
ListViewが現在100行のデータを保持し(Items.Count=100)、
表示出来る領域が3行(VisibleRowCount=3)とします。
現在97行目が1行目として表示されています(TopItem.Index=97)。
つまり、今現在最終行が表示されています(97+3>100-1)。
872 :
864 :2009/02/04(水) 19:34:39
すみません、訂正します。 97行目じゃなく、98行目が表示されている場合に最終行でした。 また、VisibleRowCountとTopItem.Indexが行の一部のみ表示などで1ずれることも考慮して TopItem.Index + VisibleRowCount > Items.Count-2 とした方が良さそうです。 その意味でItems.Count-3にしたのを今になって思い出しました。
873 :
864 :2009/02/04(水) 19:41:56
>>871 現在98行目が1行目として表示されています(TopItem.Index=97)。と訂正。
もうね、まず自分の中で落ち着いてまとめるのが先だろと
875 :
864 :2009/02/04(水) 22:53:02
876 :
860 :2009/02/04(水) 23:57:02
>>861 一定期間はスクロールして見ることができれば良くて、古い物は消していきたかったのです。数千〜多くても万行くらい。
>>862 追加した一番下の行を表示している状態にしたかったのでaddは画面を更新する状態で行っていました。
何故かMemoを使用する考えしか頭の中になかったので、一連の流れを見てて目ウロコでした。
とりあえずListBoxを使って必要なスピードは得られたのでコレで満足します。ありがとうございました。
ListBox1.AddItem('ホゲ',nil);
ListBox1.ItemIndex := ListBox1.Count-1;
:
if (ListBox1.Count > StrToInt(Edit1.Text)) then begin
ListBox1.Items.BeginUpdate; try
while (ListBox1.Count > StrToInt(Edit1.Text)) do
ListBox1.Items.Delete(0);
finally ListBox1.Items.EndUpdate; end;
end;
>>876 最初の2行は
ListBox1.ItemIndex := ListBox1.Items.Add('ホゲ');
こうした方がすっきりするかも。
いいんじゃね
>>863 VirtualMemo っていうカスタムコンポが欲しくなった(・ρ・)
>>877 イチイチnil指定するのがなんか格好悪くて、
items.addに変えてみる所までは自分で気が付いたのですが、
せっかくインデックスを返してくれるのでそのまま使った方が効率的ですね。
指摘ありがとうございます。
コードと名称を持つテーブルを更新する処理なのですが、名細部(名称1と名称2)を入力変更すると、編集状態フラグがTrueになります。 編集途中でコードにカーソルを持っていくと編集中の確認メッセージを表示して、その結果で編集内容を破棄するかどうかを確認します。 このようなプログラムでコードEnterイベントの途中でメッセージダイアログを表示すると なぜかコードのIMEがひらがな入力モードになってしまい、尚且つ、カーソルをあらわすピコピコ点滅が表示されなくなってしまいます。 これを回避する方法がなにかありませんでしょうか? 以下がソースになります。宜しくお願いします。 //使うコンポーネント// CodeEdit1 : TEdit; //imeMode = imClose (コード) MeisaiEdit1 : TEdit; //imeMode = imHira (名称1) MeisaiEdit2 : TEdit; //imeMode = imHira (名称2) //変数 HensyuFlg : Boolean; //編集状態フラグ //CodeEdit1Enterイベント prrocedure TFrmTEST.CodeEdit1Enter(Sender: TObject); begin if (HensyuFlg = True) then begin if MessageDlg('編集内容を破棄してよろしいですか?', mtConfirmation, mbOKCancel, 0) = mrCancel then begin MeisaiEdit1.SetFocus; Exit; end; end; //名細部の初期化 MeisaiEdit1.Text := ''; MeisaiEdit2.Text := ''; //編集フラグの初期化 HensyuFlg := False; end;
DBGridの横スクロールを関知したいのですが方法あります?
883 :
864 :2009/02/06(金) 15:38:48
>>866 は
× LVI(ListView1,['1行目','2行目','3行目'])
○ LVI(ListView1,['1列目','2列目','3列目'])
以上のように訂正します。誤解を招いてしまい申し訳ありませんでした。
>>881 HensyuFlg := False;
の後に
CodeEdit.SetFocus;
を加えてみてはどうでしょうか?
私の環境(TurboDelphiExplorer)ではこの1行を入れることでうまくいきました。
>>882 delphi スクロールバー messageでぐぐってみては?
他のアプリの文字列を取得したいとも思いwinsght32でウィンドウ名とかを調べてみたのですが、 customとかsticとかになっていてウィンドウ名が出ていないところに取得したい文字列があります。 こういう場合どうすればいいか教えてください。 よろしくお願いします。
886 :
881 :2009/02/06(金) 16:18:33
>>883 早速のレスありがとうございます。
試してみましたが、状況が変化しないみたいです。
引き続きあれこれ模索してみます。
>>881 imCloseの代わりにimDisableで試してみて
888 :
881 :2009/02/06(金) 18:28:09
>>887 imeMode全てで試してみましたが、変化ありませんでした。
Memo帳でもブラウザでもなんでも
入力途中で変換確定前に入力対象を失うと
画面の左上の方にIMEの入力がぽっかりと浮かぶことがありますよね。
あんな感じでフォーカスを見失ってるみたいなのです。
マウスで再度Editをクリックしてみても、カーソルがある時のピコピコが表示されないのです。
イメージ的には、Editにフォーカスがあたるという処理中が中断されてしまった為に、
Editの描画処理をやりかけのまま終えてしまっているような感じです。
>>884 ども
Messageって言うキーワードを思いつかない程の初心者なんで助かりました。
いろいろ出てきたんで回り道してみます。
TDate型に代入できる年月日の上限とか下限とかってありますか?
ある。TDateTimeでヘルプ見ると範囲が載ってたはず。
>>892 D6だと下限はあるが上限はないなあ
Writeln(SysUtils.DateTimeToStr(Math.MinDouble));
Writeln(SysUtils.DateTimeToStr(Math.MaxDouble));
でいけると思ったが下がいかん
TDateTime型が実装しているのはグレゴリオス暦なので、日本では事実上明治何年だかの改暦以降でないと 実用にならない。西欧の日付を扱うときも同様で、各国/地域のグレゴリオス改暦以降となる。つまり値の範囲 ではなく日付の数え方で制限されてしまう。逆にここを自前で実装するなら上限同様に値の範囲で制限されると 考えてよい。そこで上限のほうなのだが、TDate型と書いているので日付のみ誤差なく扱えればよいとするなら、 Double型で扱える整数値の上限を考えることになる。Double型の有効桁数は10進換算で約15桁、つまり 概ね1,000,000,000,000,000日を扱える。これを年に直すと2,739,726,027,397年で、プラスマイナス 約1兆3千億年といったところ。 要約するとグレゴリオス改暦以降なら弥勒菩薩様がいらっしゃってもまだ全然余裕。
どうでもいいけど、符号は仮数とは別にある。
あ、そういやそうでしたな。結論に変わりはないけど。
D6とDSPack 2.3.3でキャプチャーするソフトを作成しているのですが キャプチャデバイスの入力(チューナー/S端子)の切替ができないので教えてもらえますか? IAMCrossbarを使えばできることはわかったのですがDelphiでのサンプルがないので var FilterGraph: TFilterGraph; Filter: TFilter; SampleGrabber: TSampleGrabber; VideoWindow: TVideoWindow; PinList: TPinList; SysDev: TSysDevEnum; VideoMediaTypes: TEnumMediaType; SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); Filter.BaseFilter.Moniker := SysDev.GetMoniker(0); FilterGraph.Active := true; // 解像度 PinList:= TPinList.Create(Filter as IBaseFilter); try VideoMediaTypes.Assign(PinList.First); with (PinList.First as IAMStreamConfig) do begin SetFormat(VideoMediaTypes.Items[1].AMMediaType^); end; finally PinList.Free; end; with FilterGraph as ICaptureGraphBuilder2 do RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IBaseFilter); FilterGraph.Play; お願いします
898 :
897 :2009/02/09(月) 11:40:53
899 :
891 :2009/02/09(月) 17:33:43
>>892-896 ありがとうございます
>>894 もし今後下生絡みのプログラムを作ることになっても安心してTDate型を使いたいと思います
900 :
デフォルトの名無しさん :2009/02/09(月) 18:57:06
Delphi で WinRing0 使ってる方っています?
ある。なにか聞きたい?
902 :
デフォルトの名無しさん :2009/02/10(火) 09:34:50
Intel+WindowsXP+Delphi7+WinRing0(1.2.1.17)で開発し、この環境では CPU情報を取得できたのですが、AMD+Vistaで実行すると InitializeOls DLLがエラーになるのです。
そういうのは詳細添えて開発元に聞いた方がいいんじゃないか?
904 :
897 :2009/02/10(火) 23:35:24
Cのコードを参考に書いてみたんですがうまくいきません ポインタはほとんど使ったことがないのですがどうやったらいいでしょうか? いまはpCrossbarのget_PinCountsでエラーがでてしまいます var FilterGraph: TFilterGraph; Filter: TFilter; SampleGrabber: TSampleGrabber; VideoWindow: TVideoWindow; SysDev: TSysDevEnum; pCrossbar: ^IAMCrossbar; nInput, nOutput: Longint; SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); Filter.BaseFilter.Moniker := SysDev.GetMoniker(0); FilterGraph.Active := true; with FilterGraph as ICaptureGraphBuilder2 do begin if FindInterface(@LOOK_UPSTREAM_ONLY, nil, Filter as IBaseFilter, IID_IAMCrossbar, Pointer(pCrossbar)) = S_OK then begin pCrossbar^.get_PinCounts(nOutput, nInput); end; RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IBaseFilter); end; FilterGraph.Play;
Delphiのinterfaceはclassと一緒でポインタだから、Cと違ってポインタとして宣言しなくていいと思う
906 :
897 :2009/02/11(水) 09:44:41
905 var pCrossbar: IAMCrossbar;としたらちゃんとCrossbarを操作できました ありがとうございました
907 :
デフォルトの名無しさん :2009/02/11(水) 11:33:23
908 :
デフォルトの名無しさん :2009/02/11(水) 22:10:38
初心者です。どなたか教えてください。 checklistboxのアイテム1がチェックされていたら・・・ という条件は、 if checklistbox.itemindex[1].checked then と考えたのですが、エラーが出てしまいました。 どなたか正解を教えてください。
ヘルプを読んだりググったりしてプロパティを理解する
>>908 アイテム1ってのが一番目のアイテムのことを指してるなら
インデックスは0にしないとだめ
Developer Studio 2006 というバージョンですが ツールパレットのstandardにTextBoxがありません コンポーネントの追加にもTTextBoxがないようです。 もう1回インストールし直したほうがいいのでしょうか?
Delphi TTextBox に一致する日本語のページ 約 2 件中 1 - 4 件目 (0.46 秒) 日本語指定外すとかなり増えるがまあそういうことだ
1行入力ならTEdit 複数行入力ならTMemo
914 :
911 :2009/02/12(木) 21:46:15
>>913 ありがとうございます。
Editですね。
そういえば、そうですよね。
そのレベルでよくBDSなんて使おうと思ったなw
どのレベルならBDSを使ってもいいのかはよくわからないけど、 ヘルプでTTextBoxを検索してみても良かったかもね。
>>915 ヒント:くだすれDelphi(超初心者用)
918 :
デフォルトの名無しさん :2009/02/13(金) 21:58:26
>>918 ヒント:くだすれDelphi(超初心者用)
920 :
デフォルトの名無しさん :2009/02/14(土) 10:52:50
Delphi6で作ったプログラムを最小化の状態で起動しようとして、 別のプログラムで ShellExecute(Handle,nil,PChar(FileName),nil,nil,SW_MINIMIZE); としたんですが、通常状態で起動されてしまいます。なぜでしょう。
>>920 最小化状態で起動しようとしているプログラムが
VCLを使って作成されているならば、
アプリケーションウインドウは、最小化状態で起動されても、
Form1は、最小化状態でShowWindowされないから。
922 :
デフォルトの名無しさん :2009/02/14(土) 12:09:52
>>921 なるほど。すると起動する側で制御することはできないのでしょうか。
(起動される側はDelphiだけではないです)
Windowが一瞬表示されてもいいなら、 Form1のhandle捕まえて、メッセージ投げるか、 表示されるのがいやなら、フックするとか...
>>908 if checklistbox.items[1].checked then
今まで使った事なかったんだけどコードエクスプローラーって エディタのタブ移動すると収納されるんだな、使えねー。
926 :
デフォルトの名無しさん :2009/02/14(土) 18:03:47
memoの内容を別のmemoにまるまる移したいのですがその方法がわかりません>< だれか教えてください。 memo1.lines.add(memo1.lines) だとだめですよね。。
memo2.Lines.Text:=memo1.Lines.Text;
Memo1の内容をMemo2にコピー Memo2.Lines.Assign(Memo1.Lines)
>>920 Application.Minimizeは試してみた?
この人何言ってるの?
君には理解できないことを言ってる
ヒント:スレタイ
起動される側のプロジェクトソースを触れるのならこうしろということでは? Application.Initialize; Application.CreateForm(TForm1, Form1); with Application.MainForm do case CmdShow of 2,6,7:WindowState:=wsMinimized; 3:WindowState:=wsMaximized; else WindowState:=wsNormal; end; Application.Run;
>902 Vista 環境で失敗するのは、UAC のため管理者権限なしで実行されるためです。 とりあえず右クリックメニューの『管理者として実行』を使って管理者として 実行してください。これで動作すると思います。 UAC についてはネットなどで多数の情報が得られると思います。
インターネットとお話しするライブラリとしてIndy以外にはSynapseやICSなどの話を聞きます そこそこよければ使いたいと思うのですが、どんな感じですか?
Indy じゃ何が不満なの?
937 :
935 :2009/02/16(月) 01:09:32
巨大だとか、自分でソースを追いずらいとか、バグがあるとよく言われるとか、です ソースを追いづらいのは自分のスキルがいかんのかもしれませんし、 バグがあるというのはガセかもしれませんが・・・
ブロッキングソケットベースなのはIndyのデメリットだと思う。 タイムアウトや中断処理の自由度が低い。 これをソース見てselectで書き直す事はできるんだろうけど、 物がネットだけに半可な知識で手を出すとよそに迷惑をかけないとも限らないし。 確か公式ではソースの見通しがよいというブロッキングのメリットが挙げられていたけど、 応答ごとに逐次処理をしようとしたら結局は非ブロッキングとあまり変わらないんだよな。
それ以前に Indyは日本語処理がバグだらけ。 結局 TIdMessageクラスを自前で作り直したよ。
Synapseがいいらしい 自分は自作だけど
>>938 スレッド使うのが常識ジャン。ばかじゃね。
それがデメリットって話でしょ。
>>941 はぁ?
それでタイムアウトや中断処理がどう解決できるんだよw
Del は Web アプリには不向き。これがFA。
おまえはプログラマに不向き。これがFA。
Turbo Delphiを使っています。 Form上にTImageとTStringGridを配置しました。 これを重ねたときにTImageが上に表示されるようにしたいのですが、 コントロール>前面に移動を選択しても上に表示されずに困っています。 BringToFrontやSendToBackも試しましたが駄目でした。 どうすればいいか教えてください!
外部アプリのコントロールのテキストを取り込みたい時ってgetwindowtextを使うと思いますが、 例えば、リストボックスに入っている複数行のテキストを取得したい時とかは、 どうすればいいんでしょうか。 教えてください。
>>934 ありがとうございます。「管理者として実行」してみたら動きました。
しかし…今度は RdmsrEx でエラーが… AMDのノートPCだから MSR を
サポートしてないのかなあ。
でも何だかスレチぽくなってきたので以上にします。どもでした。
954 :
デフォルトの名無しさん :2009/02/18(水) 04:23:57
教えてください。
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200402/200402_04020074.html ここの状況とまったく同じ状態になり、同じ対策をしようと思ったのですが
Delphiの下記コードの
procedure TForm1.ApplicationEvents1Exception(Sender: TObject;E: Exception);
var
n : Integer;
begin
if E is EInOutError then
n := IOResult; // IOエラーコードを取得してエラーをクリア
end;
if E is EInOutError then この部分をBuilderでどのように記述するのかわかりません。
if(E==EInOutError){hoge;}とするとエラーになりました。
どうすればいのでしょうか。
955 :
935 :2009/02/18(水) 04:30:17
名前消し忘れたごめんなさい
すいません、スレ違いでした。
Turbo Delphiで斜め線を引くコンポーネントってありますか? TShapeでは無理ですよね?
Canvas.MoveTo(0, 0); Canvas.LineTo(100, 100);
コンポーネントでお願いします
すみません相当くだらない質問ですがお願いします。 親フォームの上下左右にアンカー設定したImageコンポーネントを塗りつぶせば、 フォームのリサイズに追従する長方形が描けるのかなと思い、 ↓の様に書いてみたんですが、縮みはするんですが元の大きさより伸びてくれません。 procedure TForm1.FormCreate(Sender: TObject); begin Image1.Canvas.Brush.Color := RGB(255,255,255); Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image1.Height)); end; //フォームのリサイズイベント procedure TForm1.FormResize(Sender: TObject); begin Image1.Canvas.Brush.Color := RGB(255,255,255); Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image1.Height)); //Label1.Caption := '幅' + InttoStr(Image1.Width) + ' 高さ' + InttoStr(Image1.Height); end; ラベルに表示させてみたところImageコンポーネントの大きさはちゃんとフォームに追従しているようなのですが・・・ 何が悪いんでしょうか?
線を引くコンポーネントはないな。 PaintBoxあたりから派生して作ればすぐだけど。
>>961 追従する長方形だけならTPanelにアンカーつけて色変えれば?
稀なのかよくあるのかどっちだ。
>>961 コンポーネントの大きさは変わっても塗りつぶした Canvas の TBitmap は変わらない
963の言うようにTPanelにするかTShapeにするか
塗りつぶしはテストで実は画像を……っていうならアンカーで楽せず自分で処理
質問です。 Delphiでゲームを作っています。 ハイスコアを記録したいのですが、 私はINIファイル/テキストファイルとして保存する方法しか知りません。 これではテキストエディタですぐ改変できてしまいます。 バイナリファイルとして各データを保存する方法を教えて下さい!
一応言っておくと、バイナリでも簡単に改変できます。 iniファイルでも、チェックサムを一緒に記録しておけば、簡単には改変できません。
暗号化するのが手っ取り早い。 パスワードは"GAME"とか適当に決め打ちして。 ライブラリはdelphi cryptで検索すればいくつも出てくるだろう。
xorだけでいいんじゃない?
>>967 一例。
var
User:String[12];
Score:Integer;
procedure ScoreWrite;
var
F:TFileStream;
begin
User:='POKEMON';
Score:=12000;
F:=TFileStream.Create('C:\test.dat',fmCreate);
try
F.WriteBuffer(User,SizeOf(User));
F.WriteBuffer(Score,SizeOf(Score));
finally
F.Free;
end;
end;
procedure ScoreRead;
var
F:TFileStream;
begin
F:=TFileStream.Create('C:\test.dat',fmOpenRead);
try
F.ReadBuffer(User,SizeOf(User));
F.ReadBuffer(Score,SizeOf(Score));
finally
F.Free;
end;
end;
Del6使ってるんですが、ボタンやパネルをマックのギミックみたいに バウンドしてるように見せることって出来ますか? 最初ゆっくり上昇してだんだん早く何回かバウンドして戻るみたいなのが やりたいんです。 どなたか教えてください。
サインカーブとかじゃね?
よく知らんけど、ぼよんぼよんってするんかな。 作るのはかなり面倒くさそうだ。
新手のウィルスか そのボタンを押せなければ ハードディスクドライブをフォーマットされるという
>>970 xorだけで暗号化するのは、ロッカーにガムで鍵をするようなもんだ。
とどこかで読んだことがある。
適材適所 ゲームのハイスコアにAESとか使っても仕方ないだろ
いずれにせよ覚えておいて損はないと思う。BlowFishとか。
AESのライブラリとかないのかな。
980 :
デフォルトの名無しさん :2009/02/20(金) 08:07:37
Delphi 2009 で、自分で作ったパッケージに登録されている コンポーネントを編集(再構築?)したり、 そのパッケージに新たにコンポーネントを追加したりしたいのですが、方法がよく分かりません。 メニューバーの「コンポーネント>パッケージのインストール」で「設計時パッケージ」の一覧を見ると、 自分で作ったパッケージ(C\Documents and Setting 〜〜 package1.bpl)は表示されているのですが、 「編集」ボタンが効きません。 (なので、ここから先に進めません) どうすればよいでしょうか?
パッケージのプロジェクトファイルを開いて編集すればいい。
使いづれぇーー
983 :
デフォルトの名無しさん :2009/02/20(金) 23:12:34
Delphiのバージョン5をしぶとく使い続けてるんだけど、MYSQL5だと、うまくレコードが表示されないんだよ。 MYSQL4だと正常なんだけど。 何を設定すればいいの? MYSQLは4でも5でもsjisに設定してるけど。 あ、ODBC経由でテーブルを開くアプリね。
左右の矢印キーが押されたらプロシージャを実行したいのですが、 ヘルプを見ると、フォームのキープレス、ダウン、アップのイベント は矢印キーではイベントが起きないようなことが書いてあるのですが、 何か方法はないでしょうか? よろしくお願いします。
Tchartにて、動的にタイトルを変更したいのですが、プログラム上から変更する方法を教えてください。
>>986 Chart1.Title.Text[0] := 'ぶひ';
有難うございました。
>>972 マックだかモスだかのギミックは知らんが、あんたは高校物理の基礎の基礎から始めたほうがいい希ガス
>最初ゆっくり上昇してだんだん早く
主にこの辺読んだ印象だけど
面倒だけど難しくはないよ
所望の挙動はどうか知らないけど普通のバウンドだったら
まずは等速で動かすプログラム(座標に速度を毎回足す)
次に座標がある値以上で速度を反転させるプログラム
次に速度に一定の値(加速度)を足し続けるプログラム
最後に反転時に速度に0〜1の係数(反発係数)かけるようにするって感じで練習してけばいいんじゃね
y=abs(sin(θ))*x みたいな式で簡単に作れそうだけどなあ。
ああごめん、ちょっと違うな。 y=abs(sin(n/x))*x こんな感じかな。
>>970 XORだと総当たりチェックで簡単にバレてしまいます。
1バイトごとにXORだと256回チェックしておしまいです。
適材適所だっつーの そもそもなぜ1バイトに限定してんだよ
その前に、必死になって ini ファイルの暗号解きたくなるようなゲームつくれんの?
D6 をXp で動かしているんですが、デスクトップを保存にチェックしていても、起動すると 前回ひらいていた .bpgではなく、C:\program files\Borland\Delphi6\Projects のProjectGroupe1 というのが開いてしまいます。 これを自分で保存したたとえば D:\Delphi\MyPrj.bpg を開くようにするにはどうしたらよいのでしょうか?
998 :
デフォルトの名無しさん :2009/02/22(日) 19:53:31
998 !!!!!!!!!!!!!!!!!!!!!!!!!
999 :
997 :2009/02/22(日) 20:23:40
わかりました。 .dpr を2個以上含めれば、自動で次回も疎sのbpgを開くし、デスクトップ状態も 復活するのですね!
1000!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。