Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.02.2014, 10:23
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию Дерево TTreeView при смене пользователя

Доброго всем времени суток!
Столкнулся с такой проблемой. Если дерево TTreeView невидимо, после выполнения смены пользователя Windows (не завершение сеанса) к элементам дерева невозможно обратиться программно.
Вот весь код тестового приложения:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    cbVisible: TCheckBox;
    Button1: TButton;
    procedure cbVisibleClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 i:Integer;
 S:String;
begin
 for i := 0 to TreeView1.Items.Count-1 do
   S:=S+#13+TreeView1.Items[i].Text;
 ShowMessage(S);
end;

procedure TForm1.cbVisibleClick(Sender: TObject);
begin
TreeView1.Visible:=cbVisible.Checked;
end;

end.
Узлы дерева добавлены в визуале.
Делаю так:
1. дерево невидимым (чекбокс)
2. смена пользователя и можно, не меняя, вернуться в эту же учетку
3. кнопка - пустое сообщение

Если сделать то же самое с видимым деревом, то все нормально.
Возможно, как-то Windows память пытается оптимизировать? Не знаю, подскажите, пожалуйста, что м.б.
Спасибо!
TreeTest.rar
Ответить с цитированием
  #2  
Старый 06.02.2014, 11:59
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Попробуйте в OnShow формы выполнить treeview1.realign или refresh
Ответить с цитированием
  #3  
Старый 06.02.2014, 12:40
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Попробуйте в OnShow формы выполнить treeview1.realign или refresh
Нет, не помогает.
На скринах: 1 - После смены пользователя с невидимым
2 - После включения Visible

11111.png
22222.png
Ответить с цитированием
  #4  
Старый 06.02.2014, 13:53
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Это был плохой совет.

А если поставить птису в чекбокс при входе "невидимкой", инфа восстанавливается?

Последний раз редактировалось Alegun, 06.02.2014 в 14:29.
Ответить с цитированием
  #5  
Старый 06.02.2014, 15:19
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Это был плохой совет.

А если поставить птису в чекбокс при входе "невидимкой", инфа восстанавливается?
Да, как становится видимой, так все нормально
Ответить с цитированием
  #6  
Старый 06.02.2014, 15:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Может тогда надо repaint (или просто банальный setfocus) в onshow делать, хотя у невидимого компонента это вероятно вызовет и ошибку
Ответить с цитированием
  #7  
Старый 06.02.2014, 15:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от BProg
Доброго всем времени суток!
Столкнулся с такой проблемой. Если дерево TTreeView невидимо, после выполнения смены пользователя Windows (не завершение сеанса) к элементам дерева невозможно обратиться программно.
К сожалению у стандартных компонентов TTreeView, TListView (и некоторых других) такой глюк имеется. Причём не обязательно делать смену пользователя - достаточно переместить (программно) эти компоненты на невидимый контейнер (например панель) или даже просто в никуда (т.е. Parent:=nil).

Как вариант могу предложить попробовать привыкнуть к компоненту Virtual Treeview - я с ним уже долго работаю, но так до конца не смог привыкнуть, хотя некоторые говорят что он наоборот удобнее чем стандартный TTreeView.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
BProg (07.02.2014)
  #8  
Старый 07.02.2014, 09:31
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Может тогда надо repaint (или просто банальный setfocus) в onshow делать, хотя у невидимого компонента это вероятно вызовет и ошибку
Нет, это не помогает
Ответить с цитированием
  #9  
Старый 07.02.2014, 09:40
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
К сожалению у стандартных компонентов TTreeView, TListView (и некоторых других) такой глюк имеется. Причём не обязательно делать смену пользователя - достаточно переместить (программно) эти компоненты на невидимый контейнер (например панель) или даже просто в никуда (т.е. Parent:=nil).

Как вариант могу предложить попробовать привыкнуть к компоненту Virtual Treeview - я с ним уже долго работаю, но так до конца не смог привыкнуть, хотя некоторые говорят что он наоборот удобнее чем стандартный TTreeView.
Спасибо. Интересно, и давно такой глюк тянется, с каких версий, на 7-ке он тоже есть? Было где-нибудь обсуждение этой темы?
Нет, сторонние не могу скорее всего использовать. Наверное придется переписать на что-то другое.
Ответить с цитированием
  #10  
Старый 07.02.2014, 10:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от BProg
Спасибо. Интересно, и давно такой глюк тянется, с каких версий, на 7-ке он тоже есть? Было где-нибудь обсуждение этой темы?
В Windows7 такой глюк тоже имеется - проверил. Похоже Microsoft не спешит его исправлять, а возможно даже и не будут, так сказать в целях совместимости. Хотя ещё нужно конечно проверить на Windows8. Этот глюк я обнаружил при написании одного модуля (показывающего содержимое любой панели в виде отдельного окна, а потом опять прячущего его в панель на форме). Обсуждений в интернете по этому поводу не видел.

UPD
Я же помню что как-то обходил этот глюк. Только что просмотрел свои старые проекты и в одном из них я использовал метод HandleNeeded, после которого все элементы опять становились доступными.

Последний раз редактировалось poli-smen, 07.02.2014 в 10:57.
Ответить с цитированием
  #11  
Старый 07.02.2014, 11:20
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

замени:
Код:
 for i := 0 to TreeView1.Items.Count-1 do
на:
Код:
 for i := 0 to TreeView_GetCount(TreeView1.Handle)-1 do
в uses добавь CommCtrl.
либо на:
Код:
  TreeView1.HandleNeeded;
 for i := 0 to TreeView1.Items.Count-1 do

при вызове "Сменить пользователя" и вход им же (всего один пользователь на компьютере) эффекта не наблюдается. но код:
Код:
  TreeView1.Parent:=nil;
  TreeView1.Parent:=Self;
вызывает эффект. приведенные выше изменения решили проблему. косяк в VCL.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
BProg (11.02.2014)
  #12  
Старый 11.02.2014, 08:48
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
вызывает эффект. приведенные выше изменения решили проблему. косяк в VCL.
Да, действительно, работает. А не знаете как давно в VCL такой глюк и что происходит с ним при той же смене пользователя?
Ответить с цитированием
  #13  
Старый 11.02.2014, 09:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

впервые о такой бяке узнал из этой темы как уже писал выше, при смене пользователя у меня такого не возникает, а вот при удалении и восстановлении родителя проблема вылезла. можно покопаться в исходниках дерева и поискать проблему. будет время...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 13.02.2014, 22:47
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Всем большое спасибо за помощь!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter