Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 756
от 21.03.2007, 03:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 441, Экспертов: 71
В номере:Вопросов: 4, Ответов: 9


Вопрос № 78378: Добрый день! Как определить количество элементов динамического массива??? У меня есть динамический массив DeptNoTable : Array of variant; Я могу его проинициализировать begin DeptNameTable := VarArrayCreate([0, 25], varVariant);<...
Вопрос № 78452: Доброго времени суток =) Решил написать мини чат с поддержкой смайлов для практики ! Мне нужно совать смайлы в ТМемо (либо JvMemo). В JvMemo получилось засунуть но при этом возникают неприятности с сохранением логов или копированием строк...
Вопрос № 78472: Здравствуйте, уважаемые эксперты! Мне нужен простой алгоритм шифрования паролей произвольной длины, чтобы его можно было хранить в открытой базе данных. Может кто сталкивался с подобной проблемой? Может есть какой-нибудь алгоритм несложный. Защита ну...
Вопрос № 78482: Результат SQL-запроса отображается в DBGrid. Запрос в принципе не редактируемый. Мне нужно эмулировать редактирование одного из полей, т.е. сделать так, чтобы в соответствующей ячейке Grid-а при нажатии Enter появлялся Tedit, а после ввода в него...

Вопрос № 78.378
Добрый день! Как определить количество элементов динамического массива???
У меня есть динамический массив
DeptNoTable : Array of variant;
Я могу его проинициализировать
begin
DeptNameTable := VarArrayCreate([0, 25], varVariant);
а могу и не делать этого т.к. некоторый софт по связи Delphi с Oracle сделает это сам
компонент SelQuery при использовании конструкции
select * bulk collect into........ from
проинициализирует таблицу сам и задаст столько строк, сколько нужно для вводимой информации
и поместит ее туда за одно обращение к БД,
теперь мне ее нужно куда-нибудь выводить. Т.к. обращение к базе происходит 1 раз,
то все параметры типа SelQuery RowCount и т.д. равны 1, при любом количестве выведенных строк.
Пишу цикл while, например, для вывода результатов в Memo
k:=0;
// while (Length(DeptNameTable[k]) >=1) do
// while (DeptNameTable[k] is not nil ) do
begin

Memo.Lines.Add(IntToStr(DeptNoTable[k]));
k:=k+1;
end;
Попробовал несколько разных вариантов проверки - существует ли k-тый элемент массива, все безуспешно,
подскажите, пожалуйста.
Отправлен: 15.03.2007, 10:50
Вопрос задал: Shap (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Gladiator
Здравствуйте, Shap!
По-моему для этого служит VarArrayHighBound.
Ответ отправил: Gladiator (статус: 9-ый класс)
Ответ отправлен: 15.03.2007, 11:24
Оценка за ответ: 4
Комментарий оценки:
Спасибо, пишу так...
for k:= 0 to VarArrayHighBound(DeptNoTable, 1) do begin
Memo.Lines.Add(IntToStr(DeptNoTable[k]));
end;
И все получается...

Отвечает: Pavel Maltsev
Здравствуйте, Shap!

VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1)
Ответ отправил: Pavel Maltsev (статус: 1-ый класс)
Ответ отправлен: 15.03.2007, 11:26
Оценка за ответ: 5
Комментарий оценки:
Спасибо, дошло, пишу так...
for k:= VarArrayLowBound(DeptNoTable, 1) to VarArrayHighBound(DeptNoTable, 1) do begin
Memo.Lines.Add(IntToStr(DeptNoTable[k]));
end;
И все получается замечательно, спасибо, еще раз.


Вопрос № 78.452
Доброго времени суток =)
Решил написать мини чат с поддержкой смайлов для практики !
Мне нужно совать смайлы в ТМемо (либо JvMemo).
В JvMemo получилось засунуть но при этом возникают неприятности с сохранением логов или копированием строки т.к. текст и изображение немогут быть в одном буфере оновременно !!
Примером для меня служат разные чаты и ИМ клиенты !!
Допустим в qip реализована класная робота со смайлами (в плане того что когда наводиш на смайл вишеть его текстовая форма и при выделении смайла выделяетса таже текстовая форма).
Спс за внимание.
Отправлен: 15.03.2007, 17:47
Вопрос задал: 5n00py (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Pavel Maltsev
Здравствуйте, 5n00py!

В TMemo вставить картинку не получится при всем желани. В стандартный RichEdit - с большииим геморроем. Попробуйте использовать TRxRichEdit из RxLib. А сохранение логов, и копирование текста скорее всего придется обрабатывать самому. Т.е. смайлы должны "интерпретироваться" на лету твоим же компонентом - т.е. искать в строке *OK* и заменять его картинкой...
Ответ отправил: Pavel Maltsev (статус: 1-ый класс)
Ответ отправлен: 15.03.2007, 18:04


Вопрос № 78.472
Здравствуйте, уважаемые эксперты! Мне нужен простой алгоритм шифрования паролей произвольной длины, чтобы его можно было хранить в открытой базе данных. Может кто сталкивался с подобной проблемой? Может есть какой-нибудь алгоритм несложный. Защита нужна от делетантов, не профессионалов шифровальщиков. Если есть пример, буду очень признателен :-)
Отправлен: 15.03.2007, 20:55
Вопрос задал: Alex446 (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Alex446!

Это может быть какая-нибудь хеш-функция, например CRC32
Код на Delphi в приложении

Приложение:

---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО

Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 15.03.2007, 21:06
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Исходники мне очень помогли.

Отвечает: Gh0stik
Здравствуйте, Alex446!

Можно также использовать и вычисление хеш-суммы MD5, модуль смотрите в прикрепленном файле (взято с http://delphiworld.narod.ru/
)

А вот использование в программе этого модуля:

var cod:string;
..........
cod:=MD5DigestToStr(MD5String('очень секретный код'));
..........


Но можно также и самому придумать парочку не сложных алгоритмов "кодирования", например каждый символ текущей строки будем находить по какомуто закону (обыкновенное смещение в таблице символов), который Вы задаете самостоятельно.

Вот очень простой пример кодирования файла:

procedure TForm1.Button1Click(Sender: TObject); //закодировать
begin
assignfile(f1,'data.txt');reset(f1);
assignfile(f2,'data.ddd');Rewrite(f2);
while not eof(f1) do
begin
readln(f1,st);
ss:='';
for i:=1 to length(st) do
begin
// код в символ --> символ в код//
ss:=ss+chr(ord(st[i])+21);
end;
writeln(f2,ss);
end;
closefile(f1);
closefile(f2);
end;

procedure TForm1.Button2Click(Sender: TObject); //раскодировать
begin
assignfile(f2,'data.ddd');reset(f2);
assignfile(f3,'data.txt');Rewrite(f3);
while not eof(f2) do
begin
readln(f2,st);
ss:='';
for i:=1 to length(st) do
begin
// символ в код --> код в символ//
ss:=ss+chr(ord(st[i])-21);;
end;
writeln(f3,ss);
end;
closefile(f2);
closefile(f3);
end;


Но первый способ значительно веселей и надежней... ;)

Good Luck!!!

Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.

Ответ отправил: Gh0stik (статус: Профессионал)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 15.03.2007, 21:49
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Первый код действительно лучше, но альтернатива может пригодится.

Отвечает: Pavel Maltsev
Здравствуйте, Alex446!

Да в сети их навалом... вот например:
http://www.scramasax.ramenki2.com/MD5.pas

Попробуй поискать в поисковике MD5 Delphi

Кстати, во многих СУБД имеются функции для вычисления хеша, может быть имеет смысл что-то вынести на сервер?
Ответ отправил: Pavel Maltsev (статус: 1-ый класс)
Ответ отправлен: 15.03.2007, 22:56
Оценка за ответ: 4
Комментарий оценки:
Спасибо! Вариант с обработкой хэша на сервере интересен, но на Accesse не нашел, может плохо искал?

Отвечает: sir henry
Здравствуйте, Alex446!
Очень хороший и несложный алгоритм - операция XOR.
Например, есть у Вас пароль "Бабай". Над каждой буквой этого слова Вы проводите логическую операцию XOR и слово зашифровывается, для расшифровки - таже операция XOR (с тем же ключем, разумеется) и пароль восстановлен.
Пример:
Program srr;

Var
s: string;

{Функция шифрования-дешифрования}
Function Shifrovanie(slovo: string): string;
Const
Key = 7; {Это ключ шифрования}
Var
i, j: integer;
Begin
For i:=1 To Length(slovo) Do
Begin
j:=Ord(slovo[i]);
j:=j XOR Key;
slovo[i]:=Chr(j);
End;
Shifrovanie:=slovo;
End;

Begin
WriteLn('Введите слово для шифрации:');
ReadLn(s);
s:=Shifrovanie(s);
WriteLn('Зашифрование слово: ', s);
s:=Shifrovanie(s);
WriteLn('Расшифрованиое слово: ', s);
ReadLn;
End.

Т.е. один и тот же код используется как для шифрации, так и для дешифрации.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 16.03.2007, 07:24
Оценка за ответ: 5
Комментарий оценки:
Очень интересный вариант простейшего кодирования, а я пробовал shl а затем shr


Вопрос № 78.482
Результат SQL-запроса отображается в DBGrid. Запрос в принципе не редактируемый.
Мне нужно эмулировать редактирование одного из полей, т.е. сделать так, чтобы в соответствующей ячейке Grid-а при нажатии Enter появлялся Tedit, а после ввода в него данных (снова по Enter) запускалась процедура созранения этих данных в базе.
Вторая часть задачи проблем не вызывает. Мой вопрос: как встроить Tedit в Grid?

Vitaly Grobshtein
Отправлен: 15.03.2007, 22:07
Вопрос задал: Vitaly (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Pavel Maltsev
Здравствуйте, Vitaly!

А нужно ли встраивать TEdit в грид? Какая СУБД, какие компоненты доступа к данным? (Просто, возможно, можно сделать запрос "редактируемым"). Если СУБД поддерживает редактируемые вьюхи, то лучше через вьюхи, можно через триггеры; если в качестве компонентов используются TADOQuery, а в запросе JOIN, то можно использовать Unique Table - таблица куда сохранять данные...

Или как вариант, почему бы по нажатию на Enter не высвечивать стандартный InputQuery ?

А если уж очень хочется "встроить" TEdit в Grid - можно его создать динамически

var
edt: TEdit;

begin
edt := TEdit.Create(MainForm);
edt.Parent := MainForm;
edt.BringToFront;
edt.Left := ...
edt.Top := ...
Ответ отправил: Pavel Maltsev (статус: 1-ый класс)
Ответ отправлен: 15.03.2007, 23:05

Отвечает: Gh0stik
Здравствуйте, Vitaly!

В приложении смотрите код который переводит в нужную ячейку DBEdit (при этом используется метод DrawDataCell), использование этого компонента намного эффективнее (и проще) чем просто Edit (но если Вам так сильно нужен именно Edit, то прицепить его Вам не составит большого труда).

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

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
DBEdit1.DataField:=DBGrid1.SelectedField.FieldName;
end;


Good Luck!!!

Приложение:

---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.

Ответ отправил: Gh0stik (статус: Профессионал)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 16.03.2007, 00:03
Оценка за ответ: 5
Комментарий оценки:
OnDrawDataCell у меня почему-то не работает. Возможно, это особенность DBGridEH, которым я пользуюсь. А вот OnDrawColumnCell с предложенным вами кодом работает прекрасно.
Проблема решена. Спасибо.
VG


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.46 от 18.03.2007
Яндекс Rambler's Top100

В избранное