[表示 : 全て 最新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

577 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 13:29:46 ]
Cだと通るよね

578 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 13:44:23 ]
>>575
ttp://d.hatena.ne.jp/tales/20091020
ttp://d.hatena.ne.jp/tales/20100319
この辺を応用すると一応書ける

uses .., Types;

var
 s: string;
 i: Integer;
begin
 for s in TStringDynArray.Create('One!','Two!!','Three!!!') do
  ShowMessage(s);
 for i := 0 to 2 do
  ShowMessage(TStringDynArray.Create('One!','Two!!','Three!!!')[i]);
end;

579 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 12:32:54 ]
教えてください。D6パーソナル使用です。
EXE自身のアイコンをTImageに表示しています。
アイコンの透過色が透明になってくれるのは良いのですが、白色まで透明になってしまいます。
何がいけないのでしょうか。それとも全部間違っているのでしょうか。
プロジェクトのオプションに設定しているicoファイルはこんな感じです。
www1.axfc.net/uploader/File/so/42162

var
Icon:TIcon;
begin
Icon:=TIcon.Create;
Icon.Handle:=Application.Icon.Handle;
if Icon.Handle<>0 then
Image1.Canvas.Draw(0,0,Icon);
Icon.Free;
end;

580 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 13:46:07 ]
transparent

581 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 15:39:26 ]
Transparentが関わってそうなことは想像できるのですが、2色が透過してしまうという上記例の場合
どのようにすれば良いのか分かりませんでした。もしよろしければご教示下さい。

結局ですが自己解決しました。以下のように修正。
Image1.Canvas.Draw(0,0,Icon); → Image1.Picture.Icon:=Icon;
やり方が根本的に間違っていたということでした。
しかし、こんな方法↓でもOkでした。
Image1.Picture.Icon.Handle:=Icon.Handle;
Image1.Picture.Icon.Assign(Icon);
一体どれが正しいのか??

さらに、Handleってなんなんだ?と思ったので調べると、32bit整数だと。ならば、
var
Icon:Integer;
begin
Icon:=Application.Icon.Handle;
if Icon<>0 then
Image1.Picture.Icon.Handle:=Icon;
end;
と、やってみたら大丈夫でした。
こんなコードでいいんでしょうか???

582 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:36:03 ]
ListBox.Items.Selectedが画面外の時、
その項目が表示されるようにスクロールするやり方教えてください

583 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 04:35:59 ]
はい

584 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 06:47:12 ]
>>582 TopIndex

585 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 06:51:43 ]
>>581
Image1.Picture.Assign(Application.Icon);
これだけでいいと思う。(D6パーは持ってない



586 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 16:59:50 ]
>>582
MakeVisible

587 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 23:10:54 ]
キャプチャーを作ってみたんだけど、ウィンドハンドルからデバイスコンテキストを
取得して指定の画面のキャプチャーを取ってるつもりなんだけど、わざと取りたい画面の上に
別のウィンド置いとくとその別のウィンドもキャプチャーされるんだけどそんなもの?


588 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 00:14:15 ]
XP以降なら個別にとれる
詳細はググれ

589 名前:587 mailto:sage [2010/04/19(月) 02:37:57 ]
ググったらで来た。
ありがとう

590 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 07:57:21 ]
>>589
興味有るから、やり方教えて

591 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 09:51:25 ]
printwindowを使うんだって。
使い方はググった方が早い。
簡単だよ。

592 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 14:00:11 ]
>>585
D6パーソナルでもOkでした。正解はスッキリ簡単でしたね。
リソースからアイコン削除してApplication.Iconが無い状態(有り得ないけど)にしても
表示されないだけでエラー無し。
教えてもらってから理解したけど、IDEでImage1.Pictureに画像をセットするのとほぼ同じ動作ということですね。
ありがとうございました。

593 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 17:55:06 ]
>>591
ありがとう!
がんばってみる

594 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 23:58:23 ]
IDEのエディタマクロ書きたいんだけどそういう情報ってどこにあるの?

595 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 17:46:07 ]
RichEditにDephiのソースコードを着色した状態で表示する
サンプルなりコンポなりがあったら教えてください。



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を最小化させると一緒に画面から消えちゃうの何とかならん?






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

前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