くだすれDelphi(超初心者用)その54

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2012/11/13(火) 21:05:36.27
>>947
複数の値をやりとりする方法は、レコード型の他に変数パラメータとoutパラメータもあるよ。

procedure AddExtended(A: Extended; var X,Y: Extended);
begin
  X:=X+A;
  Y:=Y+A;
end;

procedure GetExtended(out X,Y: Extended);
begin
  X:=1.56789;
  Y:=0.1234;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  X,Y: Extended;
begin
  GetExtended(X,Y);
  Memo1.Lines.Add(Format('X=%g, Y=%g',[X,Y]));
  AddExtended(0.5,X,Y);
  Memo1.Lines.Add(Format('X=%g, Y=%g',[X,Y]));
end;
953942:2012/11/14(水) 01:46:57.69
>>952
おぉ高度な! 目からうろこが
954デフォルトの名無しさん:2012/11/14(水) 10:27:09.50
var渡しで直接書き換えればいい >>952と同じことだけど

procedure ReturnInteger(input: Integer; var outputX: Integer; var outputY: Integer);

これで1つの関数でまとまるんじゃないの
955デフォルトの名無しさん:2012/11/14(水) 13:49:24.78
ん? また自演が始まったのか。
956デフォルトの名無しさん:2012/11/14(水) 21:52:03.97
var
Form1: TForm1;
DATA : array[0..255] of Integer;
(略)

procedure TForm1.Button1Click(Sender: TObject);
var (略)
begin
(計算)
 Edit_0.Text := IntToStr(DATA[00]);
 Edit_1.Text := IntToStr(DATA[01]);
 Edit_2.Text := IntToStr(DATA[02]);
 Edit_3.Text := IntToStr(DATA[03]);
(略)
end;


for i:=0 to 255 do Edit_+IntToStr(i).Text := IntToStr(DATA[i]);
  や
for i:=0 to 255 do DATA[i] := StrToInt(Edit_+IntToStr(i).Text);
みたいにできる方法はありますか? そのさいの書き方と
957デフォルトの名無しさん:2012/11/14(水) 22:12:07.16
FindComponentってのを使えばいいと思う。
958デフォルトの名無しさん:2012/11/14(水) 22:29:51.00
objlist: Array 1..100 of TObject;
objlist[1] := Edit1;
TEdit(objlist[1]).Text := DATA[1];

配列に突っ込んでおけばループで回せる
959デフォルトの名無しさん:2012/11/14(水) 23:25:21.71
こうかな? どこに書くのか悩んだけど
270個までつくってたけど組みなおそう
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,
(略);
type
 TForm1 = class(TForm)
  Edit0001_001: TEdit;
  Edit0001_002: TEdit;
  Edit0001_003: TEdit;
(略);
  procedure FormCreate(Sender: TObject);
  procedure Button1Click(Sender: TObject);
 private
  { Private 宣言 }
 public
  { Public 宣言 }
 end;
960デフォルトの名無しさん:2012/11/14(水) 23:28:41.23
var
 Form1: TForm1;
  DATA : array[0..1000] of Integer;
  objlist: Array[1..100] of array[1..10] of TObject;
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
 objlist[1][1] := Edit0001_001;
(略);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 TEdit(objlist[1][1]).Text := DATA[1];
(略);
end;
961デフォルトの名無しさん:2012/11/15(木) 00:01:09.84
>>958
これは突っ込んで欲しいのか?
962デフォルトの名無しさん:2012/11/15(木) 00:11:49.31
あらかじめtagに数字入れておけwww

procedure DoSome(Sender:TObject);
var
 i:integer;
 e:TEdit;
begin
for i:= AContainer.ComponentCount-1 downto 0 do
 begin
  if AContainer.Components[i] is TEdit then
  begin
   e:=TEditor(AContainer.Components[i]);
   e.Text:=Data[e.Tag];
 end;
end;

でなきゃ動的生成したほうが早い。どうせ並べてるんだろw
963デフォルトの名無しさん:2012/11/15(木) 00:38:59.64
ここんとこ、最近はDelphiを触ってないのが明らかな先輩方がレスくれてますね(笑)
いや結構なことなんですけど、Typoとかいろいろ笑える。

>>959-960
そんなにたくさんのTEditなら動的生成して並べた方がいいに決まっているけど、その前に。

  objlist: Array[1..100] of array[1..10] of TObject;
TEdit専用の配列ならば、こうすれば
  Editlist: Array[1..100, 1..10] of TEdit;

 TEdit(objlist[1][1]).Text := DATA[1];
キャストは不要になる。
 Editlist[1][1].Text := DATA[1];

どんなものを作ろうとしてるのか言った方が的確なアドバイスをもらえると思うよ。
Delphiのバージョンは何かな?
964デフォルトの名無しさん:2012/11/15(木) 01:29:19.69
>>963
TStringGridで済む気もするんだがw
965デフォルトの名無しさん:2012/11/15(木) 04:45:17.45
>>963 D7
5等補償型自作クイックピック
ttp://www1.axfc.net/uploader/so/2676363.jpg?key=loto
これの自動算出に基数として126*6 〜 243*6など要るので
ソース行数が爆増する問題箇所は突破できました
966デフォルトの名無しさん:2012/11/15(木) 07:20:57.17
これで270個もTEditが増えるのがわからない。画面はサブフォームで量産すれば済むし
設計の根本的なところからいろいろまずいかもしれないね
オブジェクト指向的な作り方をすれば、もっとすっきりまとまるよ
90年代のVBソフトみたいな印象で、昔はこういう作り方が多かったかもしれない。
967デフォルトの名無しさん:2012/11/15(木) 08:18:23.25
具体案を示せない人は黙ってていただけ増すか
968デフォルトの名無しさん:2012/11/15(木) 10:17:33.13
TEditのParentが全部同じなら俺ならこうする。

procedure TForm1.Button1Click(Sender: TObject);
var
I: Smallint;
begin
for I := Low(DATA) to High(DATA) do
TEdit(FindComponent('Edit' + IntToStr(I + 1))).Text := IntToStr(DATA[I]);
end;
969デフォルトの名無しさん:2012/11/15(木) 10:41:38.45
画面にTEditが40個あるとして、それをいちいちFindComponentしていくのか・・・
前持って処理してグローバルに覚えて再利用したほうがいいな
970デフォルトの名無しさん:2012/11/15(木) 15:00:41.51
ttp://www.sm.rim.or.jp/~shishido/mp3dev1.html
ここのプログラムをダウンロードしてDelphi XE3で実行したところmp3ファイルをロードしても音が出ませんでした.
Delphi6で実行すると音がでます.
XE3でも音が出せるようになる方法を教えてください.
971デフォルトの名無しさん:2012/11/15(木) 15:31:55.02
まずXE3を捨てます
972デフォルトの名無しさん:2012/11/15(木) 17:18:54.54
続いて自分を解き放ちます
973デフォルトの名無しさん:2012/11/15(木) 19:30:31.94
>>970
UnicodeなDelphiを触ったことないですけど、たぶんこんな感じだと思います。

・ レコード型のcharをAnsiCharに。2箇所。

・ Wide文字列→PAnsiCharにキャスト。
vbmp3_open(PChar(OpenDialog1.FileName),@info);
vbmp3_open(PAnsiChar(AnsiString(OpenDialog1.FileName)),@info);

違ってたら誰かフォローよろしく。
974デフォルトの名無しさん:2012/11/15(木) 20:00:55.08
>>973
できました!!
とても助かりました.
本当にありがとうございます!
975デフォルトの名無しさん:2012/11/16(金) 07:08:12.95
質問です。
WinXP + delphi7(VCL)で開発します。

コンボボックスのコンポーネントで、なめらかな動きをしない
(スムーススクロールしない)ようなものはありませんか?
あるいは、作る方法はありませんか?

Windowsのパフォーマンスオプションで、
「リストボックスを滑らかにスクロールする」のチェックを外せば、
望み通りの動きなのですが。(マウスホイールによる動きが全然違います。)

Access2007のフォームにあるコンボボックスは、この設定に関わらず
滑らかな動きをしないようなので、このようなコンポーネントをdelphiでも
用意する方法があるのではないかな、と探しているところなのです。

方法があれば、ぜひ教えてください。お願いします。
976デフォルトの名無しさん:2012/11/16(金) 11:15:39.75
ttp://stackoverflow.com/questions/2968189/disable-mouse-scroll-wheel-in-combobox-vb-net

WM_MOUSEWHEEL をコンボボックスで握りつぶせばよろしいかと。
977デフォルトの名無しさん:2012/11/16(金) 11:21:17.52
しかしstackoverflowはなんであんなに役に立つのか
978デフォルトの名無しさん:2012/11/16(金) 14:23:58.43
ttp://hp.vector.co.jp/authors/VA015850/delphi/tips/etc01.html
このサイトでiniファイルの作り方を学んだのですがこのままだとプログラム名がそのままiniファイルの名前になってしまいます。
test.iniとしたいのですが
IniFile := TIniFile.Create('test.ini');
にすると
"test.iniに書き込めません"とエラーがでます
どうすればiniファイルの名前を変えられるのでしょうか
979デフォルトの名無しさん:2012/11/16(金) 14:39:12.56
フルパス名を与える。INIファイルをEXEと同じ場所に配置するのはお勧めしない。
980デフォルトの名無しさん:2012/11/16(金) 14:41:44.06
権限のないカレントドライブのルートに書こうとしたんだろ
981デフォルトの名無しさん:2012/11/16(金) 14:42:29.64
>>979
ありがとうございます
やってみます
982デフォルトの名無しさん:2012/11/16(金) 21:29:05.18
このスレにはお世話になっているので還元
>>978
procedure TForm1.FormCreate(Sender: TObject);
var
SaveDir : WideString;
SaveFileName : WideString;
begin
// SaveDir = アプリケーションのあるフォルダのフルパスが入る
SaveDir := ExtractFilePath(Application.ExeName);

// アプリケーションのあるフォルダに'Save'というフォルダが無ければ新規に作る
SaveDir := SaveDir + 'Save\';
ForceDirectories(SaveDir);

SaveFileName := SaveDir + 'test.ini'; // その同フォルダにtest.iniを指定できる。'file_0001.dat' など任意名称

// if FileExists(ExtractFilePath(Application.ExeName) + 'test.ini') then
if FileExists(SaveFileName) then
begin
// ファイルが存在していたら行う処理を書く
end;
end;
983982:2012/11/16(金) 21:38:40.62
セーブフォルダをビジュアルに選択したいときはココの方法など
フォルダ選択ダイアログを出す
ttp://www.wwlnk.com/boheme/delphi/tips/tec0530.htm
984デフォルトの名無しさん:2012/11/16(金) 22:02:06.21
>>982
おおお…
まさにこのような答えを待っていました
とても助かりました!
ありがとうございます
985デフォルトの名無しさん:2012/11/16(金) 22:10:27.61
いやだからそんなとこに書いちゃだめだって。Program Filesの下は書き込めないという前提。
SHGetFolderPathでCSIDL_APPDATAとかCSIDL_PERSONALの場所を取得して
その下に適当なフォルダを作って配置しないと。
986982:2012/11/16(金) 22:28:47.04
>>985
なぜ? Program Files にコダワルのか判らないです。
OS 依存のシステムディレクトリなんかにプログラムのセットを置かずに
ユーザーが任意の作業フォルダから実行すれば良いだけで
取り外しメディアに入れておけばパソコン環境を変えてもインストール作業なんて不要で
そのまま他機で使用可能ですよ。

俺はインストで勝手に Program Files 固定で鎮座しやがるアプリ以外は別の自分で作ったフォルダに指定してる。
変なアプリ動作でゴミデータが増殖されるのをチェックするうえでも
987デフォルトの名無しさん:2012/11/16(金) 23:05:09.43
お行儀が悪いというレベルの話ではないのかw
本来XPならDocument and Settingの所定ユーザフォルダに置くのが望ましいという話で。
988デフォルトの名無しさん:2012/11/16(金) 23:31:30.42
まっとうな売り物でもなければ
エンドユーザーが把握できないプログラムとデータ群をProgram Filesやレジストリに書き加えて肥大させ
システムを不安定化させていく方がお行儀が悪い気がする
989975:2012/11/17(土) 00:59:00.68
>>976
ありがとうございます。
参考にして、WM_MOUSEWHEELを握りつぶすことはできました。
(ホイールが利かなくなりました。)

ただ、ホイールを無効化するのでなく、
ドロップダウンリストにスクロールバーが出ている状態においては、
リストを1行ずつスクロールさせたく思っております。

その際、スムーススクロールさせると、リストのスクロールが
目で追えなくなってしまうような描画をするので、それを対策したいと思っております。

コンボボックスに、StringGridにおけるTopRowプロパティのようなものがあれば、
対策できそうではあるんですけど、方法ありませんでしょうか?
990デフォルトの名無しさん:2012/11/17(土) 01:23:27.33
>>985
初心者に解らない断片で書かずに
Documents and Settings のユーザー名 Dir を取得するコードを
>>982 のようにちゃんと書いてあげれば?
991デフォルトの名無しさん:2012/11/17(土) 03:28:59.50
一つのアカウントを共用してるPCが大半を占めていて、
アプリケーションの設定も一つでいいのに、
わざわざユーザーからは分かりづらい場所に設定置くような
>>985みたいな挙動はどっちかというと嫌われてる
992デフォルトの名無しさん:2012/11/17(土) 09:48:49.96
インストーラーが必要で、%ProgramFiles%にインストールされるようなプログラムは
きちんと%AppData%にフォルダ作ってやってほしい。

しかしインストーラーできちんと環境を整える必要が無いようなソフトの場合は
ポータブルアプリみたいな方がいいね。

>>990
どの関数と定数を使えば良いかはすでに書いてあるんだからアレで十分じゃね?
それでどうにか出来ないようであれば初心者以前の問題かと。
993デフォルトの名無しさん:2012/11/17(土) 13:03:49.00
次スレです。

くだすれDelphi(超初心者用)その55
http://toro.2ch.net/test/read.cgi/tech/1353119767/


未解決の事案を抱える方は、次スレで再度質問してみるといいかもしれません。
994デフォルトの名無しさん:2012/11/17(土) 13:35:51.89
>>993
乙です
埋め
995デフォルトの名無しさん:2012/11/17(土) 14:05:51.69
1年はかからなかったか
996デフォルトの名無しさん:2012/11/17(土) 14:21:01.03
最近質問が増えた気がする。業務でやる人が増えるとも思えんが…。
学校の課題とか趣味のプログラミングとかかね?
997デフォルトの名無しさん:2012/11/17(土) 14:41:21.04
>>996
言語としては学校で教えるのに割と適している気もしないでも無いが
開発環境の整えづらさから考えるとあり得ないだろ。
質問内容から言っても課題とは関係なさそう。
998デフォルトの名無しさん:2012/11/17(土) 14:43:30.14
自分は趣味ですね
delphiやBuilder使わないと未だにどうすればソフトが作れるか分からないもので・・・
999デフォルトの名無しさん:2012/11/17(土) 18:19:31.20
ううう
1000デフォルトの名無しさん:2012/11/17(土) 18:20:04.14
華麗に1000げとー
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。