DLL内でEXE側のDBGridで表示されているのをExcel表示するには?

解決


sa  2010-05-14 02:07:50  No: 38444

DLL内でExe側のDBGridに表示されたデータをExcelに表示させたいのですが、
エラーになる部分があるので教えてください。

DLL内に関数を作成し、引数でDBGridを渡しています。
function  OutExcelFromDbGrid(piDBGrid: TDBGrid;
      piTitle: Pchar; piExcel: boolean): boolean; stdcall;
const
  HeaderCol  = 1;
  HeaderRow  = 1;
  MeisaiHRow = 3;
  MeisaiCol  = 1;
  MeisaiRow  = 4;
  ExtKeyWard = 'test';
var
  i, j, k, m, n: integer;
  strText      : string;
  Excel        : olevariant;
  ADataSet     : TDataSet;
  BookMark     : TBookmark;
  TFT          : TFieldType;
  rRect        : TRect;
  iRight       : integer;
  intKeyWard   : integer;
  //a : String;
begin
  strText    := '';
  intKeyWard := -1;

  // DBGridに関連付けされているDataSetを変数に代入
  ADataSet := piDBGrid.DataSource.DataSet;
  BookMark := ADataSet.GetBookmark;

  if not ADataSet.Active then
  begin
    ADataSet.Active := True;
  end;

  // DBGridに表示されているフィールドの列名を取得し、文字列に代入
  j := piDBGrid.Columns.Count - 1;
  for i := 0 to j do
  begin
    if not piDBGrid.Columns[i].Visible then
    begin
      Continue;
    end; //非表示列は除外
    strText := strText + piDBGrid.Columns[i].Title.Caption;
    if i < j then
    begin
      strText := strText + #9;
    end;
    if piDBGrid.Columns[i].Title.Caption = ExtKeyWard then
    begin
      intKeyWard := i;
    end;
  end;
  // DBGridに表示されているデータを取得し、文字列に代入
  strText       := strText + #13#10;
  Screen.Cursor := crSQLWait;
  ADataSet.DisableControls;
  try
    ADataSet.First;
    while not ADataSet.EOF do 
    begin
      for i := 0 to j do
      begin
        if not piDBGrid.Columns[i].Visible then
        begin
          Continue;
        end; //非表示列は除外
        //a := piDBGrid.Columns[i].Field.DisplayText;
        //strText := strText + a;
        //showmessage(piDBGrid.Columns[i].Field.DisplayText);
        strText := strText + piDBGrid.Columns[i].Field.DisplayText; //☆☆☆
        if i < j then
        begin
          strText := strText + #9;
        end;
      end;
      ADataSet.Next;
      strText := strText + #13#10;
    end;
  finally
    ADataSet.EnableControls;
    Screen.Cursor := crDefault;
    ADataSet.GotoBookmark(Bookmark);
    ADataSet.FreeBookmark(Bookmark);
  end;
  ・
  ・  
  ・

☆☆☆の部分でGridのデータを文字列に代入しているのですが
22列中13列目で文字列に代入せずにfinally処理が走ってしまいます。
またFinally処理のFreeBookmark部分でエラーになってしまいます。
エラーは「アドレス00000000のアドレス00000000でエラーが発生しました」です。
試しでFinallyをExceptにしてみたらエラーはでませんでした。
(それも意味がわからないのですが…)

まず、なぜ22列あるのに13列でFinally処理に行ってしまうのかが知りたいです。
よろしくお願いします。


ささ  2010-05-14 04:58:44  No: 38445

>22列中13列目で文字列に代入せずにfinally処理が走ってしまいます。
その時のループ変数jの値は?


sa  2010-05-14 17:51:34  No: 38446

>ささ様

お返事ありがとうございます。
jの値は21になっています。。


HOta  2010-05-14 19:22:24  No: 38447

DisplayTexをAsStringに変えても同じでしょうか?


sa  2010-05-14 19:29:29  No: 38448

>HOta様

!!!
AsStringに変更したらエラーなく処理が終わりました!!!
ありがとうございます!!
原因は何だったのでしょうか…??


HOta  2010-05-14 20:18:18  No: 38449

Helpに依ると、DisplayTexは編集時以外参照となっていました。


sa  2010-05-14 22:09:58  No: 38450

>>HOta様

ありがとうございました!!


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

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






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