![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Просмотр и восстановление "удаленных" записей в DBF таблицах [D7, dBase, FoxPro]
АМБ © (2005-07-18 11:15:00)Как организовать просмотр помеченных на удаление записей в DBF таблице? Т.е. сначала, записи обрабатываются tblDBF1.Delete; и становятся невидимы в DBGrid-е. Как сделать их видимыми, да еще и другим цветом, или как-то еще их выделить, а затем, выбрав какую-нибудь запись - восстановить ее, т.е. снять пометку на удаление.
ANB (2005-07-21 14:57:00) [41]
> Anatoly Podgoretsky © (21.07.05 14:52) [38]
- дык я не против. Я ж написал ИМХО. Может ему легче будет в моем коде разобраться. Кстати, я отправил, а спасибо нету . . .
Anatoly Podgoretsky (2005-07-21 14:52:00) [42]ANB © (21.07.05 12:50) [31]
Нафиг, функция из БДЕ нормально работает.
ANB (2005-07-21 14:34:00) [43]А коли имеем, номер записи вполне можно оттуда выдернуть.
ANB (2005-07-21 14:33:00) [44]
> sniknik © (21.07.05 14:14) [34]
- да там всего 18 Кб. А в обработчике раскраски разве мы не имеем доступа к полям строки, которую красим ?
АМБ (2005-07-21 14:16:00) [45]
> ANB
Жду с нетерпением...:о)
sniknik (2005-07-21 14:14:00) [46]> По исходникам разберешься
терзают меня смутные сомнения. ;о)) человек с выходным параметром единствнной функции в 2 строчки разобратся не может. а ты ему исходники... на сколько строк? ;)
к тому же там тоже вылезет проблема связи записи в TTable с записью в файле. просто уметь читать не самое главное.
ANB (2005-07-21 13:56:00) [47]Могу переслать модуль. По исходникам разберешься и сделаешь свой вариант. Модуль умеет читать записи.
АМБ (2005-07-21 13:49:00) [48]
> ANB
Да... Теоретически выглядит все понятно. Но как считывать 1-й байт записи? Подскажите...
ANB (2005-07-21 12:50:00) [49]Самый тупорылый, но самый надежный способ - читать запись напрямую из файла. Если в первой байте записи *, то она удалена, если пробел, то нет. ИМХО.
sniknik (2005-07-21 12:46:00) [50]> А у меня функция DELETE(tblDBF) всегда True?!?!?!?
прочитай [27] внимательно (похоже правдв ;), и смени событие.
АМБ (2005-07-21 12:14:00) [51]А у меня функция DELETE(tblDBF) всегда True?!?!?!? При прохождении Debug-ером.
Хотя в таблице есть и удаленные и не удаленные записи.
sniknik (2005-07-21 11:50:00) [52]> в каком случае функция DELETE(tblDBF) выдают True
если запись удалена.
sniknik (2005-07-21 11:47:00) [53]ну код тут явно бракованный... ;о)) но у меня сомнения в том что данный подход вообще работоспособен, даже если его написать правильно (с else и вообще... ;о)).
дело в том, что отрисовка работает через даталинк (данные получает для нее), а она использует ненавигационные методы работы с таблицей, т.е. для получения данных записи делается не Next, а "Внутренний указатель" + 1; ну чтото вроде этого. неохота "углублятся" в тему.
вот. и если это так то BDE будет не в курсе всех этих дел, что там "навернула" его обертка (TTable), рискуем получать неверные данные, и как следствие "неопределенно пятнистый грид".
ну вот например, что будет возвращено при BOF = true? реально указатель "за гридом" на "до первой записи" а в гриде в это время рисуется первая строка (нет строки BOF)...
ну вот, правильнее определять удалена запись или нет в событии где реально определена текущая запись (и в BDE и TTable одна и та же). например в onCalcFields... там вычисляемому полю присваивать значение, ну "Удалено" к примеру, а в отрисовке уже для условия использовать его (если уж действительно необходимо выделять цветом).
p.s. сугубо имхо естественно. BDE это не мой "конек". поэтому и пояснение хромает.. не, оно хорошее. только хромает. ;о)) (© винни пух)
АМБ (2005-07-21 11:24:00) [54]Хорошо:::(((. Можете мне сказать Anatoly Podgoretsky, в каком случае функция DELETE(tblDBF) выдают True, а в каком - False?
Anatoly Podgoretsky (2005-07-21 10:49:00) [55]А что не работает, я глубоко анализировать твой код не буду, поскольку ты сам не приложил никаких усилий для обрисовки проблемы не работоспособности. Могу скажать у тебя отсутсвует блок ELSE
АМБ (2005-07-21 10:26:00) [56]Уважаемый, Anatoly Podgoretsky (или кто-нибудь). Ну подскажите, пожалуйста. Почему не работает, как надо, следующий код:
procedure TfrmMain.dbgDBFDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DELETED(tblDBF) then
begin
TDBGrid(Sender).Canvas.Brush.Color := $00ff00;
TDBGrid(Sender).Canvas.Font.Color := $0000ff;
TDBGrid(Sender).Canvas.FillRect(Rect);
TDBGrid(Sender).Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.Text);
IF gdSelected IN State Then
Begin
TDBGrid(Sender).Canvas.Brush.Color:= clHighLight;
TDBGrid(Sender).Canvas.Font.Color := clHighLightText;
End;
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;
function DELETED(Table:TTable): Boolean;
var
Prop : RECProps;
begin
dbiGetRecord(Table.Handle, dbiNoLock, nil, @Prop);
Result := Prop.bDeleteFlag;
END;
Напоминаю. Необходимо, чтобы в DBGrid-e удаленные записи были выделены цветом. Но сейчас цветом выделяются все записи. Не зависимо от того включен режим показа удаленных записей или нет.
Извиняюсь по поводу моей "несообразительности". :о((((
Anatoly Podgoretsky (2005-07-20 16:26:00) [57]Перебирать не надо, это делает dbgDBFDrawColumnCell, а результат используй в IF
АМБ (2005-07-20 14:50:00) [58]Уважаемый,
> Anatoly Podgoretsky
Подскажите пожалуйста, Ваша функция она показывает свойство bDeleteFlag текущей записи? Т.е. можно перебирать записи и у каждой проверять это свойство и реагировать не это. Или Ваша функция показывает что в таблице есть записи, помеченные на удаление. Но мои пробы показали, что Ваша функция показывает True, даже после физического удаления записей. Так как с ней можно работать?
Скажите пожалуйста.
Anatoly Podgoretsky (2005-07-19 19:37:00) [59]Результат функции BOOLEAN
АМБ (2005-07-19 15:03:00) [60]Даже не знаю, что и сказать... Я конечно, извиняю. Но в хелп я и лазил и смотрел, анализировал и пробовал, но не получилось. Потому и обратился за помощью. Может кто знает? Из тех, кто практически уже проходил этот вопрос.