>>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;
953 :
942 :2012/11/14(水) 01:46:57.69
var渡しで直接書き換えればいい
>>952 と同じことだけど
procedure ReturnInteger(input: Integer; var outputX: Integer; var outputY: Integer);
これで1つの関数でまとまるんじゃないの
ん? また自演が始まったのか。
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); みたいにできる方法はありますか? そのさいの書き方と
FindComponentってのを使えばいいと思う。
objlist: Array 1..100 of TObject; objlist[1] := Edit1; TEdit(objlist[1]).Text := DATA[1]; 配列に突っ込んでおけばループで回せる
こうかな? どこに書くのか悩んだけど 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;
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;
あらかじめ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
ここんとこ、最近は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のバージョンは何かな?
>>963 TStringGridで済む気もするんだがw
これで270個もTEditが増えるのがわからない。画面はサブフォームで量産すれば済むし 設計の根本的なところからいろいろまずいかもしれないね オブジェクト指向的な作り方をすれば、もっとすっきりまとまるよ 90年代のVBソフトみたいな印象で、昔はこういう作り方が多かったかもしれない。
具体案を示せない人は黙ってていただけ増すか
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;
画面にTEditが40個あるとして、それをいちいちFindComponentしていくのか・・・ 前持って処理してグローバルに覚えて再利用したほうがいいな
まずXE3を捨てます
続いて自分を解き放ちます
>>970 UnicodeなDelphiを触ったことないですけど、たぶんこんな感じだと思います。
・ レコード型のcharをAnsiCharに。2箇所。
・ Wide文字列→PAnsiCharにキャスト。
vbmp3_open(PChar(OpenDialog1.FileName),@info);
vbmp3_open(PAnsiChar(AnsiString(OpenDialog1.FileName)),@info);
違ってたら誰かフォローよろしく。
>>973 できました!!
とても助かりました.
本当にありがとうございます!
975 :
デフォルトの名無しさん :2012/11/16(金) 07:08:12.95
質問です。 WinXP + delphi7(VCL)で開発します。 コンボボックスのコンポーネントで、なめらかな動きをしない (スムーススクロールしない)ようなものはありませんか? あるいは、作る方法はありませんか? Windowsのパフォーマンスオプションで、 「リストボックスを滑らかにスクロールする」のチェックを外せば、 望み通りの動きなのですが。(マウスホイールによる動きが全然違います。) Access2007のフォームにあるコンボボックスは、この設定に関わらず 滑らかな動きをしないようなので、このようなコンポーネントをdelphiでも 用意する方法があるのではないかな、と探しているところなのです。 方法があれば、ぜひ教えてください。お願いします。
しかしstackoverflowはなんであんなに役に立つのか
フルパス名を与える。INIファイルをEXEと同じ場所に配置するのはお勧めしない。
権限のないカレントドライブのルートに書こうとしたんだろ
このスレにはお世話になっているので還元
>>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;
983 :
982 :2012/11/16(金) 21:38:40.62
>>982 おおお…
まさにこのような答えを待っていました
とても助かりました!
ありがとうございます
いやだからそんなとこに書いちゃだめだって。Program Filesの下は書き込めないという前提。 SHGetFolderPathでCSIDL_APPDATAとかCSIDL_PERSONALの場所を取得して その下に適当なフォルダを作って配置しないと。
986 :
982 :2012/11/16(金) 22:28:47.04
>>985 なぜ? Program Files にコダワルのか判らないです。
OS 依存のシステムディレクトリなんかにプログラムのセットを置かずに
ユーザーが任意の作業フォルダから実行すれば良いだけで
取り外しメディアに入れておけばパソコン環境を変えてもインストール作業なんて不要で
そのまま他機で使用可能ですよ。
俺はインストで勝手に Program Files 固定で鎮座しやがるアプリ以外は別の自分で作ったフォルダに指定してる。
変なアプリ動作でゴミデータが増殖されるのをチェックするうえでも
お行儀が悪いというレベルの話ではないのかw 本来XPならDocument and Settingの所定ユーザフォルダに置くのが望ましいという話で。
まっとうな売り物でもなければ エンドユーザーが把握できないプログラムとデータ群をProgram Filesやレジストリに書き加えて肥大させ システムを不安定化させていく方がお行儀が悪い気がする
989 :
975 :2012/11/17(土) 00:59:00.68
>>976 ありがとうございます。
参考にして、WM_MOUSEWHEELを握りつぶすことはできました。
(ホイールが利かなくなりました。)
ただ、ホイールを無効化するのでなく、
ドロップダウンリストにスクロールバーが出ている状態においては、
リストを1行ずつスクロールさせたく思っております。
その際、スムーススクロールさせると、リストのスクロールが
目で追えなくなってしまうような描画をするので、それを対策したいと思っております。
コンボボックスに、StringGridにおけるTopRowプロパティのようなものがあれば、
対策できそうではあるんですけど、方法ありませんでしょうか?
>>985 初心者に解らない断片で書かずに
Documents and Settings のユーザー名 Dir を取得するコードを
>>982 のようにちゃんと書いてあげれば?
一つのアカウントを共用してるPCが大半を占めていて、
アプリケーションの設定も一つでいいのに、
わざわざユーザーからは分かりづらい場所に設定置くような
>>985 みたいな挙動はどっちかというと嫌われてる
インストーラーが必要で、%ProgramFiles%にインストールされるようなプログラムは
きちんと%AppData%にフォルダ作ってやってほしい。
しかしインストーラーできちんと環境を整える必要が無いようなソフトの場合は
ポータブルアプリみたいな方がいいね。
>>990 どの関数と定数を使えば良いかはすでに書いてあるんだからアレで十分じゃね?
それでどうにか出来ないようであれば初心者以前の問題かと。
1年はかからなかったか
最近質問が増えた気がする。業務でやる人が増えるとも思えんが…。 学校の課題とか趣味のプログラミングとかかね?
>>996 言語としては学校で教えるのに割と適している気もしないでも無いが
開発環境の整えづらさから考えるとあり得ないだろ。
質問内容から言っても課題とは関係なさそう。
自分は趣味ですね delphiやBuilder使わないと未だにどうすればソフトが作れるか分からないもので・・・
ううう
華麗に1000げとー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。