![]() |
Datenbank: Absolute DB • Version: 7.10 • Zugriff über: TABSDatabase
BlobStream in StringGrid speichern
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:
Frage 1:
// **************************************************************************
// * 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; 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 ? |
AW: BlobStream in StringGrid speichern
Für solche Fälle hat TStringGrid noch "Objects":
lGrid.Objects[Col, Row] := PicData; |
AW: BlobStream in StringGrid speichern
Warum eigentlich ein Stringgrid und nicht einfach ein TDBGrid ?
|
AW: BlobStream in StringGrid speichern
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). |
AW: BlobStream in StringGrid speichern
@tewes
Das speichern ins Grid habe ich jetzt so gemacht:
Code:
Wenn ich es aber wieder aus dem Grid rausholen will und in das JPegArray[0] schreiben will muss ich noch den ObjectTyp casten
lGrid.Objects[Col, Row] := AktData.JpegArray[0];
Das hier geht nicht:
Code:
Inkompatible Typen TPersistent und Object
JpegArray[0].Assign(lGrid.Objects[5,lGrid.Row]);
Wie schreibe ich das richtig? |
AW: BlobStream in StringGrid speichern
JpegArray[0].Assign(TjpegImage(lGrid.Objects[5,lGrid.Row]));
|
AW: BlobStream in StringGrid speichern
Zitat:
Das geht dann auch mit nur 1 Zeile Code, in dem Fall
Code:
Wobei die coXXXX halt sehen musst, was Du da brauchst. UniDAC etc. haben solche MemoryDataSets auch, falls Du kein FireDAC hast
FDMemtable1.CopyDataset(FDQuery1, [coAppend,coRestart,coStructure]);
|
AW: BlobStream in StringGrid speichern
Zitat:
|
AW: BlobStream in StringGrid speichern
@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? |
AW: BlobStream in StringGrid speichern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz