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;