[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 08/13 11:51 / Filesize : 238 KB / Number-of Response : 924
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前: ◆XcB18Bks.Y mailto:sage [2008/03/12(水) 21:09:39 ]
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を
勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが
お礼はDelphiの布教と初心者の救済をお願いします。

<前スレ>
くだすれDelphi(超初心者用)その45
pc11.2ch.net/test/read.cgi/tech/1198802907/

<過去スレ>
DelWiki避難所(Delphi 関連の過去スレッド)
delwiki.info/?Delphi%20%B4%D8%CF%A2%A4%CE%B2%E1%B5%EE%A5%B9%A5%EC%A5%C3%A5%C9


131 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 09:55:01 ]
>>129
何が起こるか想像がつかないなら、やってみる価値はある。

132 名前:131 mailto:sage [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 mailto:sage [2008/03/27(木) 11:16:28 ]
ありがとうございます。
構造体のメンバのアラインメントは他の言語にもあるのでわかるのですが、配列のpackedは謎です。
VCLのソースの中でも配列の宣言にpackedがついていたりいなかったりで、
何か使い分けがされているような気もするのですが、挙動の違いが分からないので釈然としません。
とりあえずつけておけば問題はなさそうですが・・・

134 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 11:52:13 ]
>>133
Delphiでしか使わないなら気にしない。


135 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 15:14:18 ]
Vista対応ってしとく必要あんのかな

136 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 16:52:40 ]
TTabControlで質問です。

タブを選択した時に、その番号に関連付けられてるオブジェクトが
条件を満たさないときはそのタブを選択させないようにするにはどうすればいいんでしょうか?

OnChangingイベントでいけるかと思ったんですが
これから選択しようとしているタブ番号の取得方法がわかりません。
クリックの時はマウス座標を取得する事でどうにか出来ない事もないんですが、
キーボードの時に詰まってしまいます。

137 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 20:51:54 ]
Delphiクイックリファレンスによると配列のpackedは標準Pascalとの互換性のためで
Delphiでは何の意味もないそうです

138 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:50:08 ]
StrToIntをAPIで書くとしたらどうなるんですかね?
SysUtilsはあまり使いたくない性分です・・・

139 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:52:42 ]
どう考えても意味不明だろ、それ。



140 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:57:55 ]
>>138
APIは知らんけどSystem.Val

しかしこのスレ無内容な一行レスばっかりだな。彼らは一体何がしたいのか。

141 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:07:38 ]
>>140
こんな関数があるとは・・・
勉強になります
ありがとうございます

142 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:12:26 ]
関数ではなくて手続きでしたね、すみません

143 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:06:08 ]
いやだってSysUtilsは使いたくないって意味不明じゃん。ValもStrToIntも変わらないでしょ。

144 名前:|Д゚彡 ◆A6VzDeLphI mailto:sage [2008/03/28(金) 02:16:29 ]
>>107
CharToByteIndex

なんだって。


145 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 05:27:30 ]
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');
ここおかしくない?


147 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 06:05:56 ]
やべ、スレあげちまった。

148 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:09:17 ]
123の場合、
Result := 0 * 10 + '1' - '0' → 1
Result := 1 * 10 + '2' - '0' → 12
Result := 12 * 10 + '3' - '0' → 123
であってると思うけど。

149 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:43:32 ]
ああ、あってるね。ごめんなさい。




150 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:51:44 ]
+,-,#0の一文字だけのとき、0になるわ。

151 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 10:01:22 ]
delwiki.info/?%A5%B3%A1%BC%A5%C9%C1%D2%B8%CB%2F%BF%F4%C3%CD%A4%E4CSV%A4%CE%BC%E8%A4%EA%BD%D0%A4%B7
この GetInteger10を呼び出してる GetIntegerみたいに好みの仕様を追加したらいいんじゃないの?


152 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 15:17:15 ]
TreeViewで特定の項目だけVisible:=Falseにできますか?
または代わりの方法があれば教えてください。

153 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 17:15:01 ]
Canvasにウィンドウ右上の_ □ ×ボタンをレンダリングする方法ないですか?
ビットマップで用意するとテーマの変更に追従できないので。

>>152
たぶん無理。Add/Deleteするしか。

154 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 00:26:03 ]
>>153
WinAPIのDrawFrameControl


155 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 10:18:18 ]
DrawFrameControlってテーマに対応してるの?

156 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 10:37:32 ]
Win32APIだし、内部的にそれらのAPI使ってWindowsはウィンドウ描画してるんじゃ?

てか、それぐらい自分で試せるだろ。


157 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 10:39:03 ]
いや、テーマAPI別にあるから対応してねぇかも。


158 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 10:45:44 ]
Win32のスレで聞きな。そっちの方が知ってる人多いと思う。


159 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:26:10 ]
TRegExprでtr演算子の置換をするにはどうすればいいですか?
たとえば「tr/abc/ABC/」見たいなのです
英語とか良く分からないしググッても出ないし・・・
よろしくお願いします



160 名前:159 mailto:sage [2008/03/29(土) 14:48:57 ]
今頃ですがTRegExprでなくてもDLLを使わないようなものでなければ大丈夫です

161 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 15:53:24 ]
TRegExprの使い方
delwiki.info/?%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8%2FTRegExpr

PCRE使ったの
cc.codegear.com/Item/25062

162 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 17:47:55 ]
鬼車ベースのライブラリってないの?

163 名前:159 mailto:sage [2008/03/29(土) 17:54:41 ]
>>161
> TRegExprの使い方
これを読んでみて分かりませんでした・・・
何かサンプルをいただけないでしょうか

164 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 18:08:56 ]
ぢゃ日本製使え
ttp://homepage1.nifty.com/bmonkey/delphi/delphi.html

165 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 02:33:50 ]
DirectoryListBox で、今選んでいるフォルダの深さが何階層目かを知る方法ってありますか?

166 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 02:40:05 ]
それ16ビットUIの名残り。使わない方がいいよ。

167 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 03:00:55 ]
>>166
そうですか、今後なるべく使わない様にします。
じゃあ、変数に入ってるパスが何階層目かを知る方法ってありますか?

168 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 04:05:07 ]
デリミタの数を数えるとか

169 名前:|Д゚彡 ◆A6VzDeLphI mailto:sage [2008/03/30(日) 04:23:47 ]
delfusa.main.jp/delfusafloor/opensource/delfusalibrary/20070828160200/WordDecompose/WordDecompose.pas.txt

俺も自作のを使ってしまうなあ。




170 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 06:13:30 ]
StringReplaceで\を\_にでも変換して、
長さの差を取れば\の数は分かるんじゃないのか?

171 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 06:19:44 ]
\の数だけだとUNCパスで誤動作するんじゃね?

172 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 09:42:07 ]
はぁ・・・Del7買ってから出来たものはボタンクリックして画像表示
それから2Dのスクロールと3Dモデルの回転のみ・・・

変数宣言めんどくせー
コンパイラ時に自動作成して後で修正させるようにしてくれりゃいいのに

173 名前:167 mailto:sage [2008/03/30(日) 10:01:31 ]
>>168-171
やはり文字系で処理するしかないですか
なんかディレクトリの命令であるかなと思ったんで
すいませんでした、なんとかやってみます
ありがとうございましたw

174 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 10:03:40 ]
ExtractFileDriveしてExcludeTrailingPathDelimiterしつつExtractFilePathできる回数を数える

175 名前:167 mailto:sage [2008/03/30(日) 11:19:06 ]
>>174
あっ、そういう方法でも出来るんですね
なんか出来そうな感じがしてきました
試しにやってみます、ありがとうございましたw

176 名前:|Д゚彡 ◆A6VzDeLphI mailto:sage [2008/03/30(日) 12:03:39 ]
作ってます。
delfusa.main.jp/delfusafloor/opensource/delfusalibrary/20070828160200/FileNameUnit/FileNameUnit.pas.txt

function PathLevel(Path: String): Integer;
procedure testPathLevel;

ご参考ください。

こういうのって、つくづく、実装よりも
テストコードが大事って思う。

177 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 12:06:29 ]
>172
そういうのが苦手な人にはDelphiは向かないのかも。Delphi2007ならリファクタリングで変数宣言を
追加する機能もあるけど、ちょっと違うな。昔のVBなら変数宣言不要なモード(Option)もあった気が。

178 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 12:55:00 ]
>>177
というかコンパイラって手抜きで進歩無さ杉
変数宣言なんか同じソース上に表示させる意味もなく、プロパティのように別窓か別ファイルでソート可能な表形式で管理・表示でいい


179 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 13:11:59 ]
BASICでもやってろ



180 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 13:54:06 ]
そもそもプログラミングに向いてない。

181 名前:167 mailto:sage [2008/03/30(日) 14:15:03 ]
>>176
WordDecompose.pas 頂きました
色々参考にさせていただきます、ありがとうございましたw

182 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:20:24 ]
ありとあらゆる変数をグローバル変数で宣言しておいたらどうだろう?

183 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 18:47:34 ]
>>178
IDEの恩恵しか受けたことないとこういう風に育つのか

184 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 19:10:06 ]
いや、何となくわかる。変数宣言のUI。でもソース上に書くってのに
慣れてるしプログラム書いてるって感じするし、よくよく考えてみると
GUI にするのってローカルだとかナンだとか面倒そうじゃん

185 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 20:35:28 ]
妄想するだけでで宣言文を書けたらいいのにね。
それは冗談として、アドインで作れないの?

186 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:25:08 ]
GUIで表示や追加くらいなら作れると思うが、
そんなので喜ぶのは初心者だけだし、
そういうのを作れるレベルの人は逆に生産性下がって不要なので
結果として誰も作らないってことになってるんじゃないかと

187 名前:デフォルトの名無しさん [2008/03/31(月) 00:39:57 ]
SpeedButtonみたいなのがいくつか5個くらい並んでて、一つは常にへっこんでて、一つを押すと他の全部が上がるってタイプのボタンはどうやってるんですか?

188 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:48:22 ]
SpeedButtonをグループ化するんだ

189 名前:デフォルトの名無しさん [2008/03/31(月) 00:54:37 ]
できました。
どうもありがとう!



190 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 10:50:14 ]
データベースでBlobに入っているバイナリファイルを少しずつダウンロード
したいのですが、良い方法はないでしょうか?
現在TBlobStream.CreateでそのStreamから少しずつ読み込んでいるのですが、
Createメソッドを実行した時点ですべてのデータを読み込んでいるようです。
要は少しずつReadしてプログレスバーにその状況を表示したいのです。
上の方法だとCreateを呼んだところでプログラムが一次停止したようになってしまいます。


191 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 12:19:44 ]
それについて深く考えたことない事を始めに断っておくけど、
昔調べた記憶と今、ちょっとソース見た感じだと、少なくとも新しい独自のBlobStreamクラスと
それを返すようにADOならTCustomADODataSet,dbExpressならTCustomSQLDataSetの
CreateBlobStreamメソッドをオーバーライドして独自BlobStreamを返すようにしないと
厳しそうだな。

192 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 12:22:49 ]
まぁ、読み込むBlobの最大サイズは設定できるようだから、それを設定して、
一次停止したようになるのを避けることはできる。根本的な解決ではないが。
それが嫌なら上記の方法以外ぱっと思いつかない。


193 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:29:09 ]
d6perなんですがdialog.pasがC:\Program Files\Borland\Delphi6\Source\Vclに存在しません・・・
ちょっと修正したい箇所があるのですが誰かうpしていただけないでしょうか?

194 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 19:37:21 ]
そのためのプロ版だ。プロ買え。

195 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 20:49:51 ]
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;

196 名前:つづき@ mailto:sage [2008/03/31(月) 20:50:48 ]
 // 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;

197 名前:つづきA mailto:sage [2008/03/31(月) 20:51:36 ]
// 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もそれにあわせて移動します)増減できなくなってしまいます。
一般的な話でなくて申し訳ないですが、原因のわかる方いらっしゃいませんか?

198 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 13:03:38 ]
writelnで出力した文字列を
一段上に戻って再度上書きして
進行状況を表示したいんですがどうやればいいですか?

199 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 13:07:49 ]
戻るくらいなら最初から改行するなよ



200 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [2008/04/01(火) 13:44:59 ]
Writelnの代わりにWriteで書いてバックスペース(#8)?


201 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 16:35:05 ]
dn.codegear.com/article/33747を参考に自分のソフトをVistaに対応させようと思ったのですが、
ShowModalのところで詰まってしまいました
FormのプロパティにPopupParentが存在しないのです
どうすればいいのでしょうか?

202 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 19:57:44 ]
>>201 TurboDelphi使え

203 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 20:50:47 ]
APIなどで代替出来ないのでしょうか

204 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 21:59:02 ]
TurboDelphi(ソース付き)をダウンロードしてPopupParentの実装を調べればいいんじゃね?

205 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 22:01:20 ]
>>195
無関係な行を全部削除してくれんかね。

206 名前:195 mailto:sage [2008/04/01(火) 23:52:21 ]
すみません。

// DBGridをFColorDBGrid1とFColorDBGrid2の縞々にする。

以下の1ブロックは必要ないですね。

削除したのを1から載せるとまたクドくなるのでこれで許してくれませんか?

207 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 01:43:01 ]
ぜんぜんわからんわ。
UpDownコントロールをDBGridのセルの上に置いて、値を変えられるようにしたいみたいだけど。
withで間違えているのかな。

208 名前:201 mailto:sage [2008/04/02(水) 06:22:50 ]
ddev.blog46.fc2.com/blog-entry-70.htmlをTFormの代わりに使ったら解決しました
こちらの検索不足で申し訳ありませんでした

209 名前:195 mailto:sage [2008/04/02(水) 09:05:58 ]
FilterをONにしなければ、いけるんですが、もう少しいじってみます。



210 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 20:25:55 ]
if a and b then

という場合必ずaから評価される保証はありますか?

211 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 21:09:24 ]
はいえ

マジレスすると完全評価にした場合のことは知らん

212 名前:195 mailto:sage [2008/04/03(木) 16:34:43 ]
StringList1: TStringList;

が持っている情報量をbyteで知るにはどうしたらいいんでしょうか?

213 名前: ◆XcB18Bks.Y mailto:sage [2008/04/03(木) 16:37:03 ]
言語ガイドの記述を読むと完全評価の場合は評価順序に関する記述はありませんね。

>>210
Delphiでは論理演算子andやorでつながった式については
デフォルトではショートサーキット評価といって
左から順に評価して式全体の値が確定した時点でそこで評価を打ち切ってしまいます。

> if a and b then
だとaの値がFalseなら式全体の値はbの値に関係なくFalseになりますからここで評価を打ち切ります。
つまりbの評価は行われません。

完全評価でコンパイルさせるとすべてを評価することが保証されますが
順序に関する記述が一切無いので記述と異なる順序で評価される可能性があります。


214 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 17:59:30 ]
>>212
Createの前後でメモリを空き容量を数えるww

215 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 18:14:12 ]
>>212
Length(StringList.Text) + StringList.InstanceSize とか

216 名前:212 mailto:sage [2008/04/03(木) 18:54:09 ]
ごめんなさい、説明不足でした。
もってるTextの情報量だけ欲しくて、だから、単にLength(StringList1.Text)+1でいいですよね?

217 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 20:21:46 ]
以前このスレで、画面の切り替えにPageControlを使うアイデアがありました。
ワタシ今までずっと、たくさんのフォームを作って画面切り替えをしてきたの
ですが、今回、PageControl方式でやってみました。最初は良かったのですが、
ページが増えるにつれメインフォームに無茶苦茶たくさんのコンポーネントと
そのイベントなどが集中してしまい、かなり混乱してきています。
皆様はどのように整理してやってるのでしょうか。

218 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 20:30:06 ]
まさにそのためにFrameが用意されている。
Panelのような感じでフォームに貼り付けられて
設計時には個々の独立したフォームのように扱えるから綺麗にコードがばらせる。
ListBox/ListViewなんかのわりに処理がたくさん入るようなコンポーネント単位で独立させていってもいいし。

219 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 20:48:07 ]
フレームは以前チャレンジしたことがありまして、ただそのときは設計時に
貼り付けた先を更新してしまってdfmファイルを直して戻したり、イベント
関連で不都合があったり、何やかやで結構痛いめにあった記憶がありまして
(すっかり忘れてますが…)避けてきたのですが、うまく使えば画面切り替え
には一番使えるモノなのかですか。あぁ結構アタマ混乱気味です。



220 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 20:55:57 ]
別フォームで設計しておいて、そのフォームに貼り付けたコンポーネントの
全部のオーナを変更してしまうとか

フォームのままManualDockで貼り付けてしまうとか

221 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:11:43 ]
>>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
それでも他にいい代替案がないんでずっとこの方式。
動的にタブを生成廃棄するメモやブラウザタイプのアプリを作るときにもかなり自然に使えるしね。

自分的には他にイベント関連等目立った問題はあまりないと思う。

222 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 22:21:55 ]
十分めんどくさいなぁ、それ。しかし、そんな感じになるんだろうなぁ。

223 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:27:28 ]
>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 になるのだろうか?

225 名前:最初のひとつだけYESみたいだが? mailto:sage [2008/04/04(金) 07:35:14 ]
ソース嫁。

226 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 08:03:46 ]


227 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 09:04:34 ]
ごめん>>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] := ''; // これではエラーになりますが…

のようにしたいです。

229 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 14:50:01 ]
SetLength(str, 2)
str := Copy(str, 1, 2)

str[3] := #0 or Chr(0)
が直接の回答だけどおそらく望んでいる動作とは異なり
'AB'#0
という3文字の文字列になってしまう。
PCharに渡すなら問題ないけど。



230 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 15:02:55 ]
その他
str := LeftStr(str, 2);
Delete(str, 3, 1);

231 名前:228 mailto:sage [2008/04/04(金) 15:03:14 ]
>>229
素早いご回答をありがとうございます。

実は、str[1]に空文字を代入して'ABC'→'BC'とするなど、
色々できたらと思ったのですが、
やはりString型として処理した方がよさそうですね。
(そもそもString型の中身について理解していないのが問題ですが...)






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<238KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef