Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

Проблема с ListBox ом   Найти похожие ветки 

 
ProgRAMmer Dimonych   (2006-09-30 21:35) [0]

Почему-то пропадает прямоугольник фокуса TListBox. Когда пытаюсь повторить те действия, которые выполняются до возникновения проблемы, в новом проекте, всё работает нормально. Действия такие: ListBox очищается через ListBox.Items.Clear, после чего идёт заполнение его Items"ами. Заполнение идёт из динамического массива, для которого получается длина (количество элементов), потом идёт

for i:=0 to Length(Massiv)-1 do
if Massiv[i].Text.Count>0 then
 ListBox.Items.Add(Massiv[i].Text[0]);
end;

где

Massiv=array of TMyRec;
MyRec=record
 Text:TStringList;
 . . . . . . . . . . .
end;

Если надо, могу выложить куски реального кода, а не урезанного, как здесь. Чё-то уже совсем притупился за день работы с Дельфой. :(


 
Desdechado ©   (2006-09-30 21:44) [1]

а причем тут фокус?


 
ProgRAMmer Dimonych   (2006-09-30 21:46) [2]

Фокус при том, что "прямоугольник фокуса". Т.е. после вышеперечисленных операций этот самый прямоугольник пропадает и щелчок левой кнопкой мыши по ListBox"у его не возвращает.


 
Джо ©   (2006-09-30 21:46) [3]

> Почему-то пропадает прямоугольник фокуса TListBox

Если имеется в виду не фокус, а рамка выделения текущего элемента, то HideSelection := False;


 
ProgRAMmer Dimonych   (2006-09-30 21:53) [4]

> [3]
А HideSelection - это где, у кого? Чё-то я ни в модулях, ни в справке не нахожу. :(


 
Джо ©   (2006-09-30 22:01) [5]

> [4] ProgRAMmer Dimonych   (30.09.06 21:53)
> > [3]
> А HideSelection - это где, у кого? Чё-то я ни в модулях,
> ни в справке не нахожу. :(

HideSelection это TEdit, т.е., я ошибся :-)


 
ProgRAMmer Dimonych   (2006-09-30 22:02) [6]

> [5]
Ничего, бывает...

2 All

Может всё-таки кусок кода выложить?


 
Percent   (2006-09-30 22:10) [7]

for i := 0 to Length(Massiv) - 1 do
 if (Massiv[i].Text.Count > 0) then
   ListBox.Items.Add(Massiv[i].Text[0]);

if (ListBox.Items.Count > 0) then
 ListBox.ItemIndex := 0;


Это?


 
ProgRAMmer Dimonych   (2006-09-30 22:19) [8]

> [7]
Не помогло :(


 
Kolan ©   (2006-09-30 22:23) [9]


>
> Может всё-таки кусок кода выложить?

Ну дык давай. Конференция резиновая :)


 
ProgRAMmer Dimonych   (2006-09-30 22:27) [10]

Да, ещё одно наблюдение.

Есть две процедуры: StartNew (урезает Massiv до длины 1 и его единственному нулевому элементу присваивает значение, обусловленное программой) и RefreshListContents (которая, собственно и была приведена; там идёт заполнение ListBox"а).

Кроме этого есть два обработчика событий.

procedure TMain.QClearClick(Sender: TObject);
{Пункт выпадающего меню Очистить список}
begin
if QuestList.Items.Count>0 then
begin
 StartNew;
 Changed:=True;
end
else
 StartNew;
RefreshListContents;
end;

procedure TMain.MTNewClick(Sender: TObject);
{Пункт главного меню Файл -> Новый}
var
Tmp:Integer;
begin
if Changed then
begin
 Tmp:=MessageBox(Handle,"Вы хотите сохранить изменения?","Изменения не сохранены!!!",35);
 if Tmp=2 then Exit;
 if Tmp=6 then MTSave.Click;
end;
StartNew;
RefreshListContents;
end;

Разница в том, что Файл -> Новый должен проверить значение Changed:Boolean и если оно True, то предложить сохраниться, а Очистить список просто очищает список. Но после Файл -> Новый subj"евый прямоугольник остаётся, а после Очистить список - исчезает.


 
default ©   (2006-09-30 22:28) [11]

ну накрайняк можно при потере фокуса листбоксом сохранять начало и конец выделенного текста, при получении фокуса восстанавливать выделение(если я правильно понял проблему)


 
ProgRAMmer Dimonych   (2006-09-30 22:58) [12]

> [11]
Хотелось бы формулировку поточнее...


 
default ©   (2006-09-30 23:09) [13]

ProgRAMmer Dimonych   (30.09.06 22:58) [12]
пардон, с другим контролом перепутал


 
ProgRAMmer Dimonych   (2006-09-30 23:12) [14]

По [10] кто-нибудь подскажите, плз.


 
guav ©   (2006-09-30 23:14) [15]

Style какой ?
Есть ли рисование на канве ?


 
ProgRAMmer Dimonych   (2006-09-30 23:16) [16]

> [15]

ListBox.Style=lbStandard

Художества отсутствуют...


 
guav ©   (2006-09-30 23:21) [17]

> По [10] кто-нибудь подскажите, плз.



> Tmp:=MessageBox(Handle,"Вы хотите сохранить изменения?",
> "Изменения не сохранены!!!",35);
> if Tmp=2 then Exit;
> if Tmp=6 then MTSave.Click;

ужасный код. программы с таким кодом ведут себя непредсказуемо.

надо что-то вроде
case MessageBox(Handle, "Вы хотите сохранить изменения?", "Изменения не сохранены!!!", MB_YESNOCANCEL or MB_ICONQUESTION) of
 IDCANCEL: Exit;
 IDNYES: MTSave.Click;
end;


 
ProgRAMmer Dimonych   (2006-09-30 23:23) [18]

> [17]
А в чём минус моего варианта записи алгоритма?


 
guav ©   (2006-09-30 23:32) [19]

Хотя бы в том что на чтение тривиального кода мне пришлось потратить пару минут.
И ещё, при выборе одного из нескольких вариантов case понятнее и оптимальнее чем if.

По теме, ошибка в другом месте, (возможно, затирание "чужой" памяти, если ошибка трудновоспроизводима).


 
ProgRAMmer Dimonych   (2006-09-30 23:38) [20]

> [19]
Т.е. с динамическим массивом?
Такое возможно, если массив имеет размерность 1, максимум 2, элемента?


 
guav ©   (2006-09-30 23:43) [21]

Changed - поле, переменная, свойство ? если  св-во - какие методы read и write
QuestList - это тот ListBox ? если добавить if QuestList.Items.Count>0 then ; в MTNewClick не добавится ли та же ошибка при MTNewClick ?
что делает StartNew ?


> Т.е. с динамическим массивом?

Не обязательно, но возможно и с ним.


> Такое возможно, если массив имеет размерность 1, максимум
> 2, элемента?

Да.

{$R+} или {$RANGECHECKS ON} или опция Range Checking на закладке Compiler позволяет избежать непредсказуемости при нарушениях диапазона.


 
ProgRAMmer Dimonych   (2006-09-30 23:53) [22]

> [21]
Changed - поле, объявленное в разделе private.

> если добавить if QuestList.Items.Count>0 then ; в MTNewClick
> не добавится ли та же ошибка при MTNewClick ?
> что делает StartNew ?

Собственно, if QuestList.Items.Count>0 then ; нужно только для того, чтобы менять значение Changed, если список не пуст (т.е. если очистка списка будет считаться изменением). Просто в StartNew значение Changed меняется.

procedure TMain.StartNew;
var
i,L:Integer;
begin
L:=Length(Test); {Длина массива}
for i:=0 to L-1 do
begin
 RemoveQuest(i); {Удаление элемента массива с освобождением памяти}
end;
SetLength(Test,0); {*}
FileName:=""; Changed:=False; {FileName - имя редактируемого файла}
QuestList.Items.Clear; QuestMemo.Lines.Clear; Vars.Items.Clear;
PC.ActivePageIndex:=0; {QuestMemo, QuestList,Vars,PC - контролы на форме}
HidePanel; {Процедура, которая прячет часть контролов}
end;

* - эта команда, как выяснилось при отладке, выполняется дважды с одинаковыми параметрами (один раз - в RemoveQuest, второй - в StartNew), но вряд ли это создаёт subj"евую проблему...


 
ProgRAMmer Dimonych   (2006-09-30 23:53) [23]

> [21]
Changed - поле, объявленное в разделе private.

> если добавить if QuestList.Items.Count>0 then ; в MTNewClick
> не добавится ли та же ошибка при MTNewClick ?
> что делает StartNew ?

Собственно, if QuestList.Items.Count>0 then ; нужно только для того, чтобы менять значение Changed, если список не пуст (т.е. если очистка списка будет считаться изменением). Просто в StartNew значение Changed меняется.

procedure TMain.StartNew;
var
i,L:Integer;
begin
L:=Length(Test); {Длина массива}
for i:=0 to L-1 do
begin
 RemoveQuest(i); {Удаление элемента массива с освобождением памяти}
end;
SetLength(Test,0); {*}
FileName:=""; Changed:=False; {FileName - имя редактируемого файла}
QuestList.Items.Clear; QuestMemo.Lines.Clear; Vars.Items.Clear;
PC.ActivePageIndex:=0; {QuestMemo, QuestList,Vars,PC - контролы на форме}
HidePanel; {Процедура, которая прячет часть контролов}
end;

* - эта команда, как выяснилось при отладке, выполняется дважды с одинаковыми параметрами (один раз - в RemoveQuest, второй - в StartNew), но вряд ли это создаёт subj"евую проблему...


 
guav ©   (2006-10-01 00:09) [24]

> for i:=0 to L-1 do
> begin
> RemoveQuest(i); {Удаление элемента массива с освобождением
> памяти}
> end;

или комментарий неверный или цикл должен быть таким: for i:=L-1 downto 0 do


> Собственно, if QuestList.Items.Count>0 then ; нужно только
> для того, чтобы менять значение Changed

я не о том. в  QuestList.Items.Count листбоксу посылается сообщение, может в этом причина различий в поведении приведенных методов.

Прямоугольник фокуса пропадает навсегда или до каких пор ?


 
ProgRAMmer Dimonych   (2006-10-01 00:30) [25]

> > for i:=0 to L-1 do
> > begin
> > RemoveQuest(i); {Удаление элемента массива с освобождением
>
> > памяти}
> > end;
>
> или комментарий неверный или цикл должен быть таким: for
> i:=L-1 downto 0 do
Вообще, RemoveQuest(i) удаляет любой элемент (остальные смещает), но в данном случае, действительно разумнее будет задать обратный порядок...

> Прямоугольник фокуса пропадает навсегда или до каких пор?

"Файл -> Новый" возвращает.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.05 c
15-1159277801
syte_ser78
2006-09-26 17:36
2006.10.15
доступ к сетевой папке


2-1159340524
Alex_C
2006-09-27 11:02
2006.10.15
Пытаюсь рисовать на канве RichEdit. Не получается.


2-1159611798
Piter
2006-09-30 14:23
2006.10.15
Delphi IO работает только с файлами до 2 Гб?


15-1158931825
stone
2006-09-22 17:30
2006.10.15
Премия за глупость


15-1159206509
KingLion
2006-09-25 21:48
2006.10.15
MS FrameWork 1.1 SDK





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский