レコードをポインタで参照するには?

解決


カウ  2005-05-27 03:14:32  No: 15099

DELPHI7を使用しています。
初心者質問かもしれませんが、よろしくお願いします。

以下のソースは、簡略化したものです。
エクセルに出力したデータが文字化けをおこしてしまいます。
原因がわかる方いましたら、教えてください。

変数宣言
------------------------------------------------------
PIchiran = ^TIchiran;
TIchiran = record
    Sys_Kbn: String[20];  
    Shinsain: String[5];  
    Kanji_Name: String[20];
    Syosai_Cd: String[8];
FIchiran = Array of TIchiran;

A.UNIT
------------------------------------------------------
function TEST_A: Boolean;
var
  IchiranArray : FIchiran;
  i: Integer;
begin

  //データベースより値を取得
  while not Eof do
  begin
    SetLength(IchiranArray, Length(IchiranArray) + 1);
    IchiranArray[i].Sys_Kbn := FieldByName('A').AsString;
    IchiranArray[i].Shinsain := FieldByName('B').AsString;
    IchiranArray[i].Kanji_Name := FieldByName('C').AsString;
    IchiranArray[i].Syosai_Cd := FieldByName('D').AsString;

    i := i + 1;
    Next;
  end;

  //ポインタ受け渡し
  TEST_B.pub_PIchiran := @IchiranArray;
end;

B.UNIT
------------------------------------------------------
public
    { Public宣言 }
    pub_PIchiran : PIchiran;

procedure TEST_B;
var
  i: Integer;
begin
  with EWSheet do
  begin


  2005-05-27 03:16:12  No: 15100

B.UNIT
------------------------------------------------------
public
    { Public宣言 }
    pub_PIchiran : PIchiran;

procedure TEST_B;
var
  i: Integer;
begin
  with EWSheet do
  begin
    //エクセルにデータを出力する
    Range['A1', 'A1'].Value := pub_PIchiran.Sys_Kbn;
    Range['B1', 'B1'].Value := pub_PIchiran.Shinsain;
    Range['C1', 'C1'].Value := pub_PIchiran.Kanji_Name;
    Range['D1', 'D1'].Value := pub_PIchiran.Syosai_Cd;

    Inc(pub_PIchiran);
    i := i + 1;
  end;
end;


にしの  2005-05-27 03:43:34  No: 15101

>  //ポインタ受け渡し
>  TEST_B.pub_PIchiran := @IchiranArray;

ここで、IchiranArrayを外に出しているようですが、function TEST_Aの実行が終わった時点で、IchiranArrayは破棄されますよ。


カウ  2005-05-27 04:54:43  No: 15102

返信ありがとうございました。

根本的に、間違っているのかも知れないのですが、
一応グローバル変数にしても文字化けしました。

気になってることがありまして、
ポインタの使い方は、あってますか??
そこから自信がないのですが・・・。


kkk  2005-05-27 15:11:28  No: 15103

>一応グローバル変数にしても文字化けしました。
A.UNITのfunction TEST_A内の IchiranArray : FIchiran;を外に出したということですよね?
それならOKですが。
>ポインタの使い方は、あってますか??
 Range['A1', 'A1'].Value := pub_PIchiran^.Sys_Kbn;
の様にします。


kkk  2005-05-27 15:46:35  No: 15104

IchiranArray : FIchiran;
が動的配列になっていますね
//ポインタ受け渡し
  TEST_B.pub_PIchiran := @IchiranArray;
ではなく
  TEST_B.pub_PIchiran := @IchiranArray[0];
としてください。


カウ  2005-05-28 03:15:58  No: 15105

回答ありがとうございました。

上記修正を行ったところ、エクセルにデータが出力されました。
貴重な時間を割いていただき、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加