Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE5-XE8,10.x(Seattle, Berl

Автор: vkramnik
Дата сообщения: 12.03.2015 18:04
qwertEHOK
А если сначала проверить кол-во часов в dt и, если оно = 0,
то просто сцепить дату, "00:" и время в минутах/секундах/миллисекундах ?
"Табуреточный" метод...
Автор: dix75
Дата сообщения: 12.03.2015 22:19
Добрый вечер!
Подскажите как отключить складирование изменений в history
Автор: krapotkin
Дата сообщения: 12.03.2015 22:55
xpin2013

Цитата:
DB.TDataSource - это и есть реализация "подписки на события базы данных".

вовсе нет
Cмена активной записи, изменение полей и режима датасета никакого отношения к БД вообще не имеют.

События БД - это EventAlerter. Там как раз настоящая подписка и есть.
Автор: dred2k
Дата сообщения: 13.03.2015 00:43
dix75
Tools -> Options -> Editor Options -> Create backup files
Автор: xpin2013
Дата сообщения: 13.03.2015 03:11
krapotkin

Цитата:
Cмена активной записи, изменение полей и режима датасета никакого отношения к БД вообще не имеют.

Это приблизительно то же самое, что сказать - "Ваш стакан не на половину полон, а наполовину пуст". То есть я нажимаю на двоечку, в этот момент меняется запись, а исходя из утверждения что смена записи не влияет мы смело делаем едит/пост двоечки в любое место... Ну да не будем троллить. Чем по Вашему представлена база данных для визуальных компонентов? Именно датасурсом. Позволю себе напомнить - речь шла касательно MVC - Model, View, Controller. В этой модели различные Views именно подписываются на одно и то же событие - реагируют на изменение данных в Модели. И никакой речи о "технологии EventAlerter" в MVC нет. Данными считаются именно те данные, которые хранит Модель. А когда их записывать в "БД" в какую "БД" это дело Контроллера. Именно контроллер может выстроить полнофункциональную модель не имея вообще никаких связей с базами данных. Вообще никаких БД, не только ФайрБорды. Если Вам не нравится именно формулировка, то суть то от этого никак не поменялась - никому в MVC никуда не упирались какие то события происходящие в файлах типа FDB. Ну и если уж DataSource предлагает более широкий набор событий, чем было запланировано для различных View, так это только плюс источникам данных. Различные Views, в MVC подписываются именно на изменения данных в модели, а уж никоим образом не на события баз данных.

Перечитайте, если на то пошло статью в Википедии про MVC. Ваша реализация MVC является пассивной по определению. Это именно та реализация, которая считается наиболее ущербной. Для моделей позволительно иметь собственную индексацию которая самым существенным образом может влиять например на отображение контрольных дат в главном окне. Фух как много букав.
Автор: yura371
Дата сообщения: 19.03.2015 20:11
Как правильно удалять BLOB записи с данными? Я удаляю BLOB запись, а данные остаются, т.е. БД весит также.
Запись BLOB:
MemStream.LoadFromFile(openDialog.FileName);
MemStream.Seek(0,0);
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Append('UPDATE "Настройки" SET "Карта"=:Media WHERE _rowid_=1;');
SQLQuery1.ParamByName('Media').LoadFromStream(MemStream,ftBlob);
SQLQuery1.ExecSQL();
MemStream.Clear;

Удаление BLOB:
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Append('UPDATE "Настройки" SET "Карта"=null WHERE _rowid_=1;');
SQLQuery1.ExecSQL();
MemStream.Clear;
Автор: dred2k
Дата сообщения: 19.03.2015 20:31
yura371, бд при удалении записи или обнулении поля физический размер не поменяет. Внутри физических файлов бд - страничная организация, и кол-во страниц не уменьшается, место в странице (или даже в нескольких) просто помечается как свободное. Примерно так.
Автор: Frodo_Torbins
Дата сообщения: 19.03.2015 20:35
yura371
Что за БД?
А вообще это нормальное явление, когда неиспользуемая память придерживается на какое то время. Ведь чтобы правильно освободить место, придется перезаписывать весьма большой кусок памяти, а это время * количество удалений. Поэтому многие системы (не только БД) откладывают такие затратные операции на потом.
Автор: yura371
Дата сообщения: 19.03.2015 20:38
БД SQLite.
Блин записал картинку в БД а удалить физически не могу, удаляется только указатель как я понял.
Автор: DYUMON
Дата сообщения: 19.03.2015 20:51
Сделай vacuum для базы
Автор: yura371
Дата сообщения: 19.03.2015 21:08
Спасибо через Delphi работает, но через SQLite Browser пишет:
"cannot VACUUM from within a transaction: VACUUM;"
Автор: yura371
Дата сообщения: 21.03.2015 12:21
Этот код считывает BLOB поле из БД и сохраняет в файл Karta.png.
Почему после выполнения этого кода на выходе получается картинка такого же размера, как оригинал, но пустая по содержимому, т.е. заполненная нулями? Причем это только в Android, в Windows все нормально. MemStream почему то зануляет данные в Android.


var MemStream: TMemoryStream;
BlobStream: TStream;
TmpFile: string;

TmpFile := TPath.Combine(TPath.GetTempPath, 'Karta.png');
MemStream := TMemoryStream.Create;
try
SQLConnection1.Params.Add('Database='+TPath.Combine(TPath.GetTempPath, 'Base.s3db'));
SQLDataSet1.Active:=false;
SQLDataSet1.CommandText:='Настройки';
SQLDataSet1.Active:=true;
SQLDataSet1.First;
BlobStream:=SQLQuery1.CreateBlobStream(SQLDataSet1.FieldByName('Карта'), TBlobStreamMode.bmRead);
BlobStream.Position:=0;
MemStream.LoadFromStream(BlobStream);
MemStream.SaveToFile(TmpFile);
finally
MemStream.Free;
BlobStream.Free;
end;
Автор: NeoAnomaly
Дата сообщения: 21.03.2015 13:47

Цитата:
MemStream почему то зануляет данные в Android

Почему решил, что memstream? А сразу BlobStream.SaveToFile нельзя сделать?
Автор: yura371
Дата сообщения: 21.03.2015 14:18

Цитата:
Почему решил, что memstream? А сразу BlobStream.SaveToFile нельзя сделать?

Нет такого параметра.
Решил проблему этим кодом без MemSteam:
BlobStream.Position:=0;
with TFileStream.Create(TmpFile, fmCreate) do
try
CopyFrom(BlobStream, BlobStream.Size)
finally
Free
end;
Автор: xpin2013
Дата сообщения: 23.03.2015 00:41
yura371
Очень правильный подход. Не забываем try - finally.
Автор: prokl1986
Дата сообщения: 24.03.2015 18:44
можно ли при помощи XE5, XE6, XE7 перегнать программу, написанную на Delphi 7, на Андроид
Проблема в том, что в программе используются сторонние библиотеки DLL. Консультанты по продажам говорят, что можно, но нужно еще какой-то блок докупать. Что-то я им не очень верю
Автор: Frodo_Torbins
Дата сообщения: 24.03.2015 20:45
prokl1986
Интерфейс придется переделывать полностью. А если у вас, как это часто бывает, весь код в обработчиках событий, то считайте 50% проги нужно будет переписать.
Если используются сторонние DLL, то нужно подумать что они делают, возможно удастся обойтись и без них. Если это что то очень специфичное, то вам одна дорога: делать связку сервер приложений на винде + тонкий клиент на мобиле. В случае БД-шной проги это получится трехзвенка. Ну и тут целая куча разных вариантов, начиная от встроенных и заканчивая платными сторонними.
Автор: AlekXL
Дата сообщения: 25.03.2015 22:40
prokl1986


Цитата:
можно ли при помощи XE5, XE6, XE7 перегнать программу, написанную на Delphi 7, на Андроид
Проблема в том, что в программе используются сторонние библиотеки DLL. Консультанты по продажам говорят, что можно, но нужно еще какой-то блок докупать. Что-то я им не очень верю

судя по вашему вопросу, вам нужно нанять опытного программиста.
такого, которому можете доверять.
Frodo_Torbins


Цитата:
. А если у вас, как это часто бывает, весь код в обработчиках событий, то считайте 50% проги нужно будет переписать

это если программа простая. В сложной, все же меньше 50%, не пугай нуба.


Цитата:
Если используются сторонние DLL, то нужно подумать что они делают, возможно удастся обойтись и без них

или просто их портировать под ARM, если доступны исходники.
Автор: nyinick
Дата сообщения: 26.03.2015 16:11
prokl1986

Цитата:
можно ли при помощи XE5, XE6, XE7 перегнать программу, написанную на Delphi 7, на Андроид

Проще переписать с нуля, максимум используя часть старого кода, который никак не взаимодействует с VCL
Программа для Windows завязана на VCL (если на Дельфи 7 разработка велась), та, что под Андроид - на FMX. Практически многие платформозависимые части программы, в том числе используемые dll файлы, портировать для работы на Андроид не получится.
Автор: AlekXL
Дата сообщения: 26.03.2015 17:15

Цитата:
Практически многие платформозависимые части программы, в том числе используемые dll файлы, портировать для работы на Андроид не получится.

у тебя хрустальный шар? Если библиотека использует CreateFile,ReadFile Windows функции, то трудно ли портировать ее под линукс(андроид)?
Портирование пользовательского интерфейса -- самая сложная часть, но в большом проекте эта часть не может быть самой главной.

---
у меня вопросик по стандартному TBits: нужен Enumerator элементов для него, либо контейнер с подобным функционалом..
Автор: NeoAnomaly
Дата сообщения: 26.03.2015 18:07

Цитата:
у меня вопросик по стандартному TBits: нужен Enumerator элементов для него, либо контейнер с подобным функционалом..

AlekXL, а, если не секрет, зачем тебе энумератор? Там ведь и перечислять нечего
Автор: AlekXL
Дата сообщения: 26.03.2015 18:47

Цитата:
AlekXL, а, если не секрет, зачем тебе энумератор? Там ведь и перечислять нечего

догадайся, любопытный.

Добавлено:
короче, я вернулся пока к обычному множеству, и накропал код перечислителя элементов сета [more]

Код:
program Project47;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TByteSet=set of Byte;




function NextElementFrom(const ByteSet: TByteSet; fromV:smallint=0; toVal:byte=255 ): smallint;
var
bptr:AnsiChar absolute ByteSet;
b: Byte;
dwSize,dwordIt, dwStart:integer;
curVal, mindwrd:Cardinal;
label done;
begin
dwSize:= ( SizeOf(ByteSet)+3) shr 2;
result:=(fromV);
dwStart:=result shr 5;

result:= result and $FFE0;
fromV:=fromV and 31;
mindwrd:= $FFFFFFFF shl fromV;
for dwordIt := dwStart to dwSize do begin
curVal:=PCardinal( PAnsiChar(@bptr)+dwordIt*4)^;
if (fromV>0) then curval:=curVal and mindwrd;

if curVal=0 then begin Inc(result,4*8); fromV:=0; Continue end;
if (Word(curVal)=0)then begin
curVal:=curVal shr 16;
Inc(result, 16);
end;

b:=Lo(curVal);
if (b=0) then begin
b:=Hi(curVal);
Inc(result, 8);
end;

if (b and $F=0)then begin
b:=b shr 4;
Inc(result, 4);
end;

if Result>toVal then begin result:=-1; Exit; end;

if (b and $3<>0) then begin//and
if (b and $1=0) then inc(Result);
end
else begin
if b and $C<>0 then begin
if b and $4=0 then Inc(result,3)
else Inc(Result,2);
end
else result:=-1
end;

done:
if result>toVal then result:=-1;
Assert( (fromV<>0) or (result>=0) );
exit;
end;//for
// No elements set
result:=-1;
end;

var bs:TByteSet;
bt:smallint;
i,j:SmallInt;
begin
try
bs:=[2];
bt:=NextElementFrom(bs,0);
for i := 0 to 255 do begin
for j := 0 to 255 do
begin
bs:=[i];
bt:=NextElementFrom(bs,j);
Assert( ( (j>i) and (bt=-1) ) xor (bt=i) ) ;
end;

end;
bs:=[];
for i := 0 to 255 do Include(bs,i);
for i := 0 to 255 do begin
bt:=NextElementFrom(bs,i);
Assert(i=bt);

end;


writeln(bt);

{ TODO -oUser -cConsole Main : Insert code here }
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
Автор: NeoAnomaly
Дата сообщения: 26.03.2015 22:20

Цитата:
догадайся, любопытный.

AlekXL зачем спрашивал тогда? А после приведённого тобой кода - тем более. Либо это, ох**ть как далеко, не мой уровень, либо нафига такие трудности?
Автор: Eternal_Shield
Дата сообщения: 26.03.2015 23:23
AlekXL

Цитата:
и накропал код перечислителя элементов сета Подробнее...

Эээ, в каком месте в этом коде есть хоть какое-то перечисление?

Вот это:
bs:=[199];
bt:=NextElementFrom(bs,200);
Какой должен быть результат? Не понять.


Автор: nyinick
Дата сообщения: 26.03.2015 23:38
AlekXL

Цитата:
у тебя хрустальный шар? Если библиотека использует CreateFile,ReadFile Windows функции, то трудно ли портировать ее под линукс(андроид)?

Ну давай возьмём во внимание что dll-ки в проекте скорее всего close-source (Были бы исходники тогда вообще от dll можно избавиться и это не было бы проблемой). А если либа без сыра то мне интересно посмотреть как банальные используемые CreateFile,ReadFile в закрытой либо ты будешь эмулировать под Android ) полноценный wine под андроидом ещё не скоро изобретут.
Автор: AlekXL
Дата сообщения: 27.03.2015 00:00
NeoAnomaly

Цитата:
AlekXL зачем спрашивал тогда?

право же, не от всех стоит ждать ответа.

Eternal_Shield

Цитата:
Вот это:
bs:=[199];
bt:=NextElementFrom(bs,200);
Какой должен быть результат? Не понять

-1.
я немного исправил код в сообщении выше.

nyinick

Цитата:
Ну давай возьмём во внимание что dll-ки в проекте скорее всего close-source (Были бы исходники тогда вообще от dll можно избавиться и это не было бы проблемой).

не обязательно . Много хороших либ под LGPL: 7za , Seman, и туча других...
И не всегда нужно исбавляться. Иногда нужно -- расшарить.

Delphi профессионал вообще станет использовать нестандартные либы без исходников с великой неохотой.



Цитата:
А если либа без сыра то мне интересно посмотреть как банальные используемые CreateFile,ReadFile в закрытой либо ты будешь эмулировать под Android

если либа "без сыра", и у нее уникальный функционал, то вопрос о портировании не ставился бы скорей всего.


Цитата:
полноценный wine под андроидом ещё не скоро изобретут.
изобретут. Да и не нужен полноценный.
Автор: NeoAnomaly
Дата сообщения: 27.03.2015 09:52

Цитата:
право же, не от всех стоит ждать ответа.

AlekXL скорее всего ты прав. Но как бы там ни было, на мой взгляд, стоит накакать в руки тому человеку, который сунет такой код не в лабораторную, а в реальное приложение над которым работает не он один
Автор: AlekXL
Дата сообщения: 27.03.2015 10:36
NeoAnomaly


Цитата:
стоит накакать в руки тому человеку, который сунет такой код не в лабораторную, а в реальное приложение над которым работает не он один

я не любитель наибольшего общего делителя.
upd:
поправил алгоритм еще раз. Надеюсь, а этот раз правильно.
Автор: dix75
Дата сообщения: 27.03.2015 15:45
Добрый день!

А как можно в output panel выводить только мои сообщения без логов самой среды.
А то все вместе не видно где мои а где среды.
Вообще их можно разделить?
Автор: SuPriTo
Дата сообщения: 27.03.2015 16:18

Цитата:
Вообще их можно разделить?

Нет нельзя

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129

Предыдущая тема: Отмена встречи в Outlook из Excel VBA


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.