仕事を頑張る人のおしりトラブル対策

delphiで配列をコピーするには、どうしたらいいのでしょうか?

Betr_Hairetu := Moto_Hairetu ;

としたいのですが。

Betr_Hairetu := Copy(Moto_Hairetu, 0 ,Length( Moto_Hairetu ) );

では、ダメでした。

ループで、一から入れ直せばいいのですが、かっこわるいなー・・・。
なにか、簡単な関数があるとは思うのですが、探すことができませんでした。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

本来のパスカルでは、配列と文字列(ストリング)は異質であって


相容れるものではありません。
DelphiのCopy関数は、文字列をコピーするものであって
配列をコピーするものではありません。
ちなみに、Copy関数の第2引数に0が指定されることはありません
Delphiの文字列のインデクスは1から始まります

ところが、Delphiのあるバージョンから、array[] of char と
string が 同じように扱われるようになったので、やや混乱すると思います。

ですが、Delphiでは、文字配列かstringかをはっきり区別して使用するほうが
無難です。

質問では、配列としか書かれていないので、整数の配列か、はたまたレコードの配列か
わかりませんが、

var
ar1, ar2 :array[0..5] of integer;
begin
for i := 0 to 5 do ar1[i] := i * 11;

Move(ar1,ar2, SizeOf(ar1));
end

と Move関数が使えます


また、OSがWindowsで、Win32を使えるなら

CopyMemory関数を使う方法もあります。
    • good
    • 0
この回答へのお礼

なるほどー。
やはり、変数の型がポイントになりますね。
ありがとうございます。

>Copy関数の第2引数に0が指定されることはありません
訂正ありがとうございます。
ありがとうございます。

お礼日時:2008/01/15 22:03

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qdelphi でのコード上でTab を入力。

delphiで、コード上からString変数などに、Tabを入力する方法を教えてもらえませんか?

Javaでは確か \t とかだったと思うのですが。。。

また、よろしければ多言語でのバックスラッシュコード(?改行の\nなど)に対応するものがdelphiに存在するのかも教えてください。

Aベストアンサー

Delphi6での場合。

#数字 でASCIIコードを記述します。
数字の所は16進数も使えます。

タブ(10進数): 'abc'#9'def'
タブ(16進数): 'abc'#$9'def'

改行(10進数): 'Line 1'#13#10'Line 2'
改行(16進数): 'Line 1'#$d#$a'Line 2'


こんな感じだったと思います。

C言語やJavaのような、\t みたいな記述は無かったと思います。

文字列中に'(シングルクオート)を入れる場合も、\' ではなく、
二つ重ねて '' だし。(この点ではVBに似てるかな)

QDelphiの定数とローカル変数の初期化

Embarcadero RAD Studio 2010 Architect Trialというお試し版を使っています。
constを使って定義した定数をローカル変数の初期化の際に以下のようになります。
[DCC エラー] Test.pas(39): E2026 定数式が必要です

これでは、定数を1箇所で定義しても定数が使えず即値なので、
プログラム作成やメンテナンスに困ると思うのですが、
昔、Delphiを使っていたのですが忘れてしまって、どうしていたか思い出せませんでした。

皆さんは定数をどのように定義して、どのように使っているのでしょうか?

//■定義
unit DEFUnit;

interface
// 定数・変数
const DAT1 :Integer = 10;
const DAT2 :Integer = 20;
const DAT3 :Integer = 30;

implementation
// なし

end.


//■利用
unit TestUnit;

interface

uses DEFUnit;

var

data : Array [0..2, 0..1] of Integer = (
// 先手駒
(DAT1, 1),
(DAT2, 2),
(DA3T, 3)
);

implementation

end.

Embarcadero RAD Studio 2010 Architect Trialというお試し版を使っています。
constを使って定義した定数をローカル変数の初期化の際に以下のようになります。
[DCC エラー] Test.pas(39): E2026 定数式が必要です

これでは、定数を1箇所で定義しても定数が使えず即値なので、
プログラム作成やメンテナンスに困ると思うのですが、
昔、Delphiを使っていたのですが忘れてしまって、どうしていたか思い出せませんでした。

皆さんは定数をどのように定義して、どのように使っているのでしょうか?

//...続きを読む

Aベストアンサー

型付き定数にしているからです。
型付き定数は、定数式には使用できません。
型を付けないで、
const DAT1 = 10;
とすればエラーにはなりません。

あと、全部にconstと付けなくてもいいですよ。
const
DAT1 = 10;
DAT2 = 20;
DAT3 = 30;

QDelphiのマルチスレッドの割り込み処理について

Delphiのマルチスレッドの割り込み処理について教えて欲しいのですが、ファイルをスレッドオブジェクトで作成して
クラス名.Execute関数内でSynchronizeメソッドを使用しています。
本にはSynchronizeメソッドは「渡したメソッドが実行され終了するまで待ちます」と書いてあり、テストプログラムを作成してもそうでした。ということはSynchronizeメソッドは普通の関数と一緒のような気がしてしまうのですが、違うのでしょうか?
Procedure MyThread.Execute
begin
Synchronize(AAA); AAAの処理が終了するまで待機している
end;
Procedure TmyThread.AAA;
begin
'したい処理'
end;

Aベストアンサー

実際にプログラムを作って試した訳ではありません。見当違いでしたらすみません。

BDS2006のヘルプを見たところ、SynchronizeメソッドはDelphiの中で唯一つしかないメインVCLのスレッドを使うための方法です。すなわちスレッド間の競合の問題を「簡単に」解決する方法です。

ですから、'したい処理' 全体をSynchronizeで呼び出すのではなく、基本的には 'したい処理' はExecute内に書き、その中の競合する部分だけを切り出してSynchronizeで呼び出すようにします。

例えば、DelphiのDemoフォルダ下にあるThreadsプログラムは、PaintBoxを書き換える処理だけを切り出してSynchronizeで呼び出しています。配列に関しては各スレッドで独立しているため勝手に書き換えています。

また、競合を回避するには、TCriticalSectionクラスを使う方法もあります。'したい処理' はExecute内に書き、その中の競合する部分だけをEnter-Leaveではさむようにします。

Q[delphi] 変数を利用してコンポーネント名指定したいのですが、可能でしょうか?

表題の件、どなたか教えてください。
「可能」か「不可能」かの情報や代替案でもありがたいです。

※delphi6 enterprise版を使用しています。

質問
コンポーネント名の指定に変数は使えるのでしょうか?
例えば、labelコンポーネントを複数設置しそのlabel名の末尾を数字にする(label1,2,3・・・)。何かの処理の際に、for文で変数を送り(i=1,2,3・・・)、label名+変数.captionなどという形で指定することはできるでしょうか?


ラベル名 label1 label2 label3 を設置

ボタンクリック時などに、
var
i : integer;

for i := 1 to 3 do
begin
  label(i).caption := inttostr(i) ;
end;

よろしくお願いします。

Aベストアンサー

そのような目的にはFindComponentが使えます。

for i := 1 to 3 do
begin
TLabel(FindComponent('Label'+InttoStr(i))).Caption:=InttoStr(i);
end;

QDelphiでキー入力を投げたい

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。

まず、以下の関数を記述しました。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox(LP).Items.AddObject(Buff, Pointer(WH));
Result := True;
end;

次に、ListBoxを用意して、以下を実行しました。
EnumWindows(@CallBackTest, Longint(ListBox1));
ListBoxには実行中のウインドウタイトルが表示されます。そこで、目的のウインドウ名を選択して

for i := 0 to (ListBox1.Items.Count - 1) do
if ListBox1.Selected[i] then
PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
end;

こんな感じで投げられるかな?と思ったのですが、悲しいほど無反応。
なにか根本的にやり方を間違えているのでしょうか・・・?

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。

まず、以下の関数を記述しました。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox...続きを読む

Aベストアンサー

コードを試しました。WindowハンドルをAddObjectで記憶していますので下記は修正しました。

【修正前】PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
【修正後】PostMessage(hwnd(listbox1.Items.Objects[i]), WM_KEYDOWN, {入力キー名} 48, 0);

この修正を加えたら、秀丸エディタには文字0を入力できました。しかし、メモ帳やワードパッドには入力できませんでした。

ウィンドウとメッセージについて調べて試す必要があると思います。EnumWindowsはトップレベルのウィンドウしか探しません。目的のアプリケーションがトップレベルのウィンドウにWM_KEYDOWNを送って反応するものかどうか。子ウィンドウあるいは別のメッセージにしたらどうか、フォーカスをあてたらどうか、など。

QDelphiの型変換

わけあって、Array of charとStringを相互に変換したいのですが、方法はありますでしょうか。
stringは1文字なのですが、charとの変換がどうしても上手くいきません。
よろしくお願いします。

x : string;
y : array [0..79] of char;

x := 'A';
y[0] := x; みたいなコトをしたいのですが・・・。

Aベストアンサー

String -> Array of Charの変換は、StrPCopy()でできます。
ご質問の例だと
 StrPCopy(y,x);
のような感じにすると、xの文字列がyの配列にコピーされます。

逆に、Array of Char -> Stringに変換するには、StrPas()を使います。
 x:=StrPas(y);

詳しくは、この2つの関数をヘルプで見ればおわかりになると思います。

QDephiでのTextボックスでの数値入力

 Delphi初心者です。判らないことは、テキストボックスの様に数値を入力するコントロールが何かということです。
 たとえばMsAccessのフォームで、TEXTBOXを使って数値入力をすることができますが、Delphiの場合はどんなコントロールを使用すれば、数値を入力できるのでしょうか?それとも、テキストボックスの入力を数値変換して使用するか手はないでしょうか?知っている方にしてみると、未熟な質問だと思いますが、よろしくお願いします。

Aベストアンサー

型キャストすれば良いのです。

StrToInt で キャストして IntToStr で戻すとか。
浮動小数点値なら StrToFloat など。

Delphi6以降で整数なら TryStrToInt が使えます。

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
 if TryStrToInt(Edit1.Text,i) then begin
   i := i * 10;
   Edit2.Text := IntToStr(i);
 end;
end;

QDelphiのウィンドウサイズ変更

Delphi 6でウィンドウサイズを変更(最大化)する方法で詰まっています。
直接WidthとHeightの値を指定する方法もあると思うのですが、画面の最大サイズが判っていないとならないため都度画面サイズを調べなければなりません。ウィンドウの最大化ボタンを押したときのように最大化する方法は無いのでしょうか。VC++にはあったのですが…
開発環境:WindowsXP、Delphi6 Personal

Aベストアンサー

Form1.Width:=Screen.Width;
Form1.Height:=Screen.Height;
で大丈夫のはずです。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qdelphiにて 文字列の最後の改行を取り除く

S :=TStringList.Create;
で読みこんだテキスト S.Textの文字列の末尾に一個もしくは複数個の改行#13#10があった場合に取り除きたいのですが、
その方法がいまいちよくわかりません。

ずばり方法、アドバイス、tipsのサイトなど、
教えていただけないでしょうか?

Aベストアンサー

こんにちは、honiyonです。

 すいません、質問を見落としていました。
 そうしますと、以下のような処理になるでしょうか。

function HOGE(S:string):string;
var
i : integer;
begin
for i:=length(S) downto 1 do begin
if not (S[i] in [#13,#10]) then break;
end;
Result := LeftStr(S, i);
end;

テストしていないので不具合あるかも知れませんが、だいたいこんな感じだと思います。


人気Q&Aランキング

おすすめ情報