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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 20:41:37 ]
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を
勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが
お礼はDelphiの布教と初心者の救済をお願いします。

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

<過去スレ>
DelWiki避難所(Delphi 関連の過去スレッド)
delwiki.info/?%E3%83%AA%E3%83%B3%E3%82%AF%2F%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%2FDelphi%20%E9%96%A2%E9%80%A3%E3%81%AE%E9%81%8E%E5%8E%BB%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89

596 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 19:50:22 ]
TParser使え

597 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 22:45:23 ]
RichEditの使い方が分かりません。
単純に任意の色で文字を書いて、改行を付加する/しない が選べるようにしたいだけ
なのですが、どのようにしたら良いのか分かりません。
こんなイメージで使えるprocedureを作りたいです。
const
CRLF=#$0D#$0A;

RichWrite('エン', clBlue);
RichWrite('バカ', clRed);
RichWrite('デロ', clYellow);
RichWrite('☆', clGreen);
RichWrite('Delphi'+CRLF, clBlack);
RichWrite('Hello'+CRLF, clAqua);

RichEdit1に書かれる結果:
エンバカデロ☆Delphi // 青色赤色黄色緑黒色
Hello // 水色

これを実現するための材料だけでも良いので教えてください。よろしくお願いします。
一応ですが、私は>>595とは無関係です。

598 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 23:01:57 ]
SelAttribute(ただし遅い)

599 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 23:34:48 ]
>>598 ありがとうございます。
SelAttributesはヘルプによると、
>テキストを新規に挿入するときには,SelAttributes のフォント属性が適用されます。
とのことなので良さそうなのですが、改行無しで文字列を追加したい場合はどのように
すれば良いのでしょうか?

600 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 23:36:49 ]
seltext

601 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 00:06:58 ]
>>600 うーん分からないです。
SelTextプロパティを使ったサンプルをいただけないでしょうか。

602 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 00:10:21 ]
つ ttp://www.google.co.jp/search?hl=ja&q=delphi+seltext+SelAttributes

603 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 00:50:57 ]
ああっ、分かりました!
SelStart := GetTextLen;
SelText := 'ABC';
ですね!
「Delphi SelText SelAttributes」でググると一番最初に出てくる
delphi.about.com/od/delphitips2008/qt/format_richedit.htm
の記事が分かりやすいです。
今までさんざん探してたんですが、こういう単純で基本的な内容のサンプルは初めて見ました。
ようするに、
with RichEdit1 do
begin
SelStart := GetTextLen;
SelAttributes.Color := clBlue;
SelText := 'エンバカデロ';
SelAttributes.Color := clBlack;
SelText := 'Delphi'+CRLF;
end;
みたいな感じにすればOkですね。これをprocedureにしてみます。
ありがとうございました。

604 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 08:53:22 ]
グループボックスのCaptionがCheckBoxになっているコンポーネントってないでしょうか?



605 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 09:06:16 ]
グループボックスのキャプションをなしにして、キャプションの位置にチェックボックスを置けば?

606 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 16:29:52 ]
>>604
ググって一発で出てきたんだけど
ttp://www.delphidabbler.com/tips/112

607 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 20:18:13 ]


608 名前:604 mailto:sage [2010/04/27(火) 23:56:33 ]
>>605,606
トンです。
でけました。

609 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:17:35 ]
del標準の関数でbitmapをjpegに変換すると、低圧縮でも汚いのできれいに変換できるコンポとかってないですか?


610 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:23:04 ]
ないです

611 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 13:29:03 ]
>>609
JPEGが何なのか調べてくるといいですよ^^

612 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 15:08:57 ]
正しいことが何なのか、この胸にわかるまで〜

613 名前:609 mailto:sage [2010/05/03(月) 23:15:23 ]
Jpegへ綺麗に変換できるコンポがあって説明を読むと、
delphiのはサンプリングが4:1:1だから汚いと書いてありました。
del7proなんですが、このサンプリングレートを変えることは出来ませんか?

614 名前:デフォルトの名無しさん [2010/05/04(火) 00:40:48 ]
c言語の
float range_0[] = { 0, 256 };
float* ranges[] = { range_0 };

をDelphiで書き換えたいのですが
var
range_0: array[0..1] of Float = (0, 255);
ranges: array[0..0] of PFloat;
begin
  ranges[0] := @range_0;
・・・・・・
end;
でいいのでしょうか?

Floatは
type
Float = Single;
PFloat = ^Float;
で作ってあります。

どなたかわかる方おられましたらよろしくお願いします。



615 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 03:06:22 ]
なんで数字まで変わっちゃうんでしょうか

616 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 03:41:13 ]
>>613
jpeglib.hのjpeg_component_infoをjpeg.pasに定義してcomp_infoを^jpeg_component_infoにして
TJPEGImage.Compressで
for i:= 0 to 2 do begin
jc.c.comp_info[i].h_samp_factor:=1;
jc.c.comp_info[i].v_samp_factor:=1;
end;
とかすればイケるのかな

つーか、そのコンポとやらを使えば良いんじゃないかな
酔ってるし寝るのであとは知らん

617 名前:614 mailto:sage [2010/05/04(火) 08:24:11 ]
>>615
レスありがとうございます。
数字は素で間違えました;

618 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 08:37:43 ]
Cうろ覚えだけど愚直に移すならこんな感じか。

type
Float = Single;
PFLoat = ^Single;
TFloatArray = array [0..High(Integer) div SizeOf(FLoat)-1] of Float;
PFloatArray = ^TFloatArray;

var
range_0: array [0..1] of Float = (0,255);
ranges: array[0..0] of PFloatArray = (@range_0);

ranges[0][0] ==> 0
ranges[0][1] ==> 255


619 名前:614 mailto:sage [2010/05/04(火) 15:27:34 ]
>>618
こういった書き方は、初めて知りました。
とても勉強になりました。ありがとうございます。

620 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 09:59:28 ]
>>618
そこまでこだわるならHigh(Integer)じゃなくて(High(Integer)+1)じゃね?
もしくはせっかく定数が用意されてるんだからMaxInt+1でもいいかと

621 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 14:11:06 ]
ranges: array [0..255] of Single; とどう違うかさっぱりワカンネ

622 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 23:27:13 ]
何で1足すんだよ

623 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 01:25:46 ]
>>621
どう違うかどころか全然違うよw
実際に計算してみたら?
>>622
High(Integer) div SizeOf(Float)じゃなくてHigh(Integer) / SizeOf(Float)を計算すれば分かる

624 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 01:55:41 ]
相変わらずどうでもいい頑張り方だな



625 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 04:02:03 ]
そのどうでもいいレスよりマシじゃない?

626 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 10:01:09 ]
WindowsXP SP3
DELPHI7
SQLSERVER2000
BDE

画像ファイル(JPG)を読み込み
SQLServerの画像項目(IMAGE型)に格納したいんですが


AFileName:='IMAGE.jpg';
jp :=TJPEGImage.Create;
jp.LoadFromFile(AFileName);

BDEの画像項目.Assign(jp);

上記を実行すると
「〜型が一致しません。VarBytesに対してBlobが渡されました」とエラーが出てしまいます。

blobからVarBytesに変換する処理が必要なのかと思い調べたのですがよくわかりませんでした。

ADOを使用した場合はネットから引用したソースでうまく動いたのですが、
該当システムはBDEで統一させたいので質問させていただきました。
宜しくお願い致します。

627 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 11:37:45 ]
BDE からの接続形態は?
ODBC ? SQL-Link ?

628 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:08:57 ]
>>627 ODBCです

629 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 17:07:02 ]
a-zから10桁の文字列生成をしてみようと思って
'', 'a'..'z'の配列から文字列を取り出してつなげていくプログラムを組んでみたのですが、
forを10重にしたコード書いたけど
ぐぐってみたらX種類の文字のN重ループは
for i := 0 to Power(X, N)-1 do begin
 for j := 0 to N-1 do begin
で代用出来ると書かれていたのですが、
文字列の取り出し方がわかりません。
str := mojiretsu[Trunc(i / j) mod High(mojiretsu)] + str;
としてみたらなんとなくそれっぽい感じだったんだけど文字列がループしてしまいました。

mojiretsuにアクセスする式はどうかけばいいのでしょうか?

630 名前:629 mailto:sage [2010/05/09(日) 17:07:43 ]
コードはこんな感じにしてみました
uses
SysUtils, Math, Windows;

const
StrLenMax = 27;
keta = 10;
var
i : LongWord;
j, k : Integer;
str : String;
mojiretsu : array[0..StrLenMax-1] of string;
begin
{ TODO -oUser -cConsole Main : ここにプログラムコードを書いてください }
mojiretsu[0] := '';
for k := Low(mojiretsu) + 1 to High(mojiretsu) do begin
mojiretsu[k] := Chr(97+k-1);
end;

for i := 0 to Trunc(Power(High(mojiretsu), keta))-1 do begin
str := '';
for j := 0 to keta-1 do begin
str := mojiretsu[Trunc(i / j) mod High(mojiretsu)] + str;
end;
Writeln(str);
Sleep(100);
end;
end.


631 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 01:55:29 ]
なんで乱数を使わないのかと小一時間

632 名前:629 mailto:sage [2010/05/10(月) 04:10:41 ]
>>631
期待している動作としては
a, b, c, d ... z, aa, ab, ac .. az, ba, bb
みたいな感じで指定した桁数の文字列を生成したいです。

633 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 05:36:27 ]
テストとか学校の課題?

>ぐぐってみたらX種類の文字のN重ループは
>for i := 0 to Power(X, N)-1 do begin
> for j := 0 to N-1 do begin
>で代用出来ると書かれていたのですが

元 URL を出していただけるか、元 URL のところに相談を持ち込んだほうがよいかも。

このアルゴリズム断片は、整数を26進数表記で処理するアイデアです。
i が対象となる全整数、j が 26進数変換の変換対象桁数。
i が 32 なら、
32 / 26 -> 1 余り 6 -> 'g'
1 / 26 -> 0 余り 1 -> 'b'
文字列として 'bg' を得る。
となります。

アルゴリズムとしては簡単なほうですが、
* 全組み合わせを整数から生成しているけど 26進数10桁だと 16進で 806406972400 で
32bit に収まらないから int64 にしないと。
* 0-9 が 10進で、a-z で 26進。'a' が 0 を意味するので、このアルゴリズムを単純実装
したときは aaaaaaaaaa から zzzzzzzzzz が生成されます。頭の a を消去(ゼロサプレス)
しても a,b ... y ときて z の次は aa ではなく ba です。
* おそらく、遅い。


634 名前:629 mailto:sage [2010/05/10(月) 05:58:41 ]
>>633
いえ、ブルートフォースもどきなプログラムを作ろうと思ってまずは文字列生成部分を作ってみようとしました。
参考URLはdobon.net/vb/bbs/log3-38/23321.htmlです。
同じように26進数のことをいわれていたのですけど、
結局わからなかったです。
まさか32bitに収まらないとは・・・
なんとなく10桁って書いたので6桁でも8桁でもいいのですが・・・



635 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 09:00:01 ]
var table: array [#0..#255] of char;

procedure init;
var i: char;
begin
    for i := #0 to #255 do
        case i of
            'a'..'y': table[i] := succ(i);
            'z': table[i] := 'a';
            else table[i] := #0;
        end;
end;

function getnext(s: string): string;
var
    i: integer;
    c: char;
begin
    result := s;
    for i := length(result) downto 1 do
    begin
        c := table[result[i]];
        result[i] := c;
        if c <> 'a' then break;
    end;
end;


636 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 09:00:54 ]
init;
getnext('aaa') ==> 'aab'
getnext('zzz') ==> 'aaa'

var s: string;
begin
    init;
    s := 'aaa';
    while true do
    begin
        writeln(s);
        if s = 'zzz' then break;
    end;
end;

最速狙いたいなら普通にCでDLL書いたほうがいい。

637 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 15:34:26 ]
別にCなんか使わなくてもインラインアセンブラで十分じゃん

638 名前:629 mailto:sage [2010/05/10(月) 16:20:22 ]
www.ss.u-tokai.ac.jp/~ooya/Program/Console/NShinhou1.txt
ここを参考にしたらなんとかいけそうでした。
ご協力ありがとうございました。

639 名前:デフォルトの名無しさん [2010/05/11(火) 14:28:43 ]
Delphi7だけどバグの修正これでいいかな
Quality Centralの33496
qc.embarcadero.com/wc/qcmain.aspx?d=33496

procedure TMenuItem.DoDrawText(ACanvas: TCanvas; const ACaption: string;
.


  with ACanvas do
  begin
    if Text = cLineCaption then//追加2010.05.11 QC33496
      exit;//追加2010.05.11 QC33496
    if IsLine then
    begin
       if Flags and DT_CALCRECT = 0 then
      begin
        R := Rect;
        Inc(R.Top, 4);
        DrawEdge(Handle, R, EDGE_ETCHED, BF_TOP);
      end;
    end

2箇所追加してみたけど(新しいの2010も治っていないけど)

640 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:08:13 ]
//if Text = cLineCaption then
if IsLine then
でしょ

641 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 10:44:10 ]
フォームのAlphaBlendを使った時に特定のコンポだけは透明化されないようには出来ないでしょうか?

642 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 12:15:46 ]
AlphaBlendなフォームの上に
Transparentなフォームをぴったり重ねればできそうだけど
アホっぽいなw

643 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:04:26 ]
バイナリデータを文字変数を使って処理しています
以下のようにすると、バイナリ状態のUTF-16LE文字列をWideString文字列に出来ることが分かりました
var
Bytes: AnsiString;
WStr: WideString;
begin
// BytesにUTF-16LEのバイナリを入れる処理が入る…
// 例:バイナリ 71 67 AC 4E 30 00 33 00

WStr:=WideString(PWideChar(Bytes));
// 結果:WStrに「東京03」が入る

質問:

1. コンパイル時に警告が出るんですが、このやり方で問題ないですか?
[警告] Unit1.pas(174): String から PWideChar への型キャストは間違っている可能性があります

2. この逆(WideString → AnsiStringにバイナリ状態のUTF-16LE)の変換は、1文字ずつループを回せば
出来ましたが、もっと簡単に出来ますか?

よろしくお願いします

644 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:11:55 ]
なんでAnsiStringなんかに入れるの・・・
Byte配列でええやん



645 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:34:12 ]
警告ごまかしたいなら
w := WideString(PWideChar(Pointer(s)));
w := WideString(PWideChar(@s[1]));
で行けるんじゃね。
Stringをバイナリコンテナとして使う場合
別に文字コードなんて関知しないから問題ないはず。

646 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 18:04:55 ]
>>644
何をどうすれば出来て、何が最善なのか分からないんです
実は当初、Byte型の動的配列で検索とかいろいろやってました
TByteDynArrayとかオープン配列パラメータとか使ってみたり
勉強にはなったんですが、配列要素を切ったりつなげたりのやり方が
よく分からなかったのと、いちいちSetLengthするくらいならStringの方が
簡単かつオールマイティで良いではないかと考えたんです
ちなみに配列版の試作途中ソースは誤って削除してしまいました(アホ)

>>645 ありがとうございます
WStr:=WideString(PWideChar(Pointer(Bytes)))
とすることで警告が出なくなりました
さらに、
WStr:=WideString(Pointer(Bytes)) でもOkでした
ということはと考えて、
Bytes:=AnsiString(Pointer(WStr)) とすると逆変換も出来ました
空文字やヌル付きでもそのまんま、ありのまま相互変換するようなので分かりやすいです

ポインタとかの理解度5%程度なのでよく分かってませんが、このPointer(文字型変数)
というのは単なるポインタじゃなくてポインタ型、文字列の長さ情報をも含んでいるんですね
ヘルプ見ても断片的に「型なしポインタ型」としか書いてないし…

配列でなく、オールマイティな?Stringをバイナリコンテナ(カッコ良い言葉なのでこれも拝借)
として使うのは、方向性として間違ってはいませんよね?
それともやはり配列使うべきでしょうか? 配列の利点があれば教えてください

647 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 19:05:45 ]
>>646
あんたなかなかセンスいいw

648 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:50:44 ]
>>642
それやったことあるw
よっぽど重いアプリでも作らない限り無難に理想の動作はしてくれるよ。
リサイズさせない移動させないサブフォームでなら普通に使える。

649 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:59:47 ]
Del7を使っています。
WinSight32である特定のウィンドハンドルを見たら、そのウィンドウを隠した(スライドさせる)時に
hidden となるのですが、この hidden になっているかどうかはどうすれば分かるでしょうか?

650 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 22:57:03 ]
IsWindowVisibleとか

651 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 23:58:52 ]
>>646
使ってるDelphiのバージョンが分からないけど、そのバージョンを一生使い続けるならそれも可
でも乗り換えることがあるなら、string型はすでに仕様が2回ほど変わった過去があるので
そのキャストが今後も使えるとは限らないし、配列を使った方が確実にいいと思う
だからそのコードは偶然動いた程度に考えた方がいいかと
あと利点云々は変換した後何するかによるし、もう少し情報出してくれないと・・・

652 名前:649 mailto:sage [2010/05/13(木) 00:17:33 ]
ありがとうございました。
状態の取得が出来ました。

新たな質問なのですが、
他のソフトのテキスト描画色を取得したくて、ググったらGetTextColorというのにたどり着きました。

var
CL: TColor;
begin
CL:=GetTextColor(DC);

と、やってもCLには「0」が入ります。
DCの取得は出来ています。
TColorをTColorRefとしてもダメでした。

どなたかよろしくお願いします。

653 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 01:01:48 ]
0は黒だが

654 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 01:10:32 ]
WStr:=WideString(PWideChar(Pointer(Bytes)))
による PWideChar->WideString の変換は、
#$0000 が出現するまでのデータを (_WStrFromPWChar によって)
WideString データに変換するけど、

WStr:=WideString(Pointer(Bytes))

Bytes:=AnsiString(Pointer(WStr))
は、ポインタ型のつじつま合わせを行った後に代入(_WStrAsg/_LStrAsg)
するので、後々トラブルが発生するかも。
前者は、バージョンによって、危険な場合があり、、
特に後者は、確実に refCnt いじってメモリーリークしているので危険。




655 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 06:47:59 ]
>>653
レスありがとうございます。
その描画色はなん色か時間によって変わっていって黒は使われていないんです。
描画されている文字列を取得すると正しく取得できるし、WinSightで見てもハンドルは
間違ってはいないので、デバイスコンテキストも間違ってはいないと思うのですが。


656 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 07:35:18 ]
>>654
>特に後者は、確実に refCnt いじってメモリーリークしているので危険。

w: WideString;
s: String;

w := '幹事';
s := AnsiString(Pointer(w));

がリークするの?
FastMM4は沈黙してるけど。


657 名前:654 mailto:sage [2010/05/13(木) 12:26:30 ]
Windows では、WideString は、OLE 文字列や BSTR 互換なので、
AnsiSting とは、メモリ管理方法が異なる。
WideString は、SysAllocStringLen などで
領域確保しているので FastMM4 の管理外。

WideString のオフセット -4 には、長さに相当するバイト数が
格納されていて、それ以外はしらん。
しかし、AnsiString を代入するときは参照カウントが格納されている
オフセット -8 の refCnt フィールドを調べたり、いじったりする。


658 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 12:39:38 ]
WideString (BSTR) は参照カウンタ管理されていないので、ストリングのコピーが複製になるため「遅い」
という問題を回避するために導入されたのが参照カウンタ付き UnicodeString なわけなので

WideString 側には refCnt なんてフィールドはありませんよ。
UnicodeString と混ざってしまっているかな?

659 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 13:47:46 ]
なんか疑問だな バイナリを入れるなら byte の配列を用意したほうが自然
Bytes: array of byte; で、WStr := WideString(Pointer(Bytes)); でどうなのか

660 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 14:14:50 ]
WStr := WideString(Pointer(Bytes))
だと、Bytes配列はヌル終端してる必要ある?


661 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 14:22:08 ]
>>659
バイト配列の話なんて誰もしてないから

662 名前:646 mailto:sage [2010/05/13(木) 16:31:53 ]
>>647
どういう点がセンスいいのか言ってもらわないとw 怖いもの知らずっていう意味ですか

>>651 ご意見感謝します
バージョンは6のPersonalです
作成中のアプリのコードを現代のバージョンに持って行くことはまず考えられません
しかし気持ちとしては、現代のバージョンにも転用可能なコードを書きたいと思いますし、
理解できていない・正体のハッキリしないモノ=ポインタ絡みの操作や原理不明のキャスト
も出来れば使用したくない、というのが本音です キャスト成功で手放しで喜んでいるわけではないです
なお、最近のバージョンではTEncodingとかRawByteStringとか、良さそうなものがあるようですね

>乗り換えることがあるなら、string型はすでに仕様が2回ほど変わった過去があるので
すごく承知してます
Stringでなく、AnsiStringと記述してるのは上記のような気持ちからです(あまり意味有りませんが)
自分が調べた限りではこんな感じですが、だいたい合ってますよね
■AnsiStringの系譜  D1:ShortString → D2:AnsiString → D2009:AnsiString(コードページ指定可能)
■Stringのデフォルト D1:ShortString → D2:AnsiString → D2009:UnicodeString
※ UnicodeString=AnsiString(1200)
※ D2:AnsiString、D2009:AnsiString/コードページ指定なし のコードページはシステムのロケールに依存
※ D2009:AnsiString(コードページ指定)では変数ごとに複数のコードページを保持できる
※ RawByteString=AnsiString(65535) コードページの変換をしない

やりたいことは、バイナリファイルを読み込み、特定条件の文字列や数値を検索して抜き出し、
変更を加え再構成して新たなファイルを作成、という操作です ゲーム改造みたいな感じでしょうか
いったんバラバラにしたデータを再構成する、つまり切ったりつなげたりをスマートに行う方法が
分からず、こんなことで悩むなら足し算引き算自由の文字列を使うべきかと結論付けました
配列だと、array[0..n] of Charまたはパック文字列型、StrPCopy、StrPas、Move
このあたりを使用するんでしょうか?

663 名前:646 mailto:sage [2010/05/13(木) 16:34:38 ]
>>654 ありがとうございます
WStr:=WideString(PWideChar(Pointer(Bytes))) ではヌル除去、
WStr:=WideString(Pointer(Bytes)) だとヌル保存を確認しました
少しだけナルホド、です

でも高度に技術的なお話はちょっと分からないです…
確かにSystem.pasにはそういうのがありますね、としか…
procedure _WStrFromPWChar(var Dest: WideString; Source: PWideChar);
procedure _WStrAsg(var Dest: WideString; const Source: WideString);
procedure _LStrAsg(var dest; const source);
procedure _WStrFromLStr(var Dest: WideString; const Source: AnsiString);
procedure _LStrFromWStr(var Dest: AnsiString; const Source: WideString);


みなさんのご意見をまとめると、「これらのキャストはすべて危険、未来も無いからやめとけ」
ってことですね?
しかし、配列優位とも思えませんので、文字列型を使いつつキャストもしない、という方針で
やってみようかと思います


>>659
えーと、私もそう考えて、というかByte型という名前に惹かれて、当初はTByteDynArrayでした
あと、1byte=Byte型配列の要素1個 というのも気持ち良い感じがしたんですが…
やはりバラバラにして再構成というのが配列の用法と合わないと思いました
>>661
いえ、話の発端の私がしておりますので…

664 名前:654 mailto:sage [2010/05/13(木) 16:44:54 ]
>660
PWideChar じゃないから危険だって。

PWideChar -> WideString はヌル終端までを変換するけど、
Pointer -> WideString はただの型キャスト。

PChar/PAnsiChar/PWideChar -> AnsiString/WideString/UnicodeString
=> ヌル終端までを変換

AnsiString/WideString/UnicodeString -> PChar/PAnsiChar/PWideChar
=> ヌル終端を保証

PAnsiChar/PWideChar/AnsiString/WideString -> Pointer
=> 型キャスト

Pointer -> PAnsiChar/PWideChar/AnsiString/WideString
=> 型キャスト




665 名前:654 mailto:sage [2010/05/13(木) 16:52:06 ]
ついで。
Dynamic Array -> Pointer
=> 型キャスト

Pointer -> Dynamic Array
=> 型キャスト


666 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 21:33:15 ]
>「これらのキャストはすべて危険、未来も無いからやめとけ」

んなこたない。
生ポインタをC文字列とみなしてDelphiの文字列に変換する機能は
Win32APIを叩く際の根幹的な機能だからそんな簡単に仕様変更なんてあるわけがない。
いくらなんでも脅かされすぎ。

667 名前:646 mailto:sage [2010/05/14(金) 02:20:53 ]
あれ、今までのレスをよく見直すと、
WStr:=WideString(Pointer(Bytes))
は危険な可能性有りだけど、
WStr:=WideString(PWideChar(Pointer(Bytes)))
は問題無いと言う見解ですかね?

>>666
仕様変更は無いだろうというご意見も覚えておきます
どちらにせよ、もうキャストはしないと決めました
「キャスト」なる仕組みは完全に明らかである、という状況ではない以上、
使うべきではないと思いました

668 名前:646 mailto:sage [2010/05/14(金) 02:23:12 ]
こんな感じの関数で十分でした
これなら不明な点はありませんから問題無いですよね

function BytesToUTF16LE(Bytes: AnsiString):WideString;
var
  I:    Integer;
  WOrd: Integer;
begin
  Result:='';
  for I:=1 to Length(Bytes) div 2 do begin
    WOrd:=(Ord(Bytes[I*2]) shl 8)+Ord(Bytes[I*2-1]);
    if WOrd=0 then break;           // ヌルを含めるならこの行を外す ※ヌルは複数組の可能性もあり
    Result:=Result+WideChar(WOrd);
  end;
end;


function UTF16LEToBytes(WStr: WideString):String;
var
  I: Integer;
begin
  Result:='';
  for I:=1 to Length(WStr) do begin
    Result:=Result+Char(Lo(Ord(WStr[I])))+        // and $00FF
                   Char(Hi(Ord(WStr[I])));        // Shr 8
  end;
end;

キャスト方法のアドバイスをくれた方、ご意見下さった方、ありがとうございました
大変勉強になりました

669 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 03:12:16 ]
>>666
今までに変更があったという事実は無視なの?

670 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 04:43:03 ]
コーディングスタイルは人それぞれだね
1行だけのforならbeginもendも不要なのに

671 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 04:46:14 ]
エンバグの元なのに?

672 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 06:40:31 ]
既に決着済みではあるけど一言だけ。

>>667
>「キャスト」なる仕組みは完全に明らかである、という状況ではない以上、
明らかに間違った使い方は示されたけど
Delphiの仕様の抜け道を使ったような未定義のやり方はないよ。
少なくともそんな指摘はまったく出ていないように思うが。

曖昧論やらべき論は出てきたが。

673 名前:652 mailto:sage [2010/05/14(金) 08:14:15 ]
GetTextColorについて質問をしたものです。
あれから色々試していたのですが、例えば赤で描かれたテキストがあって、
その色を取得しようと、GetDCPenColor、GetDCBrushColor、GetBKColorとか
やってみたのですが、赤の値が取れませんでした。
何か他にやり方ってあるのでしょうか。
それとも、アキラメロンなのでしょうか。


674 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 10:29:38 ]
>>673
座標を取ってGetPixelしてみるとかはどう?



675 名前:デフォルトの名無しさん [2010/05/14(金) 21:57:57 ]
描かれてしまったものは単なる絵だから。
描いたときのペンやブラシやテキストカラーの設定が現在も残ってると期待するのは無理

676 名前:652 mailto:sage [2010/05/14(金) 23:43:02 ]
>>674
ありがとうございました。
GetPixelで何とか出来ました。

>>675
そういうことなんですね。
納得しました。
ありがとうございました。

677 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 00:08:51 ]
Form1の他にForm2を作ってメニューからForm2の表示、非表示させてるんだけど、
Form2を表示中にメインのForm1を最小化させると一緒に画面から消えちゃうの何とかならん?

678 名前:デフォルトの名無しさん [2010/05/15(土) 15:35:35 ]
今デルヒで一番安く手に入る環境(違法じゃないの、新品の)でお願いします?

679 名前:デフォルトの名無しさん [2010/05/15(土) 16:10:05 ]
>>678
kaidoku.ocn.ne.jp/shopping/nv/member/item/detail/_/item_id/1090901509/

コンポーネントを一緒に買う気があるなら
www.componentsource.co.jp/products/delphi-2010-j/prices.html

680 名前:デフォルトの名無しさん [2010/05/15(土) 16:13:24 ]
あ、直販の方が安いのか
www.embarcadero.com/jp/radoffer

681 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 22:29:59 ]
頼む 日本語で

682 名前:デフォルトの名無しさん [2010/05/18(火) 11:26:08 ]
Delphi7ですけどIDE終了時AVなるのでコード変更してみました
これでいいでしょうか
_LStrClr関連で調べていたら_LStrFromPWCharLenのBuffersが悪さしてるみたいので
procedure _LStrFromPWCharLen(var Dest: AnsiString; Source: PWideChar; Length: Integer);
var
  DestLen: Integer;
begin
  if Length <= 0 then
  begin
    _LStrClr(Dest);
    Exit;
  end;
  DestLen := CharFromWChar(nil, 0, Source, Length);
  SetLength(Dest, DestLen);
  if DestLen > 0 then
  begin
    CharFromWChar(Pointer(Dest), DestLen, Source, Length);
  end
  else
    _LStrClr(Dest);
end;


683 名前:デフォルトの名無しさん [2010/05/18(火) 12:02:46 ]
こっちも変えてみました
procedure _WStrFromPCharLen(var Dest: WideString; Source: PAnsiChar; Length: Integer);
var
  DestLen: Integer;
begin
  if Length <= 0 then
  begin
    _WStrClr(Dest);
    Exit;
  end;
  DestLen := WCharFromChar(nil, 0, Source, Length);
  SetLength(Dest, DestLen);
  if DestLen > 0 then
  begin
    WCharFromChar(Pointer(Dest), DestLen, Source, Length);
  end
  else
    _WStrClr(Dest);
end;


684 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:30:32 ]
カード占いをするソフトを作りたいと思っています。

(1)カードの使用枚数と配置を決める
(2)カードを配置して裏返し、表示させる。

(1)でカードの位置を、マウスでクリックした位置に決めて
カードの裏向きの画像ファイルを表示させたい
のですが、どうすればいいでしょうか。






685 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 23:04:57 ]
ActiveXのWindowsMediaPlayerコンポーネントで、
動画再生時にビデオの明るさを変更する方法はありますか?

WindowsMediaPlayerの「拡張設定」の「ビデオ設定」にある「明るさ」を変更できる方法があればいいのですが。

686 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 00:51:54 ]
>>684
その通りにやればいいだけじゃ?
どこで詰まったのかもっと具体的に言わないと答えようがないだろ
一から手取り足取り教えてもらいたいなら金払ってサポートしてもらえ

687 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 03:56:58 ]
>もしくは質問者自身何が何だか分からない質問を
>勇気を持って書き込むスレッドです。
>Delphi使いが優しくコメントを返しますが

トランプの裏向きの画像は手に入れているとして。

フォームに CardImage という名前の TImage を作成。
Picture プロパティに画像を設定。
Visible プロパティを False に。

*クリックしたら
From の OnMouseDown イベントメソッドを作成

*位置を決めて
引数の X と Y を使う。

* 画像ファイルを表示
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
I : TImage;
begin
I := TImage.Create(self);
I.Parent := self;
I.Picture.Assign(Image1.Picture);
I.Width := Image1.Width;
I.Height:= Image1.Height;
I.Left := X;
I.Top := Y;
end;


688 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:06:14 ]
マルチスレッドのデバッグってどうすればいいでしょうか?
1つのスレッドを動的に複数Createして同時に実行した時に、ブレークポイントで止めていると
Delphiが固まってしまいます。
Del7です。
よろしくお願いします。

689 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 15:55:47 ]
>ブレークポイントで止めていると Delphiが固まってしまいます。
D7 が現役の頃にはそんな経験無いですけどね。

>Del7です
OS は? CPU は?

Vista/Win7 だとあきらめるしかないかも。

690 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 16:35:03 ]
起動中のアプリケーションでコマンドラインを受け取るにはどうすればいいのでしょうか?

a.exe -hoge -piyo
が何度か呼び出される感じ(引数は変わる)なのですが・・・
多重起動は禁止にしてます。

691 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 16:55:10 ]
すでに起動中のアプリケーションに、後から起動された(同一)アプリケーションのコマンドラインオプションを
渡すのかな?

Windows はマルチタスク/マルチインスタンスサポートの OS なので、別々に起動されたアプリケーションは
別々のインスタンスとして管理されます。何らかのアプリケーション間通信をおこなう必要があります。

擬似コードとしては

program A;

begin
if 俺は起動中かな then
begin
  起動中のインスタンスにコマンドラインを渡す( paramstr(1), paramstr(2)...)
end
else
通常実行開始
end;

後から起動されたアプリケーション A2 から、すでに起動しているアプリケーション A1 にデータを送るには、
sendmessage がつかえますが、メッセージを受信するためのウィンドウが必要(非表示でよし)なので
純粋なコマンドラインツールだと余計な手間がかかるでしょう。

692 名前:688 mailto:sage [2010/05/19(水) 17:05:30 ]
>>689
レスありがとうございます。
説明不足でした。
ブレークポイントで止まってるだけなら何ともないのですが、ステップ実行を何行かすると
フリーズしてPCのリセットボタンを押さないといけなくなります。
マルチスレッドが1つだけの時は、正常です。
ヘルプを見るとマルチスレッドのデバッグの項目はあるのですが、イマイチよく分からないです。


693 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 17:14:22 ]
>>292
XP+Turbo(2005)のわたしも同じ状況に見舞われてます。
以前わたしも、ここか雑談スレで相談しましたが、解決方法はわかりませんでした。

一応、めちゃくちゃ反応は鈍いですが、操作は可能です(時間的には、リセットで再起動の方が早いと思いますが)。
こちらでは、頻度は低いですが、マルチスレッドというか、シングルスレッドでも起こりますので、
スレッドをデバッグした時になるのだと思います(といっても、メインスレッドは別だから、結局はマルチスレッドなのだろうけど)。

おそらくデバッガーの問題かと。こちらでは、なるべくブレークポイントは使用しないという消極的な回避策で対処してます。

694 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 17:28:09 ]
>>691
ですです。
だいたいおんなじことを考えていたのですが、
>  起動中のインスタンスにコマンドラインを渡す( paramstr(1), paramstr(2)...)
ここがわかりませんでした。
後出しですみません。

作ってるアプリはGUIアプリです。



695 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 17:32:15 ]
>>694
あと、コマンドラインを渡したあと、どうやって受け取るのかもわからなかったです。。。

696 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 18:54:34 ]
>>687
やっぱりああやって書くとレス付きやすいですねw
あざーすww






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

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

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