Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#46: 2008-03-20 23:05:56 ЛС | профиль | цитата
nesco, вот я никак не пойму, что еще надо сказать, что бы доехало: у каждого узла иконок ДВЕ а не одна

#pas
Control.TVItemImage[idx] := первая_иконка;
Control.TVItemSelImg[idx] := вторая_иконка;
А у менюх, к примеру - три....
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#47: 2008-03-21 00:08:16 ЛС | профиль | цитата
Galkov писал(а):
что еще надо сказать, что бы доехало: у каждого узла иконок ДВЕ а не одна

И чего это ты умничаешь

Я прекрасно знаю, сколько их там, и что теперь
Раньше одну обоим присваивали, и ничего.

Кладов писал(а):
TVItemImage[ Node ] - основная пиктограмма для узла дерева, когда он не является
выделенным (для выделенного состояния используется другая пиктограмма, задаваемая
свойством TVItemSelImg). Используйте значение -1 для того, чтобы иметь возможность
задавать пиктограмму в обработчике сообщения TVN_GETDISPINFO. Для того, чтобы не
было пиктограммы вообще, следует использовать значение -2. При присваивании значения
данному свойству, то же самое значение одновременно присваивается и свойству
TVItemSelImg[ Node ] - пиктограмма для узла в его выделенном состоянии


Ты что, предлагаешь мутить ей отдельный индекс
А там еще и вот это есть

Кладов писал(а):
TVItemOverlay[ Node ] - надрисовка на основной пиктограмме. Значение 0 означает
отсутствие надрисовок, значения от 1 до 15 используют пиктограммы надрисовок из того
же списка изображений ImageListNormal, откуда берутся и основные пиктограммы (см.
свойство Overlay[ ] для списка пиктограмм);
TVItemStateImg[ Node ] - пиктограмма "состояния", которая берется из отдельно заданного
списка изображений ImageListState;


Надо же на чем-то остановиться.

------------ Дoбавленo:


Я, почти везде (ну в одном месте пропустил, каюсь ), присваивал один индекс на оба состояния. Ну никак не пойму, к чему это ты все
карма: 22

0
Ответов: 9906
Рейтинг: 351
#48: 2008-03-21 00:17:48 ЛС | профиль | цитата
nesco писал(а):
никак не пойму, к чему это ты все

Вот я и спрашиваю: что еще надо сказать, чтобы все-таки понял..

ПОЧЕМУ у пользователя нет возможности установить ДВЕ (три, четыре) разные
Блин, у меня уже текст кончился
------------ Дoбавленo:

И вот я интересуюсь еще: какое отношение имеет метод doLoadFileIcon к TreeView
Может я не досмотрел чего... Пальцем укажи, пожалуйста, на данные в элементе, которые использует/изменяет этот метод
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#49: 2008-03-21 00:23:59 ЛС | профиль | цитата
Galkov писал(а):
Блин, у меня уже текст кончился

Куда кончился

Galkov писал(а):
Вот я и спрашиваю: что еще надо сказать, чтобы все-таки понял..


Ты это как предложение мог кинуть, или как
А то пытаешься меня уличить в недопонимании происходящего, так тоже -- не есть хорошо.

------------ Дoбавленo:


Galkov писал(а):
doLoadFileIcon к TreeView

Нафиг он там не нужен, а потому перенес его оттуда в FileAttribute
Этот метод необходим для построения DirViewer'a, чтобы иметь возможность видеть связанные с файлом иконки.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#50: 2008-03-21 00:43:48 ЛС | профиль | цитата
Я пытаюсь уличить тебя в том, что сто раз уже сказано про то, что типов иконок "много", что возможность множественного задания появляется как раз после перехода "на индексирование", а смотришь коды - как будто ничего не говорилось...
И вот это как раз и есть плохо.
------------ Дoбавленo:

Ну-ка распоясни, откуда взялся тот самый ImageListState...
Кстати говоря, там кажется 16 state-ов, а не два...
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#51: 2008-03-21 00:44:52 ЛС | профиль | цитата
Galkov писал(а):
а смотришь коды - как будто ничего не говорилось...

Ну поэтапно надо делать, а не все сразу. Будет и многоиконность -- на следующем этапе, и я уже, приблизительно, знаю как...
А про TreeView -- я же писАл, что это -- бета версия, что-то придется убрать, что-то добавить (возможно).
карма: 22

0
Ответов: 9906
Рейтинг: 351
#52: 2008-03-21 00:48:39 ЛС | профиль | цитата
Ну и текстовое сравнение с "-1" - удручающее впечатление производит
------------ Дoбавленo:

Достали вы с поэтапностью....
Парсер должен был возвращать не текст, а несколько индексов
Если "поэтапно", то весь его переделывать надо.
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#53: 2008-03-21 00:55:20 ЛС | профиль | цитата
Galkov писал(а):
откуда взялся тот самый ImageListState...

Если nil, то берется системный, а так можно и свой замутить
Galkov писал(а):
Кстати говоря, там кажется 16 state-ов, а не два...

Не нашел информации, почему 16-ть, хотелось бы поподробнее знать эту информацию, если знаешь, то скажи где найти...
------------ Дoбавленo:

Galkov писал(а):
Парсер должен был возвращать не текст, а несколько индексов

Согласен. Я переделаю это все. Но с меню идеи, чем создать StrList для хранения индексов, у меня на ум ничего не пришло
карма: 22

0
Ответов: 9906
Рейтинг: 351
#54: 2008-03-21 01:10:11 ЛС | профиль | цитата
MSDN/TVITEM Structure писал(а):
A state image is displayed next to an item's icon to indicate an application-defined state. Specify the state image list by sending a TVM_SETIMAGELIST message. To set an item's state image, include the TVIS_STATEIMAGEMASK value in the stateMask member of the TVITEM structure. Bits 12 through 15 of the structure's state member specify the index in the state image list of the image to be drawn.


------------ Дoбавленo:

Думаю, что возвращать индексы из ParseIconIdx надо как var-переменные типа
procedure(var s:string; var i1:integer; var i2:integer; var i3:integer);
собственно, для таковой методом объекта быть не обязательно, может лежать где-нибудь в share...
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#55: 2008-03-22 00:15:22 ЛС | профиль | цитата
Ага с иконками состояния понятно, спасибо за инфу.

А почему все переменный типа integer, а, например, не одна переменная Array of integer, или какой-либо TIdxIcon с набором полей, сколько надо столько оттуда и вытащим переменных. Но это -- мысли вслух.

------------ Дoбавленo:


Ну Galkov, ну и задал же ты мне задачку про поддержку всех иконок. Парсер -- это самое просто, что можно было сделать. Столкнулся с глюками вообще в MSDN (мне так кажется, но может только в KOL'e). Хочу разобраться подробнее. А прикол в назначении значка оверлея.

Есть такая функция ImageList_SetOverlayImage, которая спользуется в KOL'e, для назначения значку признака надрисовки в ImageList'e
Вот ссылка на MSDN про эту функцию http://msdn2.microsoft.com/en-us/library/bb775227(VS.85).aspx
Вроде в KOL'e сделано правильно


procedure TImageList.SetOverlay(Idx: TImgLOVrlayIdx; const Value: Integer);
begin
if ImageList_SetOverlayImage( fHandle, Value, Idx shl 8 ) then
fOverlay[ Idx ] := Value;
end;
Те Idx смещается согласно описанию, но... -- нифига это не работает, функция всегда возвращает 0, те ошибку. Пока я не сделал вот так (образно говоря, в коде немного по-другому ( я не правил KOL, а запросил функцию минуя KOL), но смысл тот же), те убрал смещение.


procedure TImageList.SetOverlay(Idx: TImgLOVrlayIdx; const Value: Integer);
begin
if ImageList_SetOverlayImage( fHandle, Value, Idx ) then
fOverlay[ Idx ] := Value;
end;
Эта функция нифига не заработала. А с исправлениями работает прекрасно, и значок из списка отрисовывает как надо, вот и пойми...

Второе: Со списком состояния вообще бардак, только в режиме CheckBoxes работает и переключает по кругу все иконки, которые есть, начиная с той которую укажешь в TVItemStateImg. И на кой черт он тогда такой нужен, кто такой режим вообще применяет
Я понимаю использовать дополнительный ImageList для замены системных иконок состояния, но вот присваивать начальную... я даже не знаю, надо ли

Я зарезервирую четыре индекса в парсере, но вот будут ли они все использованы -- это вопрос


карма: 22

0
Ответов: 9906
Рейтинг: 351
#56: 2008-03-22 03:07:22 ЛС | профиль | цитата
Мне кажется, надо отрабатывать "пустые" случаи в GetTok

Может быть так...

type TIconsIdx = array of integer;

procedure ParseIconsIdx(var s:string; IconsIdx:TIconsIdx);
const _dlm = ',';
var sint, parse:string;
i:integer;
begin
for i:=0 to high(IconsIdx) do IconsIdx[i] := I_SKIP;
if (s = '') or (s[1] <> '<') or (Pos('>',s)=0) then exit;
Delete(s,1,1);
parse := GetTok(s,'>') + _dlm;
Replace(parse, ' ' ,'');
i:=0; repeat
sint := gettok(parse, _dlm);
if sint <> '' then IconsIdx[i] := str2int(sint);
inc(i);
until parse = '';
end;


карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#57: 2008-03-22 03:32:02 ЛС | профиль | цитата
Galkov писал(а):
for i:=0 to high(IconsIdx) do IconsIdx[i] := I_SKIP;

Я же не зря два метода придумал.
Первый был для полной инициалиации массива, а второй не менял установки в массиве. А теперь получается, что массив всегда заполняется I_SKIP'ом. Может лучше два оставить. Иначе, моя задумка по RealTime управлению индексами к черту летит, а другая на ум не лезет. Можно, правда, третий параметр передать типа init:boolean=false, скорее всего на этом и надо остановиться.

------------ Дoбавленo:


Galkov писал(а):
TIconsIdx = array of integer
Нежелательно массив делать integer, лучше smallint, иначе в TrreView'e -2 превращается в 65534 при чтении, его что, потом обратно переводить из integer в smallint, да и пунктов столько, все равно не поддерживается. Тут уж не я придумал такое.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#58: 2008-03-22 03:43:46 ЛС | профиль | цитата
nesco писал(а):
Может лучше два оставить

Может и лучше...
Это не самая основная идея была - всего я конечно не вижу же.
Основные:
а) может лучше массив динамический
б) хорошо бы учесть, что при размерности три, к примеру, может быть написан в тексте только один индекс
------------ Дoбавленo:

в 32-х битном (защищенном - иначе) режиме использование 2-х байтных величин только съедает лишние коды и отрицательно сказывается на эффективности, по сравнении с 4-х байтным

убери вообще ВЕЗДЕ smallint - глупости это.

хотя превращение -2 в 65534 - это неграмотно написанные коды: покажешь где превращается, покажу где глупость

карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#59: 2008-03-22 03:59:39 ЛС | профиль | цитата
Galkov, ну, например вот здесь, в этой связке



//[function TControl.TVGetItemImage]
function TControl.TVGetItemImage(Item: THandle; const Index: Integer): Integer;
var TVI: TTVItem;
begin
TVI.mask := TVIF_HANDLE or Loword( Index );
TVI.hItem := Item;
if Hiword( Index ) <> 0 then
begin
TVI.mask := TVIF_STATE or TVIF_HANDLE;
TVI.stateMask := Loword( Index );
end;
Result := -1;
if Perform( TVM_GETITEM, 0, Integer( @TVI ) ) <> 0 then
begin
if Hiword( Index ) <> 0 then
Result := (TVI.state shr Hiword( Index )) and $F
else
if Loword( Index ) = TVIF_IMAGE then
Result := TVI.iImage
else
Result := TVI.iSelectedImage;
end;
end;

//[procedure TControl.TVSetItemImage]
procedure TControl.TVSetItemImage(Item: THandle; const Index: Integer;
const Value: Integer);
var TVI: TTVItem;
begin
TVI.mask := TVIF_HANDLE or Loword( Index );
TVI.hItem := Item;
TVI.iImage := Value;
TVI.iSelectedImage := Value;
if Hiword( Index ) <> 0 then
begin
TVI.mask := TVIF_STATE or TVIF_HANDLE;
TVI.stateMask := Loword( Index );
TVI.state := Value shl Hiword( Index );
end;
Perform( TVM_SETITEM, 0, Integer( @TVI ) );
end;

Наверное, все же, это вот с эти связано

Кладов писал(а):
Кроме того, существует системное ограничение на максимальное число узлов в дереве (65536)

------------ Дoбавленo:

Galkov писал(а):
б) хорошо бы учесть, что при размерности три, к примеру, может быть написан в тексте только один индекс
А вот эту задумку на пальцах пожалуйста... Ну подробнее -- это точно.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#60: 2008-03-22 04:05:07 ЛС | профиль | цитата
nesco писал(а):
ну, например вот здесь, в этой связке

не рассказывай сказки, а показывай пальцем
Нет тут криминала, и не может быть - Кладов тоже понимает что smallint это фуфло, и везде здесь юзает integer
------------ Дoбавленo:

nesco писал(а):
Ну подробнее -- это точно

Я тебе с самого начала пример желаемой записи для дерева приводил, или нет
Ну так посмотри: http://hiasm.com/forum.html?q=3&p=80914#p80914
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)