Вот пример того, как писать и читать BLOB
procedure SaveToFireDACBlob;
var
MemStream: TMemoryStream;
begin
FireDAC.Connected := True;
MemStream := TMemoryStream.Create;
try
Image1.Bitmap.SaveToStream(MemStream);
MemStream.Seek(0,0);
FDQueryInsert.ParamByName('Media').LoadFromStream(MemStream,ftBlob);
FDQueryInsert.ParamByName('MType').AsString := '0';
FDQueryInsert.ExecSQL();
except
on e: Exception do begin
ShowMessage(e.Message);
end;
end;
MemStream.Free;
FireDAC.Connected := False;
end;
procedure LoadFromFireDACBlob;
var
BlobStream: TStream;
begin
FireDAC.Connected := True;
try
FDQuerySelect.Open;
FDQuerySelect.First;
while(not FDQuerySelect.EOF)do begin
// access a stream from a blob like this
BlobStream := FDQuerySelect.CreateBlobStream(FDQuerySelect.FieldByName('Media'),TBlobStreamMode.bmRead);
// access a string from a field like this
if (FDQuerySelect.FieldByName('MType').AsString='0') then begin
// load your blob stream data into a control
ImageViewer.Bitmap.LoadFromStream(BlobStream);
end;
BlobStream.Free;
FDQuerySelect.Next;
end;
except
on e: Exception do begin
//ShowMessage(e.Message);
end;
end;
FireDAC.Connected := False;
end;
{источник http://www.fmxexpress.com/read-and-write-a-blob-field-using-firedac-with-firemonkey-on-android-and-ios/}
Касательно работы с изменением качества/размера, считаю что необходимо использовать TBitmapSurface (unit FMX.Surfaces)
Нашел немного похожий вопрос на http://stackoverflow.com/questions/21836579/can-i-make-a-tmemo-size-itself-to-the-text-it-contains-firemonkey
Используя код определения высоты TMemo:
function get_memo_height(amemo:tmemo):single;
var i:integer;
astring: string;
layout: ttextlayout;
begin
Layout := TTextLayoutManager.DefaultTextLayout.Create;
astring:='';
for i:=0 to amemo.lines.count-1 do astring:=astring+amemo.lines[i]+chr(10);
Layout.BeginUpdate;
Layout.Text :=astring;
Layout.WordWrap:= amemo.wordwrap;
Layout.HorizontalAlign:= amemo.TextAlign;
Layout.MaxSize:= PointF(amemo.width,maxint);
Layout.VerticalAlign := TTextAlign.Leading;
Layout.Font := amemo.Font;
Layout.TopLeft := pointf(0,0);
Layout.EndUpdate;
result:=layout.textrect.bottom-amemo.Font.Size;;
Layout.free;
end;
Memo.Height:=get_memo_height(Memo);
в сочетании с
Memo.Align:= TAlignLayOut.VertCenter;
Получаем эффект выравнивания текста Memo по центру вертикали родительского контрола
Да - да, это он. Там есть от силы 5 ссылок в интернете, на которых разсматриваются 2 примера с ХЕ5.
Я неделю колупал, не мог разобраться пока не поставил джаву и не написал свой сервис джавовский
И сегодня наконец-то сделал, по полной аналогии, сервис в коротом пашет StartForeground)
Так что мой тебе совет. Попробуй написать на джаве, или хотяб примеры глянь. А потом через JNI все сделаешь на делфи.
думаю что можно тут:
http://github.com/FMXExpress/android-object-pascal-wrapper/blob/master/android-16/android.app.AlarmManager.pas
посмотреть на него, но как его использовать
По приложенному примеру:
в MySortTree нужно TTreeViewItem вместо TListBoxItem.
при работе с TListBox и TTreeVew (заполнение и пр.) рекомендую использовать .BeginUpdate и .EndUpdate.
По проблеме:
Так вроде показывает без фантомов:
procedure TForm1.SortTreeItemsClick(Sender: TObject);
begin
TreeView1.BeginUpdate;
try
TreeView1.Sort(MySortTree);
TreeView1.ExpandAll;
finally
TreeView1.EndUpdate;
end;
end;
P.S. А Вы используете какое-то особое правило сортировки? Если нет, рекомендую просто использовать TreeView1.Sorted := true для автоматической сортировки в алфавитном порядке по тексту в айтемах.