Страница 1 из 1

Маркеры + таблицы в памяти

Добавлено: 19 янв 2005, 06:47
Serges
Уважаемые коллеги, правильно ли я понимаю, что маркеры не работают на временных таблицах (созданных по Table struct)?
Из "Опыта" взял пример по маркерам, скомпилировал - все отлично работает. Подставляю вместо таблицы x$Files временную, заполняю ее в CmInit значениями из x$Files - не работает. В броуз выкидывает, по записям ходит, однако в маркер ничего не добавляет.

Re: Маркеры + таблицы в памяти

Добавлено: 19 янв 2005, 08:07
Goblin
Совершенно неправильно...
Работают без проблем ...

Re: „M„p„‚„{„u„‚„Ќ + „„„p„q„|„y„€„Ќ „r „Ѓ„p„}„‘„„„y

Добавлено: 19 янв 2005, 10:29
Serges
„^„„„Ђ „‡„Ђ„‚„Ђ„Љ„Ђ, „‰„„„Ђ „q„u„x „Ѓ„‚„Ђ„q„|„u„} :)
„P„‚„y„r„Ђ„w„… „ѓ„r„Ђ„z „y„ѓ„‡„Ђ„t„~„y„{ - „t„|„‘ „r„Ђ„x„}„Ђ„w„~„Ќ„‡ „{„Ђ„}„}„u„~„„„p„‚„y„u„r. „N„p cmMarkUnMark „‘ „Ѓ„Ђ„r„u„ѓ„y„| „ѓ„Ђ„Ђ„q„‹„u„~„y„u „Ђ „{„Ђ„|„y„‰„u„ѓ„„„r„u „Џ„|„u„}„u„~„„„Ђ„r „r „}„p„‚„{„u„‚„u „t„|„‘ „Ѓ„‚„Ђ„r„u„‚„{„y.

////// „I„~„{„|„…„t „ѓ „{„Ђ„~„ѓ„„„p„~„„„p„}„y:

const

sci178InsPM = 6959;
cmMarkUnMark = 2243;
cmSelectAll = 2244;
cmUnSelectAll = 2245;
cmInvertAll = 2247;

End;

/////// „R„p„} „y„~„„„u„‚„†„u„z„ѓ:

Interface Dict '„S„p„q„|„y„€„Ќ „ѓ„y„ѓ„„„u„}„Ќ'
(,,sci178InsPM) EscClose, Cyan;
show at ( 3, 1, 76, 26);

table struct tmp_db
(
nrec : Comp,
code : String,
name : String,
title: String
)
with index
(
tmp_db01 = nrec(unique,surrogate)
);

create view AllDictTables
var
Markers : LongInt;
FieldMarkers : LongInt;
IndexNo : LongInt;
(MarkerStr)
As Select
if (SearchMarker(Markers, tmp_db.code, IndexNo) = True, 'Ѓг', ' '),

* from tmp_db;

Panel pnTablesList;
Table tmp_db;
Browse bwTableList;
Fields
MarkerStr '' :[1], Skip;
tmp_db.code '„K„Ђ„t' : Protect, {Font = {Color = if(MarkerStr = 'Ѓг', 2, 0)}};
tmp_db.Name '„I„}„‘ „„„p„q„|„y„€„Ќ' : Protect, {Font = {Color = if(MarkerStr = 'Ѓг', 2, 0)}};
tmp_db.Title '„H„p„s„|„p„r„y„u „„„p„q„|„y„€„Ќ' : Protect, {Font = {Color = if(MarkerStr = 'Ѓг', 2, 0)}};
end;

HandleEvent
cmMarkUnMark : begin
InvertMarker(Markers, tmp_db.code);
if ((GetNext tmp_db) = tsOk) {};
RescanPanel(tntmp_db);
Message (GetMarkerCount(Markers));
end;
cmSelectAll : begin
StartNewVisual( vtRotateVisual, vfTimer, '„P„Ђ„}„u„‰„p„ђ „r„ѓ„u', 1);
PushPos(tntmp_db);
if ((Modifier GetFirst tmp_db) = tsOk)
begin
do
begin
InsertMarker(Markers, tmp_db.code);
NextVisual;
end;
while (Modifier GetNext tmp_db = tsOk)
end;
PopPos(tntmp_db);
StopVisual('', 0);
RescanPanel(tntmp_db);
end;
cmInvertAll : begin
StartNewVisual( vtRotateVisual, vfTimer, '„I„~„r„u„‚„„„y„‚„…„ђ „ѓ„Ѓ„y„ѓ„Ђ„{', 1);
PushPos(tntmp_db);
if ((Modifier GetFirst tmp_db) = tsOk)
begin
do
begin
InvertMarker(Markers, tmp_db.code);
NextVisual;
end;
while (Modifier GetNext tmp_db = tsOk)
end;
PopPos(tntmp_db);
StopVisual( '', 0);
RescanPanel(tntmp_db);
end;
cmUnSelectAll: begin
ClearMarker(Markers);
RescanPanel(tntmp_db);
end;
end;
end; // panel


HandleEvent
cmInit : begin
Markers:=InitMarker('ViewDictMarkers', 2, 1000, 100);
FieldMarkers:=InitMarker('', 2, 20, 20);
StartNewVisual( vtRotateVisual, vfTimer, '„P„Ђ„t„s„Ђ„„„Ђ„r„{„p „ѓ„Ѓ„y„ѓ„{„p...', 1);
_loop x$Files
{
tmp_db.code := x$Files.xf$Code;
tmp_db.name := x$Files.xf$Name;
tmp_db.title := x$Files.xf$Title;
insert current tmp_db;
}
GetFirst tmp_db;
StopVisual('', 0);
end;
cmDone : begin
DoneMarker(Markers, 'ViewDictMarkers');
DoneMarker(FieldMarkers, '');
end;
end;
end.

Re: Маркеры + таблицы в памяти

Добавлено: 19 янв 2005, 10:34
Serges
Упс, кодировка подвела.
Размещаю свой исходник для возможных комментариев.
На cmMarkUnMark я повесил сообщение о количестве элементов в маркере - для проверки.

Re: Маркеры + таблицы в памяти

Добавлено: 19 янв 2005, 13:31
Goblin
Код таблицы сделай типа word и будет тебе счастье :)

Объявленный текущий тип String для этого поля будет иметь размер 255 байт, а в маркере будет храниться только 2 байта из них (если вообще будет, не знаю как обрабатывается несовпадение размеров элемента маркера со вставляемым в него значением, вполне может быть что никак, просто отпинывается подобное и ничего не вставляется) и, соответсвенно, ни одного из имеющихся значений в нем найдено не будет ...

Передупреждений разве на присваивание не выдавалось о преобразовании к строке ?

Re: Маркеры + таблицы в памяти

Добавлено: 19 янв 2005, 19:53
edward_K
а для переменной comp нужно писать
InitMarker('ViewDictMarkers', 8, 1000, 100);
при этом желательно DSK подчистить

Re: Маркеры + таблицы в памяти

Добавлено: 20 янв 2005, 04:35
Serges
Блин, слона-то я и не увидел :)))

Передупреждений о преобразовании к строке не выдавалось, как ни странно.
Действительно, все замечательно работает, спасибо :)

Re: Маркеры + таблицы в памяти

Добавлено: 26 янв 2005, 10:53
Maverick
При работе с маркерами нужно помнить
а) строковые значения не рранятся в маркерах
б) тип маркера, а сл-но и его длина в байтах должна совпадать с типом (длиной в байтах) запихиваемого параметра