Отправляет email-рассылки с помощью сервиса Sendsay

Советы по Delphi

  Все выпуски  

Советы по Delphi


Служба Рассылок Subscribe.Ru

Здравствуйте, уважаемые подписчики! У ListView нет события, которое бы происходило только при изменении состояния флажка (флажки появляются при установке свойства CheckBoxes в true). При нажатии на флажок генерируется событие OnChange. В обработчик этого события передается характер изменения. Есть три варианта: ctText, ctImage, ctState, то есть изменение свойства Caption, изменение иконки или изменение свойств Cut, Focused, Selected или Checked. Чтобы отлавливать именно событие изменения состояния флажка, можно сделать следующее. В обработчике события OnChanging нужно сохранять текущее состояние флажка того элемента, состояние которого сейчас изменяется. А в обработчике события OnChange нужно сравнивать свойство Checked с только что сохраненным значением. Спасибо Алексею, который подсказал мне это решение.
var
  ItemChecked: boolean;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  li: TListItem;
begin
  ListView1.CheckBoxes := true;
  ListView1.ViewStyle := vsList;
  ListView1.Items.BeginUpdate;
  for i := 0 to 99 do begin
    li := ListView1.Items.Add;
    li.Caption := 'Item' + IntToStr(i);
  end;
  ListView1.Items.EndUpdate;
end;

procedure TForm1.ListView1Changing(Sender: TObject; Item: TListItem;
  Change: TItemChange; var AllowChange: Boolean);
begin
  ItemChecked := Item.Checked;
end;

procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
const
  CheckStrings: array [boolean] of string = ('unchecked', 'checked');
begin
  if ListView1.Focused and (Item.Checked <> ItemChecked) then
    ShowMessage(Format('Item%d was %s',
      [Item.Index, CheckStrings[Item.Checked]]));
end;


Полезные мелочи
Чтобы вызвать диалог, в котором бы пользователь должен был ввести что-нибудь, достаточно воспользоваться функцией InputBox или InputQuery. Эти функции создают диалог с полем ввода, надписью над ним и двумя кнопками: "OK" и "Cancel". Параметры управляют заголовком окна, надписью над полем ввода и начальным значением. Функции отличаются тем, что после вызова InputBox нельзя понять: пользователь нажал "OK", не изменив текст, или "Cancel", а текст был восстановлен самой фунцией. InputQuery возвращает значение типа boolean по которому можно определить, какую кнопку нажал пользователь. Пример:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Caption := InputBox('Заголовок окна',
    'Введите, пожалуйста, заголовок окна:', Form1.Caption);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  s: string;
begin
  s := Form1.Caption;
  if not InputQuery('Заголовок окна',
    'Введите, пожалуйста, заголовок окна:', s)
  then s := 'No value';
  Form1.Caption := s;
end;

Ошибка
В рассылке за 21.09.2001 в коде про выбор папки была допущена ошибка. Память, выделенная под переменную s типа PChar, не была освобождена. Вот каким должно быть окончание этого примера:

 ...
  SHGetPathFromIDList(ResPidl, s);
  Form1.Caption := s;
  StrDispose(s);
end;
Эту ошибку заметил и написал мне об этом Serjius.



Все советы и замечания, пожалуйста, присылайте на delphi4all@narod.ru

Всего доброго,
Даниил Карапетян.






http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное