ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Оффтоп > Болталка
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Счастливый случай :)
  #1  
Старый 20.03.2006, 01:57
Аватар для Mertvii-Listopad
Mertvii-Listopad
Banned
Регистрация: 17.03.2006
Сообщений: 110
Провел на форуме:
98021

Репутация: -15
Отправить сообщение для Mertvii-Listopad с помощью ICQ
По умолчанию Счастливый случай :)

Вступление:

Каждый из нас хоть раз видел в какой нибуть программе диалог "Совет дня". И уж тем более все мы его читали!
Как уже понятно, советы там появляются случайным образом, а не по заданной схеме. Многие молодые программисты очень часто попадаются на подобную фишку. А всё просто потому, что они не знают как правильно в 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;.

Вот и всё. Вам остаётся лишь вывести форму с советами и любоваться своим детищем!
 
Ответить с цитированием

  #2  
Старый 20.03.2006, 02:20
Аватар для Nova
Nova
OpenVPN.CC
Регистрация: 15.07.2005
Сообщений: 1,599
Провел на форуме:
7670961

Репутация: 1034


Отправить сообщение для Nova с помощью ICQ
По умолчанию

Мдауж это для новичков прям статья и сдаёться мне что она не твоя я гдето это уже видел =(
 
Ответить с цитированием

  #3  
Старый 20.03.2006, 02:22
Аватар для tclover
tclover
Banned
Регистрация: 13.12.2005
Сообщений: 1,091
Провел на форуме:
9751364

Репутация: 1847


По умолчанию

Цитата:
Сообщение от Nova  
Мдауж это для новичков прям статья и сдаёться мне что она не твоя я гдето это уже видел =(
http://www.progers.ru/articles/10.htm
 
Ответить с цитированием

  #4  
Старый 20.03.2006, 02:28
Аватар для Nova
Nova
OpenVPN.CC
Регистрация: 15.07.2005
Сообщений: 1,599
Провел на форуме:
7670961

Репутация: 1034


Отправить сообщение для Nova с помощью ICQ
По умолчанию

Цитата:
Сообщение от Trampled_clover  
а нах мне это писать я сичас на C перешёл Delphi забросил а ты только подтвердил что статья ворованая пусть модеры перенесут в соответсвующий раздел =)
 
Ответить с цитированием

  #5  
Старый 20.03.2006, 02:29
Аватар для tclover
tclover
Banned
Регистрация: 13.12.2005
Сообщений: 1,091
Провел на форуме:
9751364

Репутация: 1847


По умолчанию

Цитата:
Сообщение от Nova  
а нах мне это писать я сичас на C перешёл Delphi забросил а ты только подтвердил что статья ворованая пусть модеры перенесут в соответсвующий раздел =)
С этой целью я и написал
 
Ответить с цитированием

  #6  
Старый 20.03.2006, 02:58
Аватар для Mertvii-Listopad
Mertvii-Listopad
Banned
Регистрация: 17.03.2006
Сообщений: 110
Провел на форуме:
98021

Репутация: -15
Отправить сообщение для Mertvii-Listopad с помощью ICQ
По умолчанию

а где указано то что она МОЯ?
 
Ответить с цитированием

  #7  
Старый 20.03.2006, 03:02
Аватар для tclover
tclover
Banned
Регистрация: 13.12.2005
Сообщений: 1,091
Провел на форуме:
9751364

Репутация: 1847


По умолчанию

Цитата:
Сообщение от Mertvii-Listopad  
а где указано то что она МОЯ?
А где указано что она НЕ твоя?
 
Ответить с цитированием

  #8  
Старый 20.03.2006, 06:24
Аватар для A110ut
A110ut
Постоянный
Регистрация: 31.12.2005
Сообщений: 605
Провел на форуме:
4349433

Репутация: 661


По умолчанию

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

  #9  
Старый 20.03.2006, 07:23
Аватар для Mertvii-Listopad
Mertvii-Listopad
Banned
Регистрация: 17.03.2006
Сообщений: 110
Провел на форуме:
98021

Репутация: -15
Отправить сообщение для Mertvii-Listopad с помощью ICQ
По умолчанию

Ну просто мне статья понравилась и я решил здесь разместить ее. Откуда я знал что так делать не льзя?
 
Ответить с цитированием

  #10  
Старый 20.03.2006, 07:32
Аватар для A110ut
A110ut
Постоянный
Регистрация: 31.12.2005
Сообщений: 605
Провел на форуме:
4349433

Репутация: 661


По умолчанию

Кто сказал что так делать нельзя? Просто нужно указывать имя автора или хотя бы источник инфы
зы:или постить в «чужие статьи»
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тяжёлый случай... Гаврила Расшифровка хешей 6 07.03.2006 08:52
Интересный случай в нашем ПЛ ))) dinar_007 Болталка 3 14.02.2006 23:38



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ