>>1 乙です
前スレの991ですが引き続きよろしくお願いします
991 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/12(水) 16:55:10
現在勉強の一環としてVCLを使わずにAPIだけでプログラムを書いているのですが、
IEコンポーネントのブラウザは作成可能でしょうか?
CreateWindowで「AtlAxWin」と「Shell.Explorer.2」を指定してみたのですが作成されていないのかフォームは灰色のままです
また、Navigateの方法も教えてくださると光栄です
>>3 そりゃ可能でしょう。
VCLで作れるなら、VCLのソース見ればいいだけ。
>前スレ989
> Delphiには未来があるんでしょうか?
未来は自分で作るもの。
>990
> 実行時パッケージを使用してコンパイルしたいのですが、
>特定のpasファイルだけは静的リンクするにはどうしたらできますか?
ユニット名を変えれば出来る。 変えずにできるかどうかはやってみて。
でも、パッケージ内のユニットを実行時に置き換えることは出来ないと思うよ。
6 :
デフォルトの名無しさん :2008/03/13(木) 09:41:14
DelphiのADOQueryでSQLServerへ以下のことをしています。 ・Select文を投げる ・Query内をループし帳票へ書き出す 最近帳票が遅いと言われたので、SQLServerのテーブルへインデックスを貼ったところ速度が速くなったのですが、 なぜか「Select文の実行」時間ではなく「Query内を参照し書き出す」時間のほうが早くなっていました。 インデックスでQueryに結果を格納した後の参照時間も変わるものなのでしょうか?
変わるよ。 たいてい?のデータベースはSELECT文を実行して、最初の数行が決定された 段階でクライアント側に応答を返す。で、クライアント側がカーソルを 使ってフェッチしながら、その裏でデータベースサーバーは続きの行を一生懸命 求めている。つまり、君の言う「Select文の実行」時間とは、サーバーから 応答が返ってきた時間であって、サーバー側ではまだ処理は終わってないんだよ。
後、文章から判断するとCursorLocationプロパティがclUseServerのサーバーカーソル使ってそうだね。 サーバーカーソルならデータベースのカーソルと同じと考えていいけど、 clUseClientのクライアントカーソルに設定すると、ADOがSELECT文を実行し、 すべての行をクライアントのメモリをフェッチするまで、応答を返さないから 君の測定もまた変わる。その変わり、君の言う「Query内を参照し書き出す」時間 はインデックあろうとなかろうと、返される行数が同じならほぼ一定時間になると思う。
いや、クライアントカーソルの時「Query内を参照し書き出す」時間が一定になると 書いたが嘘かもしれん。むしろ、嘘っぽいかも。
10 :
6 :2008/03/13(木) 13:31:32
>>7-9 CursorLocationプロパティはclUseClientになってました。
予想外のところが速くなって混乱していたので、レスみて納得しました。
ありがとうございます。
>フォームからマウスが外れた時に、 >ある処理(例えばbeep)を行いたいのですが、 >どう記述すればいいでしょうか? SetCaptureControl/ReleaseCaptureを使ってみては? OnMouseMoveでSetCpatureControlを使用するならフラグで多重起動 させないように管理する必要性があるけど。
Delphi の TFoo<T,S> = class ... end; TFooInt<R> = TFoo<R,Integer>; の TFooInt<R> って、C++ の template だとどういう風に宣言するの?
PascalってもしかしてCのreturnに相当する処理って無い? 途中で抜けるのって出来ないとか?
>>13 Exit Break Continue Abort
マウスの検出は↓で出来る procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
>>13 抜けるだけなら可能だが、Resultにぶち込んでからExitしなけりゃならない
そんな話題が前スレにもありました
C++で作られたDLLファイルをDelphiで使用したいのですが、 C++で次のように定義されている関数は、Delphiでどう定義すればいいですか? int Test(const char *str1, int &a, int* a, char** msg, int* len); char** が特にどうしていいのかわかりません。 どうかお願いします。
char** は PPChar。 (PPChar = ^PChar) 呼び出し規約も合わせるように。
EditでCtl3DプロパティをFalseにすると外枠が立体的ではなく平面的になりますが Comboboxの場合はCtl3DをFalseにしても外観が変わりません。 ComboBoxを平面的な表示にすることはできますか? Delphi4です。よろしくお願いします。
フラットComboboxみたいのを昔どこかでみたことがあるなあ
バグだらけのDelphi4よく使ってんな
>>24 そりゃバグのないソフトなんて皆無だし。
Del3とDel5〜Del7はよいと思うよ。
26 :
19 :2008/03/15(土) 15:51:05
>>21 >>22 情報ありがとうございます。
でも面倒なので逆にすべて3Dで統一しようとおもいます・・・
Delphi7ですが、最近割りと大きなプログラムを扱うようになりまして、 VCLもIndyやらサードパーティのものやらがたっぷり入っていまして、 コンパイルに10分くらい掛かってしまい、やる気を無くしています。 これはPCのスペックを上げねばと思うのですが、現在はCeleronの600MHzで 512MBのメモリですが、どの程度にすればいいものでしょうか。 (自作PCで、HDDなどはそのまま使いたいと思っています)
俺Del5Entだけどセレ500MHz、RAM128MBでコンパイル一瞬だよ
Delphiのバグが突出して多いのは、有名な話だよ。
>>27 OSによる。
コンパイルって再構築?
タスクマネージャで開きメモリやCPUの使用率調べる。
OSはWindows XP Home です。タスクマネージャではDelphi32.exeが100%です。 メモリの使用率は見方が分かりませんでした。(情けない、スミマセン) ちょっと調べてみてCPの良い感じのAMDのにしようかと思っています。
再構築にしても、10分はかかりすぎ。 XPHomeで512MBなら十分。 チューンアップしていなくても、200MBぐらい空いているはず。 メモリが足りないときは、HDにガーッってアクセスするから分かる。 考えられる原因は、 他に重たいアプリが動いている。 ウィルスかも。 HDが壊れている。 エラーチェックしよう。 コンパイル状況ウィンドウはどう? プロジェクトに関係なく遅いの? コンポーネントを沢山インストールしてから遅いの?
大きいプログラムをフルビルドするならそのくらいはかかるんじゃね? その場合、それ以上早くするのは CPU 上げるしか方法はないと思う。
>>31-32 ウイルスという線もあるけれど、ウイルス対策ソフトがネックになることも多々あるよ。
>>27 毎回フルビルドしてんの?
それかincludeしてるファイルを頻繁に更新するとか?
皆様色々なレスありがとうございます。 ウィルス関連ですが、ウィルスバスター2007です。検知はされませんでした。 それから10分というのは再構築の場合です。 また、他の人から引き継いだ(コピーした)ものです。 足りないVCLはインストールしたのですが、その後も他の軽めの プロジェクトなら数秒で終わります。 近いうちにCPU換装しようかと思ってます。マザーとメモリもか…
>>36 換装よりももう一台追加した方がいいと思うぞ
>27 いまどきのPCにしたほうがいいとは思うけど、どうしてもというならまずメモリを上限(3GB)まで増設。 次にCPUを交換。あとはIDEがATA66だったりしたら増設ボードでATA100/133に。
>>38 既に最大である512Mなのでわ?
自作PCどころかPCについて詳しく無いみたいなんだけど、メモリやCPUは
世代が変わると互換性が無くなるし、古い世代のパーツを中古で手に入れよう
と思った場合、現行品に比べて遥かに高くつきますよ
dfmファイルがテキスト形式で、画像データや音データがどっさり入っている場合、 dfmファイルがべらぼうなサイズになるから、コンパイルが遅くなるかも。
ATA66→ATA100/133って…なかなかひどいアドバイスだ。
ちょっとDelphiの技術的な話からずれてきたので恐縮してます。 が、もうだめです。イラっときてキーボード叩き壊しそう。ちょっと修正して 確認ってときに数分… 昔の汎用機のTSSでのコンパイルじゃあるまいし。 明日CPU、メモリ、マザー買ってくる。それから最近はS-ATAが主流らしくて PCIもExpress何とからしくて(もう昔の人みたいす)、色々変換のパーツも 買わないといけないみたい… HDDはVCLインストールなどなどが死ぬほど 面倒そうなので使いまわしたいです。ちなみに現在のマザーはASUS CUSL2です。 レスくれた方々、本当にありがとうございました。
ちょっと待て。CPUやマザーボード換えてOSの再インストールなしでいけると思ってる? 悪いこといわんから普通に1台組み立てて環境も全部入れなおせ。
それが再インストールなしでも結構いけたりする。 再インストールは覚悟して不具合出るまで様子見もあり、と無責任なことを言ってみる。
あれ? 俺開くスレ間違えた?
Cele600というのが泣けるねw 特殊ハードを使ってないのなら、一式組み立てて OSまでインストールしてから、VMWareComverterで 古いHDDの内容を丸ごと吸い上げて、それを VMWarePlayerで動かしても多分5倍は速いw
>>45 dephi超初心者の自作スレになりました。
シングルコア→デュアルコアにしたら射精した。
それよりも毎回フルビルドすんのはなんでかという点に誰か突っ込めよ
ややこしいデータを表示するためにVirtualListViewというものを初めて使ってみたのですが CheckboxesをTrueにしてもボックスが描画されません 自分でCanvasに描くものなのでしょうか?
XPスタイルでステータスバーが凹んでいる(?)ように見えないのですが 何か設定がいるのでしょうか? クラシックスタイルでは普通です・・・
>>31 コンパイル前からCPU使用率が100%ということですか?
Delphi 7は使ったことはありませんがもしかしたら統合環境のバグかもしれません。
(Delphi 5のときはCPU使用率が100%になる不具合が複数あって結構悩まされました)
ともあれ遅い理由が本当にマシンパワーなのかきちんと検証した方が良いと思います。
(そしてマシンに手を付けるなら今ならすべて一新した方が高速で安いです)
>>46 Celeron 600MHzというCPU自体はそんなに遅くないのではないかと思います。
当時のHDDの方がボトルネックだったかもしれません。
(Celeron Mが630MHzで稼働するEee PCだとTurbo Delphi Explorerの起動するのは結構早いです)
>>50 仮想リストビューだとチェックボックスがうまく使えないみたいです。
リストビューの代わりにヘッダーコンポとチェックリストボックスの組み合わせなどを
検討してみてください。
53 :
50 :2008/03/17(月) 00:44:32
>>52 ありがとうございます
やはりダメなんですね
作り直しは厳しいですが考えてみます
継承元のフォームForm1上のコンポーネントにTCollection型のプロパティがあり、 それを継承したフォームForm2上でそのTCollection型プロパティをいじると、 実行時にそのForm2のTCollection型プロパティはどうリソースから読み込まれるのでしょうか?? Form1のプロパティ値を読み込み、そのコレクション要素を「すべてクリア」して、 Form2のプロパティ値が読み込まれる?? TReaderのソース見たけど理解が追いつきません。
クラスと実体とがごっちゃのような
ブレークポイントを設定して確認したほうがいい。
全部止めるとはまた豪快なw
コンパイル中にウィルスバスターのCPU使用率が上がってるのか? タスクマネージャ見てれば解るぞ。
>>54 継承の下位クラスで public プロパティーをいじると、それが実行時直後に
反映されるのは、どんなコンポでもいっしょ。TForm2 が TForm1 を継承してる
からといって、TForm1 のインスタンスがいったん読みこまれるわけじゃないから、
質問自体が無意味。
>>60 うーん。
>>TForm1 のインスタンスがいったん読みこまれるわけじゃないから
質問ではTForm1のインスタンスが生成されるとは一言も言ってません。
継承フォーム作成すると、派生フォームでは、変更したpublishedなプロパティだけが
差分情報としてフォームファイル(*.dfm)に記録されるんですよね?
そして実行時には、RTTIから継承フォームのプロパティを読み込んだ後に、派生フォームの差分情報だけがプロパティ
に再設定されるんですよね?で、TCollection型の場合は、どうなるのかな?という質問です。
54=60です。
>>54 ではしっかり実体とクラス使い分けませんでした。すみません(
>>55 )。
Edit1、Edit2、Edit3…のように連続した名前の物を ループ処理でTObjectListに突っ込む事はできませんかね?
できます
コンポの名前とは限らないぜ
>>67 おお!ドンピシャリだ。どうもありがとうございます
ボタン押したりメニューの設定を選んだりすると それ用の別ウィンドウが出るようにするにはどうしたらいいんでしょうか?
ファイルメニューの新規作成で、それ用のフォームを作る。 アプリ起動時に自動作成してる場合、 モーダルダイアログなら、Form2.ShowModal; ウィンドウなら、Form2.Show; 自動生成していないなら、事前にCreateする必要がある。 閉じたときどうするかも決める。
type TTask = class(TAction) property OnBeforeExecute; property OnAfterExecute; ...その他いろいろ.. end; TTaskList = class Items: TObjectList; procedure Add(Task: TAction; RemoveOldTask: Boolean = False; DelayMSec: Integer = 0; RepeatCount: Integer = 1); function Exist(Task: TTask): Boolean; procedure Remove(Task: TTask); procedure Execute; end; procedure TForm1.Button1Click; begin TaskList.Add(ActionLoadData); TaskList.Add(ActionProcessData); TaskList.Add(ActionPrintData); end; procedure TForm1.ApplicationIdle; begin TaskList.Execute; // 登録タスクをひとつ実行 end; みたいなタスク(アクション)スケジューラを導入したらスパゲッティなイベントの流れがとてもシンプルになった。 今まではイベントハンドラ中からイベントハンドラを呼び出して更にApplication.ProcessMessagesが他のもの呼び出して・・・と依存関係やタイミングに起因するバグの温床になってたのがかなり減りそうな予感。 こういうクラスって既によく練られたものがどこかにあったりする? Executeイベントハンドラをサブスレッドで実行できるTaskとか作ったらかなり便利になりそうだな。
>今までは...バグの温床になってた この部分の改善方法が分からないようじゃ何使ってもバグだらけでしょう
はははは、こりゃセンスなさすぎだ
74 :
デフォルトの名無しさん :2008/03/20(木) 14:37:34
よろしくお願いします。 Form1でメタファイルの元データを作って Form2上のPaintBox上に表示するとともに meta.wmfという名前で保存しています。 うまくできていれば、Form2上のボタンを押して meta.wmfを読み込んで印刷させたいのですが、 procedure TForm2.Button2Click(Sender: TObject); var Print_MF:TMetafile; begin Print_MF:=TMetaFile.create; Try Print_MF.LoadFromFile('d:\gazou\meta2.wmf'); Printer.BeginDoc; Printer.Canvas.StretchDraw(Rect(10,10,3000,3400),Print_MF); Finally Print_MF.free end; close; end; としても、すぐには印刷されず、Form1も閉じないと印刷できません。 Form1を閉じずにForm2だけ閉じたら印刷するようにするにはどうしたら いいでしょうか??
EndDoc
77 :
デフォルトの名無しさん :2008/03/20(木) 17:32:19
> 75 ありがとうございました。 Printer.endDoc で無事印刷されました..
79 :
デフォルトの名無しさん :2008/03/22(土) 01:58:26
よろしくお願いします。 TMemoやTRichEditで[CTRL]+[I]キーを押すと、タブ文字が挿入されますが、 この操作を無効にするにはどうすればいいでしょうか?
キーダウンメッセージ捕まえてCtrl+Iだったときはデフォルトハンドラに渡さなければいいんじゃね?
81 :
79 :2008/03/22(土) 03:51:12
>>80 ありがとうございます。
今回は、キーダウンのメッセージをKeyPress内で捕まえればいいことがわかりました。
ただ、今度はKeyPress内で[CTRL]+[I]の同時押しを判断する方法が分かりません。
どうすればいいでしょうか?
procedure TMemoEX.keyPress(var key: Char);
begin
if ((getAsyncKeyState(VK_CONTROL) and $8000) <> 0) then//CTRLキー判断
if (key = 'i') or (key = 'I') then
key := #0;//↑これだと上手くいかない
end;
>>81 Delphi2の記憶で申し訳ないが、
KeyDownには、KeyPressにはないShiftStateがあって
ssCtrlみたいなのを見ればよかったような。
>>82 私もそれで行けるかなと思ったのですが念のためにテストしてみたら駄目でした。
もし単にタブ文字入力を禁止したいのでしたら
単にタブ文字かどうかを調べてもしそうなら文字を消すようにすればいいと思います。
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
//// タブ文字が入力されたら取り消す ////
if Key = #9 then // 9はタブを示す文字コード
begin
Key := #0; // #0を代入すると文字入力がキャンセルされる(らしい)
Beep; // 取り消しとは関係ないけど「おっと、ここではタブキーは無効なんだぜ」とユーザーに伝える
end;
end;
そうではなくてもし
[Ctrl]+[I]によるタブ文字入力を禁止したいが[Tab]キーによる入力は許可したい
というのでしたらすいませんがちょっとわかりません。
つダミーAction作成
FormのOnShortcutで if (Ctrl+Iだったら) then Handled:= trueにするとか
>>83 Delphi2で申し訳ないが、
たしかに素直にやろうとしてもだめだった。
で、スマートじゃないのと
winのバージョンでタイミングの問題が気になるが
FlagをたててKeyDownでssCtrlを見ておいて、
KeyPressで
if Flag and (Key = #9) then
としたら、いちおう↓これもできた。
> [Ctrl]+[I]によるタブ文字入力を禁止したいが[Tab]キーによる入力は許可したい
87 :
デフォルトの名無しさん :2008/03/23(日) 15:42:06
Delphi 7ですが、コンボボックスにキーボード入力がわかりません。 itemになかった場合はキーボード入力したいのですが、Styleを csOwerDrawVaiableとかいろいろ変更してもキー入力できないか EaccessVilationがでます。今は、itemに項目があってそれを選択する にはOnChange イベントで取り出しています。よろしくお願いします。
まずcsDropDownでダメだったことを詳細に書いて。
AutoCompleteはFalse、StyleはデフォルトのcsDropDownに。OnChangeで処理ってのはユーザ入力を 許してる状況ではどうなんだろ?
入力化なコンボボックスってかっこ悪い
考え方が逆だ。入力するものが選択可能なエディットだと。
>>87 Comboboxをただ貼り付けただけでその動作になってると思うんだけど
デフォルトの動作から具体的にどう変えたいって事?
93 :
デフォルトの名無しさん :2008/03/23(日) 19:23:57
皆様、ありがとうございました。 OnChangeで Case ComboBox1.itemindex of 1: 2: とかしていたのですが、キーボード入力をするとここのところでエラーになる ようでした。しょうがないので、ComboBox1.textの値で分岐させることに したら解決?しました。お騒がせしました。 でも、この方法しかないのでしょうか?後学のためにどなたかキーボード 入力も許すとき、どういう方法で選択されたのを知るのが常套手段なのか 教えてくださいませんか?
>>93 そのコードだけではエラーになるところが見当たらない
大方-1を考慮してないだけとかそんなだと思うが
95 :
デフォルトの名無しさん :2008/03/23(日) 20:39:44
Vistaのデスクトップは、ctrl+マウスホイールでアイコンの大きさを 自由に変えられるけど、DelphiのListView で同じ様な表現をするには どうしたらいいんでしょうか?
>93 ItemIndexは0から始まる。該当アイテムがなければ-1だ。というか >91 だ。
>>93 いまいちよくわかってないんだけど
idx := ComboBox1.Items.IndexOf(ComboBox1.Text);
ってやればTextがItemsの何番目かがわかる。-1ならそれ以外。
>>87 onchange呼ばないでonselectでやれ。
それでキー入力はできるだろ
delphiで簡単にRSSやAtomフィード作るコンポってありますか?
MSXML
ミリ秒を時間とか分とか秒とか込みで文字列化する関数ないですか?
FormatDate
TPageControlの枠を消すにはどうしたらいいんでしょうか?
PageControl1.Style := tsButtons;
それだと無駄な余白が出来るから PageControl1.Visible := Falseにして 表示用にTabControl1配置してHeight := 20くらいにして その下にPanel配置してタブの切り替えのタイミングでで TabSheet.Parent := Panel1; TabSheet.Align := aliClient; と面倒なことをやると枠も余白も消せる。
StringGrid := [goRowSelect, goRangeSelect] として、 1〜3行目を選択後に2行目をクリックすると、選択行は2行目のみとなります これを選択範囲内をクリックした場合、新たに選択せず 選択範囲を維持するというふうにするにはどうすればいいでしょうか?
GetIndex('漢a字', 1) => 1 GetIndex('漢a字', 3) => 4 というような関数ありますか?
俺もだ。すまん、アフォでごめん。
アフォな俺にはこれぐらいしか… function GetIndex(s: String; i: Integer): Integer; begin Result := Length(AnsiLeftStr(s, i - 1)) + 1; end;
2バイトで考えた文字数目が1バイトで考えた時に何バイト字目になるかを返す関数ということでFA?
function GetIndex(Str:String; Index:Integer):Integer; begin if Str='漢a字' then begin if Index=1 then Result:=1 else Result:=4; end else Result:=0; end; 俺って天才かも!
こうか? function GetIndex( ws: WideString; index: Integer): Integer; begin Result:= Length(String(WideString(copy(ws, 1, index-1))))+1; end;
>>107 俺は読めたよ
function GetIndex(test:string;num:integer):integer;
begin
if test = '漢a字' then
begin
if num = 1 then result := 1;
if num = 3 then result := 4;
end;
end;
後は自分で工夫してくれ
115 :
デフォルトの名無しさん :2008/03/26(水) 17:47:45
> 97様、98様 お返事ありがとうございました。試してみたいのですが、来週まで 時間がとれそうもないので、まずはお礼だけさせてください。 また、よろしくお願いします。
StringList遅すぎる… Capacity多めに設定したらそこそこ改善されたけどまだまだ遅い。 Clear, Add, Stringsの列挙くらいしかやらないんだけど代替ライブラリはないものか。 MemoryStreamでも使うか。
遅いコード晒せ
MemoryStreamを引き合いに出している時点で明らかに使い方が間違っている
FastMM使ってなかったら、
>>116 はメモリマネージャ交換した方がよさそうだな。
FastMM って3年前からだよ。それまでStringListって遅かったのか?
ほんとにClear,Add,Stringsだけしか使ってない?それで遅いって、100万件ぐらい データ突っ込んでのかな。
TMemoでしたって落ち?
自分の無能さをライブラリのせいにするな
124 :
デフォルトの名無しさん :2008/03/27(木) 09:03:40
配列の宣言にpackedがついている場合を見かけますが、これ何か意味あるんですか?
メジャーになれなかった理由の一つがまさにこういった事。 比較的多用しそうな事がいまいちで滅多に使わなそうな事がすげー便利。
>>124 たとえば3バイトのメンバーを持つ構造体の配列とか?
127 :
124 :2008/03/27(木) 09:36:45
>>126 type
THoge = packed record
A: array[0..2] of Byte;
end; // 3バイトの要素を持つ構造体
THogeArray = array[0..9] of THoge;
TPackedHogeArray = packed array[0..9] of THoge;
begin
WriteLn(SizeOf(THoge)); // 3
WriteLn(SizeOf(THogeArray)); // 30
WriteLn(SizeOf(TPackedHogeArray)); // 30
end;
違いが分からないんです。
配列についているんじゃなくて、構造体についているのよ。
packedをつけないと、アライメントされるかどうかはコンパイルオプションによる。
常にpackedつけておけばOK。
>>127 packedを外してコンパイルしてみ。
129 :
124 :2008/03/27(木) 09:50:48
>>128 > packedを外してコンパイルしてみ。
TPackedHogeArrayのpackedをですか?
130 :
124 :2008/03/27(木) 09:54:58
THogeとTPackedHogeArrayのpackedを外してみましたが、 出力は変わりませんでした。 ちなみにコンパイラオプションは{$A8}です。
>>129 何が起こるか想像がつかないなら、やってみる価値はある。
132 :
131 :2008/03/27(木) 10:57:08
ごめん、勘違いしてた。 混ざらないと駄目みたい。 そうなると、packed配列は意味ありませんね。 procedure TForm1.Button1Click(Sender: TObject); type THoge1 = record A: Byte; B: Byte; C: Byte; end; THoge2 = record A: Byte; B: Byte; C: Byte; D: Word; end; begin Caption := Format('%d, %d', [SizeOf(THoge1), SizeOf(THoge2)]); end;
133 :
124 :2008/03/27(木) 11:16:28
ありがとうございます。 構造体のメンバのアラインメントは他の言語にもあるのでわかるのですが、配列のpackedは謎です。 VCLのソースの中でも配列の宣言にpackedがついていたりいなかったりで、 何か使い分けがされているような気もするのですが、挙動の違いが分からないので釈然としません。 とりあえずつけておけば問題はなさそうですが・・・
>>133 Delphiでしか使わないなら気にしない。
Vista対応ってしとく必要あんのかな
TTabControlで質問です。 タブを選択した時に、その番号に関連付けられてるオブジェクトが 条件を満たさないときはそのタブを選択させないようにするにはどうすればいいんでしょうか? OnChangingイベントでいけるかと思ったんですが これから選択しようとしているタブ番号の取得方法がわかりません。 クリックの時はマウス座標を取得する事でどうにか出来ない事もないんですが、 キーボードの時に詰まってしまいます。
Delphiクイックリファレンスによると配列のpackedは標準Pascalとの互換性のためで Delphiでは何の意味もないそうです
StrToIntをAPIで書くとしたらどうなるんですかね? SysUtilsはあまり使いたくない性分です・・・
どう考えても意味不明だろ、それ。
>>138 APIは知らんけどSystem.Val
しかしこのスレ無内容な一行レスばっかりだな。彼らは一体何がしたいのか。
>>140 こんな関数があるとは・・・
勉強になります
ありがとうございます
関数ではなくて手続きでしたね、すみません
いやだってSysUtilsは使いたくないって意味不明じゃん。ValもStrToIntも変わらないでしょ。
>>107 CharToByteIndex
なんだって。
1文字目は1バイト目から始まり、
3文字目は4バイト目から始まるって意味か。
>>138 こんなんでどうだ?(未チェック) 16進数が必要なら自分でやって。
function StrToInt(const Str: string): Integer;
var
I: Integer;
P: PChar;
Minus: Boolean;
begin
Result := 0;
Minus := False;
P := PChar(Str);
if P^ in ['+', '-'] then
begin
Minus := P^ = '-';
Inc(P);
end;
while P^ <> #0 do
begin
if not (P^ in ['0'..'9']) then raise Exception.Create('変換エラー'); // EConvertみたいなのあったかも。
Result := Result * 10 + Ord(P^) - Ord('0');
Inc(P);
end;
if Minus then Result := Result * -1;
end;
146 :
デフォルトの名無しさん :2008/03/28(金) 06:05:11
Result := Result * 10 + Ord(P^) - Ord('0'); ここおかしくない?
やべ、スレあげちまった。
123の場合、 Result := 0 * 10 + '1' - '0' → 1 Result := 1 * 10 + '2' - '0' → 12 Result := 12 * 10 + '3' - '0' → 123 であってると思うけど。
ああ、あってるね。ごめんなさい。
+,-,#0の一文字だけのとき、0になるわ。
TreeViewで特定の項目だけVisible:=Falseにできますか? または代わりの方法があれば教えてください。
Canvasにウィンドウ右上の_ □ ×ボタンをレンダリングする方法ないですか?
ビットマップで用意するとテーマの変更に追従できないので。
>>152 たぶん無理。Add/Deleteするしか。
>>153 WinAPIのDrawFrameControl
DrawFrameControlってテーマに対応してるの?
Win32APIだし、内部的にそれらのAPI使ってWindowsはウィンドウ描画してるんじゃ? てか、それぐらい自分で試せるだろ。
いや、テーマAPI別にあるから対応してねぇかも。
Win32のスレで聞きな。そっちの方が知ってる人多いと思う。
TRegExprでtr演算子の置換をするにはどうすればいいですか? たとえば「tr/abc/ABC/」見たいなのです 英語とか良く分からないしググッても出ないし・・・ よろしくお願いします
160 :
159 :2008/03/29(土) 14:48:57
今頃ですがTRegExprでなくてもDLLを使わないようなものでなければ大丈夫です
鬼車ベースのライブラリってないの?
163 :
159 :2008/03/29(土) 17:54:41
>>161 > TRegExprの使い方
これを読んでみて分かりませんでした・・・
何かサンプルをいただけないでしょうか
DirectoryListBox で、今選んでいるフォルダの深さが何階層目かを知る方法ってありますか?
それ16ビットUIの名残り。使わない方がいいよ。
>>166 そうですか、今後なるべく使わない様にします。
じゃあ、変数に入ってるパスが何階層目かを知る方法ってありますか?
デリミタの数を数えるとか
StringReplaceで\を\_にでも変換して、 長さの差を取れば\の数は分かるんじゃないのか?
\の数だけだとUNCパスで誤動作するんじゃね?
はぁ・・・Del7買ってから出来たものはボタンクリックして画像表示 それから2Dのスクロールと3Dモデルの回転のみ・・・ 変数宣言めんどくせー コンパイラ時に自動作成して後で修正させるようにしてくれりゃいいのに
173 :
167 :2008/03/30(日) 10:01:31
>>168-171 やはり文字系で処理するしかないですか
なんかディレクトリの命令であるかなと思ったんで
すいませんでした、なんとかやってみます
ありがとうございましたw
ExtractFileDriveしてExcludeTrailingPathDelimiterしつつExtractFilePathできる回数を数える
175 :
167 :2008/03/30(日) 11:19:06
>>174 あっ、そういう方法でも出来るんですね
なんか出来そうな感じがしてきました
試しにやってみます、ありがとうございましたw
>172 そういうのが苦手な人にはDelphiは向かないのかも。Delphi2007ならリファクタリングで変数宣言を 追加する機能もあるけど、ちょっと違うな。昔のVBなら変数宣言不要なモード(Option)もあった気が。
>>177 というかコンパイラって手抜きで進歩無さ杉
変数宣言なんか同じソース上に表示させる意味もなく、プロパティのように別窓か別ファイルでソート可能な表形式で管理・表示でいい
BASICでもやってろ
そもそもプログラミングに向いてない。
181 :
167 :2008/03/30(日) 14:15:03
>>176 WordDecompose.pas 頂きました
色々参考にさせていただきます、ありがとうございましたw
ありとあらゆる変数をグローバル変数で宣言しておいたらどうだろう?
>>178 IDEの恩恵しか受けたことないとこういう風に育つのか
いや、何となくわかる。変数宣言のUI。でもソース上に書くってのに 慣れてるしプログラム書いてるって感じするし、よくよく考えてみると GUI にするのってローカルだとかナンだとか面倒そうじゃん
妄想するだけでで宣言文を書けたらいいのにね。 それは冗談として、アドインで作れないの?
GUIで表示や追加くらいなら作れると思うが、 そんなので喜ぶのは初心者だけだし、 そういうのを作れるレベルの人は逆に生産性下がって不要なので 結果として誰も作らないってことになってるんじゃないかと
187 :
デフォルトの名無しさん :2008/03/31(月) 00:39:57
SpeedButtonみたいなのがいくつか5個くらい並んでて、一つは常にへっこんでて、一つを押すと他の全部が上がるってタイプのボタンはどうやってるんですか?
SpeedButtonをグループ化するんだ
189 :
デフォルトの名無しさん :2008/03/31(月) 00:54:37
できました。 どうもありがとう!
データベースでBlobに入っているバイナリファイルを少しずつダウンロード したいのですが、良い方法はないでしょうか? 現在TBlobStream.CreateでそのStreamから少しずつ読み込んでいるのですが、 Createメソッドを実行した時点ですべてのデータを読み込んでいるようです。 要は少しずつReadしてプログレスバーにその状況を表示したいのです。 上の方法だとCreateを呼んだところでプログラムが一次停止したようになってしまいます。
それについて深く考えたことない事を始めに断っておくけど、 昔調べた記憶と今、ちょっとソース見た感じだと、少なくとも新しい独自のBlobStreamクラスと それを返すようにADOならTCustomADODataSet,dbExpressならTCustomSQLDataSetの CreateBlobStreamメソッドをオーバーライドして独自BlobStreamを返すようにしないと 厳しそうだな。
まぁ、読み込むBlobの最大サイズは設定できるようだから、それを設定して、 一次停止したようになるのを避けることはできる。根本的な解決ではないが。 それが嫌なら上記の方法以外ぱっと思いつかない。
d6perなんですがdialog.pasがC:\Program Files\Borland\Delphi6\Source\Vclに存在しません・・・ ちょっと修正したい箇所があるのですが誰かうpしていただけないでしょうか?
そのためのプロ版だ。プロ買え。
DBGrid1のOnDrawColumnCellで、DBGrid1の上にUpDownを描くやり方で、UpDownでフィールドの値を変えることにチャレンジしています。 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin // DBGridをFColorDBGrid1とFColorDBGrid2の縞々にする。 if not (gdSelected in State) then begin if Table1.RecNo mod 2=0 then begin DBGrid1.Canvas.Brush.Color := FColorDBGrid1; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end else begin DBGrid1.Canvas.Brush.Color := FColorDBGrid2; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end;
// UpDownの描画 fView := False; if gdSelected in State then with DBGrid1 do if SelectedField is TIntegerField then with TIntegerField(SelectedField) do begin if Table1.Active then updownDBGridInt.Position := Table1.FieldByName('Int').AsInteger; fView := true; end; updownDBGridInt.Visible := fView; if updownDBGridInt.Visible then if not CompareMem(@oldRect, @Rect, Sizeof(Rect)) then with Rect do begin updownDBGridInt.Top := Top; updownDBGridInt.Left := Left; updownDBGridInt.Height := Bottom - Top; end; end;
// updownDBGridIntのOnChangingEx procedure TForm1.updownDBGridIntChangingEx(Sender: TObject; var AllowChange: Boolean; NewValue: Smallint; Direction: TUpDownDirection); begin if (Table1.Active=true) and (0<Table1.RecordCount) then begin if not fView then exit; AllowChange := DBGrid1.SelectedField.CanModify; if AllowChange then begin with DBGrid1 do if SelectedField is TIntegerField then with TIntegerField(SelectedField) do begin //Table1.DisableControls; Table1.Edit; Table1.FieldByName('Int').AsInteger := updownDBGridInt.Position; Table1.Post; DBGrid1.Refresh; //Table1.EnableControls; end; end; end; end; こうすると、Tableにフィルターをかけてないときは、値の増減ができ、うまくいくのですが、フィルターをかけた場合、UpDownを増減すると、カレントレコードが先頭にいったり、最後にいったり(updownDBGridIntもそれにあわせて移動します)増減できなくなってしまいます。 一般的な話でなくて申し訳ないですが、原因のわかる方いらっしゃいませんか?
writelnで出力した文字列を 一段上に戻って再度上書きして 進行状況を表示したいんですがどうやればいいですか?
戻るくらいなら最初から改行するなよ
Writelnの代わりにWriteで書いてバックスペース(#8)?
APIなどで代替出来ないのでしょうか
TurboDelphi(ソース付き)をダウンロードしてPopupParentの実装を調べればいいんじゃね?
206 :
195 :2008/04/01(火) 23:52:21
すみません。 // DBGridをFColorDBGrid1とFColorDBGrid2の縞々にする。 以下の1ブロックは必要ないですね。 削除したのを1から載せるとまたクドくなるのでこれで許してくれませんか?
ぜんぜんわからんわ。 UpDownコントロールをDBGridのセルの上に置いて、値を変えられるようにしたいみたいだけど。 withで間違えているのかな。
208 :
201 :2008/04/02(水) 06:22:50
209 :
195 :2008/04/02(水) 09:05:58
FilterをONにしなければ、いけるんですが、もう少しいじってみます。
if a and b then という場合必ずaから評価される保証はありますか?
はいえ マジレスすると完全評価にした場合のことは知らん
212 :
195 :2008/04/03(木) 16:34:43
StringList1: TStringList; が持っている情報量をbyteで知るにはどうしたらいいんでしょうか?
言語ガイドの記述を読むと完全評価の場合は評価順序に関する記述はありませんね。
>>210 Delphiでは論理演算子andやorでつながった式については
デフォルトではショートサーキット評価といって
左から順に評価して式全体の値が確定した時点でそこで評価を打ち切ってしまいます。
> if a and b then
だとaの値がFalseなら式全体の値はbの値に関係なくFalseになりますからここで評価を打ち切ります。
つまりbの評価は行われません。
完全評価でコンパイルさせるとすべてを評価することが保証されますが
順序に関する記述が一切無いので記述と異なる順序で評価される可能性があります。
>>212 Createの前後でメモリを空き容量を数えるww
>>212 Length(StringList.Text) + StringList.InstanceSize とか
216 :
212 :2008/04/03(木) 18:54:09
ごめんなさい、説明不足でした。 もってるTextの情報量だけ欲しくて、だから、単にLength(StringList1.Text)+1でいいですよね?
以前このスレで、画面の切り替えにPageControlを使うアイデアがありました。 ワタシ今までずっと、たくさんのフォームを作って画面切り替えをしてきたの ですが、今回、PageControl方式でやってみました。最初は良かったのですが、 ページが増えるにつれメインフォームに無茶苦茶たくさんのコンポーネントと そのイベントなどが集中してしまい、かなり混乱してきています。 皆様はどのように整理してやってるのでしょうか。
まさにそのためにFrameが用意されている。 Panelのような感じでフォームに貼り付けられて 設計時には個々の独立したフォームのように扱えるから綺麗にコードがばらせる。 ListBox/ListViewなんかのわりに処理がたくさん入るようなコンポーネント単位で独立させていってもいいし。
フレームは以前チャレンジしたことがありまして、ただそのときは設計時に 貼り付けた先を更新してしまってdfmファイルを直して戻したり、イベント 関連で不都合があったり、何やかやで結構痛いめにあった記憶がありまして (すっかり忘れてますが…)避けてきたのですが、うまく使えば画面切り替え には一番使えるモノなのかですか。あぁ結構アタマ混乱気味です。
別フォームで設計しておいて、そのフォームに貼り付けたコンポーネントの 全部のオーナを変更してしまうとか フォームのままManualDockで貼り付けてしまうとか
>>219 そういえば設計時に埋め込むと
>ただそのときは設計時に
>貼り付けた先を更新してしまってdfmファイルを直して戻したり
に絡んだエラーだか警告だかのダイアログがでまくってたような。
なので自分は設計時には埋め込まずFormCreateで
Frame1 := TFrame1.Create(Panel1);
Frame1.Parent := Panel1;
Frame1.Align := alClient;
と動的に作るようにしてる。
あとFormのOnCreate/OnDestroy/OnShow/OnHide
に相当するイベントハンドラがないのも不便なので
TFrameを継承して
DoCreate/DoDestroy/DoShow/DoHide
といったイベントハンドラもどきのvirtual procedureを持ったTFrameExを作って
更に子にFrameExのインスタンスがあったらそのもどきのメソッドを
適切なタイミングで呼び出すをTFormExもつくって使ってる。
言われてみればだいぶクセのある機能ではあるなぁw
それでも他にいい代替案がないんでずっとこの方式。
動的にタブを生成廃棄するメモやブラウザタイプのアプリを作るときにもかなり自然に使えるしね。
自分的には他にイベント関連等目立った問題はあまりないと思う。
十分めんどくさいなぁ、それ。しかし、そんな感じになるんだろうなぁ。
>216 いいけど、いいのか?Textプロパティを参照するとStrings[]の内容をCR+LF付で連結した文字列が 一時的にだが生成されるんだけど。それにCR+LFの分が計算に入ってるけど? それにStrings[]に同一内容同一起源のデータがあると同一の領域に格納されていてデータサイズとしては 1つ分しか消費していない、という状況をどう考えるか、とか。 要は無理ってことだが。
224 :
デフォルトの名無しさん :2008/04/04(金) 07:20:49
TBitmap.PixelFormat に pfDevice をセットしたら、自動的に HandleType は bmDDB になるのだろうか? TBitmap.PixelFormat に pf24bit をセットしたら、自動的に HandleType は bmDIB になるのだろうか? TBitmap.HandleType に bmDDB をセットしたら、自動的に PixelFormat は pfDevice になるのだろうか? TBitmap.HandleType に bmDIB をセットしたら、自動的に PixelFormat は pf24bit になるのだろうか?
ソース嫁。
?
ごめん
>>220 はオーナーじゃなくて親だった。
procedure SetParentFromForm(dst,src:TWinControl );
var i:Integer;
begin
for i:=src.ControlCount-1 Downto 0 do
src.Controls[i].Parent:=dst;
end;
という関数を作って、
SetParentFromForm(Panel1,Form2);
のように行う
切り替える時は、
SetParentFromForm(Form2,Panel1);
として戻してやる。
オーナーが切り替わってるだけだから、ボタン類は元のフォームのイベントとして呼ばれる
228 :
デフォルトの名無しさん :2008/04/04(金) 14:44:17
String型の''やポインタ型のnilに相当するChar型の表現ってありますか? 例えば、String型の変数であるstrに'ABC'という文字列が入っていたとして、 一文字削って'AB'としたい場合、 str[3] := ''; // これではエラーになりますが… のようにしたいです。
SetLength(str, 2) str := Copy(str, 1, 2) str[3] := #0 or Chr(0) が直接の回答だけどおそらく望んでいる動作とは異なり 'AB'#0 という3文字の文字列になってしまう。 PCharに渡すなら問題ないけど。
その他 str := LeftStr(str, 2); Delete(str, 3, 1);
231 :
228 :2008/04/04(金) 15:03:14
>>229 素早いご回答をありがとうございます。
実は、str[1]に空文字を代入して'ABC'→'BC'とするなど、
色々できたらと思ったのですが、
やはりString型として処理した方がよさそうですね。
(そもそもString型の中身について理解していないのが問題ですが...)
それなら delete(str,1,1) でいいと思うけどな c言語の文字列はゼロ値終端で扱われる。 pascalの文字列は 構造体になっていて文字のサイズ情報を持っている。 だから値#0を含む文字も含む事が出来る。 DelphiはC言語との連携が楽なように、PCharとpascal文字列の型変換が出来るように工夫されている たとえば s:=PChar(s); と書くと、sの中から#0までの長さに自動調整される。 だから delete(str,1,1)を str :=PChar(str)+1 ; と書くことも出来る
233 :
228 :2008/04/04(金) 16:01:13
>>232 delete関数、知りませんでした…。
その他もとても勉強になります。ありがとうございました。m(__)m
234 :
デフォルトの名無しさん :2008/04/04(金) 16:13:39
こんにちは、Delphiのインラインアセンブラについて質問があります。 Python for Delphi(P4D)のコンポーネントのソースを見ているのですが、 > mov eax, Self > mov eax, [eax].DLL_PyArg_ParseTuple の [eax].DLL_PyArg_ParseTuple とはどういう意味なのでしょうか? eax + DLL_PyArg_ParseTuple であってますでしょうか
>>234 はいな
const hoge=3;
mov eax, [eax].hoge は mov eax, [eax+3] と同じ
そういう時は、実行して、そこで止めてCPU窓を開くと逆アセ表示するからわかるよ
236 :
デフォルトの名無しさん :2008/04/04(金) 21:24:48
StretchDrawで画像を縮小するとかなり画像が劣化するのですが、 たとえば、1/2とか特定の縮小率にすればいいとか何かいい方法は ないでしょうか? Tbitmapを印刷するのに、StretchDLBitsを使う方法はDelphi Tipsで見つけたの ですが、画面上でも使えますか?
こんばんは、旧バージョンについて教えてください。 サンプルでDelPhi5のソース等をもらったのですが DelPhi5 というのはもう手に入らないのでしょうか? 現在提供されている無償版が6で5とは互換性がないと どこかに書いてあったのでDelPhi5を手に入れる方法を ご存知なら情報をお願いします。
239 :
デフォルトの名無しさん :2008/04/05(土) 00:25:14
>>235 レスサンクス!
> そういう時は、実行して、そこで止めてCPU窓を開くと逆アセ表示するからわかるよ
おお!その手があったか
241 :
デフォルトの名無しさん :2008/04/05(土) 00:26:52
>>238 Delphi5のソースは大体、上のバージョンで通るから大丈夫。
通らなかったら、ここに聞きに来な
>>240-241 ありがとうございます。6でコンパイルしてみます。
エラーがどうしても解消できなかったら
また質問に来るのでよろしくお願いします。
243 :
デフォルトの名無しさん :2008/04/05(土) 05:59:25
> 237,240 ありがとうございました。さっそく、DHGLを試してみます。 Delphi Graphic Secretsはどこでも販売してなくて Amazonでは中古を9800円で販売していましたが、今、みたら 4000円だったのでさっそく購入してみます。 もしDHGLがうまくいかなかったら、ご紹介いただいたGDI+も 挑戦してみたいと思います。 本当にありがとうございました。
きれいに画像を縮小したいだけだったら、DHGLを使うのに本を買う必要はないです。
245 :
デフォルトの名無しさん :2008/04/05(土) 15:18:51
ボタンクリックで即休止状態にしたいです。 新規プロジェクト(VCL Formアプリケーション)のフォームに配置したボタンに procedure TForm1.Button1Click(Sender: TObject); begin SetSystemPowerState(False,True) end; と書いてコンパイルしただけでは、実行してボタンクリックしても 見た目は無反応でした。何かコードが不足しているのでしょうか・・・? Windows XP SP2です。 ご存じの方いらっしゃいましたら、 すみませんが、よろしくお願いいたします。
>245
ttp://msdn2.microsoft.com/en-us/library/aa373206 (VS.85).aspx
Remarks
The calling process must have the SE_SHUTDOWN_NAME privilege. To enable
the SE_SHUTDOWN_NAME privilege, use the AdjustTokenPrivileges function.
For more information, see Changing Privileges in a Token.
248 :
デフォルトの名無しさん :2008/04/05(土) 21:00:23
delphi経験一週間の者です。 配列を2つ作って、 両者の要素をコピーし合いたいんですが、 上手くいきません。 値のコピーをしたいのですが、 アドレスがコピーされてる模様。 Delphi7で、配列の値をコピーする 方法をご教示ください。
配列に値入れてコピーしたらアドレスになるってどういう事?意味がわからない
なぜ、うまくいかないコードを示さないのだろう?
>>248 b := a; // アドレスのコピー
b := Copy(a, 0, Length(a)); // 値のコピー
SetLength(b, Length(a)); Move(a[0], b[0], SizeOf({要素の型}) * Length(a)); // 値のコピー
文字列の場合は t := s; とすると、s の文字列をコピーした振りをしてくれる(COW: Copy-On-Write)。
252 :
245 :2008/04/06(日) 01:35:00
なんで246を読んで試さないの?
面倒だからです
246のサンプルが252じゃねの
>252 ん〜そこのサンプルソースでうまくいかないのであれば、それぞれの関数の戻値をチェックしてエラーが起きていないか、 そのときのGetLastErrorの値はどうなっているか、あたりを調べてみて。Win32Check関数とかお勧め。 それとこの手の質問をするときはうまくいかない環境のOSやバージョン、他のOSでの状況なども明示すること。
XP SP2ゆうてるじゃん
258 :
デフォルトの名無しさん :2008/04/06(日) 18:47:46
> 247 ありがとうございました。DHGLでうまくいったので、今のところは 必要ないのですが、いきずまったら試してみます。 ありがとうございました。
260 :
デフォルトの名無しさん :2008/04/07(月) 12:49:15
いつも、いつもすみませんが、教えてください。 RadioGroup1で 例えば、0:犬 1:豚とあり、初期に0:犬をマークしているようになっていると します。で、豚を選択したときは、RadioGroup1で、OnEnterでイベントを検出して Procedure TFrom1.RadioGroup1Eneter(Sender:TObject) begin Label1.caption:='pig'; end; でうまくLabelにpigを出せるのですが、 RadioGroup1で0:犬、1:豚、2:魚として初期に0:犬をマークしているとします。 で、豚か魚をマークした時に Procedure TForm1.RadioGroupEvent(sender:TObject) Case Radiogroup1.ItemIndex of 1:label1.caption:='pig'; 2:label1.caption:='fish'; end;end; ではLabelに何も表示されません。何かいい知恵はないでしょうか?
OnClick
262 :
デフォルトの名無しさん :2008/04/07(月) 13:45:16
あれー、OnClickは試して駄目だったのですが 今するとちゃんとできます。なぜだんたんだろう?? なにはともわれありがとうございました。
ComboBoxのドロップダウンの長さを長くするにはどうすればいいんでしょうか?
DropDownCount
>>264 ありがとです♪
今度からはヘルプ読もうねボク
>>221 フレームにOnCreateやOnDestroyはありませんが
コンストラクタやデストラクタをオーバーライドすればたいていのことはできると思います。
(この方法はDelphi 4(5かも)以降のフォームやデータモジュールでも使えます)
ただ各画面に共通する機能は1カ所に書く方がよいので
私も共通の基本フレームクラスを作って各画面のフレームはそこから派生させています。
画面がいくつもあるアプリなんか作ってしまうとフレームのありがたさが身にしみてきます。
>>267 む〜そんなんですか。画面たくさんのアプリじゃあ、フレームなのかな。
PageContorolじゃ無理あるかも(以前に質問したモノですが)
どう実装するか全然ピンと来ないですが、参考となるサイトか参考書など
ありましたら教えてもらえますでしょうか。
ComboBoxのドロップダウンの幅を広くするにはどうすればいいんでしょうか?
CB_SETDROPPEDWIDTH を窓ハンドルに送ってやる。 こんな感じ ComboBox1.Perform(CB_SETDROPPEDWIDTH,300,0);
>>268 普通にフォームに書いて設計しておくのではどうして駄目なの?
似たような配置で画面遷移で一部だけ変わるような場合も
フォームの継承使えば簡単だし
パラレルポートからパルスを出力したいのですが どうすれば可能でしょうか。 パルス幅の設定とON、OFFスイッチを設け ONしている間だけ設定値のパルス幅で出力し続けるという 感じで行きたいのですが。。。
>>274 ありがとうございます。
時間制御ですが、ひとまずプログラム上でお約束できれば
良しとしようと思います。
マイクロ秒タイマーのコンポーネントとか使ってみよう
TMemoベース(でなくてもいいけど)のコマンドプロンプトのコンポーネントってないですか? cmdなり任意のコマンドラインツールを対話的に実行できるものです。
コマンドプロンプトを使った方が遥かに楽な気がする
自分のアプリに埋め込みたいんだろ
メモ帳で、Enterを押したらその行を解析して実行するのはどぉ?
改行は?
失礼します。 iniファイルを実行ファイルのフォルダじゃなくて、 ホームディレクトリに置きたいのですが、 どうすればよいのでしょうか。今は下のコードです。 IniFile := TIniFile.Create(extractFilePath(paramstr(0))+'test.ini'); 実行ファイルは同じだけど、iniは各個人で持ちたい。
>>282 function GetMyIniFolderName: string;
var
uName: string;
nSize: DWORD;
begin
nSize := 4000;
SetLength(uName, nSize + 4);
if GetUserName( PChar(uName), nSize) then begin
SetLength(uName,nSize-1);
end else uName := 'non';
Result := ChangeFileExt(paramstr(0) ,'' )+ '@'+uName+'.ini';
end;
実行ファイルのフォルダで "実行ファイル名@ユーザー名.ini" という感じで作る
IniFile := TIniFile.Create( GetMyIniFolderName() );
GetEnvironmentVariableで環境変数取る手もあるな。
APPDATA=C:\Documents and Settings\UserName\Application Data
USERPROFILE=C:\Documents and Settings\UserName
>>283 のマイドキュメント/AppName/AppName.iniあたりに作るのが最も無難。
>>283 >でも、実行ファイルのあるフォルダにユーザー命のフォルダを掘ってアクセスする方がいいと思うよ。
小物フリーウェアではお手軽便利なやり方で長年使われてたけど、あまりよいやり方じゃないよ。
これが横行したのがPowerUser常用が強要されてXPのセキュリティがグダグダになった一因だし。
一長一短にしても今更推奨はできない。
とりあえず実行ファイルのフォルダに作ってみて作れなかったらマイドキュメントでいいと思うけどな
2つのStringListを同期させるにはどうすればいいんでしょう たとえばStringListをソートした時にStringListBをAと同じように並べ替えたいのです
Textを全部コピーしたら。代入じゃなく。
中身は違うものなんだよね? Objects の方にインデックスかポインタを無理やり入れておいたらどう?
>>288 ,289
ありがとうございます
>288
2つのStringListは全く違うものなので使えなさそうです
>>289 Objectsというプロパティに触ったことがないのでよく分かりません
もう少し詳しくお願いできますか?
291 :
287 :2008/04/10(木) 10:43:59
>>289 の通りにやってみたらできました!
ありがとうございました
synapse の imap クライアントを使って、gmail (imap有効済) に imap で接続しようとしていますが 接続に失敗(エラー: 10091)してしまいます 設定など足りないところがありますでしょうか? uses imapsend; ------------------- with TIMAPSend.Create do try TargetHost := 'imap.gmail.com'; TargetPort := '993'; UserName := '***@gmail.com'; Password := '***'; Timeout := 5000; FullSSL := True; if Login then begin Caption := 'OK'; Logout; end else begin Caption := 'NG'; end; finally Free; end; -------------------
ComboBoxでドロップダウンした時だけ違う文字列を表示できる?
OnDropDownで combobox.items.commatext := 'a,b,c'; って話か?
295 :
293 :2008/04/10(木) 11:35:11
>>294 ドロップダウン閉じた時にどうやって元に戻せばいい?
296 :
292 :2008/04/10(木) 14:48:11
自己解決しました synapse の imap クライアントは、ソースを追ってみると SSLが実装されてないような... Indy の TIdIMAP4 の IOHandler に TIdSSLIOHandlerSocketOpenSSL を入れて、 UseTLS := utUseImplicitTLS 、下記のコードで接続OKでした ------------- with IdIMAP41 do begin Host := 'imap.gmail.com'; Port := 993; ConnectTimeout := 3000; Username := '***@gmail.com'; Password := '***'; if Connect then begin Caption := 'OK'; Disconnect; end else begin Caption := 'NG'; end; end; -------------
297 :
デフォルトの名無しさん :2008/04/10(木) 16:48:17
DateTimeToStrについて教えて下さい。 DateTimeToStrは、ロケールを意識して文字列にしてくれますが、 グリニッジ標準の文字を取得するにはどうすればよいのでしょう? さらに、夏時間とか絡んでくると、わけわからなくなりますが、 夏時間とかいうのもVCLのどこかに規定されているのでしょうか?
>>282 普通のアプリと同じように「ローカルアプリケーションフォルダ」に入れるのがよいのではないでしょうか。
usesにShlObjを追加して…
{ 現在のユーザーアカウントの「ローカルアプリケーションフォルダ」のパスを返す.}
function GetLocalAppDataPath: string;
var buf: array [0..MAX_PATH] of char;
begin
SHGetSpecialFolderPath(0, buf, CSIDL_LOCAL_APPDATA, False);
Result := buf;
end;
{ 現在のユーザーアカウント名を返す.}
function GetCurrentUserName: string;
var
buf: array [0..MAX_PATH] of char;
size: dword;
begin
size := MAX_PATH;
GetUserName(buf, size);
Result := buf;
end;
{ 実行例 }
procedure TForm1.ShowAppDataPathActionExecute(Sender: TObject);
var Path: string;
begin
if LabeledEdit_CompanyName.Text = '' then raise Exception.Create('社名はちゃんと入れろよ!');
if LabeledEdit_AppName.Text = '' then raise Exception.Create('アプリ名もちゃんと入れろよ!');
Path := GetLocalAppDataPath + '\' + LabeledEdit_CompanyName.Text + '\' + LabeledEdit_AppName.Text;
ShowMessageFmt('このパソコンの場合,ユーザー%sの設定ファイルは'#13#13'%s'#13#13'の下に保存すべきじゃ',
[GetCurrentUserName, Path]);
end;
・ショートカットキーで起動 ・ショートカットを登録 このような単純な機能を持つデスクトップランチャーを、Delphiノータッチの人間が作ろうとしたらどれ位時間がかかりますか? 作成に掛かる時間…というよりも、ランチャー作成自体の難易度がどのようなものか教えていただけると幸いです C、Java、アセンブラは初歩を嗜んだ程度です
300 :
297 :2008/04/10(木) 18:49:15
ヘルプ検索してみましたが、 Delphiってグリニッジ時間の文字列を作りだすメソッド無いんですね。
>>299 Delphiはじめて二番目に作ったのがランチャだった
確か一日一〜二時間やって一ヶ月くらいで使えるものにはなったと思う
その後使い込んでいくウチにバグ取りや機能追加で現在に至る
人に配れるレベルになったのは半年目くらいか(配っとらんが)
おれはCもなんも知らない状態で入門書とBBSフォーラムの情報だけだった
いまはグーグル先生もいるし質問先もたくさんあるから
あとはモチベーション次第なんぢゃね?
303 :
301 :2008/04/10(木) 23:15:33
>>299 C#の初心者すれでもマルチポストしたのか
Delphiやってみたいってわけではなかったんだ
●rz
304 :
282 :2008/04/10(木) 23:28:47
遅レスすみません。 >298のコードを使わせていただきました。 いくつかアイデアをもらって心に感じるものがありました。 ありがとう。
>300 日付時刻の扱いについて。TDateTime型はローカル、DST、UTC等の配慮は含まれていない。 よってこれらの配慮を要する場合はTSystemTime構造体を使用してGetLocalTimeまたは GetSystemTime(いずれもWin32API)で取得し、これをSystemTimeToDateTimeで TDateTimeに変換して使用する必要がある。またDSTについてはWindowsの実装がナニなので (基本的に今現在のDSTの適用状況しか信用できず、たとえば数年前の特定の日付における DSTの適用状況はわからない)、自前で実装する必要がある。
306 :
300 :2008/04/11(金) 09:10:00
thx!
>>305 現在の時間だけで良いので、OKです。
つまり、グリニッジ時間を知りたければ、TDateTimeは使えなくて、Win32に頼るってことですね。
Delphiを勉強するにあたってお勧めの本を教えてください C, C++, Javaで開発をしたことがあります
ぺったん。ぺったん。
つるぺったん。
>>301 >>303 あ、いや、C#スレでDelphiをオススメされたんでこっち来ました
ありがとうございます。半年ならちょっとやってみたいです
この言語で作ってみたいと思ってます
近場の書店巡ってもCだのJavaだのHTMLだのの教本しか置いて無かったです
Amazonを見てみたら評価の高い教本はあるものの、中古で異常な価格のモノばかりでした
何か初心者オススメの本は無いですか?
Webで資料もみますが、とりあえず1冊は教本を持っておきたいと考えています
今から始めるなら迷うまでもなくC#だろ・・・
>>311 IDEから文法までのを一通り説明してあるやつで
Turbo Delphiか2005用のを買っといたら。
Delphi 2005 プログラミングテクニック Vol.1入門編が無難な感じ。
シリーズ化されてて興味のある分野のものを買いたせるし。
315 :
デフォルトの名無しさん :2008/04/12(土) 11:08:06
Turbo Delphi無料版でアプリを作りたいのですが、 ソースを難読化するツールってありますか?
しんぱいしなくても
>>315 のソースはきっと読みづらい。
.NETならともかくWin32でビルドしたら 逆アセンブルしか手がないからそんなに心配することもない。
318 :
315 :2008/04/12(土) 14:21:40
>>316 コメントでバレそうです。
>>317 DEDEなるデコンパイルソフトがあるらしいのですが、大丈夫でしょうか?
コメント・・
>>315 まずはどういう動機でどういうレベルの誰から何を守りたいのかをはっきりさせよう。
フォームに乗せなきゃソース見れないだろ
322 :
315 :2008/04/12(土) 15:26:27
>>320 例えば姓名判断や競馬の予想のような、
条件を入力すると、ある専門知識に基づいた計算結果が返ってくるソフトを考えています。
バレたくないのは、その結果を算出する際のアルゴリズムやデータです。
すぐに解析されてしまうということは、
せっかく苦労してアルゴリズムやデータを作成しても、
簡単にコピー(改良版)が作られる可能性があるわけですから、躊躇しています。
dedeで生成したソースを読めるような奴はそうそういないと思うが、もしいたら諦めるしかない
なんか特殊な方法で圧縮するとかそんな感じにしなきゃ無理な気がする
まぁその前に
>>315 が作るツールにそこまでしてソースを見るほどの価値があるかどうかの方が重要だが
一応antiDeDeとかもあるけどね FindWindowでDeDeにWM_CLOSE投げるだけだけど
325 :
315 :2008/04/12(土) 16:30:52
>>323 >dedeで生成したソースを読めるような奴はそうそういないと思うが、もしいたら諦めるしかない
実はdedeの詳細を分かっていなかったのですが、それなら安心です。
シェアウェア作家や商用アプリを作ってる方も、
特に気にしていないということですかね。
>>324 ありがとうございます。参考になります。
遅いのは1byteずつ読んでいるから。 ある程度の大きさのバッファを用意して、 ReadではなくBlockReadでバッファ長のバイト数を読み込むようにする。 「BlockRead」をヘルプで引くかで、ゴーグレッドれば、サンプルが出てくる。
生成した8個のTShapeのVisibleをFalseにしたりTrueにしたりするところで とても時間が掛かっている(1秒くらい)のですが、原因がさっぱり分かりません。 このような問題が出た方いますか。
再現するコード晒せ
TShapeなんて使ったことないけど 他のコントロールの再描画が発生して重いイベントハンドラが呼ばれているのかも。 プロジェクトオプションのコンパイラのデバッグ版DCUにチェックして再構築して 再描画中に固まるタイミングで一時停止してみたら。
>>329 普通に新規で最低限のコードだと再現しないんです。
>>330 ありがとうございます。一時停止はタイミングが難しくてなかなか
思うようにいかないし何回もやってるうちにWindowsが固まるし…
再描画の他のコントロールのイベントは見てなかったのでチェックしてみます。
332 :
デフォルトの名無しさん :2008/04/12(土) 20:17:28
DICOMをDelphiで勉強しようと思ってopen sourceであるezDICOMを見ているので すが、childwin.pasで const gMouseDown : boolean = false; とあり、その以降で gMouseDown := true; となっていて、エラーがでて代入できない左辺値ですと表示されます。 constだからそういうエラーになるのですか?もしそうなら あまり当てにしてはならないコードと判断すべきなのでしょうか?
328ですが、やっぱり分からないです。描画関連のイベントでデバッグ用の TMemoに出力するようにしたのですが、Visible := True; の前には表示 されません。困ったです。デバッグの良いアイデアか疑うべき点など ありますでしょうか。
>332 constへの代入はコンパイルオプションにより可能なこともある。
いやだからソースどっかにあげろよ
>333 TShapeやTLabelのようなグラフィックコントロールの描画はコンテナの描画から呼び出される。 というわけでコンテナのPaintを起点に追うと何かわかるかも。
Delphiはいい加減標準でプロファイラつけろよな
>>333 プロジェクトのバックアップとってデバッグ用のコード仕込みまくって
いじりまくってブレーク張りまくって根性でステップ実行しまくる。
339 :
デフォルトの名無しさん :2008/04/12(土) 21:29:28
>>332 「型付き定数への代入」というやつです。
初期のDelphiコンパイラではデフォルトで有効になっていたのですが
途中からデフォルトで無効になりました。
プロジェクト設定の「コンパイラ」設定で有効にするのが手っ取り早い対処法ですが
型付き定数限定とはいえ定数の値を任意に変えられてしまうのはバグの元ですから避けるべきです。
(デフォルトが禁止になったのもバグ回避と思われます)
そのソースファイルの先頭に「型付き定数への代入」を有効にするコンパイラ指令 {$J+} を埋め込むのが良いでしょう。
>>327 ものすごく遅くなってしまいましたがやってみます
ありがとうございました
342 :
デフォルトの名無しさん :2008/04/13(日) 00:05:13
>>315 誰もおまい見たいなレベルの実行ファイルを解析したりしないよw
343 :
デフォルトの名無しさん :2008/04/13(日) 07:26:17
> 340 ありがとうございました。おかげさまで無事、コンパイルでき動くようになりました。 これで解析がはかどります。本当にありがとうございました。
>>342 「ある専門知識に基づいた計算結果」を求めてダウンロードするってことは、
少なくともその内容に関心があるってことでしょ
コーディングの巧拙は関係なし
まあ専門知識を持たないおまいには分からないだろうけどw
>>315 CGIにしたらどう? サーバ側で計算すればいい。
>345 サーバーをハッキングされる可能性があるのでは?
まだ引っ張るの?
SJIS最速の正規表現ライブラリってどれ?
鬼車をobjのLinkで使う。。。とかかな? WinAPI使ってないから改造しないと曖昧検索(同形異区の文字や 全角大小文字の一致とか、)の挙動がWSHとかと違うと思ったけど
>>346 泥棒にPC盗まれる可能性も考えれば、
アルゴリズムは暗記して、そのつど出向いて計算してあげたらよさそう。
定数を const HAIRETU: Array[0..10] of String = ('a','b','c','d','e','f','g','h','i','j','k'); HAIRETU: Array[100..110] of String = ('z','y','x','w','v','u','t','s','r','q','p'); のように離れて宣言することは出来るのでしょうか?
別unitに分けるなら出来るよ。 アクセスするときは ユニット名.HAIRETU[4] のようにアクセスする。
無理
354 :
351 :2008/04/14(月) 18:52:37
遅くなりましたがありがとうございました 変数でやる時には配列に一気に追加する方法はあるのでしょうか?
Delphiに疎な配列がないのできれいに書くのは難しい。 const HAIRETU: array[0..110] of PChar = ('a','b','c','d','e','f','g','h','i','j','k', nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 'z','y','x','w','v','u','t','s','r','q','p'); if HAIRETU[4] <> nil then ShowMessage(HAIRETU[4]); const HAIRETU: array [0..2] of record n: Integer; v: String; end = ( (n:0; v:'a'), (n:1; v:'b'), (n:100; v:'z') ); for i := 0 to 2 do if HAIRETU[i].n = 1 then ShowMessage(HAIRETU[i].v); HAIRETU := TStringList.Create; HAIRETU.Values['0'] = 'a'; HAIRETU.Values['1'] = 'b'; HAIRETU.Values['100'] = 'z'; ShowMessage(Hairetu.Values['0'])
関数を作ってみた procedure StrToArray(var Hairetu: array of string; Start: Integer; Args: array of string); var I: Integer; begin I := Length(Args) -1; while (I >= 0) do begin Hairetu[I + Start] := Args[I]; Dec(I); end; end; // ----------------- // StrToArray(HAIRETU, 0, ['a','b','c','d','e','f','g','h','i','j','k']); StrToArray(HAIRETU, 100, ['z','y','x','w','v','u','t','s','r','q','p']);
357 :
デフォルトの名無しさん :2008/04/15(火) 14:18:16
IMEのON、Offの仕方。 IMEの現在の状態を監視するには、なんと入力すればいいか教えてください。 ネット検索したんですが、使い方がよくわかりませんでした。
ImmなんちゃらってAPIだったっけかな
359 :
デフォルトの名無しさん :2008/04/15(火) 14:46:32
>>358 ありがとうございます。
それの具体的な使い方がわからなくて・・・。
私なんて、現在IMEがONかどうかを調べることすら出来なかったよ!。
Delphi5で商用利用できるフリーのXMLのクラスライブラリってないかな?
Delphi Personal version6 を使ってるんですが 自分で作ったソフトを公開する時に気をつけることってありますか コンパイラオプションを変えたりとか、そういう事するもんなんでしょうか?
Xp スタイルに対応したか? Vista 対策はOK? くらいかな。
>357 ImeModeプロパティじゃだめなん?
皆さんエディタとか何使ってますか。 beginとendを強調表示とかしてくれるエディタとかありませんかね。
サクラエディタとか。
EmEditor は、Delphi の予約語を強調表示できるよ。
IDEか秀丸だな。
すみません、質問です。 TWebBrowser で表示しているWebページの高さを OleObject.document.body.scrollheight から取得しているのですが、 どうも正確な値がとれていない時があるようです。 うまくいく場合のあるのですが、 Google 検索結果ページでの、scrollheight の値が 明らかにこっちが想定している値と違うのです。 何か心当たりがある方いらっしゃいましたら、 教えていただけたら助かります! #スクロールバー分は考慮してます。
>>370 ブラウザ内部のサイズより、HTML描画された内容が小さい場合とか?
372 :
デフォルトの名無しさん :2008/04/16(水) 09:21:58
メインメニュー・コンポーネントについて質問です。 大見出し ├小見出し1 ├小見出し2 ├小見出し3 ・・・ という構成のメニューがあったとして、 小見出しを「配列」で一括管理することはできるのでしょうか? 各小見出しのオブジェクトインスペクタのname項目では、N1、N2、N3... などとなっているので、配列名にすることができません。 (このままだと、「全てのチェックボックスを外す」などの記述が大変です) よろしくお願いします。
TStringList.SaveToFileで文字コードをUTF-8で保存したいのですが どうすればいいでしょうか?htmlファイルを生成しています。 WinXP+Delphi7Pro
delphiで通販サイトみたいなの作ってみようと思うんだけど 何か最低限これはみとけみたいなサイトあります?
>>372 大見出し(MenuItem1)から小見出し操作するなら
for i := 0 to MenuItem1.count - 1 do
begin
MenuItem1.Items[i].checked := false;
end;
メインメニュー(MainMenu1)から大見出し(例としてメインメニューの一番目)を指定して
小見出しを操作したいなら
for i := 0 to MainMenu1.Items[0].count - 1 do
begin
MainMenu1.Items[0].Items[i].checked := false;
end;
でいけると思う。
Delphiでウェブアプリなんだー。 ちょ、マイナーだね。 ウェブで無償配布ツールものとかドライバ設定系デスクトップアプリでは、某アイコンを良く見るけどね。
378 :
372 :2008/04/16(水) 10:34:44
>>375 ありがとうございます!とても助かりました。
>>373 って
for i := 0 to Memo1.Lines.Count-1 do Writeln(f, WideString(Memo1.Lines[i]));
ってやるだけじゃだめなん?WideStringとUTF8って別もの?
そこらへんいまだに全く把握してないんだけど
どこかにアホグラマ向けの解説サイトとかないのかな。
別物。
>>376 htmlやcss、DB何かも飽きるほど使った事あるからいけるかなぁとか
思ったりしてるんだけどセキュリティ関連がよくわかんないのよねぇ
SQLインジェクションやクロスサイト云々とかそういうのはわかるけど
何か他にもいろいろありそうで怖い
Webアプリって今はjavaなんかがメジャーなのかな?
DephiFのIDEモードってどうやるんだっけ。 他のウィンドウが見えるSDIになっててやりづれぇ
>>364 ありがとうございます。
Vista対策は全くしてませんので、その事を記載することにします
Vistaなんて使う方が悪いぐらいに書いとけ
質問です。 フォーカスが当たっているかコントロールは どうやって調べればいいんでしょうか?
つ TCustomForm.ActiveControl
>>381 HTML、DB飽きるほどやってるなら、セキュリティ云々の前に、
未だに、Unicodeにまともに対応してない、Delphiを使うなんて論外だと思うが・・
Delphi.NETなら使えるんだろ。 .NETの便利クラスパクって来るのも疲れたし マシン買い換えたらDelphi.Net触り始めてみたくはある。 ぼろマシンのネイティブアプリよりよっぽど速そうだw C#のフォーム周りはどうも微妙すぎるし。
微妙って、.NET Framework使ってたら言語が違っても同じでないの?
クラスライブラリが違う。
ぼろマシンで走る.NETは遅いと思う
Delphi.NETは最悪の選択
395 :
370 :2008/04/18(金) 00:33:33
>>371 レスありがとうございます。
うまくいくページとうまくいかないページがある原因がよくわかりません。。
(yahoo とかだったら、うまくいくんですが)
しかも scrollwidth はうまくとれてたりするので、
さらに意味がわからないことになってます。。
396 :
デフォルトの名無しさん :2008/04/18(金) 01:40:53
>>374 「webアプリセキュリティ対策入門」って書籍。
サウンドハウスみたいに単純な穴つかれて個人情報漏らさないように気をつけてね。
Delphiって文字が悪い記事で新聞に載らないようにしてくださいw
>>389 ただでさえDelphiは未来がないのに、その中でロードマップで切り捨てられることが決定している
Delphi.NETは選択肢としてありえないよ。
俺ならchrome joyrideをつかう。それならC#でいいけどな
.NET起動遅すぎ
動作条件に.netが入ってる時点でDLする気失せる
最近のDelphiと一緒だな。J#まで必要だし。
未だに.NETの起動がどうのなんて言ってるボロマシン使ってる可哀そうな方々は 一生DEL7SJISWIN32で頑張ってなよ。 今時C2Dマシンなんて2,3万で組めるのにw
このやり取りも無断リンク論並に飽きたので もう勘弁してほしい
デバッグの値の文字列を全部取得する方法っってありませんか。 文字列が長いと、「...」ってのが最後に入ってそこで終わってしまいます。
PageControl単位でマウスカーソルの出入りを監視するのってどうやればいいですか。 MouseOverだとその上に乗ってる全コントロールのMouseOverでチェックしないとうまくいかないし それをやったところで結局正確には取れないです。
>>403 procedure dbgPrint(s:string);
begin
with TFileStream.Create('dbg.txt',fmCreate) do try
Write(PChar(s)^, length(s));
finally free end;
end;
みたいな関数を作っておいて、
実行されない場所で呼び出しておく(そうでないと実行ファイルにリンクされない)
デバッグ時に Ctrl+F7 で 評価/変更 窓を開いて
dbgPrint( 変数名 ) と打って 評価(V) で dbg.txt というファイルに中身か書き出せる
>>404 CM_MOUSEENTER/CM_MOUSELEAVE を使うのでは駄目?
>>406 最近のバージョンではOnMouseEnter, OnMouseLeave イベントとして実装されていますね。
>>379 おおざっぱに言いますとこんな感じです。
・WideString…全部の文字が2バイト
・UTF-8…英数コードが1バイト(しかもこれらのほぼすべての文字コードがANSI文字列同じ)、
漢字やかななどが3バイト
408 :
デフォルトの名無しさん :2008/04/18(金) 22:54:38
ユニコードが使えるエディタを作りたいのですが、良い方法はありませんか? こちらの環境は Delphi 5 Pro です。
SynEdit unicode editionを使う
stringの長さだけを初期化する方法でSetLength(s, len)ってやるのと SetString(s, nil, len)ってやる方法の二つがあるみたいですが、 この二つの差って何かありますか?
総合アーカイバコンポで書庫内ファイルの削除したいんだけど、 RemoveItemsメソッドの使い方教えてください ↓こんな感じで動かすと書庫本体が削除されちゃうのですが… DelList := TStringList.Create(); Arc := TArchiveFile.Create(Application); DelList に書庫内ファイル名を突っ込む←この書庫内ファイルを削除したい try Arc.FileName := "書庫本体までのフルパス"; Arc.Options.jso := 1; // 共有エラーの場合に処理を続行 Arc.Options.n := 1; // 経過非表示にする Arc.RemoveItems(Application.Handle, nil,'', [DelList]); finally Arc.Free; DelList.Free(); end;
>>411 SetLengthはメモリを再確保した後に内容のコピーをするような分岐がありますが、
SetStringでnilを指定した場合1つの分岐だけで即座に新しい領域が割り当てられます。
なのでSetStringの方が若干速いです。
>>413 SetLengthとSetStringはともに組み込みの手続きであり、ソース上にそのものの実装は存在しません。
場合によって別々の内部手続きが呼び出されます。この場合はLStrSetLengthとLStrFromPCharLenです。
これを初心者がソースを見て判断するのは酷でしょう。
それにSetStringで長さを設定するのはVCL内に多く見られます。
実際どうなってるか知りもしないのにそのような発言をするのはよくないんじゃないかと。
>>413 レスありがと
形式はzipだからおkだと思うんだ…
何か書き方が悪いのか何なのか
それとcreateもtryの内側に入れることにしようと思います><
Createをtryの内側に入れると、今度はCreateの例外で ArcもDelListも代入前に使われちゃう。
Delphi.NET(2005)で質問です。 TStringGridの内容を帳票として成型して プレビュー画面を表示した後、印刷したいのですが 一体どうすれば良いのでしょうか。
Excelでフォーマットを好きなように作り、プログラムからグリッドの内容をセルに流し込み、印刷で。
ユーザにそこまでやらせるのはひどいアプリだなぁ
2005で、かつ Delphi.NET 使ってる時点で論外
>>422 .NetとFirebirdでWebアプリ作ってる俺に謝れ!
ClientDataSetに放り込んでQuickReportとかは?
turbo DelphiでMSSQLのデータを表示したいのですが 知り合いにできない、と言われました。 プログラムそのものが初めてでこれからやろうとしていたので本当なのかどうかがわかりません。 本当にできないのですか?
>>428 ありがとうございます。これから頑張って覚えてやってみます。
友人には間違いを伝えておきます。
>>425 確かにzipでやってみたらファイルが消えた。
lhaならできたけどzipじゃないとだめなの?
>>426 DLL直だとコンポーネント使ってる意味が無いというか…
最悪それに挑戦することになりそうです。
>>430 zipで出来ないとうまくないですねー
何とかならないものかしら
以前かなり前、TShapeの表示/非表示の切り替えが異常に遅いって 書いたモノですが、ようやく原因が分かりました。\(^o^)/ TShapeを表示させているフォームのAutoScrollをFalseにしたら、 劇的に速くなりました。良かった。これでGWは何日か休めそう
>>432 ZIP32.pasのMainEntry2の中でコマンド実行する前に
DeleteFile( ArchiveFileName )でファイル消されてる。
それコメントアウトするとちゃんと処理できたけど、追加のとき
エラー回避のために必要みたいなコメントあるから、ファイルを
消すときだけ処理を飛ばすようにした方が安全かも。
TMenuBarやTToolBarを使ってメニューを移動できるようにすると メニューにマウスを乗っけるとボタンみたいになってしまうのですが これを防ぐにはどうすればいいのでしょうか?
436 :
デフォルトの名無しさん :2008/04/24(木) 10:56:39
DelphianWorldって亡くなりました?
文字列型変数のアドレスを取る手続きFooがあるのですが、 その手続き内で文字列のサイズと内容をセットしたいのですが、どうすれば いいでしょうか? 呼び出し元は var AResult: string; begin Foo(@AResult); end; です。 procedure Foo(P: Pointer); begin // ここで文字列のサイズと内容を設定したい。 end;
短い文字列型を使う。
DelphiMLって今生きてるの? 4月8日からメールが流れて来ないんだが
437です。
>>438 呼び出し元の方は変更できませんので、呼び出し先の方でなんとかしたいです。
で、とりあえず、色々やってみたのですが、
procedure Foo(P: Pointer);
begin
Pointer(P^) := Pointer(StrNew('あいうえお'));
end;
でやると一応動いているようには見えますが、StrNewの方で参照カウントが設定
されていないので、ちょっと不安です。
呼び出し元がWideStringで
procedure Foo(P: Pointer);
begin
Pointer(P^) := Pointer(WStrNew('あいうえお'));
end;
でやるとHeapがどうたらというエラーでコケマス。
ぶっちゃけ procedure Foo(var s: string); begin s := 'あいうえお'; end; これでいいじゃんと思うのは俺だけ?
>>434 なるほど、ちょっとそのへんいじってみます。
貴重な情報ありがとうございます。
procedure Foo(ps: PWideString); begin ps^ := 'あいうえお'; end; 呼出元がポインタで渡してるみたいだし俺ならこうするかな
>>439 生きてるけど、人がいなくなって瀕死状態なのかと
同じモジュールなら、PString(P)^ := ?? でいけそうですが。 string=WideStringなら、 >443と同じですけど。
>>445 日本語でおk
つかおまいのこれ(
>>440 )はどこでStrDisposeするんだ?
どっかにリストでももってそこで管理する気か?
>>434 オイラからもありがとう
とりあえずこうしといた
if Pos('-d',_lpszCmdLine)=0 then
DeleteFile( ArchiveFileName );
とりあえず、445<>440だ。
Delphian Worldは消滅したみたい。Delphi-MLは開店休業。みんなFTにいるんじゃない?
>Delphi-MLは開店休業。みんなFTにいるんじゃない? へっ? Delphi-ML ってメンバーが10人あまりなんか? それは・・・瀕死状態なんでは?
FT?
>>440 です。みなさん、ありがとうございました。
>>443 ,
>>445 さんの方法でうまくいきました。
procedure Foo(P: Pointer);
begin
PWideString(P)^ := 'あいうえお';
end;
PStringまたは,PWideStringにキャストすれば良かったのですね。
>>441 実際のFooは仮想クラスのメソッドで派生クラスでオーバーライドしているため、
インターフェースを変える事ができません。
>>446 文字列のための動的なメモリの割り当ては、呼び出し先(この場合Foo)で行っていますが、
呼び出し元のAResultの変数が破棄される時(この場合、スコープから外れた時)に、割り当てられたメモリは自動的に
解放されると思います(たぶん)。
453 :
デフォルトの名無しさん :2008/04/25(金) 08:47:53
質問します。よろしくお願いします。 var pArray: PInteger; として GetMem(pArray,100); pArray[0]:=12; とかすると、配列型が必要ですとエラーが出ます。 Integerのポインタを配列としてアクセスするにはどうすれば良いでしょうか。
PIntegerArrayにキャスト。 PIntegerArray(pArray)[0]:=12;
フォルダのパスから、そのフォルダの中にあるファイルのパスを所得するにはとうしたらいいのでしょうか?
456 :
453 :2008/04/25(金) 09:37:41
>>454 うまくいきました。ありがとうございます。
.NET だと使えないけど absolute という便利な構文がある。 type AInteger = array [0..$ffff] of integer; var pInteger: ^Integer; pArray: ^AInteger absolute pInteger; とやれば いちいちキャストしなくても pIntegerの別名が pArrayになるんで pArray^[0] := 12; と書けるよ
>>455 意味が判らないけど
FindFirst,FindNext,FindClose
か windows API の FindFirstFile FindNextFile FindClose
の事かな?
459 :
455 :2008/04/25(金) 09:57:04
>>458 レスありがとうございます。
フォルダをフォームにD&Dしたとき
そのフォルダの中のファイルのパスがほしいという事です。
D&D の方が判らないの? FindFirst,FindNext,FindClose の使い方が判らないの?
他に COM を使う方法があるよ。 やり方は CreateOleObject('Scripting.FileSystemObject') で検索すればいいと思う
462 :
455 :2008/04/25(金) 10:11:50
>>460 FindFirstでいけそうです。ありがとうございました。
>>453 の件で便乗質問です。
私はいつも以下のようにしていますが、何かプログラム上の問題はありますか?
var
P: PIntegerArray;
i: Integer;
begin
GetMem(P,SizeOf(Integer)*10); // Integer10個分の領域確保
try
for i := 0 to 9 do
begin
P[i] := i*10000; // 順番に0,10000,20000,....90000を代入
ShowMessage(Format('P[%d] = %d',[i,P[i]]));
end;
finally
FreeMem(P); // 領域解放
end;
>>452 P は AnsiString型変数へのポインタをPWideString型へキャストすると、おかしくなると思うよ。
AResultは常にWideString型なの?
>>463 問題ない。
問題ないけど、この使い方なら 動的配列使えばいいのにって思うな。
いまどきなら動的配列じゃね?
467 :
463 :2008/04/25(金) 14:17:19
>>464-466 ありがとうございます。確かに動的配列でいけました。
var
A: array of Integer;
i: Integer;
begin
SetLength(A,10);
for i := 0 to 9 do
begin
A[i] := i*10000;
ShowMessage(Format('A[%d] = %d',[i,A[i]]));
end;
フォルダのリネームって一行ぐらいじゃできないの?
RenameFile で出来ると思うけど? ただ、誰かが使ってたら駄目だよ。 もしかして、自分自身が使ってるんじゃないの? カレントフォルダを変更してみたら?
とりあえず試してみたら? if not RenameFile( oldName ,NewName ) then ShowMessage( SysErrorMessage( GetLastError())) ;
動的配列… むかーし、なにもかもをTStringGridで処理してた時期を思い出した(涙
それはひどすぎ。動的配列がなかったときは、配列のポインタを使ったもんだ。
>>463 のように。
473 :
468 :2008/04/25(金) 23:51:18
CloseQueryでFalseしてMinimizeする常駐アプリが立ち上がってると シャットダウンできないんだけどどうやってシャットダウンなりログアウトに対応すればいいの?
WM_QUERYENDSESSIONで何とかしてみるとか
演算結果の型についての質問です。 var A: Integer; begin A := MaxInt; if A + 1 > MaxInt then // ほにゃらら を実行すると、if文の条件式が偽となります。 Delphiのマニュアルを見るとオペランドがInt64でない場合は、演算結果はInteger型に なるとのことで、if文の条件式が偽になることは納得しました。 で、if文の条件式を A + Longword(1) とすると、今度は条件式が真になります。 A + Longword(1)の型は一体何になってるのでしょうか?
符号無し整数の演算結果は一時的にInt64になるんじゃなかったか
型名を知りたかったらrecord型やSelfに突っ込んでエラー起こしてみるのが手っ取り早い。 var A: Integer; rec: record dum: Integer; end; begin rec := LongWord(1); [エラー] 'Record' と 'Cardinal' には互換性がありません Self := A + LongWord(1); [警告] 符号付型と符号無し型の演算により、オペランドが拡張されまし [エラー] 'TForm1' と 'Int64' には互換性がありません
RadioGroupのアイテムを一つだけ無効にすることってできますでしょうか?
482 :
479 :2008/04/26(土) 12:31:31
>>474 アイコンの通知を受け取るためにAllocateHWndで定義したメッセージ処理メソッドで
処理したかったメッセージ以外はWin32APIのDefWindowProcIに投げるようにする。
>>476 そういうことを気にしなくてもいいコードを書くべき。
フリーのDelphi6でADO使いたいのですが、 ActiveXの取り込みの一覧に、Microsoft ActiveX Data Objectsがありません また、Microsoft ADO Data Control 6.0っていうものをインストールしようとすると、 再構築時に、MSAdodcLib_TLB.pasで「'Error'は型ではありません」と再構築出来ません どうしたらADO使えるようになりますか?
>>484 ここは超初心者用スレだから、そんな難しいこと言われても無理。
そもそも会話が成立してないからスルーで桶
金なんか払わんよ
Delphi6だと、DataSet系ついてないと思った。
ADOIntf.pasついてないのか?
TurboDelphi用のQuickReportは無いのですか? いくら探しても…
バンドル版じゃなくて商品版はあるんじゃね?
>>485 Turbo Delphi Explorerを導入される方が早いと思います。
統合開発環境が.NETベースなのでインストールが面倒なのがなんですが。
Turboでコンポーネントインスコ出来たらいいんだけどなあ・・・
買えよ
498 :
番組の途中ですが名無しです :2008/04/28(月) 17:54:51 BE:626494-PLT(12660)
>>495 ちょっと悩みましたが、TurboDelphiを導入してみようと思います
ありがとうございました
htmlのプレビューを、IEエンジンのように時間を掛けずに表示する方法はありますか? THogeTextViewが一番いいと思うのですが、どう使えばいいのか分かりません・・・
500 :
デフォルトの名無しさん :2008/04/28(月) 23:11:41
Turbo Delphi無料版で、リソースファイル(.res)を作りたいのですが、 どうすればいいでしょうか? あるサイトで 「rcファイルを作成し、プロジェクトに追加し、コンパイルすれば、 自動的にresファイルが生成される」と書かれていたのですが、その通りに実行すると、 [Pascalエラー] E1026 ファイル'〜〜.res'が見つかりません というエラーになってしまいます。 よろしくお願いします。
外部のプロセスから出力されたOutputDebugStringの文字列を取得するコンポってないですか
>>500 brcc32 hoge.rc
で、rcファイルをコンパイルしてみるとか。
504補足 プロジェクトにrcファイルを追加したら、 一旦「ファイル→全て閉じる」してから再度プロジェクトを開いてください。 これでコンパイル出来ると思います。 これってTurboDelphi無料版のバグかな?
506 :
わかな :2008/04/30(水) 00:31:31
CのオブジェクトファイルファイルをDelphiでリンクするやり方教えて!
{$L XYZ.obj}
508 :
わかな :2008/04/30(水) 01:07:55
509 :
500 :2008/04/30(水) 09:09:26
LeadBytesってLeadByteTable: array[#0..#255] of Booleanにした方がよっぽど速いな
Delphi2008はリリースされないの?
Delphi2008でググればいろいろ出てくるぜ
TurboDelphi入れてみたけどコンパイル遅くなったのは何で?
そりゃそうだろう。 Windowsだって、XPからVistaにすると遅くなる。
なるほど
>>514 うん。なるほど
MS-Access入って無い環境でもmdb+ADOのアプリって動く?
>そりゃそうだろう。 Windowsだって、XPからVistaにすると遅くなる。 そしてVistaは誰にも嫌われる、と。 確かにDelphiの最新バージョンと一緒なんだな。
ウンコPCは窓から捨てろよ
TurboDelphiとTurboDelphi.NETって共存できないの?
TDateTimeからUTCの時間(文字列、もしくは、年、月、日の数値)を取得する方法教えてくださいでつorz
524 :
デフォルトの名無しさん :2008/05/02(金) 18:03:04
ちょっと疑問なんですが、 Nowでとった時間をTQueryなんかでAsDateTimeで設定したとしたら、 UTCとして登録されるのかな? もしかして、localtimeとして登録されちゃう?
525 :
524 :2008/05/02(金) 18:15:39
あれ? テストしてみたら、localtimeがRDBに入ってるみたいだけど、そうなの? これだと、登録した場所によって、時間の前後が変わっちゃうんだね。
526 :
524 :2008/05/02(金) 18:27:43
具体的には、 1.日本でNowで日時を取得 2.RDB(Firebird)のTIMESTAMP項目に、AsDateTimeで設定 3.アプリを例えばグリニッジで実行したら このとき、1と3の日付文字列は同じになるのでしょうか?異なるのでしょうか?
527 :
524 :2008/05/02(金) 18:30:17
自分の予想としては、 DateTimeToStrはローカルタイム変換はせずローカルタイムjのみ入力可で、 RDBにはローカルタイムで登録されてるので、 同じ日付文字列になると思うのですが。。。
もうちょっともちけつ
529 :
524 :2008/05/02(金) 19:18:36
ラジャ! 知りたいのは以下の内容です。 質問1: RDBに日付を登録するときはローカルタイムで良いのでしょうか? それともUTCの方が良いのでしょうか? どちらが良いともいえない場合、どちらが一般的でしょうか? 質問2: Nowで取得してAsDateTimeでRDBのTIMESTAMP項目に登録すると、 ローカルタイムが登録されるのでしょうか? 質問3: 上記の通り登録したRDBのTIMESTAMP項目をAsDateTimeで取ってきて、 DateTimeToStrした場合、 ロケールがどこに設定されたとしても、”日、時、分”は同じものとなるのでしょうか?
こんばんは。 電卓のプログラム(OSに搭載されている)の3のボタンを9っていう数字に変えたいんですけど、 //電卓のウィンドウハンドルを取得 hcal :=FindWindow(nil, '電卓'); h5 :=FindWindowEx(hcal, 0, nil, '3'); if h5 <>0 then begin SetWindowText(h5, '9'); Sleep(100); end; うまくいかないのですが、どうしたらよいでしょうか? ご教授おねがいします。
>>524 >>質問2,3
ADO,DBExpress何を使ってるかしらんが、基本的にドライバ次第。
ひねくれた?ドライバでなければ、TimeStamp値として渡した日付時刻がそのまま
登録される。勝手に変換したりはしないと思う。渡す日付時刻をどう解釈するかは
アプリ次第。
>>510 集合はビット演算が入るから、配列より遅くなる。 でも、メモリ消費は1/8だよ。
>>530 MSDNには、下記のようにある。
>ほかのプロセス内のコントロールのテキストを設定するには、
>SetWindowText 関数を呼び出すのではなく、直接 WM_SETTEXT メッセージを送ります。
TStringListのDelimiterに<>などの2文字以上の文字を設定するにはどうすればいいのでしょうか 置換で代替できるとは思うのですが格好よくないので使いたくありません・・・
>>533 無理
SetDelimitedTextルーチンをぱくって自分で書くしか。
単純な置換だと""の中まで変えちゃうから要注意。
>>533 具体的に1文字で何ができないのかを言った方が、解決すると思う
>>535 すみません、リロード忘れてました
2chのDATを扱いたいので・・・
一応<だけでやってもいいとは思いますが面倒なので・・・
>>537 TRegExpおすすめ
というかdat処理ならこういうの入れないとめんどくさくて無理
>>538 なるほど、正規表現の手がありましたか
確かに分かりやすそうです
ありがたく使わせてもらいます
>>532 情報ありがと。
けどメッセージ飛ばしたけど、書き換えできなかった・・・。
もう手はないかな?
特定のウィンドウにキーを送るのではなく グローバルホットキー、例えばCtrl+Alt+G を発動させるコードってどう書くんですか
HotKeyを受け取って自分で処理したいのではなく その逆にどこかのアプリで登録済みのHotKeyを 呼び出してそのアプリの機能を呼び出したいということです。 その際直接そのアプリを指定しないでキーボード操作のみの形でやりたいです。
key_eventで、キーをおしたことにすればいいんじゃないのかな? 特定のアプリ専用なら 俺なら、ウィンドウ列挙してそのアプリを前面にもってきてから アクセラレータキーを送るとか、 そうするなあ。
SetWindowsHookEx をやりたいって事のようだけど コレは色々悪さ出来るからな。 どっちにしても自前で解決して欲しい所。
全部の窓からWM_GETHOTKEYで 設定されてるキーを調べて その窓に対してコマンドを送ればいいんじゃないの?
普通に key_event 6回だろ。
>>545 とりあえずマウスのフックとキーボードが押されたときに反応する(フックっていうのか?)のはできるんだけど、
電卓の例の場合はどういう種類のフック使うんでしょうか?
フォームではなく、特定のコンポーネントにファイルをD&Dして 受け取らせるにはどうやったらいいのでしょうか?
フォームならできるのにコンポーネントだとできない理由は?
ウインドウハンドル持ってないコンポはダメじゃなかったっけ?
>>552 TGraphicControl派生コンポはTPanel置いてその中に置けばおk
>>553 なるほど
じゃあ、アプリケーションメッセージで
if (Msg.message = WM_DROPFILES) and (Msg.hwnd = Panel1.Handle) then
こんな感じで振り分ければおkじゃね?>
>>550 ※FormCreateの中に↓を入れておくこと
DragAcceptFiles(Panel1.Handle, True);
Application.OnMessage := AppMessage;
実際、ppMessageはこんなかんじ procedure TFrom1.AppMessage(var Msg: TMsg; var Handled: Boolean); begin if (Msg.message = WM_DROPFILES) and (Msg.hwnd = Panel1.Handle) then begin SetForegroundWindow(From1.Handle); SendMessage(Handle, WM_DROPFILES, Msg.wParam, Msg.lParam); Handled := True; end; end;
そんで更にこんな感じ procedure TFrom1.DropFiles(var Msg:TWMDROPFILES); const NameMax = 1024; var DropFileCount: Integer; FileNameA : array[0..(NameMax + 10)] of Char; TempStr:String; begin DropFileCount := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0); DragQueryFile(Msg.Drop, 0, FileNameA, NameMax); //お好きな処理// DragFinish(Msg.Drop); end;
557 :
550 :2008/05/04(日) 22:51:03
みなさんありがとうございます 早速やってみますね
DragQueryPointでその位置にあるコントロールを取得しては?
559 :
デフォルトの名無しさん :2008/05/05(月) 09:30:28
いつも助かっています。 Open SourceのでかいDelphiで書かれたソフトがあり、それで 勉強しようと思っています。CTRL−Cや’;’を押してどういう処理が されているのかをとりあえず見たいのですが、どういう文字の検索を すれば該当部分のコードを見れるでしょうか? OnKeyで探したのですが、それらしき処理をしている所には飛んで いかなかったのですが。
実行させてみるのが一番いいと思うよ。 OnKeyって事はコンソールアプリじゃなくて GUI アプリなんだろ? windowsGUIならイベントは全部 TAplicatioの OnMessage でひっかけられるから この中で キーイベントを IF 文入れて ブレークポイントかけられるようにして トレースしてゆけばいい
もしTActionのショートカットに入ってたらソース上には現れない フォームを右クリックしてエディタで表示して例えば「;」なら「187」って いう生数字を探せば見つかる
562 :
デフォルトの名無しさん :2008/05/05(月) 13:35:59
お返事ありがとうございました。
> 560
あまりよくわかっていませんが、FormCreateに
Applicaton.OnMessage:= AppMessage;
を入れて
Precedure TMainFrom.AppMessage(...)
var dummy:integer;
begin
If msg.message=WM_Keydown then
dummy:=1;
end;
でdummy:=1に赤線(ブレーク)をしてみましたが、そこで
止まってくれません...こういう意味ではない??
>561
187という生数字を探しましたが、ありませんでした...
MenuにもCTRL-Cのショートカットは登録してないですし
http://www.sph.sc.edu/comd/rorden/ezdicom.html なのですが...
MDIChildってフォームのメニューに"Ctrl+C"と";"のショートカットが割り当てられた項目あるけど違うのけ?
564 :
デフォルトの名無しさん :2008/05/05(月) 14:43:09
あ、ありがとうございました。元Sourceをみていただいて とても感謝しています。 Childwin.dfmの中を見ればいいんですね。 *.pasの中だけ、187の検索をしていました。 これをみると、Copyはshortcut16451とありますが、これは CTRL+Cでいいんですよね..?? 本当にありがとうございました。
> これをみると、Copyはshortcut16451とありますが、これは CTRL+Cでいいんですよね..?? そう
SetLength(S, $7FFFFFFF)とやるとAccessViolationが でます。Delphiは境界テスト?もろくに行われていない製品なのでしょうか? SetLength(S, $7FFFFFFF - 10)でやっと「メモリ不足」というエラーがでます(これは 別にいいんですが)。10というのはどっからきてるんでしょうね。参照カウンタと長さ用の領域に 8バイト、終端文字に1バイト、あと?
Delphiは境界テスト?もろくに行われていない製品なのでしょうか? Delphiは境界テスト?もろくに行われていない製品なのでしょうか? Delphiは境界テスト?もろくに行われていない製品なのでしょうか?
|,,∧
|゚Д゚彡
|⊂ミ
>>567 さん
ほんとうだ。。よく気がついたね。
あるいはメモリマネージャ側のエラーかもな
今試せないけど、データ型が大きすぎとかでそんなエラーになるとオモッタなあ。違うの?Sがなんだか知らんが
型が大きすぎでAccessViolationはねーよw
ソース見ればアクセス違反が出るまでの経緯が分かるけど、単にチェック不足だな。 要求メモリ量が負になっても気にせず続行する男気あふれるコードだ。
TSaveDialogでOptionsのofShowHelpをTrueにするとヘルプボタンが表示されますが どのイベントでひろえば良いのでしょうか。
WM_HELPを拾えばいいんでない?
質問です^^ デルファイ7使ってるんですが 「元に戻す」(アンドゥ)ってどうやるんでしたっけ 先日分からなくて諦めました 3作業前に戻るとか出来ないんですかね^^;;;;;;
7では無理
>>575 ダイアログを表示しているフォームのOnHelpでも、TApplicationのOnmessage
でMsg.messageをWM_HELPで判定しても
procedure WMHelp(var msg: TMSG); message WM_HELP;をprivateで宣言して
やってもひろえていないようです。どうして?
>>579 TApplication.HandleにRegisterWindowMessage(HELPMSGSTRING)で送られてるみたいだが
>>580 ありがとう。でも分からなかったです。とほほ
>>581 WinspectorとかでTApplicationの持つウィンドウのメッセージ監視すれば引っかかるはずだよ。
TApplication.OnMessageでは引っかからないからTApplicationのウィンドウをサブクラス化しないと受け取れないかも。
というかダイアログのHelpContextを設定しておけば Application.HelpFileで指定しといたヘルプ (の該当するトピック)を開いてくれるんだが。 それ以外のことをやりたいわけ?
TApplicationのウィンドウプロシージャーなら、Application.HookMainWindowでOK. WM_COMMANDもどこかのウィンドウに送られている。(ダイアログのトップレベルのウィンドウかも)
色々ありがとうございます。ちなみにHTMLヘルプなもんで…HelpContextでは うまくいきませんでした。それから Application.HookMainWindow も少しだけ 試したんですが。もう少し気合入れて調べてみます。
TBXを配布しているサイトが見れないのですが、TBXを再配布しているサイトはないのでしょうか?
ありがとうございます 使ってみます
type TSettings = class published property Min: Integer; property Max: Integer; property Text: String; property Switch: Boolean; end; といったプロパティをINIファイルに自動的に読み書きさせるコードのサンプルってないのかな。 WriteComponentだとプロパティの追加削除ですぐ例外吐くから使えない。
そのWriteComponent内で呼ばれるTWriterのコードでも見たら? まさにそのものをやってるメソッドがあるから
TPersistentから継承しなくても良かったっけ?
誰か例のTGifImageの脆弱性なおしておくれ
JaneStyleはTGifImageを修正してるみたいですね
gifimage.pasの5992行から while (code >= ClearCode) do begin //ここから if UINT(Source) > UINT(@stack[High(stack)]) then begin Dec(Source); Result := Source^; Exit; end; //ここまで Source^ := table1[code]; 検証お願いします
>>594 行けたぜGJ!
でも俺の場合5873行なんだがこれはバージョンの違い?
一応2.2なんだが・・・
596 :
Zzz :2008/05/09(金) 11:24:39
質問お願いします Delphi7なんですけど (最大化最小化閉じるボタンを非表示などをした)Formを 同プロジェクト内の別のFormでも使いたくFormごとコピーして 使用したいのですがコピーやり方がわかりません どうやれば実現できるのでしょうか???
ExplorerでForm1.pas/.dfmをForm2.*にコピー&リネームして ファイル内のユニット名、クラス名、Nameプロパティ名を調整。 フォーム上のコンポーネントやプロパティの設定は.dfm イベントハンドラ等のコードは.pasにあるから適当に切り貼りしてもいいかも。 名前をつけて保存でForm2とかやっちゃうとForm1が破棄されForm2を使い出すからわけわかってないと悲惨なことに。 IDEでは使いまわし支援でリポジトリなるものをサポートしているけどほとんど使ったことない。 活用してる人っているのかね。 なんにしてもプロジェクト全体のバックアップをしてから試したほうがいいかもね。
598 :
Zzz :2008/05/09(金) 11:40:36
やはり意外と、つらそうな道のりですね 了解しました 地味に作成しようと思います リポジトリの使用方法も忘れてつつあるので・・・ ありがとうございました
うちは5846行目だった TGIFSubImgae.Decompressプロシージャ内のNextLZW関数内だよね?
ver2.2のNextLZWの中です ASSERT(Code < TableSize, 'Code too large'); while (code >= ClearCode) do begin //ここから if UINT(Source) > UINT(@stack[High(stack)]) then begin Dec(Source); Result := Source^; Exit; end; //ここまで Source^ := table1[code]; Inc(Source); if (code = table0[code]) then Error(sDecodeCircular); code := table0[code]; ASSERT(Code < TableSize, 'Code too large'); end;
>>596 継承して使うと似たようなフォームで少しだけ違うような場合に便利だよ
ファイル⇒新規作成⇒その他 で出たダイアログのタブの今のプロジェクト内から Form1を選んで
下の ・継承 を確認して [OK]
602 :
Zzz :2008/05/09(金) 16:50:32
たびたびすいません 質問です リストボックスやコンボックスのItems欄に選択「文字」を追加する 方法が分かりません ・・・と書くとItem addとか思われると思いますが、もう一歩進んで その追加したを随時に追加し、且つ保存したいのです プログラムを終了させる、プログラムを起動させる 「追加したデータが消えてる(涙・・・」 どうやれば保存できるのでしょうか 最終的には、マイナーなコンポーネントに対し保存したいのですが 基本のリストボックスやコンボックスのやり方を教授していただければ 自分で考えますので(当たり前ですけど)ヒントの程お願い致します
終了時にファイルに保存して起動時にファイルから読み込む。
604 :
Zzz :2008/05/09(金) 17:23:32
>>603 おしい
それも一つの手ではあるんですが、最終的にコンポーネントの
Items欄に追加したいのでItems欄に保存する方法はないのかと
言うのを知りたいのです
質問する前に日本語を勉強する
いまいちよくわからないがexeのどこかに保存されているであろうItemsのデフォルト値に対して保存・読み出ししたいってことか? もしそうなら、コンパイルする度に値が吹き飛ぶぞw
そういうことができるなら ini ファイルはいらんがな・・
リソースを書き換えたいのか? 出来るだろうが、なんでiniファイルは駄目なんだ?
少なくともコード書いて試して 603 に対して「おしい」とかいってるのか? const DatEx='.dat'; var ListDat:string; procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Add(Edit1.Text); end; procedure TForm1.FormCreate(Sender: TObject); begin ListDat:=ChangeFileExt(Application.ExeName,DatEx); if FileExists(ListDat) then ListBox1.Items.LoadFromFile(ListDat); end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin ListBox1.Items.SaveToFile(ListDat); end; ちなみにみんなの言っている「日本語でおk」は 「Items欄に保存」ってのがわからんってことだぞ
610 :
Zzz :2008/05/09(金) 23:16:25
>>609 むむー
ListBox1.Items.SaveToFile(ListDat); で行けるかも
えっと
Items欄に保存ってゆうのは・・・・・・
コンボボックスとかは、選択肢をItems.Addしなくても事前に入れて置けるじゃないですか(うろ覚えすまん)
あれってPgで、あるボタンを押した時のイベントでItems.Addして追加しても、
Pg終了して、再度Pg再開してコンボボックスの中見ると消えてるじゃないですか(あたりまえですけど)
つまり、そのItems欄の中にデータを残しておきたい訳です
(↓コンボの中)
にんじん
だいこん
トマト
↓(いもを追加)
(↓コンボの中)
にんじん
だいこん
トマト
いも
↓(システム落として再起動)
(↓コンボの中)
にんじん
だいこん
トマト
(がーん いもは・・・・・)
611 :
デフォルトの名無しさん :2008/05/10(土) 00:01:24 BE:348454-PLT(12660)
iniかレジストリ使うのが普通じゃね?
自分で言ってるけど消えるのは当たり前なんです そういうのは外部のファイルに記録しておいて 再開したときに読み込むのがいいと思います
だから、設計時に追加した情報は、コンパイルするとリソースとしてexeに含まれるの。
TIniFile使ってやるのが一般的じゃね?
>>610 の気持ちもわからんではないが・・・逆にIDEで初期値を入れられるだけでも便利と思え!
ListBox1.Items.Commatext:=ReadString('ListBox1','Items','');
WriteString(ListBox1','Items',ListBox1.Items.CommaText);
615 :
デフォルトの名無しさん :2008/05/10(土) 10:27:37
dfmファイルを外部に持たせればOK.
彡川三三三ミ 川出 ::::::⌒ ⌒ヽ パクリ星からやってきたお! 出川::::::::ー●-●-) ..川(6|:::::::: ( 。。)) パクリ星の王子様の◆Style/kK.sだお! 出川;;;::∴ ノ 3 ノ ノ\_;;;;;;;;;;;;;;;;ノ Janeスレ荒らしてるヒキコモリだから友達できないお! ( * ヽー--'ヽ ) (∵ ;) ゚ ノヽ ゚ ):) チンポは極小で包茎だお!!ちなみに童貞だお!! (: ・ )--―'⌒ー--`,_) (___)ーニ三三ニ-) (∴ ー' ̄⌒ヽωニЗ 好きなものは他人のソースとオナニーとwarezだお!! `l ・ . /メ / ヽ ∵ /~- /. 今日もたくさんソースパクリまくるお!! (__)))))_)))))
>>587 今頃で申し訳ないんですがエラーが出てインストール出来ません・・・
d6perだからですかね?proだとインストールできるんでしょうか
>>619-620 わざわざうpしていただいてありがとうございます!
インストールしてみます
インストールできました! ありがとうございました!
インストールできたのはいいんですがメニューがボタンのようになってしまいます・・・ これじゃ当初の目的が達成できないのですが、どのようにすれば普通のメニューのように出来るのでしょうか
すみません、自己解決しました・・・
わけわかんねー事言ってんじゃねぇよタコ 小学生からやりなおせ
今小学5年生です・・・・
627 :
デフォルトの名無しさん :2008/05/10(土) 19:15:49
「相撲」って人気有るんだな 映画化されて・・・と思った・・・おれは小学生からやり直すべき?
相模だろw
意味の解らない俺はどれからやり直せばいいんだ?
アセンブラからだろ とーぜん
精子から
Office2007でコンテキストメニューを表示したとき その上にツールバーも一緒に表示するUIが何気に便利なんだけど あれどうやって実現するんだろう。
実現も何も・・ただそういうウィンドウを表示してるだけだよ。
うまく言えないんですがエスケープシーケンスのある文字列を変換するにはどうすればいいんでしょうか たとえばabc\ndefという文字列があった時に abc#10def(#10はもちろん文字列としてではなく)に変換するみたいなのです
>>634 つStringReplace
>>635 TFindDialog.OptionsにfrDownが設定されているかを確認して
自分で切り替える必要があります
637 :
634 :2008/05/11(日) 05:27:03
>>636 一応\nだけではなくて\tとか漢字とかもエスケープされてるようなので使えないです・・・
function DecodeEscStr(const s: string): string; var i: integer; begin Result := ''; i := 1; while i <= length(s) do if s[i] in LeadBytes then begin Result := Result + copy(s, i, 2); inc(i, 2); end else begin if s[i] = '\' then begin inc(i); case s[i] of 'x':try Result := Result + char(StrToInt('$' + s[i + 1] + s[i + 2])); inc(i, 2); except end; 'b': Result := Result + #$08; 'a': Result := Result + #$07; 'f': Result := Result + #$0C; 'r': Result := Result + #$0D; 't': Result := Result + #$09; 'v': Result := Result + #$0B; 'n': Result := Result + #13 + #10; else Result := Result + s[i]; end; inc(i); end else begin Result := Result + s[i]; inc(i); end; end; end;
>>634 はもしかして C言語スタイルの \ エスケープでエンコードされた
文字をデコードしたいって事じゃないかと思ってサンプルコードを書いてみた
641 :
634 :2008/05/11(日) 08:27:34
>>638 TRegExpは何だかさっぱりであまり使ってません・・・
>>639 ,640
ありがとうございます
元のプログラムはCのようなのですがそれの仕様が良く分からないもので・・・
一応「テスト」という文字が「\83e\83X\83g」になるということは分かってます
それは独自仕様って事だね。 'x':try Result := Result + char(StrToInt('$' + s[i + 1] + s[i + 2])); inc(i, 2); except end; この部分を '0'..'9' , 'A'..'F':try Result := Result + char(StrToInt('$' + s[i ] + s[i + 1])); inc(i); except end; とすれば、その部分には対応すると思うけど、他にも違いがありそうだね。 仕様が判ってるのはあなただけだから、自分でやってね
643 :
634 :2008/05/11(日) 09:26:00
>>642 それで出来たようです!
ご迷惑かけました!
そしてありがとうございました!
フォームのボタンなどのキャプションに付けるアクセラレータって言うんでしょうか (&A)みたいにするとAltキーとAを一緒に押すとクリックされるやつですが、 コントロールが多くなってくると、どれが使われていないのか探すのが大変です。 便利なワザみたいなの、ありませんでしょうか。
ActionList
適当に書いてみたが何気に便利かも・・・ 表示をまともにしてコマンドラインツールにして外部ツールとして実行できると使い物になりそう。 オープンダイアログで調べたいフォームのdfmファイルを指定するとこんな感じで出る。 C: Caption = '&ClickMe!' C: Caption = 'Button1(&C)' F: Caption = #12501#12449#12452#12523'(&F)' R: Caption = '&Run' X: Caption = #32066#20102'(&X)' procedure TForm1.Button1Click(Sender: TObject); var dfm, res: TStringList; i, idx: Integer; begin OpenDialog1.InitialDir := ExtractFilePath(ParamStr(0)); if not OpenDialog1.Execute then Exit; dfm:= TStringList.Create; res := TStringList.Create; try dfm.LoadFromFile(OpenDialog1.FileName); for i := 0 to dfm.Count-1 do begin idx := AnsiPos('&', dfm[i]); if idx > 0 then res.Add(UpperCase(dfm[i][idx+1]) + ':' + dfm[i]); end; res.Sort; ShowMessage(res.Text); finally dfm.Free; res.Free; end; end;
647 :
デフォルトの名無しさん :2008/05/11(日) 18:17:09
質問です。 TMemo に長いテキストを読み込ませたいのですが LoadFromFile で一気に読み込むと一瞬フリーズしたようになります。 そこで、スクロールに合わせて小分けに読み込むようにしたいのですが何か良い方法はありませんか?
649 :
デフォルトの名無しさん :2008/05/11(日) 19:08:34
>>648 お答えありがとうございます。
ですが、メモリを節約して小分けに読み込み表示してスクロールバーの振る舞いはファイルサイズに合ったものにしたいのですが、どうにかなりませんか?
はなっからスクロールバーを適正サイズにしたいってこと?そりゃ無理。どれだけの行数があるのかは 読み込んでみないとわからないっしょ?
>>650 確かにそうですね。妥協することにします。
>>647 終了です。ご回答くださった方ありがとうございました。
TStringListにいったん読み込めばいい。
複数キー入力を検出するにはどうすればよいでしょうか? Ctrl+Alt+Delとかのことです。 よろしくお願いします。
そんな無作法なツールは死ねばいい
>653 検出はいいけど、何をしたいのか具体的に書いたほうがいいと思うが。 ちなみにCtrl+Alt+Delは捕捉できないので念のため。
BBS へ行ったと思われ
658 :
デフォルトの名無しさん :2008/05/12(月) 23:42:30
TMemo でスクロールせずに表示できる行数を知るには ClientHeight を Font.Height で割れば良いのでしょうか?
1分で確かめられる事をわざわざ聞きにくるな
1分使って自分で確かめるくらいなら2分使って質問を投げる勇気を私はもちたい。
:::::::::::.: .:. . ∧_∧ . . . .: :::::::: :::::::: :.: . . /彡ミ゛ヽ;)ヽ、. ::: : :: ::::::: :.: . . / :::/:: ヽ、ヽ、i . .:: :.: :::  ̄ ̄ ̄(_,ノ  ̄ ̄ヽ、_ノ ̄
662 :
635 :2008/05/13(火) 12:49:06
>>636 ありがとうございます。帰ってやってみます。
これからDelphiをはじめる初心者ですが TurboDelphi用の初心者向け参考書はありますか? お勧めがあれば教えて下さい。
(;^ω^)今更ながらtypeとポインタが便利な事に気付いたwwww今まで時間無駄にしてたわwwwwwww
で、TGIFImage の開発元にフィードバックしたいのだが。 で、いくつか問題起こす gif を見ましたが、なんつーか児童ポルノに厳しい国でも レポートできるようなアニメーション GIF で再現できない物ですかねぇ
var Attr: Cardinal; dv: string; Attr:= GetFileAttributes(pchar(dv)); if (Attr and FILE_ATTRIBUTE_COMPRESSED) <> 0 then begin MessageDlg('Compressed.', mtError, [MBOK], 0); end; if (Attr and FILE_ATTRIBUTE_ENCRYPTED) <> 0 then begin MessageDlg('Encrypted.', mtError, [MBOK], 0); end; dv はドライブ名 C:\ or D:\ これで9x系のドライブスペースとNT系の圧縮フォルダとプロの 暗号化されたやつを判定できますか?
ウィンドウハンドルを指定してそのウィンドウのキャプチャをCanvasに描くのってどうやるの?
ランダムな2バイト文字を生成するにはどうすればいいんでしょうか
'ランダム' お約束すぎた?
>>669 GetWindowRect(ハンドル,Rect);
GetDC
673 :
デフォルトの名無しさん :2008/05/15(木) 13:49:45
calendarExと言うdelphiのカレンダーコンポーネント使ってるんですけど Appendで特別な祭日(2008/5/6)の追加できたんですけど削除の仕方がわかりません^^; どうやればいいのでしょう すれ違いだと思いますが罠にもすがる思いで質問します
罠にすがられたいという事なんで レスしてみる calendarEx と言われても、誰もが付けそうな名前なんで判らん。 とりあえず一番簡単なのは、Createをメソッドとして読んで 再度 設定しなおしたら駄目? レジストリやファイルに保存してないならだけどさ
罠??? 糸・・・藁だ 藁 なるほどその手もありましたか このソフトなんか10年くらいの前のソフトらしく四苦八苦してます ヒントくれてありがとうございます ;;
>>670 全2二バイト文字を抽出しておいて、そこからランダムに選んだらどうだろう。
うーん、2バイト文字ってのも良く分からないけど 何でランダムに抽出したいのか、その使い道が気になるにょ
>>670 文字コードにもよるが、SJISのランダムな日本語を得たいのかな?
679 :
670 :2008/05/16(金) 19:55:14
結果はファイルにでもキャッシュしておけばいい。 SJISに割り当てられている全文字合わせても20KBくらいだし。
無効な文字なら、アウトラインを取得できないかもしれないから、 それ使って判断できるかも。
682 :
デフォルトの名無しさん :2008/05/17(土) 11:41:06
ListViewのMultiSelect=Trueの状態で ボタンを押すと選択行を1段下げる処理をしたいのですが <<2のところで「EAccessViolation クラスの例外」と出てしまいます また<<2だけの処理だと複数行選択してしまいます with ListView do begin Items[Selected.Index].Selected := False; //<<1 Items[Selected.Index + 1].Selected := True; //<<2 end; 他にもMultiSelectをFlaseにしてから リストをClearSelectionしてからなど試しましたが 同じようにエラーが出てしまいます 何かよい方法はないでしょうか?
>>682 >選択行を1段下げる
MultiSelectだと飛び飛びで選択している場合もあるけど
その場合は?
>>682 var
hoge:integer;
begin
if listview1.itemindex<0 then exit;
hoge:=listview1.ItemIndex+1;
listview1.ClearSelection;
listview1.Items[hoge].Selected:=true;
listview1.Items[hoge].focused:=true;
listview1.SetFocus;
end;
こういう事?
MakeVisibleや行数を超える場合は知らない
>>682 <<1でTListItem.SelectedをFalseにしているのだから
<<2のTListView.Selectedはnilになってる
686 :
682 :2008/05/17(土) 14:58:57
>>683 >>684 >>685 あ!なるほど
こんな感じで実装したら思ったようにいきました。
ありがとうございます!助かりました。
procedure TMainForm.ListMove(Next: Boolean);
var i, idx: Integer;
begin
if Next then i := 1
else i := -1;
with ListView do begin
idx := Selected.Index;
ClearSelection;
Items[idx].Selected := False;
Items[idx + i].Selected := True;
Items[idx + i].Focused := True;
end;
end;
マルチセレクトでないなら ListView.ItemIndex := ListView.ItemIndex + 1 でいいんじゃない?
指定した文字列がファイルとして作成できるか確認する方法はありますか? 例えばC:\Delphi.txtを渡すとTrue、C:\Delphi\を渡すとFalseを返す、などということです
ListViewについて質問です。 二つのカラムを作成し(A、B)、カラムAの1番目に文字列'1-1'、カラムBの1番目に文字列'1-2'、 カラムAの2番目に文字列'2-1'、カラムBの2番目に文字列'2-2'という形でリストを作成したいのですがどうすればいいでしょうか? よろしくお願いします。
>>689 var
TestColumn: TListColumn;
begin
with ListView1 do begin
TestColumn := Columns.Add;
TestColumn.Caption := 'A';
TestColumn.Width := 100;
TestColumn := Columns.Add;
TestColumn.Caption := 'B';
TestColumn.Width := 100;
with Items.Add() do begin
Caption := '1-1';
SubItems.Add('2-1')
end;
with Items.Add() do begin
Caption := '1-2';
SubItems.Add('2-2')
end;
end;
end;
>>688 字面の正しさは正規表現でチェック
'^([a-zA-Z]\:)|(\\)(\\{1}|((\\{1})[^\\]([^/:*?<>"|]*(?<!\[\])))+)$'
ディレクトリが存在してるか、アクセス権があるか等々で失敗する要因が他にもあるから
あまりがんばらずに、実際に書き込んでみてから例外拾って対応するのが定石。
>>689 for i := 1 to 2 do
with ListView1.Items.Add do
begin
Caption := Format('%d-1', [i]);
SubItems.Add(Format('%d-2', [i]);
end;
>>690 ,692
FileCreateで行けるようですね、ありがとうございました
>>690 色々なサイトを回ったのですがSubItemの使い方について書いてあるところが見つかりませんでした。
>>691-692 ありがとうございます。
しかし、そのとおり実行してみるとカラムAの1番目に'1-1'、3番目に'2-1'
カラムBの2番目に'1-2'、4番目に'2-2'と表示され、
カラムAの2,4番目は空欄、カラムBの1,3番目も空欄、というようになります。
どうすれば1番目と2番目とで納められるでしょうか?
本当にすみません。
>>692 さんのコードでできました。お騒がせいたしました。
また、答えてくださった方ありがとうございました。
>>691 さんのコードもできました。
変に打ち間違えていたようです。
すみませんでした。
697 :
デフォルトの名無しさん :2008/05/20(火) 06:08:00
698 :
デフォルトの名無しさん :2008/05/20(火) 06:10:06
ActionListをダブルクリックすると編集ウィンドウが開きますが、 この位置や大きさをプロジェクト単位で覚えさせとくってできます?
>>699 フリーウェアでそんなのがありそうだな。
ソフトウェア板行って聞いてみたら。
702 :
デフォルトの名無しさん :2008/05/21(水) 11:04:56
Memo1.Lines.LoadFromFile(FileName); とかでEUCのテキストを読み込むと文字化けしますが これを読めるように表示することってできるのでしょうか? テキストエディタだと見た目はeucで読み込んで表示し 保存もeucのまましてるように見えるけどあれは 内部でシフトJISに変換して表示して、保存時は再度eucに変換してるだけなんでしょうか?
TMemoryStreamで読み込んで nkf32.dllで変換して Memo1.Lines.LoadFromStream
704 :
k :2008/05/21(水) 11:52:01
正整数Nを読み込み、x^2≦N<(x+1)^2となる整数x、つまり√Nの近似値を求めるプログラムを、 sqrtなどの標準関数を使わないで作りなさいという問題なんですが。。。 わかりません。教えてもらえませんか?PASCALでやっているんですが。
705 :
702 :2008/05/21(水) 11:54:14
>>703 やはりnkf32.dll等で自動判別して読み込んでsjisで表示するんですね
ありがとうございます
>>704 良く知られた方法は 奇数を順に累計していったらという方法
function iSqr(n:Integer):Integer;
var i,sum:Integer;
begin
sum:=0;
for i:=0 to $B505 div 2 do begin
sum:=sum+1+i*2;
if sum>n then begin Result:=i;exit;end;
end;
Result:=i;
end;
大きな数字で速度がある程度必要ならバイナリー法(2分検索を行う)
さらに浮動小数点等で速度が必要ならニュートン法
あ div 2 は 不要だ。
助けてください。 Form3で procedure TForm3.FormCreate(Sender: TObject); begin IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); try pass := IniFile.Readinteger('pass', 'Pno',0); finally IniFile.Free; end; edit1.text:=inttostr(pass); end; んでForm1で procedure TForm1.N1Click(Sender: TObject); begin Form3.ShowModal; end; しても Form3のEdit1にiniのPnoデータ表示されません(;;
わざわざForm3のOnCreateを使ってiniを読む理由は?
>>708 何が表示されるの?
もしかして Edit1 って文字のまま? だとしたら例外が出てるんじゃないの?
>>709 Form3(バージョン情報の画面)に
シリアルb入力してiniファイルを作成してます。
んで次回起動時にForm3を開くと
iniファイルを読んでシリアルb表示させたいんです。
>>710 シリアルbニして数値を表示させています。
一度入力すれば問題ないのですが
起動一発目の読み込みがうまくいきません(;;
コピペした部分のコードにはおかしいところはなさそうな気がする。 edit1.text:=inttostr(pass); の下に ShowMessage(Format('edit1.text=''%s'', pass=%d', [edit1.text, pass])); って行を入れてメッセージダイアログが表示され、更に値が望んだものかどうかをチェックしてみたら。
>>713 ダイアログ表示せず・・・
FormCreate走ってないようです
orz
>>714 プロジェクトのオプションでForm3を自動作成の対象から外して
Form1のボタンイベントを↓に変えて実行したらどうなる?
procedure TForm1.N1Click(Sender: TObject);
begin
Form3 := TForm3.Create(nil);
Form3.ShowModal;
Form3.Free();
end;
メニューアイテムにビットマップを動的に割り付けようと 下記のようなコードを書いたのですが、反応がありません(エラーも出ない) New1.Bitmap.LoadFromFile('C:\hogehoge\new.bmp'); 設計時にオブジェクトインスペクタから、あらかじめ bitmapを割り当てていた場合は、 その画像と入れ替わりに、ビットマップが更新されます インスタンスがないのかと New1.Bitmap := TBitmap.Create; New1.Bitmap.LoadFromFile('C:\hogehoge\new.bmp'); もやってみましたが、結果は同じでした ビットマップ読み込み後に、アップデート処理などが必要なのでしょうか?
717 :
k :2008/05/21(水) 17:34:29
>>706 $B505ってなんですか?すみません。なにもわからないもんで・・・
>>716 新しいTBitmapオブジェクトを作ってTMenuItem.Bitmapに代入するとうまくいくよ
NewBitmap := TBitmap.Create;
NewBitmap.LoadFromFile('....');
New1.Bitmap := NewBitmap;
NewBitmap.Free; // 解放を忘れずに
>>716 New1.Bitmap.LoadFromFile('C:\hogehoge\new.bmp');
New1.Bitmap.Canvas.Refresh;
copy関数で何文字目とか文字数とかの設定は 関数にできないんでしょうか?
日本語でry
>>720 こういうこと?
function TForm1.CopyEx(S:String; Idx, Cnt:Integer):String;
begin
Result := Copy(S,Idx,Cnt);
end;
>>722 申し訳ないです。
関数にできないんでしょうか?
は変数にできないんでしょうか?
の間違いです。
722に申し訳がるこた全くなし つうか変数使えるでしょ?たぶん
>>723 こういうこと?
var
Idx,Cnt:Integer;
begin
idx := 1;
Cnt := 2;
Edit2.Text := Copy(Edit1.Text, idx, Cnt);
end;
>>725 a1 := edit1.text;
a2 := strtoint( a1 );
data := copy( Edit2.Text,a2,1 );
ここで悩んでます。
はぁ?
>>726 edit1.textに数字を入力すれば普通に動くと思う
↓またはこうする
a1 := edit1.text;
try
a2 := strtoint( a1 );
finally
a2 := 0;
end;
data := copy( Edit2.Text,a2,1 );
a1 := edit1.text; a2 := Length( a1 ); data := copy( Edit2.Text, a2, 1 ); こーゆーこと?
いやあエスパーさんばっかいるなwww
>>728 var
bno:string;
keta:string;
k1,k2 : string;
kk1,kk2 : integer;
a1,a2 : string;
procedure TForm1.Button2Click(Sender: TObject);
begin
a1 := copy(bno,kk1,1);
a2 := copy(bno,kk2,1);
edit2.Text := a1+a2;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
keta := edit2.text;
k1 := copy(keta,1,1);
kk1 := strtoint(k1);
k2 := copy(keta,2,1);
kk2 := strtoint(k2);
end;
コンパイルは通るのに実行するとエラーが出ます(涙)
edit2でキー押したとたんに落ちたの?
>>734
とりあえず書き方がうざすぎる
>>735 はい。
デバッガ例外通知が出たので
継続ってすると
”は整数ではありません
と怒られました。
>>738 ほかのEditから取り込んだ数値が入ってます。
>>739 ↓この行にブレークポイント置いてketaの中身をチェックしてみ
k1 := copy(keta,1,1);
>>740 やってみます。
ありがとうございました
とりあえず1度深呼吸してからヘルプのOnChangeを10000回ぐらい読んでこい
>>741
Edit&数値処理の基本 var n: Integer; begin try n := IntToStr(Edit1.Text); ShowMessage(Format('%dの二倍は%d', [n, n * 2])); except ShowMessage(Edit1.Text + 'は数値ではない'); end; end;
>>740 >>742 >>743 EditChangeに入れてた式を
ButtonClickに移動したらエラーが出なくなりました。
もっと勉強します
例外がどこで起こってるかくらいてめぇで調べられないのかよ・・・ 嘆かわしいのぅ
IDEで挿入されるもの以外小文字で書いてる人よく見るけど見づらくないのかな
大文字と小文字が区別されないという特徴をうまく使っていると思っている方々なんですよ、わかりません。
TDateTimePickerのKindプロパティをdtkTimeにし、Formatプロパティに日付を表示するように設定した場合、 日付を編集し、その後に時刻を編集すると日付が元に戻ってしまうのですが、 OnChangeなどを監視するなどしか対策方法はないでしょうか ヘルプには 「Format プロパティに日付フィールドのコードが含まれている場合には日付部分も編集できます。」 と書いてあるのに・・・
750 :
716 :2008/05/22(木) 10:04:22
Delphi5, TStringGrid にデータ表示 1レコード1行の場合OnDrawCellイベントで if Grid.Row = ARow then begin Grid.Canvas.Brush.Color := '紺色'; Grid.Canvas.Font.Color := '白色'; Grid.Canvas.FillRect(Rect); end else begin Grid.Canvas.Brush.Color := Grid.Color; Grid.Canvas.Font.Color := Grid.Font.Color; Grid.Canvas.FillRect(Rect); end; として、フォーカスが当たっているように見せています。 1レコード2行の場合はどうすればいいでしょうか? Grid.Row が2の倍数で ARow = Grid.Row + 1 Grid.Row が2の倍数以外で ARow = Grid.Row - 1 の条件の時にも 背景・前景色を変更したけど、フォーカス色が残ってしまう場合があります。 OnDrawCell内で Grid.Repaint; を実行するとチラつきます。 Grid.Invalidate; だと さらに チラつきっぱなしです。 複数行フォーカスってどうやるんでしょうか?
>>751 一行が二行に見えるように描画すればいい。
753 :
デフォルトの名無しさん :2008/05/23(金) 10:53:01
>>753 みたいです。MLでも話題になっています
Webサーバのあるディレクトリのファイル名の一覧を FindFirst, FindNext みたいに HTTPで取得する方法ってあります?Delphi7 + Indy9 ですけど
お前は行ったことの無い店の商品が分かるのか? そういうことだ でも店によっちゃホームページとかで公開してる場合もある それと同じようにファイル一覧が見れるページもある
出来たらCGIがスケスケで大問題だね
>>753-754 MLにご本人からポストがありましたがWeb鯖が停止しているだけのようで。
閉鎖の予定は無いそうですよ。
>>756 >>757 あ、自分のサーバーなんです。ユーザーに配るプログラムから、
特定のディレクトリのファイルを全部 GET でダウンロードできるように
したいと思いまして(そこに置くファイルは変化します)。
でも出来ないみたいなのかあ。
>>759 それなら、ファイルの一覧を取得して返すCGIを置いといて、それにアクセスすればいいと思うよ
自鯖ならFTPか何かで取得してもいいんじゃ?
あ、そうか。CGI方式もFTPでもいけそうかあ。 ありがとう。FTPはパスワード変更しそうなんでCGIで検討してみます。 # 最初の質問、説明不足でスミマセンでした。
TComboBoxでドロップダウンのアイテム選択しているとき、 DELキーを押したら選択アイテムをItemsからむ削除したいんだけど出来るかな? ブラウザの検索履歴を消すイメージで
そりゃできるだろ
どこがわからないんだよ
こいつのがんばり方が正直よくわからない
TComboBoxでやるのは意外と大変かもよ。 ブラウザは独自のComboBoxもどきでしょうね。
>>766 itemsの中身がペロッと出て、
そのペロッと出たリストを選んでいる状態で、
DELキーを押したときの処理なんだけど…
説明がヘタですまん
ボタンイベントを監視してDELが押されたら現在選択中の番号取得してそこをリストから削除すりゃーいい話だろう
ん?よくわからないんだがこれじゃだめなの? procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var i:integer; begin if key=VK_DELETE then for i:=0 to combobox1.Items.Count-1 do if combobox1.Text=combobox1.Items[i] then combobox1.Items.Delete(i); end;
あぁItemIndex使えばいいか
keyPressだとうまく行かなかったけど、KeyDownならうまく行きそうだね
>>771 ありがとう
たびたびすいません
>>771 でうまくいったと思うんだけど、
ペロッと出してない状態でも、textにitemsと同じ文字列が入ってる状態で
DELキー押すとitemsから削除されちゃうのは、しょうがないですかね?
>>775 それはイベントですか?
DroppedDownの意味がわからなくてすいません
ヘルプは?
>>777 ヘルプに乗ってました
↓こうしたらうまくいきました
助かりました!
if (ComboBox1.DroppedDown) and (key=VK_DELETE) then begin
ループしてる時に固まることがあるのでUpdateWindowを毎回やってるのですが、それでも固まってしまいます UpdateWindowよりも確実な方法はあるのでしょうか? Application.ProcessMessageは遅い印象があるので使いたくないです
>>780 なるほど、マルチスレッドにはあまりしたことがないので思いつきませんでした
ですがループで毎回メインフォーム弄ってたらそれも遅くなったりしませんかね?
>779 > Application.ProcessMessageは遅い印象があるので使いたくないです 印象だけで排除するのはどうよ?つかたぶんその印象は間違っている。
784 :
デフォルトの名無しさん :2008/05/24(土) 07:08:07
>>779 ・マルチスレッド化する
・Sleep();を入れる
マルチスレッドにしてもWait入れたりSleepしないと重くなるけどな
特定のコンポーネントの表示を頻繁に行いたいなら ListBox1.Items.Add('foo'); ListBox1.Repaint みたいにすればいいし、ウィンドウのリサイズなんかの操作が固まるのを避けたいなら Application.ProcessMessagesかスレッド使うしかない。 どうやるにしろ表示の更新は重いのには変わりない。
ListViewならBeginUpdate / EndUpdateで大幅に高速化できるな
Invalidateしないと、UpdateWindowだけでは更新しなかった気がするのですが。
質問させてください。(2つに分けます。長くて申し訳ありません) 次のような宣言をされた DLL があります。(Microsoft Visual C++ 6.0) typedef struct { SOCKET fd; /* Socket Handle */ struct sockaddr_in m_lcd; struct sockaddr_in m_para; struct sockaddr_in m_serial; timeval timeout; int registered; } PICNIC; extern "C" { __declspec(PICNIC_DLL) PICNIC *PN_open(char *ip, u_short lcd_port, u_short para_port, u_short serial_port); __declspec(PICNIC_DLL) void PN_close(PICNIC *pn); __declspec(PICNIC_DLL) int PN_setwhole(PICNIC *pn, int addr, int cn, ...); } つづく
>>788 のつづき
この DLL にアクセスしたくて Delphi 7 でこのようにプログラムを書いてみましたが
uses WinSock
type
TPICNIC = record
fd: TSocket;
m_lcd: sockaddr_in;
m_para: sockaddr_in;
m_serial: sockaddr_in;
timeout: timeval;
registered: Integer;
end;
function PN_open(ip: PChar; lcd_port: Word; para_port: Word; serial_port: Word): TPICNIC; cdecl;
external 'PICNIC.DLL' name 'PN_open';
procedure PN_close(pn: TPICNIC); cdecl;
external 'PICNIC.DLL' name 'PN_close';
function PN_setwhole(pn: TPICNIC; addr: Integer; cn: Integer): Integer; cdecl;
external 'PICNIC.DLL' name 'PN_setwhole';
C での SOCKET 型が Delphi では TSocket と宣言すれば正しいのかわからないです。(Longint ?)
それと、PN_setwhole(PICNIC *pn, int addr, int cn, ...); の最後の「...」を
Delphi では、どのように記述すればいいのかわかりません。
どなたか教えていただけないでしょうか?
790 :
デフォルトの名無しさん :2008/05/24(土) 19:02:15
少し書き間違ってました。 function PN_setwhole(pn: TPICNIC; addr: Integer; cn: Integer; arg: array of Integer): Integer; cdecl; です。DLL 側のソースで va_start(arg, cn); for(i=0;i<cn;i++){ mask = va_arg(arg, int); or = va_arg(arg, int); frame[3+i*2] = mask; frame[3+i*2+1] = or; } va_end(arg); と記述されています。
791 :
デフォルトの名無しさん :2008/05/24(土) 19:46:48
>>758 あせったわw
MLみたら、2chの書き込みまで引用されててひどい
誰だよ武内さん語ったの・・・いたずらにしてはひどい話だよ
あれは、たかだか2chのソースでしかない話を引用した方も悪い
くだらない筆問ですが
下記サイトで言語習得を目指そうと思います
全てを呼んだわけではありませんがサイトから抜粋
Delphiの
Object Pascal という言語をつかって、Windows 95/98/2000 が DLL
(ダイナミック・リンク・ライブラリ)として提供している
Win32 API (アプリケーション・プログラミング・インターフェース)という
関数群を呼び出してウィンドウズアプリケーションをつくる方法を解説しています
現在仕様しているソフトは無償版Turbo Delphiです
RAD環境などサイトとは異なる点がいくつかあると思いますが問題なく勉強していけるでしょうか?
これだけのボリュームと内容なので当事はかなり有名な人だったのでしょうね
ttp://homepage2.nifty.com/Mr_XRAY/Halbow/ShousaiIndex.html
>>789 "..."は末尾にvarargsを付ける。詳しくはヘルプを読め
SOCKETはたぶん同じ。あとTPICNICをそのまま使うんじゃなくて
type
PPICNIC = ^TPICNIC
としてPPICNICを使わないとだめ(ポインタだから)
実体を渡す事が多いようなら 参照にしてもいいと思うよ (var pn: TPICNIC; みたいにさ
ListViewに何万個ものアイテムを追加するとClearした時やフォーム自体を終了した時にものすごく時間がかかるのですが、 時間のかからないClearの方法はないでしょうか?
仮想リストビュー使っとけ めちゃ軽くなる
TreeViewも標準で仮想にして欲しい
800 :
デフォルトの名無しさん :2008/05/24(土) 22:45:31
>>794 ,795
とりあえず、794 さんの方法で試したところ、上手く行きました。
ありがとうございました。
特に varargs は存在そのものを知らなかったので
勉強になりました。
CreateUpDownControlでアップダウンコントロールを 直前に作ったEditに関連付けて作ったのですが、 ウィンドウスタイルにUDS_ARROWKEYSを設定し、矢印キーで位置を移動したら アップダウンコントロールが凹んだまま元に戻らないのですがこれは直せるのでしょうか? アップダウンコントロールをクリックすれば元に戻るのですが・・・ また、C++で試したところ問題はなかったのですが、なぜDelphiでのみ症状が発生するのでしょうか?
Webページの更新をチェックしたいんですが、サーバーにあるファイルの更新日時は どうすれば取得できるのでしょうか?
>>803 HEADリクエスト投げてLast-Modifiedでも見れば?
806 :
デフォルトの名無しさん :2008/05/27(火) 19:21:11
「'」を文字列で使いたい場合どうするんでしょう? コードとして解釈されてしまいます。
''''
今から始めるなら Delphi6とTurbo Delphiどっちがいいですか?
ガゼンDelphiだろ
両方ともDelphiだろw
TMediaPlayerコンポーネントを使ったソフトでmp3ファイルを開こうとすると
「指定されたファイル名拡張子からデバイスの種類を判断できません」
というエラーメッセージがでるという不具合報告がありました
ttp://d.hatena.ne.jp/tomoemon/20051031/p4 ↑を読むと、DeviceTypeを明示的に指定する必要があるみたいなんですが
"MPEGVideo"に相当するTMPDeviceTypesの値はどれでしょう?
Delphi6を使っているのですが、もしかして対応してなかったりするのでしょうか?
>>812 DeviceTypeはdtAutoSelectでmp3再生できたけど?(Del6)
書き込む前に自分で試してね
dtAutoSelectでも、↓に拡張子とデバイスタイプを結びつけるキーが無いと
>>812 のエラーが出る。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Current Version\MCI Extensions (NT系)
不具合報告を送ってきた人の環境には、それが無いか別の値になってるのかもしれない。
ちなみにTMediaPlayerに"MPEGVideo"を指定するのはソースを見る限り無理だと思う。
あ、オレのアプリ(Del7)のMediaPlayer使ったBGM機能もいつの間にか mp3再生できなくなってる… wavで使ってきたから全然気が付かなかった。 開発時は再生できてたのに何でレジストリ変わっちゃったんだろ!? それよりクレーム全然無いってのも、悲しいもんだね
BCB使いだけどTMediaPlayerは使い勝手悪かったから、自分でDirectShow叩いてプレイヤーコンポ作っちゃったなぁ IGraphBuilderインタフェース作成して、そこからコントロールとかビデオウィンドウとかの必要なインタフェース呼び出すだけだから 最低限の物なら50行も行かないと思う。 Delだとヘッダ使えないから面倒そうだけど。
>>813 不具合報告がありましたってんだから環境によるものだろ
自分の環境が全てではないぞ
不具合報告にはOS書いてなかったのか?
95とかだったのでは?
818 :
812 :2008/05/28(水) 22:11:31
>>814 あやや、アプリ側で吸収してあげるのは無理っぽいですか
レジストリの値をいじってもらうのには抵抗ありますが致し方ないですな
>>815 反応ないと寂しいのは、あるある
無茶なクレームつけられるのは困るけど、
今回の人はきちんと対話ができる人だったんで
対応するほうもやる気がでます
>>817 いや、XP Proらしいっす
ただ、気になる点があるとすればMP3に関連付けられてるのが
Media Player Classicだってことでしょうか
もしかしたら、そのせいでレジストリにキーが登録されなかったのかも
レジストリの値をチェックしてもらう方向で対応してみようかと思います
皆様ありがとうございましたm(__)m
820 :
デフォルトの名無しさん :2008/06/01(日) 10:07:41
821 :
デフォルトの名無しさん :2008/06/01(日) 17:22:38
BDS2006 + Vistaのインストールに関する質問です。
http://bousyo.blog45.fc2.com/blog-entry-116.html の手順に従ってインストールが完了しました。
(アップデートはまだです)
まずは、認証登録をしようとしたのですが、
インターネット経由では、「登録サーバーに接続できません。」で×
http://dn.codegear.com/article/33586 によると、プロクシのせいとかかれていますが、当方はプロクシが不要の環境です。
次に、webによる登録で登録を無事にすませ、
認証用テキストがかかれたメールを受取、
そのreg722.txtというファイルをホームフォルダ(.borlandの上位フォルダですよね?)
に突っ込みましたが、
「Borland Developer Studio for Windowsは動作を停止しました。
問題が発生ししたため、プログラムが正しく動作しなくなりました。
プログラムは閉じられ、解決策がある場合はWindowsから通知されます。プログラムの終了」
とダイアログが出て、まったく起動ができません。
管理者権限で実行しています。
大変困っております。
うまく起動する方法はありませんでしょうか?
822 :
821 :2008/06/01(日) 19:31:20
アップデート1、2と当てて、ホットフィックス全部当てたら起動しました。 実は、アップデート2が同じような落ち方をして、 うまくインストールできなかったのですが、 UAC切って、DEPも切ったら当てられました。 おさわがせしました。 ありがとうございました。
あたらしいデルファイはでるんかい?
で、出るふぁい!
ボタンをクリックするたびに 1 2 4 8 ・ ・と2乗の数を表示させるプログラムを作りたいのですが、 {$R *.dfm} var s: integer; str: string; procedure TForm1.Button1Click(Sender: TObject); var i :integer; begin s :=1; for i :=1 to 44444444 do s := i * 2; str := IntToStr(s); Memo1.Lines.Add(' = ' +str); end; end. こんな風にしてやったら失敗しました。他にも試したのですが、ループ制御変数がどうとか出てできませんでした。 どなたか教えてください。
DelphiのGUIプログラミングはプログラミングの仕方がちょっと独特だから最初は戸惑うかもな type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private 宣言 } num: Integer; // <- 変数はここ public { Public 宣言 } end; implementation procedure TForm1.FormCreate(Sender: TObject); begin // 変数の初期値はここで設定 num := 1; end; procedure TForm1.Button1Click(Sender: TObject); begin // ボタンが押されるたびに呼び出される // なのでループを書く必要はない Memo1.Lines.Add(IntToStr(num)); num := num * 2; end; end.
DeviceIoControl(Handle, FSCTL_SET_SPARSE, nil, 0, nil, 0, BytesReturned, nil); スパースファイルを作りたいんですけど 未定義の識別子 : 'FSCTL_SET_SPARSE'となります。 何をインクルードすればいいんでしょうか? Delphi6 personal です。
RTLには含まれていないので自分で定義してください。
830 :
828 :2008/06/03(火) 16:57:30
>>825 > 1
> 2
> 4
> 8
> ・
これは2乗ではないな、 1 を 起点に x2 していってるだけ
> ボタンをクリックするたびに
なら、ボタンクリックだけでいきなり44444444回もループしたらダメだろ?
Button1のTagプロパティに1をセットして、
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(IntToStr(Button1.Tag));
Button1.Tag:=Button1.Tag*2;
end;
これでいいんではないか?
2^0 = 1 2^1 = 2 2^2 = 4 2^3 = 8 1^2 = 1 2^2 = 4 3^2 = 8 の違いか。
ぢゃ、こうか? Button1のTagプロパティを0に戻して Memo1.Lines.Add(FloatToStr(IntPower(2,Button1.Tag))); Button1.Tag:=Button1.Tag+1;
>>825 >for i :=1 to 44444444 do s := i * 2;
>>831 が
>なら、ボタンクリックだけでいきなり44444444回もループしたらダメだろ?
と、つっ込んではいるものの、なぜ「44444444」と記述したのか?
それを知りたい。
825です すいません。2のn乗でした。 444444としたのはとにかくどこまでも2倍ができるように作りたかったからです。
それならforよりもwhileじゃね?
forつかって書いてみなさい的な課題だったので・・・。 バリバリ初心者なのでわからないのですが・・・。
なんだよその課題 教師アホすぎてワロタw
839 :
834 :2008/06/04(水) 11:53:59
for でも while でも case でも if でも何でもいいじゃん 目の前の問題が解決できりゃ万々歳 でしょ? とりあえず Delphi 実行できる環境があるんなら何でも試してみたら いいじゃん。それで出来なかったらガンガン質問すりゃいいじゃん! このスレ、結構ガンガン突っ込む人多いみたいだから安心だよ。
ボタンをクリックするたびに、*2するんじゃないのか? forの中で、キー入力待ちするの? それとも、forで一気に*2していくのか? 見えないぞ。
2レスで解決してるのに引っ張るねぇ
843 :
825 :2008/06/04(水) 22:28:29
先生が見せてた見本ではクリックするたびに2,4,8,16,とMemoに表示されていってました。 長引かせてしまいすいません; プログラム板の人は親切な人が多いですね。 ありがとうございました。これからは授業ちゃんと聞きます。 課題は途中経過を書いて出します。
こういうことじゃね? procedure Form1.Button1Click(Sender: TObject); var i,j: Integer; begin j := 1; // 計算用変数jの初期値として1を入れておく with Button1 do begin Tag := Tag + 1; // ボタンを押した回数をTagに記録 for i := 1 to Tag do// ボタンを押した回数分jに2を掛ける処理 j := j * 2; end; Memo1.Lines.Add(IntToStr(j)); end;
これくらいでwith使うな OnCreateでButton1.Tag = 1; Button1.OnClickで Button1.Tag = Button1.Tag * 2; Memo1.Lines.Add(IntToStr(Button1.Tag)); 又は Button1.Tag = Button1.Tag + 1; Memo1.Lines.Add(IntToStr(Math.Power(2,Button1.Tag)));
>>826 でいいじゃん。
numはグローバル変数にして、
var
num: Integer = 1;
のほうが楽かも。
847 :
844 :2008/06/05(木) 18:13:04
>>845 Button1のNameプロパティ変えたりすることを考えると、
どうしてもwith使ってしまう悪い癖は抜け切れそうに無い。
Form1のプロパティを参照したい時に面倒になるのは承知済み。
この場合、複数のボタンで使いまわし出来るよう
with TButton(Sender)の方が良かったけどね。
>>837 に従って無理やりfor文を入れたけど、
for文を使わなくても良いのなら
>>845 でFA。
>>848 そりゃInterbaseに接続して処理するんだからしょうがない。
それと配布するとなるとインストール先にもInterbaseのライセンスが必要になる。
単一アプリケーションの内蔵データベースとしてしか使わないんであれば、Interbaseの代わりにEmbeded Firebirdの使用をおすすめ。
FirebirdはInterbase6.0互換だからVCLのInterbase接続コンポがそのままつかえる。
※IDEからデバッグ実行したときにカレントディレクトリとexeファイルのパスの違いで問題起きるので、
アプリケーションの初期化のところでexeファイルの場所にSetCurrentDirectoryを使ってカレントディレクトリを変更しておくといい。
A-Zの26人の人がいて、8人くらいでじゃんけんをしたとする。 その結果を書いたtxtがあって、 1.自分の勝率(自分はAとする) 2.自分のBに対する勝率 3.自分が相手にすると勝率が高い人TOP5 4.自分と一緒に勝つ確立が高い人TOP を出力したいのですが、全然ナにやっていいかわからないで困っています。 1.テキストをTmemoに取り込んだ 2.勝った人の1人目をlistboxに出力してみた、うまくいかなかった 3.データベースは使い方がよくわからなかった 4.試合数だけ数えてみた:これはできた 5.やりたいことをするために何をすればいいのかわからなくなってきた いまここ
> うまくいかなかった そのうまくいかなかった部分を言おうよ
それじゃ誰にも答えてもらえないよ さようなら
>>850 文字列解析の課題かな。 txtファイルがどんなのかわからないと答えようがない。
csv形式なら、TStringList.CommaTextを使ってデータを切り分けれる。
プログラム以前の問題でしょう。 やるべきことを整理して箇条書きにして、一歩一歩解決していくしかないでしょう。 質問が具体的じゃないと、具体的に回答できるはずもありません。
txtをどっかにうpすれば誰かやってくれそうなもんだけどな
書き方悪くてすいません。850です。
http://irsj.bestplaying.com/modules/result/ ここのページのhtmlを取得してやろうと思ったんですが、まずはテキストと思い、
39274 フリー@(´゚ω゚`)ナッツエレガント 2008/06/06 01:30
Win genzouzi(1648) satou(1717) Molt(1437) hujisan(1438)
Lose masa4_(1864) hyakusiki(1152) parusah(1610) against(1600)
Upload コメント (0)
こんな感じで出力されました。
これが一個のレコード?になります。なのでCSVではないです。
で、フローチャートを考えてみたのですが、それがまずわからなくて悩んでいます。
何言ってんのかさっぱりわからんな
htmlから必要なデータを抜き出したいのか。 StrPosを使って、'>Win<'を探す。 それ以降にある '</a>'を探す。 名前は >mog</a> となっているから、>から<まで抜き出す。 こんな感じでやればいいよ。
861 :
デフォルトの名無しさん :2008/06/07(土) 10:11:55
俺ほどぢゃないだろ
つうかこんなスレ、リキ入れて読んでられないからさ〜 酒のみながらみてるときもあるし… できるだけわかり易い文章か母性本能くすぐりーの感じで書かないと
865 :
デフォルトの名無しさん :2008/06/07(土) 23:31:06
質問です。 壁紙を手前に表示するソフトを作ろうと思っています。 そこで TForm と TImage を半透明にして常に手前に表示してマウスなどの入力は背後のウィンドウに渡すようにしたいのですがどうすればできますか?
GetNextWindowで次にあるウィンドウ出して送ればいいと思う
>>866 ありがとうございます。GetNextWindow を調べてみます。
Delphiのフォームに画像はりつけて全画面かつ最前面表示して 後ろのExcelやExplorerを自然に操作するってことか。 フォームへのウィンドウメッセージをすべての他の適切なウィンドウに再送信しまくるなんて かなり面倒なことをしないといけなさそうだな。たぶん挫折するだろう。 付箋紙のイメージ表示機能で我慢しておいた方がいいんじゃね。
>>865 つ SetLayeredWindowAttributes
つ WS_EX_TRANSPARENT
ここの人、親切。 でも「付箋紙のイメージ表示機能で我慢」になりそうです。 クリックすると逃げるようにして邪魔にならないようにしています。 でも多謝。
delphi6なんだけど ListViewでオーナーデータだとマルチセレクト出来ない? 出来ない場合出来るようにする方法とか教えてください
TClientSocketでデータを数値として受け取るにはどうすればいいんでしょうか? Ordで大丈夫なんでしょうか
バイナリデータを受信したとき、ってこと?1バイトならOrdでいいかな。複数バイトならバイトオーダの考慮も 忘れずに。
普通にテキスト化して送ったら
TListViewからの派生クラスを書いているのですが、縦スクロールバー出現によるクライアントエリアの横サイズ変更に追従するには どのメソッドで変更に追従する処理をすればよいのでしょうか? 派生クラスで実装するので、できればメソッドのオーバーライドで処理したいです。
RGB0~255を三次元空間に見立てて その中に数十個のピクセルをFormなりImageなりに表示するのを支援してくれる ライブラリってないですか? DirectXやOpenGLほどハイパフォーマンスで大げさなのじゃなくて ちょっとしたグラフライブラリ程度のもので。
877 :
デフォルトの名無しさん :2008/06/10(火) 13:53:10
いっていることがわからないのだが、ボクセルということだろうか
色立体とかいう物を表示したいんじゃなかろうか。
879 :
デフォルトの名無しさん :2008/06/10(火) 23:32:26
880 :
デフォルトの名無しさん :2008/06/10(火) 23:33:25
881 :
デフォルトの名無しさん :2008/06/10(火) 23:37:13
スマン ど忘れして しかも ググッテも出てこない 範囲指定して字下げするのってどうやるんだっけ? 忘れちまった・・・・・ 年だ・・・・
>>881 Ctrl+Shift+I/U
フリーカーソル無効化してるならTab/Shift+Tabでもできる。
>>882 やるね!!
まあああああああああああベラス!!
ありがとう!!
フリーカーソル?・・・・ググッタ!コンポーネントかぁ メモメモ
ついでに、選択したところ全て注釈にする方法わかりますか?
これも出来たはずなんだが・・・
884 :
デフォルトの名無しさん :2008/06/11(水) 00:13:32
テプラ作った大切にするぉ サンキュウ デルファイ マイスターズ
885 :
デフォルトの名無しさん :2008/06/11(水) 09:34:41
>>879 バカっていうんなら、人にわかるように説明しろよ
グラフライブラリって書いてあるじゃんw
TChartって2次元までだっけか?
>>883 選択状態にして選択範囲を右クリックしてみるといいよ。
ちなみに、Ctrl+/で出来る。
TlistBoxを3つ並べてスクロールを同期させたいんだがどうすればいい?
890 :
デフォルトの名無しさん :2008/06/11(水) 14:36:13
>>889 OnScrollで他もスクロールさせる。
>>888 ふむふむ
ありがとう
テプラットきます
>>888 それ、D7で出来ないみたい
あと、いつの間にか右クリックして「しおり」のテンキーの数字が効かなくなってるし
>>893 うん
やってみた
ターボの方は出来るんですけれど
7はダメでした
報告ありがとう
でも 7でもやる方法があった様な気がするが
はて 勘違いかなあ
MainMenuについて聞きたいんですが 項目の右側に勝手に(Z)と付くのはどうにか出来ませんか?
>895 AutoHotKeysをmaManualに。
898 :
デフォルトの名無しさん :2008/06/13(金) 09:30:41
>>894 GExpertsのマクロでコメントアウトなどできた気がするよ
>>899 フラグでも立てて、Compareに-1掛ければいい。
>>900 それはわかるんですけど、そのフラグがわからんのです。
そもそもcompareイベントの仕組みがよくわからなくてコピペしたのがいけないんですが・・w
デバッガで追いかけろ
前に書いたソートサンプル。適当に解読してくれ。 { Private 宣言 } ColumnToSort: Integer; LastColumnToSort: Integer; Ascending: Integer; procedure TForm1.FormCreate(Sender: TObject); begin ColumnToSort := -1; LastColumnToSort := -1; end; procedure TForm1.listviewColumnClick(Sender: TObject; Column: TListColumn); begin ColumnToSort := Column.Index; if (Ascending > 0) and (ColumnToSort = LastColumnToSort) then Ascending := -1 else Ascending := 1; LastColumnToSort := ColumnToSort; listview.AlphaSort; end; procedure TForm1.listviewCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin Compare := ( StrToInt(Item1.SubItems[ColumnToSort-1]) - StrToInt(Item2.SubItems[ColumnToSort-1]) ) * Ascending; end;
>>903 助かった。thx!
コピペでできてしまったので、次使うときのために解読しとくわ。
コピペだけでアプリ一本作りそうな勢いだなww
>>905 教科書はネットのみだからおのずとコピペが多くなってしまうのは仕方ない気がw
アプリはもうできてて今は改善している段階でふ。
ifの条件が複数あるときはVBのようにandで繋ぐことは出来ないんでしょうか?
そんなの入門サイトに乗ってそうだけどなあ 回答としては「出来る」よ
listviewで表を作っているんですが ある条件を満たしたときに画像を文字の後ろに付け足したいのですがどうすればいいですか? column1,column2,・・・ 名前,数学の点数,国語の点数, で、数学の点数や国語の点数が80点を越えたときに 各々数学マーク.bmp、国語マーク.bmpを名前の後ろに付け足したいという意味です。
910 :
デフォルトの名無しさん :2008/06/14(土) 17:20:45
912 :
デフォルトの名無しさん :2008/06/14(土) 18:59:06
listviewのownerdrawか・・・激しく挫折しそうだ・・
>>907-908 演算子の優先度がVBと違うからできないと思ったのかもしれないな
if (条件) and (条件) 〜
みたいに括弧で括らないといけないから
>>912 ListViewのOwnerDrawはOwnerDataを使っていなければそんなに難しくないと思います。
OwnerDataを使っているならHeaderコントロール+ListBoxマジオススメ。
ListViewやListBoxの内容は直接編集出来ないんでしょうか?
クリックしたときに、カーソル直下のセルに内容入れたTEdit生成して、TEditがフォーカス失ったらTEditの内容をセルに書き込めばいいと思うよ。 TStringGridで用が足りることも多いけどNE
formcreateでiniファイルを読み込んで、listboxにiniの内容を書き出したいのですが for do でループしようと思ったら、iniファイルのセクションの項目数をカウントする方法が思いつかずに 困っているのですが、これはどうしたらいいのでしょうか 逆にtxt形式にしてreadlnでuntil Eofとかしないとだめなのでしょうか。ご教授ください。
920 :
デフォルトの名無しさん :2008/06/17(火) 08:04:52
AnsiやUTF8の文字列をUTF32にエンコードするにはどうすればいいんでしょう? WikipediaのUnicodeの項目を見るとUCS4とUTF32は互換性があるらしいですが、 WideStringToUCS4Stringでエンコードしても、UCS4StringをStringに正常にキャストする方法が見つからず、 UTF32かどうか確かめられません よろしくお願いします
WideStringToUCS4Stringがあれば、当然UCS4StringToWideStringもあるわけだけど、 直接Stringにしたいって事?
923 :
921 :2008/06/18(水) 19:30:09
すみません、自己解決しました
MBCSUtils(
http://cc.codegear.com/item/25496 )のAnsiStringToUtf8をしたあと、Utf8ToWideStringをしたら
望むとおりの結果がでました
>>922 そうです
UTF8にしたときは普通にStringとして取得できますが、WideStringToUCS4Stringだと
取得できないので、それを取得しようと思ったのです
924 :
デフォルトの名無しさん :2008/06/19(木) 00:25:06
初心者です。教えて下さい。 「Borland Delphi 7 Professional」と 「Borland Delphi 7 Studio Professional」は なにがどうちがうのですか?
925 :
デフォルトの名無しさん :2008/06/19(木) 00:36:50
Studio は Kylix3 が付いているみたいだけど、 非Studioはどうなのか、検索しても良く分からないや。
TMemoryStreamのオブジェクトを別のExeに渡したりできますか?
やめとけ。MemoryStreamのデータ領域のアドレスとサイズを渡すようにするのが吉。 ん?他のexeってプロセス間通信ってこと?WM_COPYDATAかメモリマップドファイルで。
929 :
927 :2008/06/19(木) 11:31:35
巨大なメモリプールなので、2つ持ちたくないんです(><)
ならmemmapfileだな。 MemoryStreamじゃなくてただのメモリの固まりとして共有するしかない。
メモリマップファイルは、名前の通り、実態はファイルなんだけどね
とは限らないよ。オプションによる。
http://itpro.nikkeibp.co.jp/article/COLUMN/20071107/286607/?P=4&ST=techskill メモリー・マップト・ファイルが,プロセス間の共有メモリーを実現できることはわかったが,
そのためにいちいちファイルを作成するのは面倒な話だ。
実は,CreateFileMappingの第1引数には,INVALID_HANDLE_VALUE
(ファイル・ハンドルの無効な値)を指定できるようにもなっている。
つまり,ファイルを指定せずに,ファイル・マッピング・オブジェクトを作れるのである。
それではファイル・マッピングにならない,と思うかもしれないが,
マップするのがシステムのページング・ファイルになっただけと考えればよい。
これは結局のところ,VirtualAllocでコミットされたページと同じ状態なのである。
Http := TIdHttp.Create Memo.Lines.Text := Http.Get(URL) これでcharset:EUC-JPのソースを取得すると化けるのですが解決方法あれば教えてください。
EUCからSJISに変換する ググればすぐ出てくる
Shift-JISコードに変換
936 :
933 :2008/06/20(金) 22:14:26
EUC→ShiftJIS ググった結果なんですが 1.変換テーブルみたいのを書く 2.NKF32で変換する とでてきたわけですが UTF8Decode(IdHttp1.Get(url)); こんな感じの簡単なIndyの関数的なものはないでしょうか?
俺はTPzConv使ってる
DelphiでUnicodeベースのアプリの作成ってどの程度現実的なんですか? TNTを使うとコンポーネントだけでなくWindows, Classes, SysUtilsあたりの基本クラスの代替はだいたいそろっているんですか? 実際にDelphi製フリーウェアでそういうアプリも出ているんですかね。
次期バージョンで対応する。それまでは完全対応ではなくコントロールごとの 一時しのぎだと。でないと、次期バージョンの価値がない。
941 :
デフォルトの名無しさん :2008/06/21(土) 19:22:43
数年Delphiを使っていなかった者ですが、 Delphian worldをなくなってしまったのでしょうか? コンポーネントが多数あり、便利に使っていたのですが。
このスレを抽出してみたら? 俺は何とかWebArchiveで凌いでるけど・・・
お返事とヒントどうも。 いろいろ探してみます。
>>940 そうなのか?ウレシイ!
文字コードの対応は疲れる こんなことで時間とられたくない
なんかホントウにしんどい ってつくづく思ってた。
Delphi2008かTiburonでググレカス
Genericsまだ?
Genericsと匿名メソッドもTiburonで。
最新版のDelphi(無料)ってどれですか?
Turbo Delphi
>>949 ありがとうございます
早速勉強させていただきます
951 :
デフォルトの名無しさん :2008/06/21(土) 23:57:41
>>950 うるせー馬鹿。
今度から自分で調べろ。
pagecontrolであるタブを隠すことはできますか? editbox使いまくってたらこんがらがってきたので、pagecontrolで整理しようと考えているんですが、 今まではvisibleでfalseにして隠していたのですが、tabsheet2に隠すとしてもタブが表示されてしまうと 何も表示されないタブが出現してしまうので困っています。 tabのvisibleをfalseにしても実行するとtrueに戻って表示されてしまうんですよね・・・
tabvisible
954 :
デフォルトの名無しさん :2008/06/22(日) 01:39:53
tabcontrolにはtabvisibleがあるんですが pagecontroleにはtabvisibleがなくて困ってるんです・・・
すいません逆に考えてました。 自己解決sry
Jane Doe Styleのスレッド本文の表示には何のコンポーネントを使っているのでしょうか?
958 :
デフォルトの名無しさん :2008/06/22(日) 06:32:57
>>939 SpTBXLibとか使っているのがちらほら散見される。
使っている人は使っているという印象だな。
959 :
デフォルトの名無しさん :2008/06/22(日) 06:34:18
960 :
デフォルトの名無しさん :2008/06/22(日) 08:08:52
無料だしDelphi始めてみようと思って、一番新しそうな2007を 入れてみようと思ったが有償じゃねーか!!! 結局何をインストールすりゃいいんだよ!
960 ターボデルファイ
考えてみたらデルファイって毎年VerUpしてねえ?
ここ数年は「お布施」でしたよ。D7 で十分。
>>957 JaneLovelyで使われてたもの。名前はTMDITextView
StyleはLovelyベースてゆうかパクリ版。Lovelyのソースが今公開されてるのかは知らん。
なければOpenJaneDoeのTHogeTextView使え
965 :
960 :2008/06/22(日) 12:19:54
Delphi7? どこで手に入れるんだ?
>>964 mjk!!
LovelyのソースみてみたけどTHogeTextViewじゃなかったのか・・・orz
>>965 まあちょっと前くらい嫁って話なんですけどね
ってTMDITextViewはTHogeTextView継承やん・・・
969 :
デフォルトの名無しさん :2008/06/22(日) 13:13:32
なんか変なのが湧いてるが、 > 無料だし そういうかたはVSへどうぞ。
972 :
デフォルトの名無しさん :2008/06/22(日) 13:45:22
無料だからいいっていうなら、Visual Stuidoをお勧めしておくぞ。 さすがに今は・・・
ふじさんwwwwwww
あ、無料じゃないのね・・・ すまん、調査不足。 VBに挑戦してみるわ 何回もすまん
Delphi for Rubyっていつ出るの?
7の無料ってなんか本についてなかったけ 記憶違いかもしれない蹴れど アマゾンで検索してくり
977 :
デフォルトの名無しさん :2008/06/22(日) 19:34:25
無料じゃなくて体験版では?
>975 多分永久に出ない。3rd Railなら既に出てるけど。
Delphi6をインストールした後に、Turbo Delphiをインストールすると 関連付けがTurbo Delphiに変わってしまいました。 再び、Delphi6に戻すにはどうすればよいですか?
インストール時に関連付けするかどうか選べたはずだが・・
コントロールパネルのフォルダオプション
Editに kanji と言う文字列が入っていた場合に IMEを起動して かんじ という入力状態にするやり方があったら教えてください
983 :
デフォルトの名無しさん :2008/06/23(月) 23:44:36
984 :
デフォルトの名無しさん :2008/06/23(月) 23:45:28
>982 Imm*系のAPIでできるのかもしれないけどよくわからない。
おおすごい。短いコードだけど、知らないとまったく手がでません。
すいません質問です。 PageControlでMultilineを使用した際、特定の行で折り返したいのですがそんなことは可能なんでしょうか? ex) A|B|C|D|E|F|G Eで折り返したい ↓ E|F|G A|B|C|D|
>>989 レスありがとうございます。
すいません説明が足りませんでした。
H|I|J|K|L|
E|F|G
A|B|C|D|
のようにさらに上にカテゴリがあるのです。
やはりPageControlを重ねるかCaptionで無理やり調整するしかありませんかね。
もう990なのでスレ立て行ってきますね。 書き込みはもう少し我慢してくださいまし。
994 :
デフォルトの名無しさん :2008/06/24(火) 16:50:01
教えてください。 Builderで int hoge; AnsiString s; s.printf("%d",hoge); これをDelphiではどのように記述すればいいのでしょうか。
s := Format('%d', [hoge]);
>>994 s:=Format('%d',[hoge]);
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。