Announcement

Collapse
No announcement yet.

Einfügen einer Grafik in eine Datenbanktabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Einfügen einer Grafik in eine Datenbanktabelle

    Ich arbeite erst ganz am Anfang mit Datenbanken. Bisher gelingt es mir nur über die Zwischenablage eine Grafik in eine TDBImage-Komponente einzufügen, so dass Sie auch in die verknüpfte Tabelle übernommen wird.

    Versuche, eine Grafik-Datei direkt mit der Methode ..picture.loadfromfile in die Komponente einzufügen gelingen nur soweit, dass das Bild tatsächlich dargestellt, aber offensichtlich nicht in die Datenbanktabelle übernommen wird. Bei jedem Versuch nach dieser Operation im DBGrid zu einem anderen Datensatz zu wechseln wird eine Exception ausgelöst (Tabelle nicht im Edit oder Insert - Modus).
    Wie muss ich vorgehen?

  • #2
    Hallo,

    es gibt zwei Möglichkeiten: <br>
    1. Der Datensatz wird vorher in den Editier-Modus geschaltet. <br>
    2. Die Grafik wird über SQL in der Tabelle abgelegt.
    Das folgende Beispiel demonstriert den zweiten Weg - eine .ICO-Datei kann über einen Datei öffnen-Dialog ausgewählt werden, um als Icon direkt in der Datenbanktabelle zu landen.
    <pre>
    procedure TFormMain.SBOpenClick(Sender: TObject);
    begin
    with OpenPictureDialog1 do
    if Execute then
    begin
    // zur Information Daten zum ausgewählten Icon anzeigen
    StaticTextPath.Caption := ExtractFilePath(Filename);
    Image1.Picture.LoadFromFile(FileName);
    OpenPictureDialog1.InitialDir := StaticTextPath.Caption;
    EditIconName.Text := ExtractFilename(FileName);
    end
    end;

    (* QueryICON.SQL = INSERT INTO icondb (Name, Icon)
    VALUES (:sName, :bIcon)

    QueryICON.Params = sName : String
    bIcon : Blob *)

    procedure TFormMain.BitBtnImportClick(Sender: TObject);
    begin
    with QueryIcon do
    begin
    Params[0].AsString := EditIconName.Text;
    if StaticTextPath.Caption <> '' then
    begin
    Params[1].LoadFromFile(OpenPictureDialog1.FileName, ftGraphic);
    Params[2].AsString := EditRubrik.Text;
    ExecSQL;
    TableIconTable.Refresh;
    end;
    end;
    end;
    </pre>
    Um das ICON aus der Datenbank anzeigen zu können, wird der folgende Weg verwendet:
    <pre>
    procedure TFormMain.DataSource1DataChange(Sender: TObject; Field: TField);
    var
    aStream: TBlobStream;
    begin
    with TableIconTable do
    begin
    // Wieviel Icons sind im Bestand ?
    StatBar.SimpleText := Format('%d Datensätze vorhanden', [RecordCount]);
    // kein Datensatz -> Abbruch
    if RecordCount = 0 then Exit;
    end;
    // TDBImage kann nur Bitmaps, daher dieser Umweg
    aStream := TBlobStream.Create(TableIconTableICON as TBlobField, bmRead);
    try
    ImageDB.Picture.Icon.LoadFromStream(aStream);
    finally
    aStream.Free;
    end;
    end;
    </pre>
    Der Zugriff erfolgt dabei über die für diese Tabellenspalte angelegte <b>persistente TField-Instanz</b>

    Comment


    • #3
      Danke für die prompte Antwort!
      Der entscheidende Tip ist, dass DBImage nur Bitmap-Dateien in Tabellen unterbringen kann.
      Die Sache klappt jetzt mit table.edit, dbimage.picture.loadfromfile und table.post

      Comment

      Working...
      X