先日以下の方法でHDDのシリアルを取得しました。
このシリアルに任意の計算をさせていです。
ソース##################################################
var
VolumeSerialNumber,
MaximumComponentLength,
FileSystemFlags: Cardinal;
VolumeName: array[0..260] of char;
FileSystemName: array[0..260] of char;
begin
GetVolumeInformation(
'C:\', // ドライブ
VolumeName, // ボリュームネームが入る
260, // ボリュームネームを格納するバッファのサイズ
@VolumeSerialNumber, // ボリュームシリアルナンバーが入る
MaximumComponentLength, // ファイル名は何文字までか、が入る
FileSystemFlags, // ファイルシステムの情報が入る
FileSystemName, // ファイルシステムの名前が入る
260 // ファイルシステムの名前を格納するバッファのサイズ
);
showMessage(inttostr(VolumeSerialNumber));
ソース##################################################
inttostr(VolumeSerialNumber)は9桁10桁の数列です
例えば、123456789として一つ一つをarrayに格納したいのですが。
よろしくお願いします。
アルゴリズムの基本なのであえてソースは載せません。
i:integer;
i:=123;
この整数iの百の位、十の位、一の位の取得方法は?
単純に十進数なら百の位は100で割った値ですよね。
inttostr(VolumeSerialNumber) は文字列なので、
StrPCopy 関数とか使うのも、よいかもしれませんね。
ほれ
var
hogehoge: string;
hogechar:Char;
begin
hogechar := hogehoge[65535];
だめです、、、アドバイスください。
だめというのは、何がどのようにだめなのですか?
StrPCopyというのが良くわからないのです。
inttostr(VolumeSerialNumber) は文字列なので
例えば、
i:integer;
i:=inttostr(VolumeSerialNumber);
では無理ですよね。
ということは、、、、
>StrPCopyというのが良くわからないのです。
inttostr(VolumeSerialNumber) は文字列なので、
StrPCopy関数を使って、配列にコピーすればよいのではないでしょうか?
>i:=inttostr(VolumeSerialNumber);
あと、
IntToStr関数やStrPCopy 関数など、意味は理解してます?
(分からなかった場合、ヘルプなどで調べました?)
以下の単語の組み合わせでGoogle検索すれば、やりたいことはすぐできるはず。
(1)delphi 変数 型
(2)delphi 文字列 操作 関数
(3)delphi 数値 文字列 変換
ためしてみたのですが
kazu : integer;
moji : string;
moji:= inttostr(VolumeSerialNumber);// 文字列のmojiに代入
kazu:= StrToInt(moji); // 文字列mojiを整数型にしてkazuに代入
kazu:= kazu - kazu; // 整数型 − 整数型 = 0
Label1.Caption :=kazu; // ←エラー
ためしてみたのですが
kazu : integer;
moji : string;
moji:= inttostr(VolumeSerialNumber);// 文字列のmojiに代入
kazu:= StrToInt(moji); // 文字列mojiを整数型にしてkazuに代入
kazu:= kazu - kazu; // 整数型 − 整数型 = 0
Label1.Caption :=kazu; // ←エラー
inttostr(VolumeSerialNumber) この時点でinttostrしないとラベルに表示できなかったのですが。
もともとintの形だったということでしょうか?
intではなぜラベルに出せないのでしょうか?
StrPCopyがなぜ出てきたのかよくわからないんですが、
文字列のn文字目を取り出したいなら文字列[n]でできますよね?
すでにヒントさんが書いてますけど。
一応確認しときますけど、たとえばVolumeSerialNumberが1234567890だったら
1, 2, 3, 4, 5, 6, 7, 8, 9, 0 をそれぞれ「数値として」取り出して
整数の配列に格納したい、で合ってますよね?
だったらいずれにしても1文字ずつ取り出して数値化していく必要があります。
あるいは一番最初の回答にあるように、数値のまま10で割っていくか。
元の質問者さんに対して、厳しいことを言うようですが
せっかく回答してもらっても、中身を理解していなくて
空振りに終わっていることが多すぎませんか?
最低限の基本概念は身につけて、簡単なエラーくらいは
自力で対処してくれないと
回答者の皆さんの時間を無駄に使うだけですよ。
>一応確認しときますけど、たとえばVolumeSerialNumberが1234567890だったら
>1, 2, 3, 4, 5, 6, 7, 8, 9, 0 をそれぞれ「数値として」取り出して
>整数の配列に格納したい、で合ってますよね?
>StrPCopyがなぜ出てきたのかよくわからないんですが、
あ、すみません。元の質問、「Charの配列」と思って、StrPCopy関数を
挙げてました・・・
「整数の配列」に格納したいってことなら、
・StrPCopy関数を使って、まず「Charの配列」に格納。
・次にその「Charの配列」の各内容を「整数の配列」に入れなおす
っていう方法もできますね。
>intではなぜラベルに出せないのでしょうか?
TLabelのCaption プロパティは、TCaption型で、
TCaption型は、string
なので、TLabelのCaptionに格納したい場合は、文字列にする必要があります。
>・StrPCopy関数を使って、まず「Charの配列」に格納
>・次にその「Charの配列」の各内容を「整数の配列」に入れなおす
と書きましたが、
…さんが書かれた、
>文字列のn文字目を取り出したいなら文字列[n]でできますよね?
>すでにヒントさんが書いてますけど。
>だったらいずれにしても1文字ずつ取り出して数値化していく必要があります。
この結果を「整数の配列」に格納していく方法が、簡単ですね。
1)数値型(Integer, Extended)と文字列型(String)の区別をはっきりさせる
2)数値型と文字列型では、「=」や「:=」で等号判定、代入できない
3)お互いの型変換は IntToStr, StrToInt等を使う必要がある
このへん理解してる?
そうじゃなければ、プログラム以前の問題だから、そこから初めてください。
もちろん文字列変換して取得する方法もありますが、
私ならこうします。
//n桁目の値を取得
function Getdigitvalue(value:Integer; digit:Byte):Byte;
// value:Integer; 元になる数値
// digit:Byte 知りたい桁 1は1の位 2は10の位...
//例 123456の100の位を知りたければ
// 123456 / 100 = 1234 余り 56
// 1234 / 10 = 123 余り (4)←これが求めたい値
var
p,q:Integer;
begin
q:=1;
for p:= 2 to digit do
q:=q*10;
p := value div q;
Result := p mod 10;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,p:Integer;
begin
i := 123456;
for p := 1 to 7 do
ShowMessage(IntToStr(i) + 'の' + IntToStr(p) + '桁目の数字は = ' + IntToStr(Getdigitvalue(i,p)));
end;
procedure TForm7.Button1Click(Sender: TObject);
var
C: Cardinal;
I: Integer;
S: String;
B: array[1..10] of Byte; //格納先の配列
begin
C := 123456789; //元のシリアル番号
S := IntToStr(C); //文字列に変換
for I:=1 to Length(S) do
begin
B[I] := Ord(S[I])-48;
end;
end;
ツイート | ![]() |