Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.932 Beiträge
 
Delphi 12 Athens
 
#3

AW: [Fmx] TBitmap in TValue speichern

  Alt 8. Apr 2016, 10:36
Das ist ja auch nicht mein Wunschkandidat, aber ich versuche mit dem DataGeneratorAdapter und LiveBindings eine Datenbankschnittstelle hinzubekommen.
Dazu brauche ich wohl TValue.

Edit:

Laut dem http://monkeystyler.com/guide/TGrid es eigentlich funktionieren, zumindest im StringGrid.

Delphi-Quellcode:
//A TValue uses generics to specify the data type to read or write. The example below shows an example of setting data for each of the built in cell types,
procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer;
  var Value: TValue);
begin
  if Col = 0 then
    //TTextCell
    Value := TValue.From<String>(IntToStr(Row))
  else if Col = 1 then
    //TCheckCell
    Value := TValue.From<Boolean>((Row mod 2) = 0)
  else if Col = 2 then
    //TProgressCell
    Value := TValue.From<Single>(Row)
  else if Col = 3 then
    //TPopupColumn
    // - doesn't accept data
  else if Col = 4 then
    //TImageColumn
    Value := TValue.From<TBitmap>(ImageControl1.Bitmap);
    //Or Value := TValue.From<String>('C:/Pictures/Kitten.png');
end;
Aber dann liegt es irgendwo am DataGeneratorAdapter1.Fields[4].SetTValue( valPic ); und
es geht verloren auf dem Weg zum Image und zur ImageList.

Ich hab nochmal meinen TestCode mit drangehangen.


Rollo


Delphi-Quellcode:
procedure TForm1.Setup_Data(const sType: String);
var
  bmp: TBitmap;
  bmpCopy: TBitmap;

  valPic: TValue;
  dt: Extended;
  sDt: string;
  sTest: String;

  varPic: OleVariant;

begin

  DataGeneratorAdapter1.Fields[0].SetTValue( Random(100) );
  DataGeneratorAdapter1.Fields[1].SetTValue( 'Name ' + Random(100).ToString + ' - ' + sType );

  // TimeStamp string
  sDt := FormatDateTime('YY.MM.DD hh:nn:ss', Now);
  DataGeneratorAdapter1.Fields[2].SetTValue( sDt );


  // TimeStamp TDatetime
  DataGeneratorAdapter1.Fields[3].SetTValue( Now );

  // Pic
  if Assigned(Glyph1.Images) and (Glyph1.ImageIndex < Glyph1.Images.Count) then
    bmp := Glyph1.Images.Bitmap(TSize.Create(512,512), Glyph1.ImageIndex)
  else
    bmp := nil;

  if Assigned(bmp) then
  begin

    bmpCopy := TBitmap.Create; //TODO: Is this managed and freed by TValue ?? Check

    try
      bmpCopy.Assign( bmp );

// Error
// S4Bmp_ToStream(bmp, MStrm, '.jpg', 85);
// MStrm.Position := 0;
//
// BMPToVariant(bmpCopy, varPic);
//

// Error
// valPic := TValue.From<Variant>(varPic);
// sTest := valPic.ToString;
//


// Error
// valPic := TValue.From<TBitmap>(bmpCopy);
// sTest := valPic.ToString;
//

// Error
// TValue.Make(@bmpCopy, TypeInfo(TBitmap), valPic);
// sTest := valPic.ToString;

// Error - Bitmap ist nur nach erstellen sichtbar, Scroll/Refresh vernichtet es
      valPic := TValue.From(bmpCopy);
      sTest := valPic.ToString;

      DataGeneratorAdapter1.Fields[4].SetTValue( valPic );

    finally
// bmpCopy.Free; // Nicht gemacht, weil sonst das Bmp zerstört würde
                     // Aber kann TValue Owner vom Bmp sein ?
    end;

  end;



end;


procedure TForm1.Button1Click(Sender: TObject);
begin

  DataGeneratorAdapter1.Append;

  Setup_Data( 'by append');

  DataGeneratorAdapter1.Post;

end;
Angehängte Dateien
Dateityp: zip T96_LbDataBindSrc.zip (753,3 KB, 3x aufgerufen)

Geändert von Rollo62 ( 8. Apr 2016 um 11:47 Uhr)
  Mit Zitat antworten Zitat