![]() |
Счастливый случай :)
Вступление:
Каждый из нас хоть раз видел в какой нибуть программе диалог "Совет дня". И уж тем более все мы его читали! Как уже понятно, советы там появляются случайным образом, а не по заданной схеме. Многие молодые программисты очень часто попадаются на подобную фишку. А всё просто потому, что они не знают как правильно в 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))+'Tip s.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;. Вот и всё. Вам остаётся лишь вывести форму с советами и любоваться своим детищем! |
Мдауж это для новичков прям статья и сдаёться мне что она не твоя я гдето это уже видел =(
|
Цитата:
|
Цитата:
|
Цитата:
|
а где указано то что она МОЯ?
|
Цитата:
|
Тут помниться некоторых (:)) людей за новость без копирайтов чуть в бан не отправили, а здесь целая статься нах (интеллектуальная собственность между прочим)
Мало того еще и "а где указано то что она МОЯ" :) Пипец одним словом... |
Ну просто мне статья понравилась и я решил здесь разместить ее. Откуда я знал что так делать не льзя?
|
Кто сказал что так делать нельзя? Просто нужно указывать имя автора или хотя бы источник инфы
зы:или постить в «чужие статьи» |
| Время: 13:30 |