![]() |
|
|
Регистрация | << Правила форума >> | 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), потом вторым проходом брутфорсим все индексы и если они есть во множестве - добавляем соответствующий индексу параметр (для этого просто завести массив возможных уникальных параметров).
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо 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 — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо 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 параметр, и вдобавок чекбокс активировал группу других чекбоксов/радиобаттонов для задания параметров, существующих только в при существовании первого. Может есть еще какие-то решения. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо 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. |