AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken BlobStream in StringGrid speichern
Thema durchsuchen
Ansicht
Themen-Optionen

BlobStream in StringGrid speichern

Ein Thema von Smiley · begonnen am 6. Mai 2022 · letzter Beitrag vom 23. Mai 2022
Antwort Antwort
Seite 1 von 3  1 23      
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, 16: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
tewes

Registriert seit: 31. Jan 2007
25 Beiträge
 
#2

AW: BlobStream in StringGrid speichern

  Alt 9. Mai 2022, 13:35
Für solche Fälle hat TStringGrid noch "Objects":
lGrid.Objects[Col, Row] := PicData;
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: BlobStream in StringGrid speichern

  Alt 9. Mai 2022, 14:16
Warum eigentlich ein Stringgrid und nicht einfach ein TDBGrid ?
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

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

AW: BlobStream in StringGrid speichern

  Alt 9. Mai 2022, 18:09
Wenn ich ein DBGrid nehme muss ich die Datenbank ja immer offen halten, wenn ich mit den Daten arbeiten will.
Das Ziel ist aber die Datenbank nach dem lesen der Daten so schnell wie möglich wieder zu schließen.
Wenn alle Datensätze gelesen sind kann ich ohne DBGrid die Verbindung lösen und lokal im Grid arbeiten bis mal etwas geändert wird, was selten vorkommt.
Was nicht verbunden ist, kann nicht kaputt gehen. (Single user DB).
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

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

AW: BlobStream in StringGrid speichern

  Alt 9. Mai 2022, 20:15
@tewes
Das speichern ins Grid habe ich jetzt so gemacht:
Code:
lGrid.Objects[Col, Row] := AktData.JpegArray[0];
Wenn ich es aber wieder aus dem Grid rausholen will und in das JPegArray[0] schreiben will muss ich noch den ObjectTyp casten
Das hier geht nicht:
Code:
JpegArray[0].Assign(lGrid.Objects[5,lGrid.Row]);
Inkompatible Typen TPersistent und Object

Wie schreibe ich das richtig?
  Mit Zitat antworten Zitat
tewes

Registriert seit: 31. Jan 2007
25 Beiträge
 
#6

AW: BlobStream in StringGrid speichern

  Alt 10. Mai 2022, 09:54
JpegArray[0].Assign(TjpegImage(lGrid.Objects[5,lGrid.Row]));
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: BlobStream in StringGrid speichern

  Alt 10. Mai 2022, 11:16
Wenn ich ein DBGrid nehme muss ich die Datenbank ja immer offen halten, wenn ich mit den Daten arbeiten will.
Das Ziel ist aber die Datenbank nach dem lesen der Daten so schnell wie möglich wieder zu schließen.
Wenn alle Datensätze gelesen sind kann ich ohne DBGrid die Verbindung lösen und lokal im Grid arbeiten bis mal etwas geändert wird, was selten vorkommt.
Was nicht verbunden ist, kann nicht kaputt gehen. (Single user DB).
MemoryDatasets wie TFDMemTable (FireDac Memtable).. da liest Du die ganzen records rein und funktioniert wie das Query selbst, aber ohne DB-Anbindung.
Das geht dann auch mit nur 1 Zeile Code, in dem Fall

Code:
FDMemtable1.CopyDataset(FDQuery1, [coAppend,coRestart,coStructure]);
Wobei die coXXXX halt sehen musst, was Du da brauchst. UniDAC etc. haben solche MemoryDataSets auch, falls Du kein FireDAC hast

Geändert von MyRealName (10. Mai 2022 um 11:22 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: BlobStream in StringGrid speichern

  Alt 10. Mai 2022, 11:17
Wenn ich ein DBGrid nehme muss ich die Datenbank ja immer offen halten, wenn ich mit den Daten arbeiten will.
Das Ziel ist aber die Datenbank nach dem lesen der Daten so schnell wie möglich wieder zu schließen.
Wenn alle Datensätze gelesen sind kann ich ohne DBGrid die Verbindung lösen und lokal im Grid arbeiten bis mal etwas geändert wird, was selten vorkommt.
Was nicht verbunden ist, kann nicht kaputt gehen. (Single user DB).
Ich will das jetzt nicht empfehlen, in Zeiten von ORM und Co. ist ja das Arbeiten mit den DB-Controls etwas "out", aber das Obige wäre genau das Szenario, wofür das TClientDataset gedacht ist.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

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

AW: BlobStream in StringGrid speichern

  Alt 10. Mai 2022, 13:23
@tewes
Danke für die Syntax.

@MyRealName
Richtig FdMemtable wäre eine gute Idee, daran habe ich gar nicht mehr gedacht.
Ich habe FireDAC,UniDAC und TMS.
Was nehmen wir denn Heute?

@Jumpy
Deine Antwort ist für mich nicht ganz eindeutig, was du aussagen möchtest.
"Ich will das jetzt nicht empfehlen" meintest du meine Idee das mit einem Stringgrid zu machen ?
"in Zeiten von ORM und Co. ist ja das Arbeiten mit den DB-Controls etwas out" kannst du das näher erläutern ?

Mit den DB-Controls hatte ich im letzten Projekt einige Schwierigkeiten, da ich im Event DataSetChange versucht habe dort die FormularAktualisierung aufzurufen und dabei einige Probleme hatte, da er dort nicht nur beim wechseln des Datensatzes dort reinspringt.
Hab ich da eventuell den falschen Event benutzt?
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: BlobStream in StringGrid speichern

  Alt 10. Mai 2022, 13:38
@MyRealName
Richtig FdMemtable wäre eine gute Idee, daran habe ich gar nicht mehr gedacht.
Ich habe FireDAC,UniDAC und TMS.
Was nehmen wir denn Heute?
UniDAC mit VirtualTable. Warum ? Weil Du VirtualQueries drüber machen kannst mit JOINS auf andere Datasets Um es jugendfei zu halten will ich gar nicht sagen, wie geil das ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz