![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Приветствую всех, уважаемые форумчане!
Помогите решить задачу. Есть программа-Ланчер на которой есть несколько 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
|
|||
|
|||
|
Как то так
Код:
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
|
||||
|
||||
|
Спасибо Вам за код, снова помогаете)
Этот вариант вроде бы простой но в то же время предвещает много головной боли в моем случае, так как 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
|
||||
|
||||
|
У меня есть мысль сделать следующим образом:
Код:
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
|
|||
|
|||
|
Да, можно. Читаем что такое Хэш-мап.
Фактически, можно имплементировать его на простом TStringList. К каждому флажку у тебя должен быть прицеплен какми-либо образом список (можно массив) нужных значений. Далее, когда ты анализируешь состояние твоих 20 флажков, то: 1. Создаешь пустой список TStringList 2. Для каждого флажка 2.1. Для каждого привязанного к флажку параметра 2.1.1. Ищем такой параметр в списке 2.1.2. Если найден, то пропускаем, если не найден, то добавляем. Таким побразм в конце анализа у тебя будет набор уникальных параметров. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Alloc (31.01.2015)
| ||
|
#6
|
||||
|
||||
|
Боюсь моих знаний в программировании не достаточно, чтобы реализовать это.. если это не сложно, Вы не могли бы привести пример? Буду Вам очень признателен.
|
|
#7
|
||||
|
||||
|
Можно и по-простецки. Сначала каждый чекбокс добавит свой набор чисел (индексов параметров) во множество (set), потом вторым проходом брутфорсим все индексы и если они есть во множестве - добавляем соответствующий индексу параметр (для этого просто завести массив возможных уникальных параметров).
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Alloc (31.01.2015)
| ||
|
#8
|
||||
|
||||
|
А вам не кажется, что эта задачка явно для множеств? Вот примерно так можно это сделать:
Код:
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
|
||||
|
||||
|
Код:
for it := Red to Violet do if it in options then |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Alloc (31.01.2015)
| ||
|
#10
|
||||
|
||||
|
Цитата:
пожалуйста, по подробнее, я новичку и приведенные выше примеры сложноваты для меня Будьте добры, приведите пример используя выше написанный код для сабжа. Т.е. : Цитата:
Добрые люди, помогите пожалуйста, никак не разберусь |
|
#11
|
||||
|
||||
|
Пожалуй я погорячился насчет множеств именно для данной задачи. Тут больше подходят битовые операции в явном виде, т.к. 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
|
||||
|
||||
|
Цитата:
Давно бы уже описали, какие параметры существуют, в каких комбинациях встречаются и т.д. Может имеет смысл сделать так, чтобы у каждого чекбокса был 1 параметр, и вдобавок чекбокс активировал группу других чекбоксов/радиобаттонов для задания параметров, существующих только в при существовании первого. Может есть еще какие-то решения. Последний раз редактировалось Bargest, 31.01.2015 в 14:02. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Alloc (31.01.2015)
| ||
|
#13
|
||||
|
||||
|
Если все параметры имеют константное значение:
'FASTLOCK=ON' 'EDITOR BLUE' 'SOFTWARE3D' 'NOPRELOADSECTORS' 'CHUNKCACHESIZE=16' 'GAMESPEED=3' то пример с битами должен полностью решить проблему, а вот если возможны: 'GAMESPEED=3','GAMESPEED=2','GAMESPEED=1' и т.д. то тут надо будет подумать. Выложите все параметры, какие возможны. |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Alloc (31.01.2015)
| ||
|
#14
|
||||
|
||||
|
Чего вы херню какую-то городите? Если вам надо с битами работать — используйте TBits.
|
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Alloc (31.01.2015)
| ||
|
#15
|
||||
|
||||
|
Цитата:
Цитата:
согласен с вами, моя вина... Тогда выкладываю для более лучшего представления скриншот программы. ![]() Как видите есть 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. |