• XSS.stack #1 – первый литературный журнал от юзеров форума

Счастливый случай :) Random в Delphi.

ART

floppy-диск
Пользователь
Регистрация
03.07.2005
Сообщения
7
Реакции
0
Вот нашел кой чего полезного =) может кому пригодиться :)

Счастливый случай :)
Вступление:
Каждый из нас хоть раз видел в какой нибуть программе диалог "Совет дня". И уж тем более все мы его читали!
Как уже понятно, советы там появляются случайным образом, а не по заданной схеме. Многие молодые программисты очень часто попадаются на подобную фишку. А всё просто потому, что они не знают как правильно в Delphi реализовать данную возможность.
В этой статье я попробую объяснить вам, как это программно реализовать в дельфи на простейшем примере, а в конце статьи я объясню вам, как сделать свой первый диалог "Совет дня". Да не просто диалог, а диалог с внешним файлом советов. Впрочем, обо всём по порядку...
Я не буду вдаваться в теорию, а сразу перейду к кодингу. Итак, запускайте дельфи, создавайте новый проект и понеслась...
Первые шаги:
Для начала напишем наипростейшею программку для того, чтобы понять принцип работы рандома. Суть этой программки будет заключаться в том, чтобы показывать случайную позицию на ProgressBar. Приступим к написанию.
За, так называемый, "Счастливый случай" в дельфи отвечает свойство Random. Давайте рассмотрим это на практике.
Киньте на форму три компонента: 1. TButton с вкладки Standard, 2. TProgressBar с вкладки Win32, 3. TTimer c вкладки System.
Разместите их на форме по своему усмотрению. После того, как вы всё сделали, создайте функцию. Сделать это можно очень просто - после
{$R *.dfm} сразу пишите:
function GRI:integer;
begin

end;
Здесь GRI - Имя функции. Вообще, здесь можно написать всё что угодно, но только латинскими символами и без пробелов.
Внимание! У каждой функции после названия пишется, через двоеточие, формат возвращаемых данных. Без этого работают процедуры.
Вообще, можно было обойтись и без создания функции, но так гораздо удобнее. Так вот, после того как вы создадите функцию, установите значение MAX у ProgressBar в 100, а POSITION и MIN в 0. Для создания рандома лучше использовать массивы. Давайте создадим массив данных.
Между function GRI:integer; и begin напишите:
const int:array[0..100] of integer = (
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100);
В итоге у вас должно получиться что-то типа этого:
function GRI:integer;
const int:array[0..100] of integer = (
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100);
begin

end;
Если с массивом всё понятно, то переходим к следующему этапу. Для того, чтобы вернуть значение из функции, необходимо использовать метод result. У нас это должно выглядеть примерно так:
result:=int[random(101)];
Вот уже и появилась долгожданное свойство random. После него, в скобочках, необходимо указать количество, из которого следует выбрать одно значение. Поскольку у нас в массиве int 101 значение, то мы и должны указать это число! С этим проблем возникнуть не должно! В итоге у вас должна получится готовая процедура:
function GRI:integer;
const int:array[0..100] of integer = (
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100);
begin
result:=int[random(101)];
end;
Вот вы и создали функцию для случайного выбора числа. Теперь установите свойство Enabled у Timer в False и щёлкните два раза по самому компоненту для создания процедуры. Данная процедура будет выполнятся каждые X миллисекунд, где X - значение Interval у Timer. 1000 миллисекунд = 1 секунде и так далее.
Так как мы уже создали функцию возврата случайного числа, то другого кода по возврату нам уже не надо. Использовать эту функцию очень просто:
ProgressBar1.position:=GRI;
Всё. Теперь два раза щёлкните на кнопке и напишите там следующее:
Timer1.Enabled:=true;
Программа готова. Компилируйте проект и смотрите на своё творение. Нажимайте на кнопку в своей программе и понеслась... Однако, что это? Каждый раз позиция начинается с одного и того же места и в дальнейшем действует по одинаковой схеме. Исправляется это очень просто. В нашей функции, перед result:=int[random(101)];, нужно вписать всего одно слово:
Randomize;
В итоге у вас должна получится такая функция:
function GRI:integer;
const int:array[0..100] of integer = (
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100);
begin
Randomize;
result:=int[random(101)];
end;
Теперь всё должно работать как надо. Конечно, этот пример немного сложноват для новичка, но эта статья писалась для людей, которые хоть чуть-чуть, но понимают Delphi. Если у вас всё равно ничего не получилось, не отчаивайтесь! Пишите мне о своих вопросах на cooleditor@nm.ru или blacklord2003@mail.ru. Я постараюсь вам помочь в силу своих возможностей. А теперь...
Полезные случайности:
Как я и обещал, я расскажу вам как написать диалог полезных советов. Создавайте новый проект и вперед!
Для начала нужно создать ещё одну форму (для диалога с советами). Создавайте её и идём дальше.
Все нужные для этого компоненты находятся на одной вкладке - Standard. Оттуда берите два Button и один Label. Кидайте их на вторую(!) форму, расставьте их как следует.
Затем у объекта label установите свойства AutoSize в false, а WordWrap в true. Первое отвечает за автоматическое растягивание компонента по длине текста, а второе включает перенос этого текста по словам. В общем, проблем возникнуть не должно.
Поскольку мы пишем диалог полезными советами, которые находятся во внешнем файле, нам понадобится глобальная переменная. В блоке var напишите:
STR:tStringList;
Это мы объявили глобальную переменную STR. Теперь нам надо её инициализировать. В свойстве OnCreate вашей формы пишите:
STR:=TStringList.create;
А в OnDestoy:
STR.free;
Здесь мы её выгружаем из памяти. Она выгрузится из памяти, когда форма будет выгружаться.
Затем в уже знакомом OnCreate, сразу после инициализации, пишите:
STR.LoadFromFile(ExtractFilePath(ParamStr(0))+'Tips.txt');
Здесь загружается файл с советами. Предполагается, что файл находится в папке с программой и называется Tips.txt.
Теперь давайте создадим ещё одну функцию.
У меня это:
function RandomTip:string;
begin

end;
Теперь напишите следующее:
randomize;
result:=str.Strings[random(str.Count)];
Здесь выбирается случайный совет из списка. За совет считается одна строка и выбирается она из всего количества строк в списке. У вас должно поучиться буквально следующее:
function RandomTip:string;
begin
randomize;
result:=str.Strings[random(str.Count)];
end;
Теперь на свойстве OnShow у формы пишите:
Label1.caption:=RandomTip;
Тоже самое нужно написать на обработчике одной из кнопок. Думаю принцип работы этой строки уже всем понятен.
А для другой кнопки нужно создать обработчик с командой Close;.
Вот и всё. Вам остаётся лишь вывести форму с советами и любоваться своим детищем!
На этом разрешите откланяться! Если у вас возникнут какие либо вопросы, пожелания или предложения, то смело пишите мне на e-mail:
cooleditor@nm.ru
 
тем кто с random не знаком, хороший пример же вроде?

Да вообщем-то ИМХО мало, что полезного :) Если человек прочёл хоть один учебник по делфе, то он будет знать, что такое массивы и random...
 
Зачем это? имхо суда кидать лучше только авторские статьи. а сока интересно тут будет топиков если я свои 1.5 метра статей выложу?
 
Зачем это? имхо суда кидать лучше только авторские статьи. а сока интересно тут будет топиков если я свои 1.5 метра статей выложу?

Скромно :) Мой архив раз в 250 больше занимает байтов :)
 
begin
randomize;
tmp:=tstringlist.create;
гем, а нафиг объявлять генератор ? Он без объявления пашет, т.е. эта строка
showmessage(tmp.strings[random(tmp.count)]);
и так нормально отобразится
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх