Einzelnen Beitrag anzeigen

Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#1

BlobStream in StringGrid speichern

  Alt 6. Mai 2022, 15:56
Datenbank: Absolute DB • Version: 7.10 • Zugriff über: TABSDatabase
Hallo Community

Ich überlege was die beste Lösung für mich ist um Daten aus einer Datenbanktabelle in ein StrinGrid zu schreiben.
Die normalen Daten sind kein Problem, ich habe jedoch noch ein Blob Feld in der Tabelle, das ich entweder irgendwie mit ins Grid bekommen muss oder nur einen Index ins Grid schreibe und den BlobFeld-Inhalt in eine Array of TJpegImage speichere.
Im Blob-Feld ist entweder ein TJpegImage gespeichert oder ein Array[0..119] of TJpegImage.
Die Angabe ob es ein Bild oder eine Bildfolge ist habe ich in der Tabelle stehen, als ‚B‘ oder ‚V‘.
Für Bild oder Video.
In der Datenbank sind mehrere Kunden mit ID gespeichert und zu jedem Kunden 1 bis 50 Datensätze mit Daten und Bild/Bildfolge.

Hier der Code wie ich ins Grid schreibe:

Code:
// **************************************************************************
// *             Daten in Grid schreiben                                   *
// **************************************************************************
procedure TDM.WriteDataToGrid(lPatNr: Cardinal; lGrid: TStringGrid);
var
  I, Row, Col: Integer;
  AlteDB: String;
  StopWatch: TStopWatch;
begin
  // Header in Grid schreiben
  lGrid.cells[0, 0] := 'ID';
  lGrid.cells[1, 0] := 'Erst.Datum';
  lGrid.cells[2, 0] := 'Info Datum';
  lGrid.cells[3, 0] := 'Typ';
  lGrid.cells[4, 0] := 'Bilder Anzahl';
  lGrid.cells[5, 0] := 'Info';
  lGrid.cells[6, 0] := 'Bild';
  lGrid.ColWidths[0] := -1;
  lGrid.ColWidths[1] := 65;
  lGrid.ColWidths[2] := 65;
  lGrid.ColWidths[3] := 30;
  lGrid.ColWidths[4] := 70;
  lGrid.ColWidths[5] := 250;
  lGrid.ColWidths[6] := 70;
 
  qData.SQL.Text := 'Select * from Bilder Where PatNr=:PatNr order by CreateDate Desc';
  qData.ParamByName('PatNr').AsInteger := lPatNr;
  qData.Open;
  qData.first;

  // Daten aus der DB lesen und in Grid schreiben
  Row := 1;
  Col := 0;

  for I := 0 to qData.RecordCount - 1 do
  begin
    // ID einlesen und in Grid und AktData schreiben
    lGrid.cells[Col, Row] := AktData.ID.ToString;
    Inc(Col);

    // CreateDate einlesen und in Grid schreiben
    lGrid.cells[Col, Row] := DateToStr(AktData.CreateDate);
    Inc(Col);

    // InfoDate einlesen und in Grid schreiben
    if (qData.FieldByName('InfoDate').AsString = '') then
      lGrid.cells[Col, Row] := ''
    else
      lGrid.cells[Col, Row] := DateToStr(AktData.InfoDate);
    Inc(Col);

    // BildTyp einlesen und in Grid schreiben
    lGrid.cells[Col, Row] := AktData.Typ;
    Inc(Col);

    // BildAnzahl einlesen und in Grid schreiben
    lGrid.cells[Col, Row] := AktData.PicCount.ToString;
    Inc(Col);

    // Infotext einlesen und in Grid schreiben
    lGrid.cells[Col, Row] := AktData.Info;
    Inc(Col);
   
   // Hier sollte das Bild aus der Tabelle in das Grid geschrieben werden
    //lGrid.cells[Row,I+6] := PicData; // Bild in Grid schreiben ???

    // Nächsten Datensatz holen
    qData.Next;
    Inc(Row);
    Col := 0;
  end;

  // Ersten Datensatz mit neuestem Datum auswählen
  // und in AktData Record ablegen
  qData.first;
  AktData.ID := qData.FieldByName('ID').AsInteger;
  AktData.CreateDate := qData.FieldByName('CreateDate').AsDateTime;
  AktData.InfoDate := qData.FieldByName('InfoDate').AsDateTime;
  AktData.Typ := qData.FieldByName('PicTyp').AsString;
  AktData.PicCount := qData.FieldByName('PicCount').AsInteger;
  AktData.Info := qData.FieldByName('Info').AsString;
  // Hier sollte das Bild aus der Tabelle in das Grid geschrieben werden
  // AktData.JPegArray:= PicData ???
  // Query schließen
  qData.Close;
//--------------------------------------------------------------------------
 
  AktData sieht so aus:
  TAktData = class
    PatNr: Cardinal;
    ID: Cardinal;
    CreateDate: TDate;
    Typ: String;
    InfoDate: TDate;
    PicCount: Byte;
    Info: String;
    DBName: string;
    JpegArray: Array [0 .. 119] of TjpegImage;
.......

constructor TAktData.Create;
Var
  i: Integer;
Begin
  ID := 0;
  PatNr := 0;
  CreateDate := 0;
  InfoDate := 0;
  Typ := 'B';
  PicCount := 1;
  Info := '';
  For i := 0 to 119 Do
  begin
    JpegArray[i] := TjpegImage.Create;
  end;
End;
Frage 1:
Kann ich das BlobFeld einfach in das StringGrid bekommen und wenn ja wie ?

Frage 2:
Wenn ich ein Array[0..119] of TJpegImage habe in dem nur einBild in Array[0] enthalten ist, wieviel wird dann im Blobfeld von den nicht benutzten Arrayfeldern an Platz beansprucht und wieviel im RAM für das Array ?
  Mit Zitat antworten Zitat