Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ListBox с подсказкой


ТехникПТО ©   (2005-01-30 14:27:00) 

Нужно сделать подсказку в ListBox'е... т.е. при навидении какого либо элемента высвечивалась дополнительная информация...
скажем описание или коментарий.. в Memo


Diabolik   (2005-02-01 05:09:00) [1]

2ТехникПТО - как обещал даю код


// определяем тип TBSelected как record (запись)
type
TBSelected = record
  Check : Boolean;      // здесь информация по checkbox из ListView
  Select1: String[50];  // Текст колонки №1
  Select2: String[10];  // Текст колонки №2
  Select3: String[255]; // Текст колонки №3
  Select4: String[150]; // Текст колонки №4
end;
// количество колонок необходимых к записи и длинну можно указать свою

// объявляем переменные
var F: file of TBSelected;
   ListItem: TListItem;
   Records: array[0..20] of TBSelected; // количество записей в файле
   BaseColumn: TListColumn;

// добавление колонок в ListView
procedure TSB.FormCreate(Sender: TObject);
var INI: TIniFile;
begin
INI := TIniFile.Create(ExtractFilePath(ParamStr(0))+'Base.ini');
BaseColumn := BaseList.Columns.Add;
BaseColumn.Caption := INI.ReadString('BaseListColumns','First','Имя файла');
BaseColumn.Width   := INI.ReadInteger('BaseListColumns', 'First.width', 92);
BaseColumn := BaseList.Columns.Add;
BaseColumn.Caption := INI.ReadString('BaseListColumns','Second','Открывать при старте');
BaseColumn.Width   := INI.ReadInteger('BaseListColumns', 'Second.width', 127);
BaseColumn.Alignment := taCenter;
BaseColumn := BaseList.Columns.Add;
BaseColumn.Caption := INI.ReadString('BaseListColumns','Therd','Описание');
INI.Free;
end;

// процедура чтения из файла
procedure TSB.LoadDBList(Sender: TObject);
var Rec: TBSelected;
begin
 AssignFile(F, ExtractFilePath(ParamStr(0))+'BaseList.dat');
 Reset(F);
 try
   while not Eof(f) do begin
     Read(F, Rec);
       with BaseList do begin
           ListItem := Items.Add;
           ListItem.Checked := Rec.Check;
           ListItem.Caption := Rec.Select1;
           ListItem.SubItems.Add(Rec.Select2);
           ListItem.SubItems.Add(Rec.Select3);
           ListItem.SubItems.Add(Rec.Select4);
       end;
   end;
 finally
   CloseFile(F);
 end;
end;

// процедура записи в файл
procedure TSB.SaveDBList(Sender: TObject);
var I: Integer;
begin
 AssignFile(F, ExtractFilePath(ParamStr(0))+'BaseList.dat');
 Rewrite(F);
 try
   with BaseList do
     for I:= 0 to Items.Count-1 do
       begin
         Records[I].Check   := Items.Item[I].Checked;
         Records[I].Select1 := Items.Item[I].Caption;
         Records[I].Select2 := Items.Item[I].SubItems.Strings[0];
         Records[I].Select3 := Items.Item[I].SubItems.Strings[1];
         Records[I].Select4 := Items.Item[I].SubItems.Strings[2];
         Write(F, Records[I]);
       end;
 finally
   CloseFile(F);
 end;
end;

// добавление записи из файла в listview
procedure TSB.FormActivate(Sender: TObject);
begin
BTAdd.Glyph.LoadFromFile(ExtractFilePath(ParamStr(0))+'images\button\sb - add.bmp');
BTDelete.Glyph.LoadFromFile(ExtractFilePath(ParamStr(0))+'images\button\sb - delete.bmp');
BTUp.Glyph.LoadFromFile(ExtractFilePath(ParamStr(0))+'images\button\sb - up.bmp');
BTDown.Glyph.LoadFromFile(ExtractFilePath(ParamStr(0))+'images\button\sb - down.bmp');
BTOk.Glyph.LoadFromFile(ExtractFilePath(ParamStr(0))+'images\button\sb - ok.bmp');
BTCancel.Glyph.LoadFromFile(ExtractFilePath(ParamStr(0))+'images\button\sb - cancel.bmp');
BTAdd.Margin    := 10;
BTDelete.Margin := 10;
BTUp.Margin     := 10;
BTDown.Margin   := 10;
BTOk.Margin     := 16;
BTCancel.Margin := 3;
LoadDBList(Self);
BaseList.SetFocus;
if BaseList.Items.Count <> 0
then begin
       BaseList.Selected := BaseList.Items.Item[0];
       BaseList.ItemFocused := BaseList.Selected;
       BaseList.Selected.Selected := true;
     end
else exit;              
end;

// вывод данных из невидимой колонки в строку Edit
procedure TSB.BaseListSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
begin
 If Selected
 then EditPath.Text := BaseList.Selected.SubItems.Strings[2]
 else EditPath.Text := '';
end;


Думаю смысл понятен??


ТехникПТО   (2005-01-31 10:38:00) [2]


> А удалять за собой мусор...Не?

лениво :) хотя можно и подумать :) хм... элементарно :)


Neznaika   (2005-01-31 10:29:00) [3]

>>ТехникПТО ©   (31.01.05 08:50) [12]
>>но при изменении итема создаеться еще один текстовый фалй уже с новым именем а старый остаеться :( мусор :((

А удалять за собой мусор...Не?


ТехникПТО   (2005-01-31 08:50:00) [4]


> Я то же делал что-то подобное. Только для этого использовал
> не ListBox а ListView. Все данные хранились в типизированном
> *.dat файле. Было три колонки и четвертая скрытая (не отображалась).
> При выборе какого либо пункта по ListView данные в Edit
> отображались из 4 колонки. Просто и со вкусом. Если нужно
> поищу исходный текст...

Поищи плиз.. это будет получше чем я сделал :)
Я просто создаю файл txt с именем Itema :) и соответсвенно при наведении загружаю этот файл... но при изменении итема создаеться еще один текстовый фалй уже с новым именем а старый остаеться :( мусор :((


diabolik   (2005-01-31 07:33:00) [5]


> ТехникПТО ©   (30.01.05 14:27)  
> Нужно сделать подсказку в ListBox'е... т.е. при навидении
> какого либо элемента высвечивалась дополнительная информация...
> скажем описание или коментарий.. в Memo


> Baddelay   (31.01.05 02:15) [10]
> Когда-то я делал, что то подобное, весь текст у меня хранился
> в скрытом Мемо, и просто при выделении итема в Lb у меня
> считывало инфу с Мемо с таким же индексом, и вставляла его
> в Label(нужно WordWrap true). Только етот способ работает
> если в lb итемы неизменяются по ходу выполнения проги..


Я то же делал что-то подобное. Только для этого использовал не ListBox а ListView. Все данные хранились в типизированном *.dat файле. Было три колонки и четвертая скрытая (не отображалась). При выборе какого либо пункта по ListView данные в Edit отображались из 4 колонки. Просто и со вкусом. Если нужно поищу исходный текст...


Baddelay   (2005-01-31 02:15:00) [6]

Когда-то я делал, что то подобное, весь текст у меня хранился в скрытом Мемо, и просто при выделении итема в Lb у меня считывало инфу с Мемо с таким же индексом, и вставляла его в Label(нужно WordWrap true). Только етот способ работает если в lb итемы неизменяются по ходу выполнения проги..


SergP   (2005-01-30 17:29:00) [7]


>  [8] ТехникПТО ©   (30.01.05 17:06)
>
> > круто, где такой откопали?
>
> 1990 год :)


В  [7] Antonn ©   (30.01.05 16:57) очевидно мелось ввиду "еще с 2 5 6 начинал"


ТехникПТО   (2005-01-30 17:06:00) [8]


> круто, где такой откопали?

1990 год :)


Antonn   (2005-01-30 16:57:00) [9]


> еще с 256 начинал

круто, где такой откопали?


ТехникПТО   (2005-01-30 16:11:00) [10]

сделал :-P


Neznaika   (2005-01-30 15:15:00) [11]

Не понял ... что хранить?

Тект мемо? - да хоть в *.тхт
Или я вообще не понял Ваш вопрос...?


ТехникПТО   (2005-01-30 15:05:00) [12]


> procedure listbox1.Click(la la la );
> var i : integer;
> begin
> i:=-1;
> If listbox1.ItemIndex > -1 then begin
> i:=Listbox1.ItemIndex;
> case i of begin
> -1: memo1.text:='Выделите интересующий Вас элемент';
> 0:  memo1.text:='Вы выбрали первую строку сверху';
> 2: и т.д.
> end;
>
> Это первое что пришло в голову... :)

Очень интерестно :) а как это все хранить?? :)


Neznaika   (2005-01-30 15:04:00) [13]

procedure listbox1.Click(la la la );
var i : integer;
begin
i:=-1;
If listbox1.ItemIndex > -1 then begin
i:=Listbox1.ItemIndex;
case i of begin
-1: memo1.text:='Выделите интересующий Вас элемент';
0:  memo1.text:='Вы выбрали первую строку сверху';
2: и т.д.
end;

Это первое что пришло в голову... :)


ТехникПТО   (2005-01-30 14:55:00) [14]


> Уважаемый ТехникПТО мне кажется что все вопросы возникающие
> у Вас по ходу написания программы Вы выкладыаете здесь...
> А как на счет самому подумать...?

Сорь если напрягаю... НО я еще навичок в этом деле и сейчас работаю над довольно объемным и сложным проектом...
Базовые знания у меня только Паскаль... компьютерного образования 0, конечно кроме многолетнего стажа работы с компами... еще с 256 начинал :) а мне всего то 20 лет :)
о системе и железе знаю довольно много... многое додумываю сам ментодом научного тыка (я про процесс написания)...
и в конце концов я задаю не такие уж и сложные вопросы :)
был я на многих форумах.. но остановился на этом.. мне понравился здесь народ... как он отвечает на вопросы... самое главное быстро и правильно :) респект вам всем :)
если бы я щас работал с базами данных.. я бы не задавал подобных вопросов, а сделал бы связанные таблици и не парился.. но БД мне здесь не нужно...
P.S. Если напрягаю то сорри!!


> По поводу вопроса: Приблизительно представляя высоту строки
> в Вашем Listbox-се и зная сколько пользователь может водить
> мышкой над ним в поиске нужной ему строки, думаю что постоянное
> мерцание подсказок в мемо как только проведешь мышкой на
> ListBoxom, будет как минимум раздражать, советую сделать
> активацию подсказки при выделении строки в ListBoxe. Это
> и проще и практичней...


вы не поняли... под ListBox'oм есть Memo...
при выделении какой либо строки в ListBox'e должен быть комент в этом самом мемо...
как это реализовать?? как связать какую то конкретную строку в ListBox'e с определенным значением в Memo???


Neznaika   (2005-01-30 14:41:00) [15]

Уважаемый ТехникПТО мне кажется что все вопросы возникающие у Вас по ходу написания программы Вы выкладыаете здесь... А как на счет самому подумать...?

По поводу вопроса: Приблизительно представляя высоту строки в Вашем Listbox-се и зная сколько пользователь может водить мышкой над ним в поиске нужной ему строки, думаю что постоянное мерцание подсказок в мемо как только проведешь мышкой на ListBoxom, будет как минимум раздражать, советую сделать активацию подсказки при выделении строки в ListBoxe. Это и проще и практичней...


Наверх

Титульная страница Поиск, карта сайта Написать письмо