Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2011, 23:47   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Радость Правильно определить знак перед строкой и в зависимости от этого выставить checked свойство

Всем Доброго времени суток!


У меня есть файл с таким содержамием:
Код:
mysql
;sqlite
;fun
engine
fakemeta
;geoip
;sockets
;regex
nvault
cstrike
csx
;hamsandwich
это имена dll которые подгружаются другой программой.
Знак ; обозначает что данный элемент отключён.

Моя задача написать программу которая заполняет CheckListBox этим списком, и выставить элементам свойство checked(включён) если перед элементом нет знака ";" , и наоборот если выключен.

Проблема в проверке этого свойства checked у элемента.

вот как проверяю:
Код:
const
  Disabled_prifix=';';

{$R *.dfm}

function ItemsEnabled(s: string): Boolean;
var
  Ts: TStringList;
  i, n: Integer;
  myDir: string;
  ss: string;
begin
  myDir := ExtractFilePath(ParamStr(0));
  Ts := TStringList.Create;
  try
    Ts.LoadFromFile(myDir + 'configs\' + 'modules.ini');
    ss := Disabled_prifix + s;
    for i := 0 to Ts.Count - 1 do
    begin
      n := AnsiPos(ss, Ts.Strings[i]);
      //если не нашли
      if (n = 0) then
      begin
        //передаём что элемент включён
        Result := True;
        Exit;
      end
      else
      begin
        //иначе передаём что выключён
        Result := False;
      end;
    end;
  finally
    Ts.Free;
  end;
end;

Проблема в том, что немогу привильно определить свойство checked основываясь на нахождении знака ; перед названием модуля в списке.

Вот прекрипляю проект, подскажите как привильно проверить это свойство, основываясь на стоящем знаке ; перед названием модуля?
Вложения
Тип файла: zip myProject.zip (163.8 Кб, 6 просмотров)
Человек_Борща вне форума Ответить с цитированием
Старый 18.02.2011, 00:17   #2
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Вложение не смотрел, но навскидку:

Загрузили в TCheckListBox строки и...
Код:
var i: integer;
    str:string;
begin
  for i:=0 to CheckListBox1.Count-1 do
    if CheckListBox1.Items[i][1]<>';' then
      CheckListBox1.Checked[i]:=true
    else
      Begin
        str:=CheckListBox1.Items[i];
        delete(str,1,1);
        CheckListBox1.Items[i]:=str;
      End;
end;
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"

Последний раз редактировалось AlDelta; 18.02.2011 в 00:21.
AlDelta вне форума Ответить с цитированием
Старый 18.02.2011, 00:20   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Нет в Checklistbox загружаются названия dll без всяких ;
Проверку надо зделать именно в файле.
Человек_Борща вне форума Ответить с цитированием
Старый 18.02.2011, 00:31   #4
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Код:
var i: integer;
    list: TStringList;
begin
  list:=TStringList.Create;
  try
    list.LoadFromFile(myDir + 'configs\' + 'modules.ini');
    for i:=0 to list.Count-1 do
      if list[i][1]<>';' then
        CheckListBox1.Checked[i]:=true
      else
        CheckListBox1.Checked[i]:=false
  finally
    list.Free;
  end;
end;
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 18.02.2011, 00:38   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Спасибо, если бы всё было так просто. Прядок в mugules.ini может не совподать с порядком наваний в checklistbox.

По этому я делаю проверку ;+имя из списка checklistbox (код в первом посте).

Я не понимаю в чем причина неработоспособности кода.

Вроде ксе привильно:
Перестчитываем все строки в файле. Далее в каждой строке ищем сроку вида: ;+имя из checlistbox , если нету значит элемен работает(стоит галочка).

Но почему-то данный код не работает. И я ищу причину, либо я что-то не так делаю, либо надо по другому делать. Вопрос как и почему?
Человек_Борща вне форума Ответить с цитированием
Старый 18.02.2011, 00:45   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Слишком все усложнено.
А проще просканировать список на наличие имени и, если такое есть, то проверить нет ли перед ним нужного символа:
Код:
var
  Ts: TStringList;

function ItemsEnabled(s: string): Boolean;
var
  i, n: Integer;
begin
  Result := True;
  for i := 0 to Ts.Count-1 do begin
    n := AnsiPos(s, Ts.Strings[i]);
    if (n > 0) and (Ts.Strings[i][1] = Disabled_prifix) then begin
      Result := False;
      Exit;
    end;
  end;
end;
Проверено, мин нет.
Правда, поправлено - Ts списком заряжается один раз в LoadModulesBtnClick. Чего этот лист трепать каждый раз.

Последний раз редактировалось Прик; 18.02.2011 в 00:49.
Прик вне форума Ответить с цитированием
Старый 18.02.2011, 00:57   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Спасибо, теперь все работает. Маленькая поправка:
Код:
    for i := 0 to Ts.Count - 1 do
    begin
      n := AnsiPos(s, Ts.Strings[i]);
      if (n > 0) and (Ts.Strings[i][1] = Disabled_prifix) then
      begin
        Result := False;
        Exit;
      end else
      Result:=True; //Иначе все элементы отключались(Chacked=false)
    end;
Вопрос решён! Ставлю +
Человек_Борща вне форума Ответить с цитированием
Старый 18.02.2011, 01:00   #8
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию


Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  myDir,str: string;
  list: TStringList;
  i,j: Integer;
begin
  myDir := ExtractFilePath(ParamStr(0));
  list:=TStringList.Create;
  try

    list.LoadFromFile(myDir + 'configs\' + 'modules.ini');
    list.Sort;
    CheckListBox1.Items.Text:=list.Text;

    ModulesList.Items.LoadFromFile(myDir + 'configs\' + 'modules.ini');

    for i:=0 to ModulesList.Count-1 do
      if ModulesList.Items[i][1]=';' then
        Begin
          str:=ModulesList.Items[i];
          delete(str,1,1);
          ModulesList.Items[i]:=str;
        End;

    for i:=0 to list.Count-1 do
      if list[i][1]<>';' then
        for j:=0 to ModulesList.Count-1 do
          Begin
            str:=list[i];
            if str=ModulesList.Items[j] then
              Begin
                ModulesList.Checked[j]:=true;
                break;
              End;
          End;

  finally
    list.Free;
  end;
end;
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"

Последний раз редактировалось AlDelta; 18.02.2011 в 01:12.
AlDelta вне форума Ответить с цитированием
Старый 18.02.2011, 01:03   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Можно и так=)
Человек_Борща вне форума Ответить с цитированием
Старый 18.02.2011, 01:11   #10
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Спасибо на добром слове. Но наверное, более оптимально поставить Result := True в начале тела функции один раз (как в моем примере), чем присваивать результату значение True на каждой итерации, если условие не срабатывает. Т.е. единожды лучше, чем много раз
У меня то отключались только те элементы, которые должны быть отключены, а не все.
Ну, это так, замечание в порядке оптимизации кода.
Прик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вставить знак перед строкой Человек_Борща Общие вопросы Delphi 1 17.02.2011 22:06
Что означает знак & перед переменной в PHP ? SuBwooFer PHP 4 01.04.2010 15:17
Определение типа браузера и дальшейшие действия в зависимости от этого. Stanislaus JavaScript, Ajax 1 24.11.2009 10:40
Определить знак зодиака qwertyuiop12345678 Помощь студентам 4 27.10.2009 17:28
Определить, сколько раз в последовательности меняется знак Siroga35 Паскаль, Turbo Pascal, PascalABC.NET 1 22.01.2009 12:25