Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > "CheckListBox" Добавление в Items


Автор: Volkogriz 15.7.2013, 21:31
Доброе время суток!
Прошу помочь в ситуёвенки:
CheckListBox выводятся имена, если CheckListBox= Check дописывается к имени ' "Оплачено"'. Но там такая лабуда происходит что и не опишу))
Постоянно приписывается ещё одно или несколько ' "Оплачено"' )))
Вот как я пытался:
Код

procedure TForm1.ListBoxChecked;
var
i:Integer;
Str: string;
ini: TIniFile;
ichec:Integer;
begin
for i:=0 to CheckListBox1.Items.Count-1 do    { Запускается цикл}
if CheckListBox1.Checked[i]=true then
begin
if copy(CheckListBox1.Items.Strings[i],Length(CheckListBox1.Items.Strings[i])-12,12)=' "Оплачено"'then
else
CheckListBox1.Items.Strings[i]:= CheckListBox1.Items.Strings[i]+' "Оплачено"'
end
else
if CheckListBox1.Checked[i]=false then
begin
Str:= CheckListBox1.Items.Strings[i];
Delete(Str,Pos('"',Str),Length(Str));
CheckListBox1.Items.Strings[i]:=Str;
 end;  

где то 121 попытка добиться результата)))
Заранее благодарен!
С уважением,
Volkogriz! 

Автор: northener 15.7.2013, 21:41
А почему 12?
Оплачено = 8. Плюс 2 кавычки = 10.
И не лучше ли вместо сравнения копий использовать функцию Pos?

Автор: Volkogriz 15.7.2013, 21:51
Прежде чем сюда писать я долго "Часа 4-5" искал решение не чего не выходит.
Я CheckListBox_ом первый раз столкнулся.
Может примерчик если есть какой нибудь в три строчки smile  
С уважением,
Volkogriz!  

Автор: Illusion Dolphin 15.7.2013, 22:00
У вас несколько проблем:
1) Оформление кода ужасное
2) Строка 9 и 16 это (facepaml)X2
3) Научитесь пользоваться отладчиком
4)
Код

const
  PayedStr = ' "Оплачено"';
var
  I: Integer;
  Str, EndsWithText: string;
begin
  for I := 0 to CheckListBox1.Items.Count - 1 do
  begin
    Str := CheckListBox1.Items.Strings[I];
    EndsWithText := Copy(Str, Length(Str) - Length(PayedStr) + 1 {Строки с 1 (единицы)}, Length(PayedStr));
    if CheckListBox1.Checked[I] then
    begin
      if EndsWithText <> PayedStr then
        CheckListBox1.Items.Strings[I] := Str + PayedStr;
    end else if EndsWithText = PayedStr then
    begin
      Delete(Str, Length(Str) - Length(PayedStr) + 1, Length(PayedStr));
      CheckListBox1.Items.Strings[I] := Str;
    end;
  end;
end;


Добавлено @ 22:02
Кстати в последних версиях есть замечательные helper'ы для строк типа Str.EndsWith("SomeText")

Добавлено @ 22:02
Цитата

А почему 12?
Оплачено = 8. Плюс 2 кавычки = 10.

Вообще таких магических чисел быть не должно

P.S. Подправил чуток

Автор: northener 15.7.2013, 22:43
Цитата(Volkogriz @  15.7.2013,  21:31 Найти цитируемый пост)
где то 121 попытка добиться результата

А не очень ли нескромно будет с моей стороны спросить вас сколько раз вам советовали на разных форумах использовать отладчик для поиска ошибок в алгоритмах? И сколько раз вы следовали этому совету? А ведь и одного раза бы хватило smile

Автор: Volkogriz 15.7.2013, 22:56
Спасибо всем!
Я пишу только в два форума)))  programmersforum здесь один раз посоветовали))
а так пытаюсь сам))
С уважением,
Volkogriz!  

Автор: Keeper89 16.7.2013, 03:05
Volkogriz, 
Такой вопрос - зачем смешивать бизнес-логику с GUI? По идее, если логика есть в отдельном классе/записи - отображение дожно происходить очень просто по индексу элемента при щелчке по галке.

Автор: northener 16.7.2013, 03:15
Цитата(Keeper89 @  16.7.2013,  03:05 Найти цитируемый пост)
По идее, если логика есть в отдельном классе/записи - отображение дожно происходить очень просто по индексу элемента при щелчке по галке.

Я тоже сначала было об этом подумал.
Но вдруг автору надо сохранять/восстанавливать инфу из файла? Стандартные же методы SaveToFile/LoadFromFile ничего не знают о каких-то там галках :( 
А придумывать что-то своё, нестандартное, возможно лень. smile

Автор: Qu1nt 16.7.2013, 11:40
MVVM.

Автор: Poseidon 16.7.2013, 16:13
Цитата(Illusion Dolphin @  15.7.2013,  22:00 Найти цитируемый пост)
Вообще таких магических чисел быть не должно
Вот это правильно. Через год потом будешь сидеть и гадать что это за 12. Если уж так нужно, то правильнее будет использовать Length("Оплачено"), хотя и это не правильно smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)