Страница 2 из 3

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 12 фев 2007, 15:21
Сейчас_не_спящий
&quot писал(а):Что ты имееш ввиду под

если ни один компонент не выбран
т.е. если ни один компонент не выбран, Батон2 не должен быть активным (в прграмме это выгладит как если ничего не выбрано, то нечего и удалять -> кнопка активной быть не должна).

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 12 фев 2007, 16:02
Blood_Magic
Лелик писал(а):Опиш твою ошибку тоже так раньше попадалась
Допустми у тебя 50 итемов в твоем листе
Ты ставишь галочки с 1-20
Идет твой цикл 1-20 удалились все нормально.
И число итемов уже осталось 30

НО в цикле у тебя бежит до 50 (как было изначально)
И когда заходит на items[30]. возникакет ошибка

поэтому самылй лучший выход использовать while or repeat
так ошибка-то собственно не в этом, это как раз корректно отрабатывется, ошибка в том что если поставить галки подряд (1-20), то удалятся они через одну, станутся четные, а не четные удалятся и останется 10 галок

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 12 фев 2007, 16:54
Игорь Акопян
&quot писал(а): если ни один компонент не выбран
я бы положил TActionList, создал там TAction. Назначил бы ему свойства Caption="заголовок кнопки". Далее создаются события на OnExecute (туда пишешь код с Клика) и OnUpdate в котором пишешь:

Код: Выделить всё

procedure TForm1.Action1Update(Sender: TObject);
begin
  (Sender as TAction).Enabled := CheckedQuantity>0;
  // или Action1.Enabled := .... я просто так привык ;)
end;

лень писать подсчёт числа помеченных чеков:
CheckedQuantity должно содержать это количество, либо завести переменную и каждый раз при клике пересчитывать, либо сделать функцию где в цикле пройтись по св-ву Checked. Можно даже переменную сделать логической и проверять хоть один установленный флажок

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 12 фев 2007, 19:00
Сейчас_не_спящий
&quot писал(а):(Sender as TAction).Enabled := CheckedQuantity>0;
// или Action1.Enabled := .... я просто так привык ;)
не совсем понял что ты написал - присваиваешь CheckedQuantity > 0 ??
может тогда через IF ??
т.е. как я понимаю
if CheckedQuantity > 0 then
Action1.Enabled := true
else
Action1.Enabled := false;
или не так? распиши подробнее плиз

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 12 фев 2007, 19:02
Лелик_1044
Blood_Magic писал(а):так ошибка-то собственно не в этом, это как раз корректно отрабатывется, ошибка в том что если поставить галки подряд (1-20), то удалятся они через одну, станутся четные, а не четные удалятся и останется 10 галок
Да нет ошибка в этом

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 12 фев 2007, 19:03
Сейчас_не_спящий
Кстити, тоже самое и с Memo - если в Мемо не занесён хотя бы один символ, Батон4.Enabled := False.
Только вот как это сделать что бы процедура выполнялась сама по себе (т.е. постоянно отслеживала наличие хотя бы одного символа, а в случае checklistbox - хотя бы одного выбранного компонента), а не по нажатию на Мемо, ЛистБокс, Кнопку и т.п.
КАК?!??!?!? Плиз помогите ламеру, хочу научится:'(
Большая просьба написать хотя бы один, полный и расписаный, и, самое главное без сбоев рабочий, пример. Программисты! Не жадничайте знаниями и не ленитесь, ведь тем самым вы сами учитесьи набираете опыт (от поговорки повторение - мать учения..). Зарание благодарен.

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 13 фев 2007, 07:55
SergeyS
Создаешь отдельную процедуру типа GlobalCheck, в ней осуществляешь все необходимые проверки которые влияют на твою кнопку или серию кнопок и выставляешь их статус в зависимости от текущего состояния твоих компонент.
А уж эту процедуру вызывай в любом месте, когда что-то меняется в частности при открытии формы, при изменении текста в мемо, при изменении чекбоксов и т.д. От обработки событий типа OnMemo1Changed тебе не уйти (таким образом мемо тебя информирует что оно изменилось).
На крайний срок поставь таймер который через равные промежутки времени будет тестить состояние компонент, но это неверный путь, т.к. ведёт к лишним вычислениям. А обработка событий гарантирует вычисление только в нужный тебе момент.

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 13 фев 2007, 11:45
Игорь Акопян
на. это вставляешь в dfm файл

Код: Выделить всё

object Form1: TForm1
  Left = 268
  Top = 155
  Width = 604
  Height = 274
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Memo1: TMemo
    Left = 44
    Top = 28
    Width = 185
    Height = 89
    Lines.Strings = (
      'Memo1')
    TabOrder = 0
  end
  object CheckListBox1: TCheckListBox
    Left = 308
    Top = 28
    Width = 121
    Height = 97
    ItemHeight = 13
    Items.Strings = (
      'item 1'
      'item 2'
      'item 3')
    TabOrder = 1
  end
  object Button1: TButton
    Left = 100
    Top = 140
    Width = 75
    Height = 25
    Action = Action1
    TabOrder = 2
  end
  object Button2: TButton
    Left = 332
    Top = 140
    Width = 75
    Height = 25
    Action = Action2
    TabOrder = 3
  end
  object Button3: TButton
    Left = 232
    Top = 192
    Width = 75
    Height = 25
    Action = Action3
    TabOrder = 4
  end
  object ActionList1: TActionList
    Left = 536
    Top = 92
    object Action1: TAction
      Caption = 'Action1'
      OnExecute = Action1Execute
      OnUpdate = Action1Update
    end
    object Action2: TAction
      Caption = 'Action2'
      OnExecute = Action2Execute
      OnUpdate = Action2Update
    end
    object Action3: TAction
      Caption = 'Action3'
      OnExecute = Action3Execute
      OnUpdate = Action3Update
    end
  end
end
[syntax='delphi']
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ActnList, StdCtrls, CheckLst;

type
TForm1 = class(TForm)
Memo1: TMemo;
CheckListBox1: TCheckListBox;
Button1: TButton;
Button2: TButton;
ActionList1: TActionList;
Action1: TAction;
Action2: TAction;
Button3: TButton;
Action3: TAction;
procedure Action1Execute(Sender: TObject);
procedure Action1Update(Sender: TObject);
procedure Action2Execute(Sender: TObject);
procedure Action2Update(Sender: TObject);
procedure Action3Execute(Sender: TObject);
procedure Action3Update(Sender: TObject);
private
{ Private declarations }
function CheckBoxListNotEmpty: boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.CheckBoxListNotEmpty: boolean;
var
I: integer;
begin
Result := false;
for I := 0 to CheckListBox1.Items.Count-1 do
if CheckListBox1.Checked then
begin
Result := true; Break;
end;
end;

procedure TForm1.Action1Execute(Sender: TObject);
begin
// нажатие кнопки 1
end;

procedure TForm1.Action1Update(Sender: TObject);
begin
Action1.Enabled := Length(Memo1.Lines.Text)>0;
end;

procedure TForm1.Action2Execute(Sender: TObject);
begin
// нажатие кнопки 2
end;

procedure TForm1.Action2Update(Sender: TObject);
begin
Action2.Enabled := CheckBoxListNotEmpty;
end;

procedure TForm1.Action3Execute(Sender: TObject);
begin
// нажатие кнопки 3
end;

procedure TForm1.Action3Update(Sender: TObject);
begin
Action3.Enabled := Action1.Enabled and Action2.Enabled;
end;

end.
[/syntax]

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 14 фев 2007, 08:32
Сейчас_не_спящий
&quot писал(а):
на. это вставляешь в dfm файл
благодаю=) ... надо знать меру, это вобще уже для идиотов расписано :)
я эту задачу решил другим способом:
для листчекбокса:

procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var
i : integer;
с : boolean;
begin
с := false;
for i := 0 to CheckListBox1.Items.Count -1 do
begin
if CheckListBox1.Checked then // т.е. еслии хотя бы первый
//попавшийся удоблетворяет условию, то уже не важно что там дальше, всё
//равно батон"удалить" становиться активным. (это для того что бы не прогонял
//всю базу, так быстрее искать будет)
begin
с : = true;
break;
end;
end;
Button2.Enabled := с;
end;

А для Мемо вот так:

procedure TForm1.Memo1Change(Sender: TObject);
begin
if memo1.Lines.Count >0 then //если количество строк меньше 1(если там
//даже только 1 символ всё равно создаётся строка), то сохранять нечего
//-> батон3 не активный.
button3.Enabled := true else
button3.Enabled := false;
end;

Re: CheckListBox: удалить выбранные итемсы

Добавлено: 14 фев 2007, 11:56
Игорь Акопян
Сейчас_не_спящий, просто лень было описывать что класть на форму ;)
в отличии от Action - тебе придётся в начале инитить состояние кнопок... а TAction сам будет проверять состояние.

зы.
[noparse]
обрамляй код либо тэгом

Код: Выделить всё

 текст с сохранением отступов 
либо [syntax='delphi'] текст с подсветкой синтаксиса [/syntax]

[/noparse]