0

インターネット上の多くの場所を検索しましたが、まだ適切な解決策を見つけることができませんでした。例のほとんどは、他のコンポーネントを使用するか、直接保存などを目的としています。

私の問題はそれです; サーバー上に 2 つのデータベースがあり、1 つは製品情報 (株式コード、名前、価格など) を保持し、もう 1 つは製品の画像 (jpeg、png、gif) を保持しています。製品と画像 (prod_id) をペアにするために、両方のデータベースに固有の値があります。

フォームに 2 つの TFDConnection、2 つの TFDQuery および 1 つの TDataSource コンポーネントを配置しました。情報データベースからデータを取得し、これらのデータを TDataSource、TFDConnection、TFDQuery およびその他の TFDConnection および TFDQuery コンポーネントを介して StringGrid にロードし、画像データベースに接続します。

そして、私はそれをしたいと思います。StringGrid の行をクリックすると、プログラムは選択した行の prod_id 値を取得し (そこまでは問題ありません)、prod_id 値がある場合は画像のデータベースを検索し、blob としての画像 (FILEDATA フィールド) は TImage コントロールにこの画像を表示します。

FireDAC コンポーネントでこれを行う方法はありますか? または、別の方法に従う必要がありますか?ありがとう。

4

1 に答える 1

1

Delphi のサンプル フォルダを見ると、LiveBindings フォルダの下に BindGridLinkVCLProject という名前の例が見つかるはずです (既に使用している可能性があります)。

これは、ライブ バインディングを使用してStringGridからにデータを入力するTDataSet方法と、それを使用してデータベースに保存されているイメージをロードする方法を示しています。これは、 に表示されている現在のレコードに基づいていますStringGrid

ClientDataSet標準 (Borland) Biolife データベース (別名 FishFacts) のデータをロードして使用します。ClientDataSet確認したところ、 を FireDAC のものに置き換えることができます(TFDMemTableサンプル データの形式に Biolife DB も含まれているため、 を使用しました)。Ken White がコメントで述べたように、Firebird データベースを使用していることに違いはありません (もちろん、どの FireDAC データセット タイプを使用するかを除きます)。

また、2 つ目の FireDAC データセットを使用してルックアップを実行し、画像を取得して にロードできることも確認しましたTImage。以下にその方法を示します。

BindGridLinkVCLProject デモ プロジェクトでは、データの Graphic 列に魚の画像が含まれており、TImageLivebinding 経由で表示されます。

このデモ プロジェクトを別の場所から画像を取得するように変更するのTDataSet は簡単です (ただし、以下で説明する内容では、Biolife データセットの 2 番目のコピーを使用するだけです)。ClientDataSet の代わりに FireDAC データセットを使用します。(もちろん、Biolife データには既に画像データが含まれているため、これは人為的な例ですが、ライブ バインディングを使用しても、必要に応じて別のデータセットから画像を簡単に取得できることを以下に示します。)

次のことを試してください。

  • プロジェクトとその GridLinkFormUit1.Pas ファイルのコピーを作成します。

  • に置き換えClientDataSet1ますFDMemTable

  • DataSource1とをポイントBindSourceDB1FDMemTable1ます。

  • FDMemTable1Samples Data フォルダーの Biolife.Fds ファイルから読み込みます (IDE で右クリックします) 。

この時点でStringGridWithBindColumns、Biolife データが表示され、ImageWithHandlerTImage は現在の魚の写真を表示するはずです。今、

  • ダブルクリックBindingList1し、ポップアップで Bind Component for を削除しImageWithHandlerます。これを以下の別の BindingList に追加します。

  • フォームに 2 つ目の FDMemTable を追加し、 と同じデータをロードしますFDMemTable1

  • DataSource2 番目のandBindingListをフォームに追加します。をポイントDataSource2FDMemTable2ます。

  • 次に、 をダブルクリックBindingList2し、エディターを使用して のGraphicフィールドFDMemTable2ImageWithHandlerTImage の間に新しいバインディングを追加します (これを接続する方法については、以下の DFM を参照してください。バインディング エディターは自動的に作成BindSourceDB2 する必要があり、そのDataSetおよびDataSourceプロパティをFDMemTable2およびに設定する必要がありますDataSource2

次に、次のコードをフォームのユニットに追加し、コンパイルして実行します。

  TGridLinkForm1 = class(TForm)
    [...]
  public
    { Public declarations }
    DataFileName : String;
  end;


procedure TGridLinkForm1.FormCreate(Sender: TObject);
begin
  DataFileName := 'D:\xe8\samples\Data\Biolife.Fds';
  if not FDMemTable2.Active then
    FDMemTable2.LoadFromFile(DataFileName);
  if not FDMemTable1.Active then
    FDMemTable1.LoadFromFile(DataFileName);
end;

procedure TGridLinkForm1.FDMemTable1AfterScroll(DataSet: TDataSet);
var
  SpeciesNo : Double;
begin
  SpeciesNo := FDMemTable1.FieldByName('Species No').AsFloat;
  if not FDMemTable2.Locate('Species No', SpeciesNo, []) then
    raise Exception.CreateFmt('SpeciesNo %n not found in %s', [SpeciesNo, FDMemTable2.Name]);
end;

DFM 抽出:

  object FDMemTable2: TFDMemTable
    FetchOptions.AssignedValues = [evMode]
    FetchOptions.Mode = fmAll
    ResourceOptions.AssignedValues = [rvPersistent, rvSilentMode]
    ResourceOptions.Persistent = True
    ResourceOptions.SilentMode = True
    UpdateOptions.AssignedValues = [uvCheckRequired]
    UpdateOptions.CheckRequired = False
    Left = 24
    Top = 392
  end
  object DataSource2: TDataSource
    DataSet = FDMemTable2
    Left = 88
    Top = 392
  end
  object BindSourceDB2: TBindSourceDB
    DataSource = DataSource2
    ScopeMappings = <>
    Left = 236
    Top = 392
  end
  object BindingsList2: TBindingsList
    Methods = <>
    OutputConverters = <>
    Left = 152
    Top = 392
    object LinkControlToField1: TLinkControlToField
      Category = 'Quick Bindings'
      DataSource = BindSourceDB2
      FieldName = 'Graphic'
      Control = ImageWithHandler
      Track = False
    end
  end
于 2015-11-10T16:59:15.517 に答える