т.е. если ни один компонент не выбран, Батон2 не должен быть активным (в прграмме это выгладит как если ничего не выбрано, то нечего и удалять -> кнопка активной быть не должна)." писал(а):Что ты имееш ввиду под
если ни один компонент не выбран
CheckListBox: удалить выбранные итемсы
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
- Сейчас_не_спящий
- Сообщения: 46
- Зарегистрирован: 26 янв 2007, 17:06
- Откуда: Беларусь, Гомель
- Контактная информация:
Всё не знает никто, но важно найти того кто знает нужное...
-
- Сообщения: 273
- Зарегистрирован: 30 июн 2005, 14:53
так ошибка-то собственно не в этом, это как раз корректно отрабатывется, ошибка в том что если поставить галки подряд (1-20), то удалятся они через одну, станутся четные, а не четные удалятся и останется 10 галокЛелик писал(а):Опиш твою ошибку тоже так раньше попадалась
Допустми у тебя 50 итемов в твоем листе
Ты ставишь галочки с 1-20
Идет твой цикл 1-20 удалились все нормально.
И число итемов уже осталось 30
НО в цикле у тебя бежит до 50 (как было изначально)
И когда заходит на items[30]. возникакет ошибка
поэтому самылй лучший выход использовать while or repeat
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
я бы положил TActionList, создал там TAction. Назначил бы ему свойства Caption="заголовок кнопки". Далее создаются события на OnExecute (туда пишешь код с Клика) и OnUpdate в котором пишешь:" писал(а): если ни один компонент не выбран
Код: Выделить всё
procedure TForm1.Action1Update(Sender: TObject);
begin
(Sender as TAction).Enabled := CheckedQuantity>0;
// или Action1.Enabled := .... я просто так привык ;)
end;
CheckedQuantity должно содержать это количество, либо завести переменную и каждый раз при клике пересчитывать, либо сделать функцию где в цикле пройтись по св-ву Checked. Можно даже переменную сделать логической и проверять хоть один установленный флажок

- Сейчас_не_спящий
- Сообщения: 46
- Зарегистрирован: 26 янв 2007, 17:06
- Откуда: Беларусь, Гомель
- Контактная информация:
не совсем понял что ты написал - присваиваешь CheckedQuantity > 0 ??" писал(а):(Sender as TAction).Enabled := CheckedQuantity>0;
// или Action1.Enabled := .... я просто так привык![]()
может тогда через IF ??
т.е. как я понимаю
if CheckedQuantity > 0 then
Action1.Enabled := true
else
Action1.Enabled := false;
или не так? распиши подробнее плиз
Всё не знает никто, но важно найти того кто знает нужное...
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
Да нет ошибка в этомBlood_Magic писал(а):так ошибка-то собственно не в этом, это как раз корректно отрабатывется, ошибка в том что если поставить галки подряд (1-20), то удалятся они через одну, станутся четные, а не четные удалятся и останется 10 галок
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
- Сейчас_не_спящий
- Сообщения: 46
- Зарегистрирован: 26 янв 2007, 17:06
- Откуда: Беларусь, Гомель
- Контактная информация:
Кстити, тоже самое и с Memo - если в Мемо не занесён хотя бы один символ, Батон4.Enabled := False.
Только вот как это сделать что бы процедура выполнялась сама по себе (т.е. постоянно отслеживала наличие хотя бы одного символа, а в случае checklistbox - хотя бы одного выбранного компонента), а не по нажатию на Мемо, ЛистБокс, Кнопку и т.п.
КАК?!??!?!? Плиз помогите ламеру, хочу научится:'(
Большая просьба написать хотя бы один, полный и расписаный, и, самое главное без сбоев рабочий, пример. Программисты! Не жадничайте знаниями и не ленитесь, ведь тем самым вы сами учитесьи набираете опыт (от поговорки повторение - мать учения..). Зарание благодарен.
Только вот как это сделать что бы процедура выполнялась сама по себе (т.е. постоянно отслеживала наличие хотя бы одного символа, а в случае checklistbox - хотя бы одного выбранного компонента), а не по нажатию на Мемо, ЛистБокс, Кнопку и т.п.
КАК?!??!?!? Плиз помогите ламеру, хочу научится:'(
Большая просьба написать хотя бы один, полный и расписаный, и, самое главное без сбоев рабочий, пример. Программисты! Не жадничайте знаниями и не ленитесь, ведь тем самым вы сами учитесьи набираете опыт (от поговорки повторение - мать учения..). Зарание благодарен.
Всё не знает никто, но важно найти того кто знает нужное...
- SergeyS
- Сообщения: 196
- Зарегистрирован: 21 ноя 2006, 17:12
- Откуда: Хакасия, Абакан
- Контактная информация:
Создаешь отдельную процедуру типа GlobalCheck, в ней осуществляешь все необходимые проверки которые влияют на твою кнопку или серию кнопок и выставляешь их статус в зависимости от текущего состояния твоих компонент.
А уж эту процедуру вызывай в любом месте, когда что-то меняется в частности при открытии формы, при изменении текста в мемо, при изменении чекбоксов и т.д. От обработки событий типа OnMemo1Changed тебе не уйти (таким образом мемо тебя информирует что оно изменилось).
На крайний срок поставь таймер который через равные промежутки времени будет тестить состояние компонент, но это неверный путь, т.к. ведёт к лишним вычислениям. А обработка событий гарантирует вычисление только в нужный тебе момент.
А уж эту процедуру вызывай в любом месте, когда что-то меняется в частности при открытии формы, при изменении текста в мемо, при изменении чекбоксов и т.д. От обработки событий типа OnMemo1Changed тебе не уйти (таким образом мемо тебя информирует что оно изменилось).
На крайний срок поставь таймер который через равные промежутки времени будет тестить состояние компонент, но это неверный путь, т.к. ведёт к лишним вычислениям. А обработка событий гарантирует вычисление только в нужный тебе момент.
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
на. это вставляешь в dfm файл
[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]
Код: Выделить всё
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
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]

- Сейчас_не_спящий
- Сообщения: 46
- Зарегистрирован: 26 янв 2007, 17:06
- Откуда: Беларусь, Гомель
- Контактная информация:
благодаю=) ... надо знать меру, это вобще уже для идиотов расписано" писал(а):
на. это вставляешь в 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;
Всё не знает никто, но важно найти того кто знает нужное...
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
Сейчас_не_спящий, просто лень было описывать что класть на форму 
в отличии от Action - тебе придётся в начале инитить состояние кнопок... а TAction сам будет проверять состояние.
зы.
[noparse]
обрамляй код либо тэгом либо [syntax='delphi'] текст с подсветкой синтаксиса [/syntax]
[/noparse]

в отличии от Action - тебе придётся в начале инитить состояние кнопок... а TAction сам будет проверять состояние.
зы.
[noparse]
обрамляй код либо тэгом
Код: Выделить всё
текст с сохранением отступов
[/noparse]
