Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» CheckBox в Delphi

Автор: Zakipel
Дата сообщения: 08.11.2012 03:53
Всем привет.
Задача следующая:
Нужно как то заставить const passchar='qwerty...' менять свой вид в зависимости от чекбоксов. как?
з.ы. и возможно как то убрать пунктирную рамку у чекбокса? (см. скрин)

http://i48.fastpic.ru/thumb/2012/1108/70/fcb22b0bea89fa346a720e4104b4ff70.jpeghttp://i48.fastpic.ru/thumb/2012/1108/1f/8e7ad1f12f3e7f1c851ba66dcbad531f.jpeg
Автор: exteris
Дата сообщения: 08.11.2012 07:24

Цитата:
Нужно как то заставить const passchar='qwerty...' менять свой вид в зависимости от чекбоксов

Константы как-бы не меняются...

Цитата:
и возможно как то убрать пунктирную рамку у чекбокса?

Перекройте метод Paint своим.
Автор: salexn1
Дата сообщения: 08.11.2012 07:32
Zakipel


Цитата:
Нужно как то заставить const passchar='qwerty...' менять свой вид в зависимости от чекбоксов. как?

Не понятно, что вы имеете ввиду...


Цитата:
з.ы. и возможно как то убрать пунктирную рамку у чекбокса? (см. скрин)

оставить только сам чекбокс, т.е. убрать Caption и положить вместо него TLabel
Автор: Corsairs
Дата сообщения: 08.11.2012 07:56
Zakipel

Цитата:
Нужно как то заставить const passchar='qwerty...' менять свой вид в зависимости от чекбоксов. как?

Если я правильно понял - то имеется в виду изменение вида отображения сгенерированных паролей? Если это так, то нужно использовать для вывода что-то типа richedit (т.е. с возможностью менять вид отдельной части отображаемого текста), или перерисовывать самому...
Автор: salexn1
Дата сообщения: 08.11.2012 11:16
Corsairs
Ждем от автора поста, что же имеется ввиду...
Автор: Zakipel
Дата сообщения: 08.11.2012 15:35

Цитата:
Если я правильно понял - то имеется в виду изменение вида отображения сгенерированных паролей?

да, именно про это я и говорю
а если, как говорит exteris

Цитата:
Константы как-бы не меняются...

то нужно найти другой способ)
ну а с рамками все понял




Добавлено:
[more]
Цитата:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ActnList, Clipbrd, ExtCtrls, sSkinManager;

type
TForm1 = class(TForm)
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
ListBox1: TListBox;
Timer1: TTimer;
sSkinManager1: TsSkinManager;
procedure Timer1Timer(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
s,t:integer;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
const PassChar='QWERTYUIOPLKJ01478HGFDSAZXCVBNM96325';
var
LenPass : integer;
sPass : string;
i, passCharCount : integer;
begin
Randomize;
LenPass :=StrToInt(Edit1.Text); {длина пароля}
passCharCount := Length(PassChar);

sPass := '';

for i:=1 to LenPass do
sPass := sPass + PassChar[ Random(passCharCount)+1 ];
begin
t:=(strtoint(edit1.Text));
if t>0 then
begin
s:=s+1;
listbox1.Items.Add(sPass);
label3.Caption:='Сгенерировано: '+inttostr(s);
if s=strtoint(edit2.Text) then
timer1.Enabled:=false;
end;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if ListBox1.Items.Count =0 then exit;
listbox1.Items.SaveToFile('generated.txt');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text='' then exit;
if Edit2.Text='' then exit;
s:=0;
listbox1.Clear;
timer1.enabled:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled:=false;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if Listbox1.Itemindex <0 then exit;
if ListBox1.Items.Count >0 then
Clipboard.AsText:= Listbox1.Items.Strings[Listbox1.Itemindex];
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const digit:set of char= ['0'..'9',#8];
begin
if not (key in Digit) then
key:=#0;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
const digit:set of char= ['0'..'9',#8];
begin
if not (key in Digit) then
key:=#0;
end;

end.

вот так все это выглядит
это мое знакомство с delphi так что как то так

[/more]
Автор: salexn1
Дата сообщения: 08.11.2012 16:17
Zakipel
Если я правильно понял, то

Цитата:
Нужно как то заставить const passchar='qwerty...' менять свой вид в зависимости от чекбоксов. как?


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

тогда Вам нужно 4 набор констант:
digits = '0..9';
UpperChars = 'A...Z';
LowerChars = 'a..z';
Symbols = '!$@%_';

и переменная PassChars, которая будет состоять из констант в зависимости от чекбоксов:
PassChars := UpperChars + digits

Автор: Zakipel
Дата сообщения: 08.11.2012 16:44
т.е. как то так должно выглядеть?

procedure TForm1.Timer1Timer(Sender: TObject);
const digits = '0..9';
const UpperChars = 'A...Z';
const LowerChars = 'a..z';
const Symbols = '!$@%_';
//const PassChar='QWERTYUIOPLKJ01478HGFDSAZXCVBNM96325';
var
PassChar : digits+UpperChars+LowerChars+Symbols;
LenPass : integer;
sPass : string;
i, passCharCount : integer;
begin

Добавлено:
вот поправил, наверно))
procedure TForm1.Timer1Timer(Sender: TObject);
const digit = '0..9';
const UpperChar = 'A...Z';
const LowerChar = 'a..z';
const Symbol = '!$@%_';
const PassChar=digit+UpperChar+LowerChar+Symbol;
var
digits, UpperChars, LowerChars, Symbols : integer;
LenPass : integer;
sPass : string;
i, passCharCount : integer;
begin
Автор: salexn1
Дата сообщения: 08.11.2012 17:05
Zakipel
да не... как-то не так

function TForm1.GetPassChars: String;
begin
Result = '';
if DigitCheckBox.Checked then
Result = Result + digit;
if UpperCharCheckBox.Checked then
Result = Result + UpperChar;
if LowerCharCheckBox.Checked then
Result = Result + LowerChar;
if SymbolCheckBox.Checked then
Result = Result + Symbol;
end;

Автор: Zakipel
Дата сообщения: 08.11.2012 20:37
salexn1 спасибо все получилось, не сразу конечно, я ж пытаюсь разговаривать на китайском, а китайский я етессно е знаю)))
осталась одна единственная мелочь, когда ни один чекбокс не выбран выскакивает ошибка
делал по аналогии с эдит не выходит(

з.ы. максимальное количество символов в одной строке = 37440, это зависит от возможностей компа?

Добавлено:
и еще, можно как нибудь исключить повторения символов в строке?
Автор: salexn1
Дата сообщения: 09.11.2012 07:21
Zakipel

Цитата:
делал по аналогии с эдит не выходит(


Это совершенно не понятная фраза...


Цитата:
и еще, можно как нибудь исключить повторения символов в строке?

в какой строке?
Автор: Corsairs
Дата сообщения: 09.11.2012 08:42
Zakipel

Цитата:
можно как нибудь исключить повторения символов в строке?

как я понимаю - под строкой имеется в виду сгенерированный пароль, да?
исключить то можно, но это зависит от количества использованных символов и длины желаемого пароля... (если используется 10 символов, а длина пароля - 12, то в любом случае будут повторы...)
а если не должно быть повторов в любой подстроке (естественно, ее длина должна быть меньшей, чем количество используемых в наборе символов) - то это возможно.

если учитывать
Цитата:
максимальное количество символов в одной строке = 37440
то для исключения повторов нуно генерить пароль с использованием китайских иероглифов, вроде... да и запомнить такое чудо...
или имеется в виду просто максимальная длина строки?


Цитата:
когда ни один чекбокс не выбран выскакивает ошибка

ну, в принципе - логично... ведь не из чего генерировать строку-пароль... т.е. минимум какой-то один набор символов должен быть выбран...
Автор: Zakipel
Дата сообщения: 09.11.2012 14:25

Цитата:
Zakipel - делал по аналогии с эдит не выходит(

salexn1 - Это совершенно не понятная фраза...


я имел ввиду if edit1.text='' then exit; в таком духе, но это уже не важно, проблему решил, просто немного не так делал)
if (checkbox1.State=cbunchecked)
and (checkbox2.State=cbunchecked)
and (checkbox3.State=cbunchecked)
and (checkbox4.State=cbunchecked) then
exit;


Цитата:
как я понимаю - под строкой имеется в виду сгенерированный пароль, да?

да чтобы в одном сгенерированном пароле символы не повторялись


Цитата:
максимальное количество символов в одной строке = 37440

даль комп не тянет таймер работае но в listbox пусто)



Добавлено:
зы я юзаю дефи7, слетели патчи. переставлять буду, может что-то получше посоветуете
Автор: Corsairs
Дата сообщения: 09.11.2012 17:39

Цитата:
я имел ввиду if edit1.text='' then exit; в таком духе
ну да, такой вариант с чекбоксом не пройдет, так как в случае едита мы имеем строковую переменную, а здесь - состояние элемента...
можно сделать так:
берем переменную, присваиваем ей начальное значение (количество изначально выбранных чекбоксов)
при изменении любого из чекбоксов соответственно изменяем это значение (+1 или -1).
если значение переменной равно 0 - то ни один чекбокс не выбран...


Цитата:
даль комп не тянет таймер работае но в listbox пусто)
хм... т.е. 37440 - это суммарная длина символов, выведенных в listbox, да? возможно, это ограничение самого listbox? попробуй вывести в memo или richedit

как я понял - в listbox выводится результат - сгенерированные пароли?
может стоит выводить какое-то определенное количество строк?
Автор: Zakipel
Дата сообщения: 09.11.2012 18:10

Цитата:
Corsairs
ну да, такой вариант с чекбоксом не пройдет

я ж говорю проблему решил) следующим образом:
if (checkbox1.State=cbunchecked)
and (checkbox2.State=cbunchecked)
and (checkbox3.State=cbunchecked)
and (checkbox4.State=cbunchecked) then
exit;
Цитата:
может стоит выводить какое-то определенное количество строк?

так и сделал max length

Вобщем остался только один вопрос: как сделать чтобы в одном сгенерированном пароле символы не повторялись?
Автор: Corsairs
Дата сообщения: 09.11.2012 19:44
Zakipel

Цитата:
так и сделал max length

это общая длина, а я имел в виду количество строк (т.е. сгенерированных паролей)


Цитата:
как сделать чтобы в одном сгенерированном пароле символы не повторялись?

это во многом зависит от алгоритма генерации пароля... (это если сразу генерировать такие пароли)
а если можно просто отбрасывать "неправильные" пароли - то это можно реализовать с использованием множества, типа вот так:
определяем пустое множество
в цикле проверяем символы пароля: если символа нет во множестве - то добавляем его.
а вот если символ есть - то в пароле есть двойные символы.
Автор: Zakipel
Дата сообщения: 09.11.2012 20:00

Цитата:
это общая длина, а я имел в виду количество строк (т.е. сгенерированных паролей)

в инспеторе объектов для каждого поля эдит, т.е. как количество, так и длину ограничил

Цитата:
определяем пустое множество
в цикле проверяем символы пароля: если символа нет во множестве - то добавляем его.
а вот если символ есть - то в пароле есть двойные символы.

можешь кодом намекнуть как это выглядит?

Автор: Corsairs
Дата сообщения: 09.11.2012 21:22
Zakipel
А куда выводятся сгенерированные пароли? Что, в edit? Я думал, что внизу картинки memo...


Цитата:
можешь кодом намекнуть как это выглядит?
приблизительно вот так:

определяем тип:
Код: char_in_pass: set of char;
x: char;
Автор: Zakipel
Дата сообщения: 09.11.2012 21:54

Цитата:
А куда выводятся сгенерированные пароли? Что, в edit? Я думал, что внизу картинки memo...

нет, пароли выводятся в листбокс, а кождое поле эдит отвечает: одно за длину, другое за кол-во, сответсвенно можно ограничить длину ввода, т.к. генерация идет из порядковых значений, то длина эдит в 3 символа = 999 )

за код сэнкс, попробую прилепить

Добавлено:
[more] вобщем нашел способ удалять повторы, НО тогда результат(Result) <> StrToInt(Edit1.Text) так как символ просто удаляется из строки, надо как то сделать так что бы символ заменялся на другой, вот кусок кода:


Цитата:
function DelRepeat(txt:string):string;
var
j:integer;
begin
Result:= '';
for j := 1 to Length(txt) do
if Pos(txt[j],Result)= 0 then Result := Result+txt[j];
end;

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
sPass : string;
LenPass, i, passCharCount : integer;
begin
Randomize;
LenPass :=StrToInt(Edit1.Text);
passCharCount := Length(PassChar);
sPass := '';
for i:=1 to LenPass do
sPass := sPass + PassChar[ Random(passCharCount)+1 ];
begin
t:=(strtoint(edit1.Text));
if t>0 then
begin
s:=s+1;
listbox1.Items.Add(DelRepeat(sPass));
label3.Caption:='&#209;&#227;&#229;&#237;&#229;&#240;&#232;&#240;&#238;&#226;&#224;&#237;&#238;: '+inttostr(s);
if s=strtoint(edit2.Text) then
timer1.Enabled:=false;
end;
end;
end;

[/more]
Автор: Zakipel
Дата сообщения: 11.11.2012 10:12
столкнулся с таким багом, или своим незнанием

если код такой if strtoint(Edit1.Text) >70 then exit; - все в порядке

а если код if Edit1.Text > '70' then exit; идентичен верхнему коду НО не работает 8 и 9

там же 70 а не 7 знает кто нибудь почему так?
Автор: Corsairs
Дата сообщения: 11.11.2012 12:25

Цитата:
знает кто нибудь почему так?

это особенности сравнивания строковых переменных...
при этом сначала сравниваются первые символы, а вторые и далее используются только при равенстве предыдущих... (примеры этого - сортировка файлов в Total Commander (если не включать опцию в твикере), да и во многих других программах...)
Автор: Zakipel
Дата сообщения: 12.11.2012 00:39
Собственно ВОТ что из этой темы получилось

Добавлено:

Генератор паролей
Автор: salexn1
Дата сообщения: 12.11.2012 11:43
Zakipel
Имхо, лучше бы Вы выложили сорцы...
Автор: Zakipel
Дата сообщения: 12.11.2012 17:11
salexn1 да влегкую )


Цитата:
Имхо, лучше бы Вы выложили сорцы...
Автор: salexn1
Дата сообщения: 13.11.2012 09:32
Zakipel
Если будет время, то напишу, где косяки...
С ходу:
если выставить кол-во = 0, то уходит в бесконечность...
по форматированию кода много вопросов...
контролы не переименованы...
Button5Click - вообще странный код, можно сделать так

begin
if not Assigned(Form2) then
Form2 := TForm2.Create(Self);
Form2.ShowModal;
end;

Ну и много чего еще...

Автор: Zakipel
Дата сообщения: 13.11.2012 22:21
salexn1
сенкс, баг с бесконечностью убрал


Цитата:
Button5Click - вообще странный код, можно сделать так

begin
if not Assigned(Form2) then
Form2 := TForm2.Create(Self);
Form2.ShowModal;
end;

а какая разница? ты бы сделал так, я сделал так )


Цитата:
напишу, где косяки...

жду
Автор: salexn1
Дата сообщения: 14.11.2012 09:04
Zakipel

Цитата:
а какая разница? ты бы сделал так, я сделал так )

ну так просто кашерно...
нет времени к сожалению
Автор: Zakipel
Дата сообщения: 30.12.2012 18:39

Цитата:
з.ы. и возможно как то убрать пунктирную рамку у чекбокса?


sCheckBox1.ShowFocus:=false;

Страницы: 1

Предыдущая тема: VBA поиск в тексте текущего письма Outlook


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.