Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.01.2015, 14:03
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Передать параметры для запуска программы через CheckBox

Приветствую всех, уважаемые форумчане!

Помогите решить задачу.

Есть программа-Ланчер на которой есть несколько CheckBox'ов. Каждый CheckBox должен передавать определенные ключи, допустим в какую-нибудь переменную для запуска другой программы. Проблема в том, что каждый CheckBox должен передавать как минимум два таких ключа.

Допустим:
Код:
CheckBox1 = "FASTLOCK=ON NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3"
CheckBox2 = "EDITOR BLUE NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3"

Как видите некоторые параметры есть и там и там. Если будет отмечен только 1 CheckBox тогда все проста, а если оба? Ключи не должны дублироваться в этом случае. И строка должна выглядеть в итоге так:

Код:
"FASTLOCK=ON EDITOR BLUE NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3"

Как все это реализовать по умному?

З.Ы. Сами CheckBox'ы читаю и сохраняю из/в ini-файл.

Прошу, помогите/подскажите как это все воплотить в жизнь. Буду очень признателен за помощь.
Ответить с цитированием
  #2  
Старый 30.01.2015, 15:28
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Как то так

Код:
Param:='';
if CheckBox1.Checked then Param:=Param+' FASTLOCK=ON';
if CheckBox2.Checked then Param:=Param+' EDITOR BLUE';

if CheckBox1.Checked or CheckBox2.Checked then Param:=Param+' NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3';
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Alloc (30.01.2015)
  #3  
Старый 30.01.2015, 18:24
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо Вам за код, снова помогаете)

Этот вариант вроде бы простой но в то же время предвещает много головной боли в моем случае, так как CheckBoxs'ов много, около 20-ти и для каждой комбинации придется таким образом писать..

И еще проблема в том, что если допустим во втором CheckBoxs'е будет ключ - "FASTLOCK=OFF"

тогда код отработает не так как надо:

Код:
Param:='';
if CheckBox1.Checked then Param:=Param+' FASTLOCK=ON';
if CheckBox2.Checked then Param:=Param+' FASTLOCK=OFF EDITOR BLUE';
 
if CheckBox1.Checked or CheckBox2.Checked then Param:=Param+' NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3';

результат будет -
Код:
"FASTLOCK=ON FASTLOCK=OFF...."

Заранее спасибо
Ответить с цитированием
  #4  
Старый 30.01.2015, 19:45
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

У меня есть мысль сделать следующим образом:

Код:
  
  if chk1.Checked then
     Param:= Param + 'A';
  if chk2.Checked then
     Param:= Param + 'B';
  if chk3.Checked then
     Param:= Param + 'C';
  if chk4.Checked then
     Param:= Param + 'D';
  if chk5.Checked then
     Param:= Param + 'E';
  if chk6.Checked then
     Param:= Param + 'F';
  if chk7.Checked then
     Param:= Param + 'G';
  if chk8.Checked then
     Param:= Param + 'H';

Далее уже каждой комбинации прописать определенный список параметров:

Код:
if Param:= 'A' then Key:='FASTLOCK=ON NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3';
if Param:= 'B' then Key:='FASTLOCK=OFF EDITOR BLUE NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3';
if Param:= 'AB' then Key:='FASTLOCK=ON EDITOR BLUE SOFTWARE3D NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3';

if Param:= 'AC' then ...
if Param:= 'AD' then ...
...

Что Вы думаете об этом способе? И можно ли его как то упростить?
Возможно Вы сможете предложить что то более правильное?

Заранее спасибо.

Последний раз редактировалось Alloc, 30.01.2015 в 19:51.
Ответить с цитированием
  #5  
Старый 31.01.2015, 00:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да, можно. Читаем что такое Хэш-мап.
Фактически, можно имплементировать его на простом TStringList.
К каждому флажку у тебя должен быть прицеплен какми-либо образом список (можно массив) нужных значений. Далее, когда ты анализируешь состояние твоих 20 флажков, то:
1. Создаешь пустой список TStringList
2. Для каждого флажка
2.1. Для каждого привязанного к флажку параметра
2.1.1. Ищем такой параметр в списке
2.1.2. Если найден, то пропускаем, если не найден, то добавляем.
Таким побразм в конце анализа у тебя будет набор уникальных параметров.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Alloc (31.01.2015)
  #6  
Старый 31.01.2015, 01:39
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Боюсь моих знаний в программировании не достаточно, чтобы реализовать это.. если это не сложно, Вы не могли бы привести пример? Буду Вам очень признателен.
Ответить с цитированием
  #7  
Старый 31.01.2015, 01:47
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Можно и по-простецки. Сначала каждый чекбокс добавит свой набор чисел (индексов параметров) во множество (set), потом вторым проходом брутфорсим все индексы и если они есть во множестве - добавляем соответствующий индексу параметр (для этого просто завести массив возможных уникальных параметров).
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Alloc (31.01.2015)
  #8  
Старый 31.01.2015, 02:37
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А вам не кажется, что эта задачка явно для множеств? Вот примерно так можно это сделать:
Код:
unit Unit28;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DIB, StdCtrls;

type
  TOption = (Red, Orange, Yellow, Green, LightBlue, Blue, Violet);
  TOptionSet = Set of TOption;

  TForm28 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure CheckBoxClick(Sender: TObject);
  private
    Options: TOptionSet;
  public
    { Public declarations }
  end;

var
  Form28: TForm28;

implementation

{$R *.dfm}

procedure TForm28.CheckBoxClick(Sender: TObject);
Var
  S: String;
begin
 if TCheckBox(Sender).Checked
 then Options := Options + [TOption(TCheckBox(Sender).Tag)]
 else Options := Options - [TOption(TCheckBox(Sender).Tag)];
 S := '';
 if Red in Options then S := S + ' Каждый';
 if Orange in Options then S := S + ' Охотник';
 if Yellow in Options then S := S + ' Желает';
 if Green in Options then S := S + ' Знать';
 if LightBlue in Options then S := S + ' Где';
 if Blue in Options then S := S + ' Сидит';
 if Violet in Options then S := S + ' Фазан';
 Memo1.Lines.Add(S);
end;

procedure TForm28.FormCreate(Sender: TObject);
begin
 Options := [];
 CheckBox1.Tag := Ord(Red);
 CheckBox2.Tag := Ord(Orange);
 CheckBox3.Tag := Ord(Yellow);
 CheckBox4.Tag := Ord(Green);
 CheckBox5.Tag := Ord(LightBlue);
 CheckBox6.Tag := Ord(Blue);
 CheckBox7.Tag := Ord(Violet);
end;

end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Alloc (31.01.2015)
  #9  
Старый 31.01.2015, 10:06
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Код:
for it := Red to Violet do
  if it in options then
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Alloc (31.01.2015)
  #10  
Старый 31.01.2015, 13:27
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Код:
for it := Red to Violet do
  if it in options then

пожалуйста, по подробнее, я новичку и приведенные выше примеры сложноваты для меня

Будьте добры, приведите пример используя выше написанный код для сабжа.

Т.е. :

Цитата:
Сообщение от Alloc
И еще проблема в том, что если допустим во втором CheckBoxs'е будет ключ - "FASTLOCK=OFF"

тогда код отработает не так как надо:

Код:
Param:='';
if CheckBox1.Checked then Param:=Param+' FASTLOCK=ON';
if CheckBox2.Checked then Param:=Param+' FASTLOCK=OFF EDITOR BLUE';
  
if CheckBox1.Checked or CheckBox2.Checked then Param:=Param+' NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3';

результат будет -
Код:
"FASTLOCK=ON FASTLOCK=OFF...."

Добрые люди, помогите пожалуйста, никак не разберусь
Ответить с цитированием
  #11  
Старый 31.01.2015, 13:53
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Пожалуй я погорячился насчет множеств именно для данной задачи. Тут больше подходят битовые операции в явном виде, т.к. Tag чекбокса может иметь более одного значения:
Код:
unit Unit28;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DIB, StdCtrls;

const
  Red = 1;
  Orange = 2;
  Yellow = 4;
  Green = 8;
  LightBlue = 16;
  Blue = 32;
  Violet = 64;

type
  TForm28 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    Memo1: TMemo;
    CheckBox8: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure CheckBoxClick(Sender: TObject);
  private
    Options: Integer;
  public
    { Public declarations }
  end;

var
  Form28: TForm28;

implementation

{$R *.dfm}

procedure TForm28.CheckBoxClick(Sender: TObject);
Var
  S: String;
begin
 Options := Options xor TCheckBox(Sender).Tag;
 S := '';
 if Red and Options <> 0 then S := S + ' Каждый';
 if Orange and Options <> 0 then S := S + ' Охотник';
 if Yellow and Options <> 0 then S := S + ' Желает';
 if Green and Options <> 0 then S := S + ' Знать';
 if LightBlue and Options <> 0 then S := S + ' Где';
 if Blue and Options <> 0 then S := S + ' Сидит';
 if Violet and Options <> 0 then S := S + ' Фазан';
 Memo1.Lines.Add(S);
end;

procedure TForm28.FormCreate(Sender: TObject);
begin
 Options := 0;
 CheckBox1.Tag := Red;
 CheckBox2.Tag := Orange;
 CheckBox3.Tag := Yellow;
 CheckBox4.Tag := Green;
 CheckBox5.Tag := LightBlue;
 CheckBox6.Tag := Blue;
 CheckBox7.Tag := Violet;
 CheckBox8.Tag := Red or Yellow or Green;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Alloc (31.01.2015)
  #12  
Старый 31.01.2015, 13:55
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
результат будет -
"FASTLOCK=ON FASTLOCK=OFF...."
А какой результат вы ожидаете, выставляя взаимоисключающие чекбоксы? В таком случае эти два должны быть не чекбоксами, а радиобаттонами, иначе сама задача абсурдна, т.к. никакое решение не будет правильным (потому что выбор двух противоречащих друг другу чекбоксов значит что параметр как минимум одного из них будет задан неверно).
Давно бы уже описали, какие параметры существуют, в каких комбинациях встречаются и т.д. Может имеет смысл сделать так, чтобы у каждого чекбокса был 1 параметр, и вдобавок чекбокс активировал группу других чекбоксов/радиобаттонов для задания параметров, существующих только в при существовании первого. Может есть еще какие-то решения.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 31.01.2015 в 14:02.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Alloc (31.01.2015)
  #13  
Старый 31.01.2015, 14:01
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Если все параметры имеют константное значение:
'FASTLOCK=ON'
'EDITOR BLUE'
'SOFTWARE3D'
'NOPRELOADSECTORS'
'CHUNKCACHESIZE=16'
'GAMESPEED=3'
то пример с битами должен полностью решить проблему, а вот если возможны:
'GAMESPEED=3','GAMESPEED=2','GAMESPEED=1'
и т.д. то тут надо будет подумать.
Выложите все параметры, какие возможны.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Alloc (31.01.2015)
  #14  
Старый 31.01.2015, 14:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Чего вы херню какую-то городите? Если вам надо с битами работать — используйте TBits.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Alloc (31.01.2015)
  #15  
Старый 31.01.2015, 14:54
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Давно бы уже описали, какие параметры существуют, в каких комбинациях встречаются и т.д.
Цитата:
Сообщение от Страдалецъ
Выложите все параметры, какие возможны.

согласен с вами, моя вина...

Тогда выкладываю для более лучшего представления скриншот программы.



Как видите есть 8-мь основных CheckBox'ов слева. Так же имеются 3-и TrackBar'а которые собственно и указываю значения для ключей:
Код:
PRELOADSIZE=, CHUNKCACHESIZE= и GAMESPEED=.

Сами CheckBox'ы и их ключи которые они должны передавать (Это для каждого CheckBox'a в отдельности):

Код:
CheckBox1 = FASTLOCK=ON NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3
CheckBox2 = FASTLOCK=ON SOFTWARE3D NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3 
CheckBox3 = FASTLOCK=ON EDITOR NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3
CheckBox4 = FASTLOCK=ON VOODOO NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3
CheckBox5 = FASTLOCK=OFF NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3
CheckBox6 = FASTLOCK=ON NOBLITTEXTURES NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3
CheckBox7 = FASTLOCK=ON NOTEXOVERLAYS NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3
CheckBox8 = FASTLOCK=ON PRELOADSIZE=3 CHUNKCACHESIZE=16 GAMESPEED=3

Как видите некоторые параметры повторяются для каждого CheckBox'а.

Таким образом, необходимо в случае выбора CheckBox2, CheckBox3, CheckBox5 чтобы результат был

Код:
FASTLOCK=OFF SOFTWARE3D EDITOR NOPRELOADSECTORS CHUNKCACHESIZE=16 GAMESPEED=3

Т.е. чтобы значения не повторялись.

Последний раз редактировалось Alloc, 31.01.2015 в 14:59.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:19.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025